個人で使う mercurial リポジトリを集約したい

独りで細々とプログラム組みたい私による私のためのさすらいメモ。

# これまで

自宅で趣味開発を行う際にバージョンコントロールシステムというか集中ソース管理の場所として、部屋内自前サーバーに Subversion を仕込んで長らく使ってきました。多分十年以上。

どうせ使うのは独りだし今でも問題ないのですが、流石に時勢として Subversion は過去のモノになりつつあるので乗り換えようかなあというのは度々考えていました。しかし、一斉を風靡している git はなんか肌に合わなくて仕事で使うならともかく、個人の趣味でも使いたいと思わなかったのですね。このへん好みの問題。

長らく mercurial を知らなかったのですが、git の他になんかないかなーと探していてようやく巡り合えました。
git とそんなに違わないじゃないと言われるとそうなんですが、svn 使いだったからかアクション名がほど良く近くて TortoiseHG が良くできているので気に入った次第。

mercurial のリポジトリサーバーとしては Bitbucket を選択して使い始めました。プライベートリポジトリが製作し放題というのも個人開発用として魅力です。(有料コースは主にチーム開発オプション)

そんなこんなで Bitbucket と mercurial を使って半年くらい経ったのですが、そろっと不満も出てきました。

やっぱり手元の自分用サーバーにリポジトリを集約したいな、と。


# 不満に思うこと

## 一カ所にリポジトリを集めておきたい
mercurial は git とほぼ同等な分散型リポジトリデータベースです。サーバーとクライアントといった区分が無くみなさんの手元にあるリポジトリが全てを含んでいますし、これが複数台に clone されていたらその時点で分散バックアップですから、どれか一台がクラッシュしても他のマシンから(ある程度)復旧できます。
なので、個人開発においてはサーバーに置く必要すらなく HDD の中でリポジトリを作ってバージョン管理していればそれで良いはずですね。

しかし、外のサーバーにデプロイするときとか、別のマシンで開発の続きをやるときとかでリポジトリが分散しがちです。管理意識の高い人でもないと HDD 内のリポジトリがどれとどれかが分からなくなるかもしれません。いや、分からなくなる自信がある！

なのでやっぱりサーバーがあってそこにリポジトリをまとめたいなと。

## 小さいリポジトリで埋もれる

リポジトリの集約については Bitbucket の利用で解決されるのですが、使っていくうちにやっぱりというかなんというか書き捨てプログラムとかの小さいリポジトリがいっぱいできていきます。それもプライベートで。

そういったカスみたいなコードをいちいちご大層なプロジェクト管理ツールに預けているのもむずがゆいというか、もうすこし小規模で良いんじゃねという気分になってきたのですな。

## バックアップ取りたい

あと、バックアップを自分でコントロールしたい。
サーバーのバックアップって自分で仕込むから自分の納得のいくスパン(場合によっては取らないという選択も含め)で行えるので、なんか安心感あるし、いざというとき復帰できるもできないも自分の裁量なので気が楽なのである。

なのでやっぱ外部サービスじゃなくてローカルにリポジトリサーバー持ちたくなってきた。

## WEBリポジトリマネージャを探す

最初にやったことは既存のリポジトリ管理ツールを探すことでした。
しかしまあ trac に始まり SCM-manager 等の色々な管理ツールは「プロジェクト」の管理であり、チームが効率よく動けるための仕組みである。何かというと大きすぎる。ゴミみたいなコードをたくさん作るにはちょっと大きいなというのは Bitbucket と同じ感じなわけです。

ここまで来てなんとなくわかった。
自宅サーバーに Subversion のサーバー入れてソースコードを出し入れしていただけのあの時代に戻りたいんだな、と。


# 実現したいこと

 * 個人サーバー内の 1つのディレクトリにリポジトリをたくさん作りたい、まとめたい、そこそこ管理したい

 * ブラウザでリポジトリへのパスを一覧して clone 時にパスをそこからコピペしたい

 * まとめておけばサーバーのバックアップとともにリポジトリもバックアップ取れて欲しい(☆オプショナル)

 * シンプルにいきたい


# 調査するよ

## シンプルなリポジトリサーバー

mercurial は git と同じく clone でリポジトリのコピーを取るだけだから、サーバー上のディレクトリにリポジトリ作っておいてそこに ssh で入ってコピーしてくるだけというのが一番シンプル。サーバーらしいサーバーは ssh だけですむわけです。
サーバー上のユーザーディレクトリに、ここがリポジトリ置き場だよというのを決めてそこにどんどん作れば良い。

## リポジトリの一覧

mercurial にはサーバーモードがあって

`$ hg serve`

でリポジトリを http 公開できます。

ツリーが見れたりそこから clone できたりなかなか高機能。hgweb.cgi はこれを httpd からのキックで起動するためのコンビニエンスインタフェースですな。

実のところ私の要求の半分くらいこの mercurial の標準機能でまかなえちゃいます。

残りの惜しいところは何かというと、この WEBインタフェースからリポジトリを新規作成できないところなのです。サーバーにログインして手作業でリポジトリ作れば良いと言えば良いのだけれども、ちょっとでも Bitbucket を使ってしまったので WEB からリポジトリ作成したいのですよ。

## 自動で update する

サーバー上のディレクトリから ssh で clone する、ここまでは良いのです。次に、ローカルでコミットした成果を push すると、サーバー上のリポジトリにとっては pull リクエストなので誰かが update するまでその push が反映されません。

リポジトリサーバーとしてはちょっと問題です。

サーバー上のリポジトリは .hg/hgrc にフックリクエストを追加して、push されたら自動的に update をかけるようにしましょう。

```init:hgrc
[hooks]
changegroup = hg update >&2
```

これでサーバー上のリポジトリが自動的に update されて「集約」の意味を持つようになりますね。


# 実装したよ

結局

 * ディレクトリ内のリポジトリ一覧を表示する
 * リポジトリを作成する
 * それらをWEBインタフェースで利用できる

という要求を満たすツールが無かったので localhgbowl という名前の超小物プログラムを自作しました。

ずいぶんと色気の無い画面ですが自分で使うには十分なのでまずはこんなところから。
![2014-12-20_064543.png](https://qiita-image-store.s3.amazonaws.com/0/50737/4d757559-240c-25ff-39fa-8f0548636cd2.png)


公開リポジトリはこちら
https://bitbucket.org/rerofumi/localhgbowl


回りくどいうえに大したことやってねえなとか、github 使えとか色々あるとは思いますが、好みやこだわりは人それぞれということで。