彷徨えるフジワラ

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

名前付きブランチ全体の差分取得と revset 利用

revset 機能が導入される以前であれば:

名前付きブランチにおける、分岐時点から最新までの総差分

みたいなものを参照しようとした場合:

  1. "hg log -b ブランチ名 --template '{rev}\n'| tail -n 1" などで、最初の分岐リビジョン(BRANCHING)を取得
  2. "hg parents BRANCHING" で分岐リビジョンの親リビジョン(BASE)を取得
  3. "hg diff -r BASE -r ブランチ名" で差分を取得

といった手順が必要だったので、自分の書籍では:

名前付きブランチの作成の際には、分岐元リビジョンへのタグ付けを、ブランチの最初のリビジョンにするのがお勧め

としてあるのだけれど、revset を使えば:

  • 当該ブランチのリビジョン: "branch(ブランチ名)"
  • 且つリビジョン番号が最小(= 分岐リビジョン): "min(branch(ブランチ名))"
  • 且つ第1親: "min(branch(ブランチ名)) ^ 1"

という記述で分岐元リビジョンが導出できるので、以下のコマンド実行で差分が取得できる。

$ hg diff -r "min(branch(ブランチ名)) ^ 1" -r ブランチ名

とはいえ、内部的には高速化に関する配慮が色々とされているけれど、revset での絞り込みは決して安価な処理ではないので、履歴が膨大な場合には当然実行性能的な問題が生じ得る: 例えば『当該ブランチの最小リビジョン』導出は、履歴の全走査が必要。

まぁ、今時の個人が使用する端末の性能を考えると、先のエントリで書いたように『この程度の記述差で、目に見えて実行効率が低下することも無い』筈ではあるのだけれど、そういった状況への配慮が必要な場合であれば、『分岐元リビジョンへのタグ付け』は依然として有効な筈。