본문 바로가기

IT 라이프

[Visual SVN] pre-commit hook 샘플 - 커밋 메세지 또는 이슈번호 입력 체크, 삭제 금지 등

반응형

 SVN Server를 관리하는 입장에서는 사용자들의 일부 비정상적인 커밋이 금지될 수 있도록 통제하고 싶을 때가 있습니다. 이럴 때 활용할 수 있는 방법이 바로 pre-commit hook 을 사용하는 방법인데요. VisualSVN을 사용하는 경우에는 이 hook 스크립트를 윈도우즈 스크립트 스타일로 짜야 하기 때문에, 리눅스 환경에 익숙한 분들에겐 영 어색하고 여간 귀찮은 일이 아닐 수 없습니다.

 

 그래서 이번 포스팅에서는 제가 활용하기 위해 작성한 스크립트를 공유하고자 합니다. 많지 않은 분들이시겠지만, 아직 VisualSVN을 활용하고 계신 분들은 참고하시면 좋을 것 같습니다. 이 스크립트에서 커밋 이전에 체크하는 사항들은 아래와 같습니다.

 

- 커밋 메세지를 입력하였는지

- 커밋 메세지에 이슈번호를 입력하였는지

- 삭제 커밋이 포함되어 있는지 (삭제 커밋이 있는 경우 커밋 금지)

 

 여기에서 다소 특이한 부분은 관리자 권한을 가진 특정 사용자들은 삭제 커밋을 포함한 모든 커밋을 자유롭게 할 수 있도록 하였습니다.

 

- 관리자 권한을 가진 유저는 모든 커밋을 자유롭게 할 수 있음

 

VisualSVN pre-commit hook 예시

@echo off
:: Stops commits that have empty log messages.
@echo off

setlocal

rem Subversion sends through the path to the repository and transaction id
set REPO=%1
set TXN=%2

set SVNLOOK="%VISUALSVN_SERVER%\bin\svnlook.exe"

:: Logging Settings
set LOGFILE="D:\log\pre-commit-%date%.log"
echo ====%date%====%time%==== >> %LOGFILE%
echo REPO: %REPO% >> %LOGFILE%
echo TXN : %TXN% >> %LOGFILE%

:: Debugging....
echo [SVNLOOK changed] >> %LOGFILE%
%SVNLOOK% changed %REPO% -t %TXN% >> %LOGFILE%

echo [SVNLOOK log] >> %LOGFILE%
%SVNLOOK% log %REPO% -t %TXN% >> %LOGFILE%

echo [SVNLOOK author]>> %LOGFILE%
%SVNLOOK% author %REPO% -t %TXN% >> %LOGFILE%

:: Checking... isAdministrator
%SVNLOOK% author %REPO% -t %TXN% | findstr "adminuser_a adminuser_b" >> %LOGFILE%
if %errorlevel% equ 0 (goto NORMAL_EXIT)

:: Checking... empty comment
%SVNLOOK% log %REPO% -t %TXN% | findstr . >> %LOGFILE%
if %errorlevel% gtr 0 (goto ERROR_TOO_SHORT)

:: Checking... issue number
:: %SVNLOOK% log %REPOS% -t %TXN% | findstr /r /c:"#[0-9]" >> %LOGFILE%
:: if %errorlevel% gtr 0 (goto ERROR_ISSUE)

:: Checking... DELETE commit
%SVNLOOK% changed %REPO% -t %TXN% | findstr /b /c:"D   " >> %LOGFILE%
if %errorlevel% gtr 0 (goto NORMAL_EXIT) else (goto ERROR_DELETE)


:ERROR_TOO_SHORT
echo Your commit has been blocked because your log message was too 1>&2
echo short. Please write a log message describing the purpose of your 1>&2
echo changes and then try committing again. Thanks! 1>&2
echo 커밋메시지를 반드시 입력하셔야 합니다. 1>&2
goto ERROR_EXIT

:ERROR_ISSUE
echo empty issue, please fill issue number 1>&2
echo changes and then try committing again. Thanks! 1>&2
echo example : #000 hello world 1>&2
goto ERROR_EXIT

:ERROR_DELETE
echo You cannot delete resources. contact admin please. 1>&2
echo 삭제 커밋은 불가능합니다. 관리자에게 문의하십시오. 1>&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1
 
:NORMAL_EXIT
exit 0
반응형

참고사항

VisualSVN Server 3.9 이상의 버전을 사용하시는 분들이라면, 커밋 메시지의 길이를 체크하기 위해 아래와 같이 VisualSVN 사에서 제공하는 [VisualSVNServerHooks.exe] 프로그램을 활용할 수도 있습니다. 

    "%VISUALSVN_SERVER%\bin\VisualSVNServerHooks.exe" ^
    check-logmessage "%1" -t "%2" ^
    --min-size <min-size>
    IF ERRORLEVEL 1 exit /b 1

 자세한 사항은 VisualSVN 사의 공식 설명을 참고하시기 바랍니다.

 

https://www.visualsvn.com/support/topic/00140/

 

Validating commit log messages in VisualSVN Server - VisualSVN Help Center

VisualSVN Server includes a pre-commit hook that allows putting certain restrictions on the log messages for the new commits. Typically, you might want to prohibit empty log messages or log messages that are too short. Note Do not forget to use IF ERRORLEV

www.visualsvn.com

 

반응형