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 がインストールされていること (最新の 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 クライアントができないかなあ. 会社その他でも勧めやすくなるのに.