2007-05-19

Mercurial で手軽な共有レポジトリをつくろう

SCM の Mercurial には CGI スクリプトがついてくる. これを使うと簡単に共有レポジトリを作ることができる. Web ブラウザからコードを閲覧できるし, 標準の hg コマンドからもさわれる. ためしにこのサーバ(さくらインターネットの賃貸)にインストールしてみたら, ちゃんと動いた. せっかくなのでインストール手順を簡単に紹介しておく.

さて, SCM が CGI として動くのは一部の人にとってキラーな機能かもしれない. ちょっと友達と一緒にコードをいじりたい. 家と学校で設定ファイルやメモを共用したい. そんな時に重宝する. 今時の先鋭的な Web の若者は自分の公開サーバがあるだろうけれど, 怠惰な中年にそういうものはない. 共有サーバの賃貸がせいぜい. なので CVS や Subversion はあてにできない. 有償の Subversion ホスティングに金を払うのも惜しいし, sourceforge や google code に登録するのも面倒だ. そんなあなた(というか私)は Mercurial を試してみていいと思う. 以上能書き.

なお以下で紹介する手順は Mercurial の Wiki にあるのと同じもので, 特に落とし穴もなかった. 公式情報が好きなひとはそちらを参照あれ: Setting up a Mercurial CGI Server, Publishing Mercurial repositories

前提条件

インストールを始める前に以下の点を確認しておく.

入手, 展開, インストール

Mercurial のソースコードをダウンロードして展開, 適当なローカルディレクトリにインストールする.

# サーバ側:
$cd tmp
$wget http://www.selenic.com/mercurial/release/mercurial-0.9.3.tar.gz
$tar xvzf mercurial-0.9.3.tar.gz
$cd mercurial-0.9.3
$python setup.py install --home=$HOME/local --force

レポジトリの準備

サーバ側で公開するレポジトリを手元で作り, サーバにコピーする. その際にサーバ側で必要な設定(hgrc の記述)も済ませておく.

# クライアント側:
$mkdir hello-hg
$hg init hello-hg
$vi hello-hg/.hg/hgrc

hgrc の中味はこんなかんじ:

[web]
push_ssl = false
allow_push = *

"allow_push = *" は任意のユーザにチェックイン(push)を許す設定. アクセス管理は apache に任せるので, ここでは素通ししていい. "push_ssl = false" は push の際に SSL を使わず素の HTTP を許す設定. このサーバは SSL を使えないから仕方なし.

準備ができたらレポジトリをまとめてサーバにコピーする.

# クライアント側:
$tar cvzf hello-hg.tgz hello-hg
$scp hello-hg.tgz ....

サーバ側でそれを適当な場所に展開する. ついでに CGI から書き換え可能なアクセス権を与える.

# サーバ側:
$cd ~/work/
$tar xvzf ~/tmp/hello-hg.tgz # hello-hg ディレクトリができる
$find hello-hg -type d | xargs chmod 777 # おおざっぱすぎるかも...
$find hello-hg -type f | xargs chmod 666

レポジトリづくりはサーバ側でやってもいいけど, hg コマンドを動かすには環境変数の設定などが面倒. 手元でやる方が楽だった.

CGI の設定

CGI フロントエンドのスクリプトを Web から見える適当なディレクトリにコピーし, 設定を書き換える.

# サーバ側:
$mkdir ~/www/hello-hg
$cp ~/tmp/mercurial-0.9.3/hgweb.cgi ~/www/hello-hg/index.cgi
$chmod 755 ~/www/hello-hg/index.cgi
$vi ~/www/hello-hg/index.cgi

スクリプトの書き換え箇所は二箇所ある. まずこのコメントを外して...

#import sys
#sys.path.insert(0, "/path/to/python/lib")

Mercurial をインストールしたディレクトリを指定する.

import sys
sys.path.insert(0, "/home/alice/local/lib/python")

あとはレポジトリの場所を指定する. 以下を...

def make_web_app():
   return hgweb("/path/to/repo", "repository name")

こんな風になおす.

def make_web_app():
   return hgweb("/home/alice/work/hello-hg", "Hello, Mercurial")

これで一応の設定は完了している. index.cgi の URL を開いてみよう. エラーでない画面が表示されたら成功. (こんなかんじ.)

チェックアウト (clone) も試そう.

# クライアント側
$cd ~/work/
$hg clone http://www.example.com/hello-hg/index.cgi hello-hg
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

hg clone で手元にレポジトリをコピーしている.

アクセス制限

現状では匿名でばりばり書き換え可能な状態になっている. Basic 認証くらいはかけておきたい. .htaccess を書こう. (ここから先は普通の CGI の話です.)

# サーバ側
$vi ~/www/hello-hg/.htaccess

.htaccess の中味はこんなの:

DirectoryIndex index.cgi

<Limit POST PUT>
AuthName Mercurial
AuthType Basic
# .htpasswd の作り方は適当にぐぐってください.
AuthUserFile /home/phantasien/.htpasswd
Require valid-user
</Limit>

設定を確認するために変更をチェックイン(push)してみる.

# クライアント側
$cd ~/work/hello-hg
$vi hello.txt
.... # なんか書く
# ローカルのレポジトリにチェックイン
$hg add hello.txt
$hg ci
# いざ push. 訊かれるパスワードは .htpasswd で設定したもの.
$hg push http://www.example.com/hello-hg/index.cgi
pushing to http://www.example.com/hello-hg/index.cgi
searching for changes
http authorization required
realm: Mercurial
user: alice
password:
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files

無事 push できればインストールはおしまい. 今日から君も Mercurian. クライアントの使い方は本家にある チュートリアル(日本語)を眺めてみてください.

proxy の設定

firewall の中にいる人は proxy の設定が必要になる. マニュアルによると, ローカルレポジトリの .hg/hgrc に設定を書けばいいらしい. (私はまだ試してない.)

[http_proxy]
host = proxy.example.com:8080

ざっとみたところ, Mercurial は GET と POST しか使わなそう. この素朴さも Mercurial の利点になるかもしれない. (.htaccess のサンプルは PUT もチェックしてるけど...) Subversion は PROPFIND のようなマイナーメソッドを使うため, 保守的な proxy をくぐれないことがある.

余談

Mercurial は受け入れられつつある. Mozilla も移行を決め, Tamarin は一足先に乗り換えた. Trac にも入りそう, 他も色々. 分散という点ばかり注目されているけれど, 試してみると全体に細々と出来がいい. それにブランチの手間がない Mercurial は私の好みにあう. なのでしばらく応援していきます. まともな GUI クライアントができないかなあ. 会社その他でも勧めやすくなるのに.