hgwebと2つのリポジトリでpull requestを開発フローに組み込む

http://connpass.com/event/445/:title=の成果です。
TODO: 動機付け

構成

f:id:troter:20120519174010p:image

hgwebでは次の二つのリポジトリを用意します。

通常の作業者は一のリポジトリを用意ます

pull requestを処理する人は二つのリポジトリを用意します。

0) hg clone (◆作業者/★pull request処理者)

pull専用リポジトリをクローンして作業用リポジトリ(とpull request取り込み用リポジトリ)を作成します。

$ hg clone http://hg.example.com/app app # 作業用リポジトリ
$ hg clone http://hg.example.com/app app-pull-request # pull request取り込み用リポジトリ
# もしくは
$ hg clone app app-pull-request # ハードリンクされるのでディスク容量が節約できる

push/pull先を変更する為に.hg/hgrcを書き換えます。

$ cd app
$ vi .hg/hgrc
  • .hg/hgrc
[paths]
default = http://hg.example.com/app
default-push = http://hg.example.com/app-work
app = http://hg.example.com/app
work = http://hg.example.com/app-work

default-pushを設定後に引数無しで'hg push'を実行すると、default-pushで指定したリポジトリ(http://hg.example.com/app-work)にpushを行います。

1) hg pull (◆作業者/★pull request処理者)

pull専用リポジトリから最新の変更を取り込みます。

$ hg pull
$ hg update # 必要に応じて

2) hg commit(◆作業者)

作業を行います

3) hg push --force -r . (◆作業者)

行った変更をpush専用リポジトリにpushします

$ hg push --force -r .

push専用リポジトリは変更点置き場です。マルチプルヘッドになっても良いのでどんどんforce pushしてしまいます。

4) pull request (◆作業者)

redmine等のitsにpull requestのイシューを登録します。
イシューにはpush専用リポジトリにpushした内容(headのurl)を貼り付けます。

# hgwebの場合のURLの例
http://hg.example.com/app-work/rev/973671fc0804

5) hg pull work -r REV (★pull request処理者)

pull request取り込み用リポジトリでpull requestを処理します。push専用リポジトリからpull requestに登録されたリビジョンをpullします。

$ hg pull work -r 973671fc0804

取り込み後、変更点のレビューを行ったり、mergeやupdateをして動作確認を行います。

$ hg log -r .:tip -p # .:tip で現在の場所から取り込んだ内容を指定出来る
$ hg merge tip # もしくは hg update

動作確認して取り込みが決定したらコミットします。(hg updateで済む場合は不要です)

$ hg ci -m "merge (pull request #123)" # pull requestのイシュー番号を含めます

取り込まない場合はイシュー等で連絡してpull requestを修正して貰います。その場合、pull request取り込み用リポジトリに取り込んだ変更点は一旦破棄します。

6) hg push app -r . (★pull request処理者)

最後に、pull request取り込み用リポジトリからpull専用リポジトリにpushします。

$ hg push app -r .

tips

pull requestの取り込み方について

pull requestは通常mergeで取り込みます。が、必ずmergeするべきというわけではありません。

  • pull requestの必要なリビジョンだけhg graftで取り込み
  • 常にrebaseして取り込み

も運用ルール次第でOKです。その場合はpull requestのイシューでmergeで取り込まなかったという事を伝えます。

履歴改変について

ルールは一つだけで、pull専用リポジトリの内容を変更してはいけません。
逆にpull専用リポジトリに取り込まれていない履歴は改変可能です。pull requestをrejectされた場合、がりがりに改変して新しくpull requestを出したりするのもOKです。

どれが最新か問題

hgwebだったら次のURLみて我慢

http://hg.example.com/app-workが汚くなる問題

汚くなるのが目的です。代わりにhttp://hg.example.com/appがクリーンに保てます。

bitbucketの有料プランでも使える

bitbucketの有料プランで6人以上でpull requestで開発を行っている場合も、この方法が有効。
というのも個人個人でforkしてしまうと5人までしか共有出来ないので。