commit dialog가 나오는 pre-commit hook을 기준으로 설명함.
hook script는 PHP 스크립트라고 가정함.
설정하는 부분 아래에 예제 스크립트가 있음.
context-menu 에서 TortoiseSVN > Settings 선택
Settings 창에서 Hook Scripts를 선택하고 Add 버튼 누름
Hook Type 은 Pre-Commit hook 으로 설정하고,
Working Copy Path 는 현재 작업중인 SVN 저장소 디렉토리로 지정하고,
Commandl Line To Execute 는 실행시킬 hook script 실행 커맨드를 지정하면 됨.
여기선 php script 기준이므로 php.exe 경로 + hook script 경로 로 지정했음.
하단에 나오는 'Wait for the script to finish'와 'Hide the script while running'은 모두 체크해줘야 함.
여기까지 완료하고 OK 를 누른 후,
해당 저장소에서 commit을 시도하면 커밋되기 전에 지정한 스크립트가 동작하게 됨.
예제 스크립트.
SVN hook 은 지정한 스크립트를 호출하면서 argv 로 각 파라메터를 전달하는데 hook의 종류에 따라 전달되는 파라메터가 다르다.
pre-commit hook은 아래와 같은 형태의 argv가 전달된다.
자세한 건 이 포스트 최하단의 참조경로를 참조할 것.
0 - 실행 스크립트 자체경로
1 - PATH
2 - DEPTH
3 - MESSAGEFILE
4 - CWD
내가 관심있는 건 커밋되는 소스파일 리스트이므로 argv[1] 만 사용한다.
argv[1]에는 어떤 임시 파일의 경로가 지정되어 있는데 이 파일을 읽어들이면 \n 으로 구분되어 커밋될 파일경로 리스트를 얻을 수 있다.
아래는 pre-commit hook 에서 실행되어 커밋될 파일들의 내용을 읽어들인 후 각자에 맞는 유효성 체크를 하는 방식의 hook script 예제다.
<?PHP
// pre-commit hook에서 커밋될 파일리스트 확보
$files = explode("\n", trim(file_get_contents($argv[1])));
$err_msg = '';
foreach ($files as $f) {
$f = trim($f);
// TODO 파일 내용을 읽어들여 각종 체크 실행
// 체크에 실패할 경우 메세지를 차곡차곡 쌓는다.
$err_msg .= chk($f);
}
// 체크 통과 실패
if ($err_msg!='') {
// TortoiseSVN commit dailog에 에러메세지 출력
err($err_msg);
exit(1);
}
// 체크 통과 성공
else {
exit(0);
}
// 파일내용을 읽어들여 각종 체크 실행
function chk($f)
{
$res = '';
if (!file_exists($f)) return $res;
$contents = file_get_contents($f);
// TODO 여기서 이것저것 체크하고 걸리는 내용을 에러메세지 형태로 $res에 append
return $res;
}
// STDERR 메세지 출력
function err($err_msg)
{
file_put_contents('php://stderr', $err_msg);
}
Mercurial에 비하면 편한 듯.
pre-commit 의 경우 commit dialog가 나오는데 거기에 stderr 로 메세지를 보내면 출력이 되므로 편하다.
Mercurial의 경우엔 에러메세지를 뿌리기 위해 따로 브라우저를 박은 실행파일을 하나 만들었었는데.
(사실 Mercurial도 python으로 제작한 hook script는 이게 가능한데 hook script가 PHP라서 그 땐 그랬다능...)
참조 : http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-settings.html#tsvn-dug-settings-hooks
'버전관리' 카테고리의 다른 글
[Mercurial] hg status - 저장소 상태출력 (0) | 2014.07.31 |
---|---|
[Mercurial] named branch (0) | 2014.07.31 |
[Mercurial] http 인증 for Linux (nginx, proxy, authorization) (0) | 2012.09.12 |
[Mercurial] http 인증 for Windows (nginx, proxy, authorization) (0) | 2012.01.04 |
[Mercurial] 특정 리비전 묶음으로 backout 하기 (backout revisions) (0) | 2012.01.03 |