彷徨えるフジワラ

年がら年中さまよってます

MQ におけるフェーズ機構

Mercurial 2.1 版から導入されたフェーズ機構は、『必要が無ければ、特に意識する必要が無い』類のもの。

でも、折角なので、一番手っ取り早くフェーズ機構の恩恵を受けるであろう MQ との併用モデルについて説明する。

以下の説明は、フェーズ機構の概要に関しては把握していることが前提。

まだ概要を知らない人は、"hg help phases" を参照のこと(ウェブ経由でも参照可能)。"s" が付く方 (phases) が概念としてのフェーズの説明で、付かない方がコマンドとしての phase の説明なので注意。

# "export LANG=ja" 設定等が有効になっていれば、日本語化された説明を参照可能

さて、MQ を使っていて何が一番怖いかと言うと、個人的には以下の状況:

push/pull/clone 契機で、MQ 配下のリビジョンが外部に漏れてしまう

一応、随分前から push でのガードは掛かるようになったのだけれど、MQ 運用中のリポジトリに対する pull/clone にはガードが掛からないので、うっかり作業環境の更新を取り込もうとした際に、作業途中のリビジョンが紛れ込んだりするのだ。

# まぁ、『うっかり取り込もうとする』のが悪いと言えば悪いのだけれど....

2.1 版以降の Mercurial であれば:

[mq]
secret = True

上記の設定を追加しておくことで、『MQ 配下のリビジョンのフェーズは常に secret』という扱いになる。

フェーズが secret なリビジョンは push/pull/clone の対象から除外されるので、それは即ち MQ 管理下のリビジョンは push/pull/clone からガードされるということ。

これで安心して MQ パッチを当てたままでリポジトリを放置しておける(笑)。

"secret = True" 設定は、qpush 以外にも、『リビジョン指定 (-r/--rev) 付き qimport による、MQ 管理下への既存リビジョンの取り込み』でも有効。

2.1 リリース直前には:

  • MQ 配下のものは問答無用で secret 化
  • 但し、 "qimport -r REV" での取り込みでは、既存フェーズをそのまま維持
  • qpop 後に再度 qpush すると secret 化される

みたいな、ちょっと変な仕様だったり、『MQ 配下は完全に secret 化した方がよくね?』という提案が却下されたりと、結構ドタバタしていたので、この辺はリリース後に解説とかを書いた方が良いかも?と思っていたのだけれど、最終的には比較的自然な仕様に落ち着いたと言えるのかな?

# どっちにしても解説エントリを書いたわけだけど (^ ^;;)

ちなみに、secret な MQ 配下のリビジョンを、qfinish で通常リビジョン化した場合、フェーズは secret のまま維持されるので:

qfinish したリビジョンを共有リポジトリに push できない!!

といったことで慌てないように注意。

一応『secret 以外に連携先リポジトリに反映するリビジョンが無い』場合には、"(ignored xxxx secret changesets)" みたいな感じでメッセージが出るけれど、裏を返すと『secret 以外に反映するリビジョンが1つでもあればメッセージが出ない』ことでもあるので、最悪2回目の "hg push" でないとこのメッセージは表示されないのだ。