2012年1月15日日曜日

qguardを使ってみた #TokyoMercurial の感想込

TokyoMercurialへ行って来ました。

内容は意外なことに、個々でモクモク。
たまに来る質問に対して盛り上がる系でした。

@modal_soulさんによるTweetのまとめはこちら
#TokyoMercurial #1 まとめ その1
#TokyoMercurial #1 まとめ その2

次回は2/25

感想
変態や神の多い勉強会で楽しかったw




そんな質問->盛り上がるのなかで「qguard」という単語が出てきました。
知らなかったので使ってみた。

てかそもそもqguardってなんやねん。

$ hg -v help qguard
hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]

パッチのガード設定ないし表示

    「ガード」はパッチ適用の可否を制御します。 ガードが設定されていない
    パッチは常に適用されます。 「正」のガード(例: "+foo")が設定された
    パッチは、 "hg qselect" によって当該ガードが設定されている場合に限り
    適用されます。 「負」のガード(例: "-foo")が設定されているパッチは、 "hg
    qselect" によって当該ガードが設定されている場合は適用されません。

    引数指定が無い場合、 現在のガード選択状況を表示します。
    引数が指定された場合、 指定パッチに対するガード選択を設定します。

    備考:
       「負」のガード設定には、 ガード指定の前に '--' 指定が必要です。

    現行パッチ以外にガードを設定するには:

      hg qguard 対象パッチ名 -- +2.6.17 -stable

    成功時のコマンド終了値は 0 です。

らしい。

とりあえず試してみる。

@  チェンジセット:   3:f8c4733a0105
|  タグ:             tip
|  ユーザ:           dnk
|  日付:             Sat Jan 14 22:57:24 2012 +0900
|  要約:             4th
|
o  チェンジセット:   2:38ad6ad44a14
|  ユーザ:           dnk
|  日付:             Sat Jan 14 22:56:26 2012 +0900
|  要約:             third
|
o  チェンジセット:   1:22ff7bf5abb1
|  ユーザ:           dnk
|  日付:             Sat Jan 14 22:55:21 2012 +0900
|  要約:             second
|
o  チェンジセット:   0:bbd7202921cd
   ユーザ:           dnk
   日付:             Sat Jan 14 22:54:47 2012 +0900
   要約:             first
とりあえずこんな感じのものを用意。
上記の状態の準備すらメンドイ人向けに https://bitbucket.org/daneko/qguardtest1 に配置しました

一旦全部パッチ化

$ hg qimport -r 1 -r 2 -r 3
$ hg qguard -l
1.diff: unguarded
2.diff: unguarded
3.diff: unguarded

1,2にマイナスのガードを追加
これ個別にしか指定できないのかなぁ…

$ hg qguard 1.diff -- -hoge
$ hg qguard 2.diff -- -hoge
$ hg qguard -l
1.diff: -hoge
2.diff: -hoge
3.diff: unguarded
$ hg qpop -a

$ hg qselect hoge //ガードを選択
ガード設定の変更により、 適用除外パッチ数が 3 から 1 になりました

$ hg qpush -a
3.diff を適用中
適用中の最上位パッチは 3.diff です
$ hg glog
@  チェンジセット:   1:45ac9d559036
|  タグ:             3.diff
|  タグ:             qbase
|  タグ:             qtip
|  タグ:             tip
|  ユーザ:           dnk
|  日付:             Sat Jan 14 22:57:24 2012 +0900
|  要約:             4th
|
o  チェンジセット:   0:bbd7202921cd
   タグ:             qparent
   ユーザ:           dnk
   日付:             Sat Jan 14 22:54:47 2012 +0900
   要約:             first

素晴らしい!

とりあえず元に戻しましょう。

$ hg qselect -n // guard を外す
$ hg qpop // 3.diffだけ設定されているので一度外す
$ hg qpush -a

次はプラス側のガードを試してみる

$ hg qguard 1.diff +hoge
$ hg qguard 2.diff +hoge
$ hg qguard 3.diff +huga
$ hg qguard -l
1.diff: +hoge
2.diff: +hoge
3.diff: +huga
$ hg qselect hoge
$ hg qpush -a
1.diff を適用中
2.diff を適用中
3.diff を抑止 - ガード '+huga' が適用されました
適用中の最上位パッチは 2.diff です

上手に使えばseriesファイルを直接弄っていたあんなシチュエーションやこんなシチュエーションが減りそうです(ぇ


qguardが出てきたのは下記のような話題が出たからでした。

A->B
とコミットしてしまったが
A->C->B
とすべきだった(したほうが後々見直す上でよかった)ときにどうするか?
ここでCはA->Bの中間生成物的なものとする
recordはちょっと使えないというシチュエーション


あくまで下記は俺が覚えている(というかうろ覚え)範囲なので、間違っているかもしれないし
当然他の方法だっていっぱいあると思います。

とりあえずその記憶を下記にメモ

$ hg glog
@  チェンジセット:   1:9cd39df9c615
|  タグ:             tip
|  ユーザ:           dnk
|  日付:             Sun Jan 15 00:01:38 2012 +0900
|  要約:             second
|
o  チェンジセット:   0:1e8e287648f5
   ユーザ:           dnk
   日付:             Sat Jan 14 23:59:47 2012 +0900
   要約:             first

まず状態Cを手動で作る
(現状の状態から必要なだけ削ってコミット)

$ hg glog
@  チェンジセット:   2:8ee095d38d45
|  タグ:             tip
|  ユーザ:           dnk
|  日付:             Sun Jan 15 00:12:35 2012 +0900
|  要約:             third
|
o  チェンジセット:   1:9cd39df9c615
|  ユーザ:           dnk
|  日付:             Sun Jan 15 00:01:38 2012 +0900
|  要約:             second
|
o  チェンジセット:   0:1e8e287648f5
   ユーザ:           dnk
   日付:             Sat Jan 14 23:59:47 2012 +0900
   要約:             first

というわけで
A->C->Bを作る前に
A->B->Cを作ったということになります。

上記の状態の準備すらメンドイ人向けに https://bitbucket.org/daneko/qguardtest2 に配置しました


$ hg qimport -r 1 -r 2 // CとBをパッチ化
$ hg diff -r 0 -r 2 > X.diff // A->Cの差分作成
$ hg diff -r 2 -r 1 > Y.diff // C->Bの差分作成
$ hg qimport X.diff Y.diff  // 追加
$ hg qpop -a
2.diff の適用解除
1.diff の適用解除
全てのパッチの適用が解除されました

$ hg qguard 1.diff -- -hoge
$ hg qguard 2.diff -- -hoge
$ hg qselect hoge
ガード設定の変更により、 適用除外パッチ数が 4 から 2 になりました
$ hg qpush -a
X.diff を適用中
Y.diff を適用中
適用中の最上位パッチは Y.diff です


あとはパッチをリビジョン化すればOK
1.diff 2.diff の削除も同時にやればおしまいというところでしょうか?



さて次回に向けて勉強しないと白い目で見られそうです
mercurialのソース少し読んで見ることにします(白目



0 件のコメント:

コメントを投稿