Mercurial Advent Calendar 2011 〜自鯖で公開レポジトリ〜

はじめに

私自身は、Mercurialを使い始めてだいたい1年ぐらいになる。

元々は特に理由もなくSubversionを使っていたのだが、レポジトリを自鯖で公開したいと思うと色々不満が多く、乗り換えを決意した。

Gitと比較検討した結果、まぁMercurialが一番手っ取り早そうだという結論に達したのが、Mercurialの始まりである。まぁつまりMercurial使ってる最大の理由は簡単にレポジトリを公開できそうだったから、という辺りである。

レポジトリの公開方法

実際問題レポジトリを公開しようと思い立った時、大きく2つの手段がある。

ぶっちゃけると後者の方が簡単で安いし安定している。Bitbucketは確か無料だった筈で、その点でも特に問題は無い。というかBitbucket使いたくてMercurial使ってる人もいるらしい。

(そういえば良く見てみると20日に@terapyon さんからBitbacketについて詳しい説明があるようです)

それでも自鯖Mercurialレポジトリを立てたい人向けの話。

ちなみに基本的にはPythonCGIなので、レンタルサーバの類でMercurialレポジトリを立てる場合、最低でもPythonの実行許可が必要になる。

どんな感じ?

私が公開しているレポジトリが

http://ponkotuy.com/hg

こんな感じである。必要最低限の機能は揃っている。デザインとかは特に変更していない(可能だと思われるがやってない)

ちなみに以下の方法では自由に変更(push)することはできない。hg cloneはできる。pushしたい場合は別の手法(例えばSSHとか)を用いる必要があると思われる。

単独レポジトリ公開

1つのレポジトリだけ公開すればいい時は

http://mercurial.selenic.com/wiki/JapaneseCGI_Install

この通りにやればいい。

複数レポジトリ公開

複数のレポジトリを公開する場合は、とりあえず単独の場合と同じく

  • Apache2, Mercurialのインストール
  • Apache2の設定ファイルの設定
  • /var/www/cgi-hgを作成

まで行う。

次にディレクトリ構造を作る。複数レポジトリ公開する場合は基本的に、

  • トップページで、保持するレポジトリの一覧を表示できる
  • 直接それぞれのレポジトリにアクセスできる

という条件を満たしたいので、cgi-hg直下に、cgi-hg/app1, cgi-hg/app2等、各レポジトリのディレクトリを置く。各々のディレクトリには先程の単独レポジトリ公開と同じようにindex.cgiを置く。

トップディレクトリにも/usr/share/doc/mercurial-common/example/hgweb.cgi をindex.cgiにrenameして持ってくるが、今度はconfig変数を以下のように置き換える。

config = "/var/www/cgi-hg/hgweb.config"

更に、以下のような内容のhgweb.configを作成する

[paths]
app1 = /home/user/repos/dir

[collections]
app1/ = app1/

※私もcollectionsの意味が良く分かっていないが、アプリの短縮名とディレクトリ名は一致させておいた方が、この辺で苦労しなくて済む気がする。

あと、各々のレポジトリ内にある.hg/hgrcに

[web]
description = Repo Name
author = ponkotuy<mail@address>
allow_archive = gz, zip, bz2

と書いておく。この情報を元にトップページを生成する為である。

最後に

日時がオーバーしてしまったのでこの辺りで止めておく(というか疲れた)が、英語を読む根気のある人は

http://mercurial.selenic.com/wiki/HgWebDirStepByStep

なんか読むと更にカスタマイズできたりWindowsでもできたりして幸せになれるかもしれない。

さぁみんなも自鯖でレポジトリを公開してみよう!

1.6より前の話。

1.6より前では、/usr/share/doc/mecurial-common/examplesにhgwebdir.cgiがあるのでこれをコピーすればOKだった。というかそれ前提で書くつもりだったが誤算であった。調べてみると、

http://mercurial.selenic.com/wiki/HgWebDirStepByStep

Starting with version 1.6 of Mercurial, the hgwebdir.cgi script has been unified with the hgweb.cgi script. Wherever hgwebdir.cgi is referred to in these directions, you can substitute the hgweb.cgi script instead.

どうやらindex.cgiに統合されたようだ。(上に続く