この文章では、分散バージョン管理システム Mercurial のレポジトリを DreamHost 上に置いて使う方法を説明します。
まず 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 %
まず、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 に 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/ へと行けるようになります。