서브버전 저장소 꾸미기
며칠 전에 개인적으로 쓰는 서브버전 저장소를 지인의 서버에서 제 서버로 옮겨 오면서 "어쩌면 이렇게 해도 되지 않을까?" 하고 시작한 것이 지금까지 왔습니다. -_-; 뭔 짓을 했냐 하면 대강 이렇게 생겼습니다.
쉽게 말하면 서브버전만으로 ViewVC 비슷한 것 만들기라고 할 수 있겠습니다. 네. 농담이 아닙니다.
서브버전을 WebDAV를 쓰도록 설정하면 저장소에 웹으로 접속했을 때 저장소 안에 있는 파일들의 목록을 들여다 볼 수 있습니다. 물론 이 목록은 꽤 밋밋하게 생겼지만 SVNIndexXSLT를 사용하여 XML 출력을 변환해 보여 줄 수 있는데, 이 변환된 HTML에서 XMLHttpRequest(다들 ajax라고 부르는 그...)를 사용해서 더 자세한 정보를 보여 주는 것입니다.
예시는 http://svn.mearie.org/snippets/sheepcount/ 에서 볼 수 있고, 다음 파일들이 실제로 화면을 꾸며 주는 역할을 합니다. (제 사이트에 맞게 되어 있기 때문에 어느 정도의 수정은 필수입니다.)
- http://mearie.org/res/svnindex.xsl - 실제 XSLT 파일. 경로 정도만 수정하면 그대로 쓸 수 있을 듯 합니다.
- http://mearie.org/res/svnindex.css - XSLT 파일에서 불러 오는 CSS. 사이트에 따라 적절히 수정해야 합니다.
- http://mearie.org/res/svnindex.js - XSLT 파일에서 참조해서 파일 정보와 로그 정보를 얻어 오는 자바스크립트.
구조는 그다지 어렵지 않은데, 다음과 같습니다.
- svn.mearie.org의 루트에 서브버전 저장소가 있고, SVNIndexXSLT 명령으로 /*svnindex*라는 XSLT를 불러 쓰도록 되어 있습니다. XSLT 파일을 외부에 둘 수도 있지만 이럴 경우 일부 브라우저(특히 파이어폭스)에서 외부 도메인 제약 때문에 아예 못 불러 오는 경우가 생깁니다.
-
<a href="http://svn.mearie.org/*svnindex*" rel="nofollow">http://svn.mearie.org/*svnindex*</a>
로 접속하면<a href="http://mearie.org/res/svnindex.xsl" rel="nofollow">http://mearie.org/res/svnindex.xsl</a>
의 내용을 그대로 갖다 보여 줍니다. 이 과정은 생각보다 어려운데 저장소가 루트에 있어서 그 안에 저장소가 아닌 내용을 집어 넣기 힘들기 때문입니다. 여러 번의 시도 끝에 현재는 mod_rewrite에서 프락시로 접속하는 방법을 (아쉬운 대로) 쓰고 있습니다. -
<a href="http://svn.mearie.org/*" rel="nofollow">http://svn.mearie.org/*</a>(rev)*/path
식의 URL은 mod_rewrite로<a href="http://svn.mearie.org/!svn/bc/" rel="nofollow">http://svn.mearie.org/!svn/bc/</a>(rev)/path
로 넘겨 줍니다. 이 과정은 옛날 리비전의 파일을 좀 더 예쁜(?) URL로 보여 주기 위해서 사용했습니다. 다른 URL을 원하신다면 svnpath2url을 고치셔야 겠지요. - svnindex.xsl은 svnindex.css와 svnindex.js를 참조하고, 입력받은 XML을 사용해서 subversion_entries라는 함수를 호출해 자바스크립트에게 현재 있는 파일들의 목록을 넘겨 줍니다.
- svnindex.js에서는 "Extended view" 체크박스가 켜졌을 때 지정된 엘리먼트에 XMLHttpRequest로 리비전 정보와 날짜, 커밋한 사람 아이디를 보여 줍니다. 이 과정은 retrieve_svn_info_from_* 함수들이 맡으며, from_headers로 하면 GET 요청을, from_props로 하면 PROPFIND 요청을 합니다. (GET 요청은 리비전 번호와 파일 크기만을 반환합니다. 기본값은 PROPFIND입니다.)
- 리비전 번호를 클릭하면 retrieve_svn_log_report 함수가 REPORT 요청을 보내서 로그 정보를 받아 옵니다. (아마도 인터넷 익스플로러 7에서는 REPORT 메소드를 XMLHttpRequest에 쓸 수 없는 듯 합니다. 일단은 꺼 놓았습니다.)
- 그 밖에 previous/next를 클릭하면 이전 리비전이나 다음 리비전으로 가고, README.* 같은 파일이 있으면 받아 와서 보여 주는 기능도 있는데 이 부분은 그다지 어렵지 않고 간단하게 구현되어 있습니다.
http://svn.collab.net/repos/svn/trunk/notes/webdav-protocol 를 참고하시면 이 스크립트에서 사용한 PROPFIND와 REPORT 요청의 구조를 쉽게 알 수 있습니다. 이를 응용해서 자바스크립트 서브버전 클라이언트를 만들 수도 있을 것 같은데, 브라우저 제약 때문에 쉽지는 않을 듯 싶습니다. :p
한 번 심심하시거나 ViewVC를 쓰기 싫어하시는 분께는 괜찮은 접근 방법일 지도 모르겠습니다. (저는 개인적으로 CGI 설정하는 걸 싫어해서 ViewVC를 잘 안 씁니다.)
와우! 정말
와우! 정말 멋지네요~
근데 .. viewcvs가 viewvc로 된건가요? 예전에 php였던 것 같은데 python으로 바뀌면서 CGI설정을 해야하나보군요 :( viewsvn 이녀석은 php만 있어도 되는 것 같네요~
viewcvs, viewvc
viewcvs가 viewvc로 이름을 바꾼 것이니 두 프로젝트는 같은 프로젝트입니다. viewcvs는 언제나 파이썬이었고 PHP였던 적이 없습니다.
websvn이 PHP였습니다.
websvn이 PHP였습니다.
그 밋밋한 화면이
그 밋밋한 화면이 이렇게 예뻐졌군요. :)
오!
오! 대단합니다.
댓글 달기