commit dialog가 나오는 pre-commit hook을 기준으로 설명함.



hook script는 PHP 스크립트라고 가정함.

설정하는 부분 아래에 예제 스크립트가 있음.





context-menu 에서 TortoiseSVN > Settings 선택








Settings 창에서 Hook Scripts를 선택하고 Add 버튼 누름















Hook TypePre-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






Posted by bloodguy
,