서브버전 저장소 꾸미기

lifthrasiir의 이미지

며칠 전에 개인적으로 쓰는 서브버전 저장소를 지인의 서버에서 제 서버로 옮겨 오면서 "어쩌면 이렇게 해도 되지 않을까?" 하고 시작한 것이 지금까지 왔습니다. -_-; 뭔 짓을 했냐 하면 대강 이렇게 생겼습니다.

쉽게 말하면 서브버전만으로 ViewVC 비슷한 것 만들기라고 할 수 있겠습니다. 네. 농담이 아닙니다.

서브버전을 WebDAV를 쓰도록 설정하면 저장소에 웹으로 접속했을 때 저장소 안에 있는 파일들의 목록을 들여다 볼 수 있습니다. 물론 이 목록은 꽤 밋밋하게 생겼지만 SVNIndexXSLT를 사용하여 XML 출력을 변환해 보여 줄 수 있는데, 이 변환된 HTML에서 XMLHttpRequest(다들 ajax라고 부르는 그...)를 사용해서 더 자세한 정보를 보여 주는 것입니다.

예시는 http://svn.mearie.org/snippets/sheepcount/ 에서 볼 수 있고, 다음 파일들이 실제로 화면을 꾸며 주는 역할을 합니다. (제 사이트에 맞게 되어 있기 때문에 어느 정도의 수정은 필수입니다.)

Cookies 등의 클래스는 적절히 만들어 쓰셔야 합니다. 맨 앞부분의 svnpath2url와 svnpathexpand 함수는 저장소 경로에 따라서 다소 수정해야 합니다. (루트에 있다면 그대로 써도 됨)

구조는 그다지 어렵지 않은데, 다음과 같습니다.

  • 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를 잘 안 씁니다.)

Forums: 
lacovnk의 이미지

와우! 정말 멋지네요~

근데 .. viewcvs가 viewvc로 된건가요? 예전에 php였던 것 같은데 python으로 바뀌면서 CGI설정을 해야하나보군요 :( viewsvn 이녀석은 php만 있어도 되는 것 같네요~

feanor의 이미지

viewcvs가 viewvc로 이름을 바꾼 것이니 두 프로젝트는 같은 프로젝트입니다. viewcvs는 언제나 파이썬이었고 PHP였던 적이 없습니다.

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

websvn이 PHP였습니다.

gamdora의 이미지

그 밋밋한 화면이 이렇게 예뻐졌군요. :)

hongminhee의 이미지

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.