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 がインストールされていること (最新の 0.9.3 が望ましい. 0.9.0 はバグあり.)

サーバで CGI が動くこと

サーバでシェルが使える(ssh でログインできる)こと

サーバで Python 2.3 以降が使えること (python -v で確認)

サーバで C コンパイラが使えること (which gcc で確認)

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

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 クライアントができないかなあ. 会社その他でも勧めやすくなるのに.