Mercurial を DreamHost で使う

この文章では、分散バージョン管理システム Mercurial のレポジトリを DreamHost 上に置いて使う方法を説明します。

更新履歴

ssh 経由で使えるようにする

まず DreamHost にログインして、Mercurial をインストールします。

% ssh example.com
...
$ pwd
/home/alice
$ wget http://www.selenic.com/mercurial/release/mercurial-1.0.tar.gz
...
$ tar zxf mercurial-1.0.tar.gz
$ cd mercurial-1.0
$ python setup.py install --home $HOME/local
$

インストールできたかどうか確認してみます。 ~/local/lib/python にインストールされたファイル群が hg から見つかるよう環境変数 PYTHONPATH の指定が必要です。

$ ~/local/bin/hg version
Traceback (most recent call last):
  File "/home/kzys/local/bin/hg", line 11, in ?
    from mercurial import demandimport; demandimport.enable()
ImportError: No module named mercurial
$ PYTHONPATH=~/local/lib/python ~/local/bin/hg version
Mercurial Distributed SCM (version 1.0)

...
$

次に、空のレポジトリを手元で作り DreamHost 上にコピーします。

% mkdir hello
% cd hello
% hg init
% scp -r . example.com:/home/alice/hello
...
%

このままでは、いまコピーしたレポジトリは clone できません。

% hg -v clone ssh://example.com//home/alice/hello
running ssh example.com "hg -R /home/alice/hello serve --stdio"
remote: bash: line 1: hg: command not found
abort: no suitable response from remote hg!
%

bash から hg が見つかるように PATH と、さらに前述の PYTHONPATH を設定するよう、 DreamHost 側の ~/.bashrc を書き換えます。

export PATH=$HOME/local/bin:/usr/local/bin:/usr/bin:/bin
export PYTHONPATH=$HOME/local/lib/python

これで、DreamHost 上のレポジトリから clone して、変更を加え、 変更点を push する、という一連の流れが動くようになります。

% hg -v clone ssh://example.com//home/alice/hello
no changes found
resolving manifests
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
% echo hello world > hello.txt
% hg add hello.txt
% hg commit -m 'Added a file.'
% hg push
pushing to ssh://example.com//home/alice/hello
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 1 changes to 1 files
%

Web から読めるようにする

まず、DreamHost Panel からサブドメインを追加します。 "FastCGI Support?" にチェックをいれておいて下さい。

次に hgwebdir.cgi を hg.example.com にコピーします。

$ cd ~/hg.example.com
$ cp ~/mercurial-1.0/hgwebdir.cgi .
$ chmod +x hgwebdir.cgi

hgwebdir.cgi を直接編集して ~/local/lib/python をみるようにします。

...
# adjust python path if not a system-wide install:
import sys
sys.path.insert(0, "/home/alice/local/lib/python")
...

~/hg.example.com/hgweb.config というファイルを作り、レポジトリ群の場所を指定します。

[collections]
/home/alice/repos/ = /home/alice/repos/

これで http://hg.example.com/hgwebdir.cgi からレポジトリが読めるようになります。 clone もできます。

% hg clone http://hg.example.com/hgwebdir.cgi/hello
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
%

URI をきれいにする

URI に hgwebdir.cgi という文字列がはいっているのは、あまりきれいではありません。 mod_rewrite をつかって http://hg.example.com/hello/ のようなアドレスでレポジトリにアクセスするよう変更します。

まず ~/hg.example.com/.htaccess に以下のように記述します。

RewriteEngine On
RewriteRule ^$ hgwebdir.cgi  [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) hgwebdir.cgi/$1  [QSA,L]

次に、mod_rewrite でマップした URI にむけて hgwebdir.cgi がリンクをつくるよう、 ~/hg.example.com/hgwebdir.cgi の先頭付近に以下のような記述を追加します。

#!/usr/bin/env python
#
# An example CGI script to export multiple hgweb repos, edit as necessary

# clean URI
import os
os.environ['SCRIPT_NAME'] = os.getenv('SCRIPT_URL')[:-len(os.getenv('PATH_INFO', ''))]
...

これで http://hg.example.com/ にリポジトリ一覧が、そしてそこから、 個々のレポジトリの http://hg.example.com/hello/ へと行けるようになります。

参考