커밋이 되기 전에 hook은 precommit, pretxncommit 2가지가 있는데,
pretxncommit 이 커밋될 changeset이 완성된 다음의 hook 이라 이걸 이용함.

아래와 같은 과정을 거친다.
pretxncommit hook -> hook process -> exitcode가 0이면 커밋진행, 0이 아니면 커밋중단(rollback)


1. hgrc
mercurial 저장소 경로의 .hg 폴더에 hgrc 파일이 있다. (없으면 만들면 된다)
hook 을 걸려면 아래처럼 입력 후 저장.

[hook]
pretxncommit.myhook = 후킹_프로그램


원래 환경변수가 몇가지 있는데 윈도우즈에선 영 안먹히는 것 같아서 그냥 뺐음.




2. 후킹_프로그램
hg commit 을 하면 커밋될 changeset을 완성한 후 후킹 프로그램을 호출해준다.
실행되는 순간의 작업디렉토리가 저장소 디렉토리이므로 hg 명령어를 이용해서 여러 정보를 수집한 다음 처리가 가능하다.




3. 예제
Windows에서 커밋훅을 걸어 메인저장소에서 받아오지 않은 incoming changeset이 있는지 체크하고,
있으면 커밋중단(rollback), 없으면 커밋을 진행시키는 예제.
사용된 언어는 그냥 php 임.


hgrc
[hook]
pretxncommit.myhook = C:\xampp\php\php.exe C:\hook.php



hook.php
<?PHP
// incoming 되어야 할 changeset이 있을 경우 커밋 중지
if (strpos('changset:', shell_exec('hg incoming'))!==false) exit(1);
// 없다면 커밋진행
else exit(0);




예제는 정말 초단순한 예제이고,
실제로는 명령어를 조합하든가 해서 데이터를 잔뜩 모아 얼마든지 세밀한 체크가 가능하다.
그리고 php같은 언어가 아닌 Windows에서 UI를 표현할 수 있는 다른 언어로 처리한다면,
커밋을 할지 말지 사용자 입력도 받을 수 있고 체크된 내용을 보여줄 수도 있으니 좋음.





Posted by bloodguy
,