svn hook pre lock script example (batch)

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

스크립트 설명

  1. 변수 설정:

    • REPOS, PATH, USER, TOKEN, BREAK 등의 변수는 pre-lock 훅이 실행될 때 전달되는 인자들을 저장합니다.
    • SVNLOOK, GREP, SED는 각각 SVN 저장소를 조회하고, 텍스트를 검색하고 수정하는 외부 프로그램의 경로입니다.
  2. 파일 존재 여부 확인:

    • TEMP_FILE은 잠금 상태 정보를 임시로 저장할 파일 경로입니다. 파일이 존재하면 삭제합니다.
  3. 잠금 소유자 조회:

    • svnlook lock 명령어로 지정된 경로(%PATH%)에 대한 잠금 정보를 가져오고, grep으로 'Owner: ' 줄을 찾습니다.
    • sed는 해당 줄에서 'Owner: '를 제거하여 실제 잠금 소유자를 추출합니다.
  4. 잠금 소유자 정보 처리:

    • 추출된 잠금 소유자 정보를 LOCK_OWNER 변수에 저장합니다.
    • 만약 잠금 소유자가 존재한다면, 해당 소유자 정보를 에러 메시지로 출력하고, 스크립트를 종료합니다 (exit /b 1).
  5. 잠금 허용:

    • 만약 잠금 소유자가 없다면 스크립트가 성공적으로 종료되며 잠금이 허용됩니다 (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_doeC:\svn\myrepo 저장소에서 trunk/file.txt 파일을 잠금 해제하려고 시도합니다. 이때 잠금 소유자가 12345678-90ab-cdef-1234-567890abcdef의 토큰을 가진 경우, 강제로 잠금을 해제하려는 상황입니다.

위 스크립트는 svnlook 명령어를 사용하여 잠금 소유자를 확인하고, 잠금을 해제하려는 사용자가 잠금 소유자와 일치하는지 확인한 후, 일치하지 않으면 오류 메시지를 출력하고 잠금 해제를 막습니다.

*강제 해제 기능은 사용하지 않는 것으로 약속하였기에 스틸 락을 하더라도 기능은 똑같이 진행합니다.

전체 흐름

  1. 사용자 A가 파일을 잠금.
  2. 사용자 B가 동일한 파일에 잠금을 시도할 때, 해당 파일의 잠금 소유자가 A인 것을 확인.
  3. 스크립트는 B에게 '잠금이 이미 A에 의해 설정됨'을 알려주고, B는 잠금을 진행할 수 없습니다.

팀에서 여러 사람이 협업하는 환경에서 파일 잠금을 효율적으로 관리할 수 있도록 도와줄 거예요.

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗