Sep 10 2008
CVS loginfo(post-commit trigger) 작업
(프로젝트 중에 CVS 를 연동해야 하는 작업이 있어서, 당분간은 CVS 사용 관련 포스팅이 이어질 것 같다.)
CVS 의 저장소에 변경이 일어나는 시점에(commit) 특정 명령을 수행하게 할 수 있다.
자세한 설명은 아래의 post를 참조하고…
여러 trigger 가 있지만, 그 중 commit 이후 수행되는 trigger 는 loginfo 이다.
trigger 를 수정하는 방법 중 가장 안전한 것은 저장소의 CVSROOT 모듈을 checkout 하고 수정한 다음 commit 하는 것이다.
포스트를 참고로 해서 loginfo 에 한 줄을 추가해 넣었다.
test/* (/cvs-log/postCommit.sh %p %{sVv} $USER)
test 모듈의 모든 파일을 대상으로 commit 발생 시 /cvs-log/postCommit.sh 를 실행하겠다는 뜻이다.
괄호 안의 내용들은 그대로 shell에서 실행되므로 실행될 argument 문자열을 입맛에 맞게 조절할 수 있다.
아래 인자들은 CVS에 의해 정보로 변환되어 들어간다.
%p : 디렉토리 경로(모듈 경로가 포함됨. ex. test/DirectoryA/)
%{sVv} : s 는 파일명, V 는 기존 버전 번호, v 는 신규 버전 번호
$USER : commit 한 유저 아이디
commit 시에 디렉토리 별로 shell 이 한 번 실행되는 것 같다. 예를 들면 commit 시에 변경 파일들이…
test/DirA/A.txt 1.1 -> 1.2
test/DirA/B.txt 신규(1.1)
test/DirB/C.txt 삭제(기존 1.3)
test/DirB/D.txt 1.3 -> 1.4
이라면 shell 은 이렇게 실행되었다.
/cvs-log/postCommit.sh test/DirA/ A.txt 1.1 1.2 B.txt NONE 1.1 cvsuser
/cvs-log/postCommit.sh test/DirB/ C.txt 1.3 NONE D.txt 1.3 1.4 cvsuser
예외 사항이 있다면, 디렉토리는 ADD 할 때 바로 hook 이 동작한다. 디렉토리 자체가 cvs에서는 commit 으로 추가되는 개체가 아니다.
그리고 파일과 구분하기 위해서, 디렉토리는 파일 명 부분에 ‘-’ 가 한 번 들어온다. (이후에 New, directory 가 더 들어오는데 알아서 걸러내면 된다.) 버전은 NONE NONE 으로 들어오니 이를 통해 구분해도 될 것으로 보인다.
CVS 는 디렉토리를 삭제할 수 없다. 저장소(물리적인 위치) 에서 직접 rm -rf 명령으로 삭제하여야 한다. 그러므로 디렉토리 삭제에 대한 감지는 되지 않는다.
postCommit.sh 자리에는 실행 가능한 어떠한 것이라도 올 수 있다. 여기서는 shell script 를 적었지만 그냥 막바로 프로그램을 돌릴 수도 있다. 링크된 post에서는 cvs 의 commit 이 block되기 때문에 처리가 많이 걸리는 것은 직접 걸어두지 말고 프로세스를 하나 더 두는 것을 제시하고 있다.
작업시 주의해야 할 것은, cvsd 설치 시에 chroot jail 설정을 한 경우에는 loginfo 가 실행하는 디렉토리 경로도 chroot가 적용된다는 것이다. (이것때문에 거의 반나절 가까이 보냈다.)
loginfo 가 실행해 주는 셸 내에서도 chroot가 적용되는 것으로 확인했다. (프로그램도 아마 마찬가지가 아닐까 생각된다.)
위의 예를 들자면, cvsd가 /var/lib/cvsd 에 설치되고 chroot 가 /var/lib/cvsd 로 설정되어 있다면, postCommit.sh 파일은 /var/lib/cvsd/cvs-log/ 에 위치해 있어야 한다.
그리고, sh(shell 실행파일) 이라던지 cat, date 등이 없기 때문에 필요하다면 chroot 의 해당 디렉토리로 복사해 넣어야 한다.
윈도우즈에서만 작업하다가 linux 작업을 하다 보니 chroot 에 대해 전혀 모르고 있다가 된통 당할 뻔했다.
ps. 작업환경은 우분투 OS 에 cvsd 패키지를 설치했고, CVS 버전은 1.12.13 (client/server) 이다.
ps2. received broken pipe signal 에러가 나서 한참 고생했을 때 chroot 문제임을 알게 해 준 포스트
