svn pre lock hook script example입니다.
원래 배치 파일 자체에서 반복문을 통해 락-아너를 구해보려고 했는데, 시간관계상 임시파일을 읽는 것으로 대체하였어요. 좋은 자료 있다면 공유 좀 해주세요~
다음 스크립트는 SVN 저장소에서 특정 경로에 대한 pre-lock 훅을 설정하는 예제예요. pre-lock 훅은 파일 잠금을 시도할 때 트리거되어, 해당 경로에 이미 잠금이 설정되어 있는지 확인하고, 잠금을 허용할지 말지를 결정합니다.
이 스크립트는 VisualSVN Server와 Git 도구를 사용하는 환경에서 작동하므로, Git 도구도 다운로드 하셔야 해요. 각 부분에 대해 간단히 설명드리겠습니다.
스크립트
@echo off
set REPOS=%1
set PATH=%2
set USER=%3
set TOKEN=%4
set BREAK=%5
set SVNLOOK="C:\Program Files\VisualSVN Server\bin\svnlook.exe"
set GREP="C:\Program Files\Git\usr\bin\grep.exe"
set SED="C:\Program Files\Git\usr\bin\sed.exe"
set TEMP_FILE=%TEMP%\svn_pre_lock.txt
if exist %TEMP_FILE% del %TEMP_FILE%
%SVNLOOK% lock "%REPOS%" "%PATH%" | %GREP% "Owner: " | %SED% "s/Owner: //" > %TEMP_FILE%
set LOCK_OWNER=
for /f "delims=" %%i in (%TEMP_FILE%) do (
set LOCK_OWNER=%%i
)
del %TEMP_FILE%
if not "%LOCK_OWNER%"=="" (
echo Lock : %LOCK_OWNER% >&2
exit /b 1
)
exit /b 0
스크립트 설명
변수 설정:
REPOS,PATH,USER,TOKEN,BREAK등의 변수는pre-lock훅이 실행될 때 전달되는 인자들을 저장합니다.SVNLOOK,GREP,SED는 각각 SVN 저장소를 조회하고, 텍스트를 검색하고 수정하는 외부 프로그램의 경로입니다.
파일 존재 여부 확인:
TEMP_FILE은 잠금 상태 정보를 임시로 저장할 파일 경로입니다. 파일이 존재하면 삭제합니다.
잠금 소유자 조회:
svnlook lock명령어로 지정된 경로(%PATH%)에 대한 잠금 정보를 가져오고,grep으로 'Owner: ' 줄을 찾습니다.sed는 해당 줄에서 'Owner: '를 제거하여 실제 잠금 소유자를 추출합니다.
잠금 소유자 정보 처리:
- 추출된 잠금 소유자 정보를
LOCK_OWNER변수에 저장합니다. - 만약 잠금 소유자가 존재한다면, 해당 소유자 정보를 에러 메시지로 출력하고, 스크립트를 종료합니다 (
exit /b 1).
- 추출된 잠금 소유자 정보를
잠금 허용:
- 만약 잠금 소유자가 없다면 스크립트가 성공적으로 종료되며 잠금이 허용됩니다 (
exit /b 0).
- 만약 잠금 소유자가 없다면 스크립트가 성공적으로 종료되며 잠금이 허용됩니다 (
스크립트 활용 예시
이 스크립트는 예를 들어 다음과 같은 환경에서 유용할 수 있습니다.
- 경우 1: 특정 파일에 이미 잠금이 설정되어 있을 때, 다른 사용자가 잠금을 시도하면 이를 거부하는 경우.
- 경우 2: 특정 잠금 소유자만 잠금을 변경할 수 있도록 제한을 두고자 할 때.
변수 예시 값
%1:C:\svn\myrepo%2:trunk/file.txt%3:john_doe%4:12345678-90ab-cdef-1234-567890abcdef%5:1(강제 해제)
이 예시에서는 사용자가 john_doe로 C:\svn\myrepo 저장소에서 trunk/file.txt 파일을 잠금 해제하려고 시도합니다. 이때 잠금 소유자가 12345678-90ab-cdef-1234-567890abcdef의 토큰을 가진 경우, 강제로 잠금을 해제하려는 상황입니다.
위 스크립트는 svnlook 명령어를 사용하여 잠금 소유자를 확인하고, 잠금을 해제하려는 사용자가 잠금 소유자와 일치하는지 확인한 후, 일치하지 않으면 오류 메시지를 출력하고 잠금 해제를 막습니다.
*강제 해제 기능은 사용하지 않는 것으로 약속하였기에 스틸 락을 하더라도 기능은 똑같이 진행합니다.
전체 흐름
- 사용자 A가 파일을 잠금.
- 사용자 B가 동일한 파일에 잠금을 시도할 때, 해당 파일의 잠금 소유자가 A인 것을 확인.
- 스크립트는 B에게 '잠금이 이미 A에 의해 설정됨'을 알려주고, B는 잠금을 진행할 수 없습니다.
팀에서 여러 사람이 협업하는 환경에서 파일 잠금을 효율적으로 관리할 수 있도록 도와줄 거예요.
