Chapter 12
Managing change with Mercurial Queues

12.1 パッチ

ソフトウェアパッケからインストするがあるのにパッケ使しておかなければならないバグ してしまうというようなはよくあることですパッケのことをれているとパッケしいするてきたとしますパッケしいだにバグしていたならスツリから してしいしなければなりませんこのような退いをこしやすいもので

これは パッチですではすることができない スツリがあるとしますスツリカルがあるならしいしてカルできるようにそう いったしたいとうでしょう

パッチはさまざまなしますプンソスソフトウェアプロジェクトプロジェクト メンテナンスバグ規機パッチするおそらくもわかりやすいでしょ

プンソスソフトウェアオペレティングシステムするパッケするうのでたちのにおいてビルドうのはのことです

つかいたいdiff およびpatch プログラムこれらのする12.4 こと使してパッチすることはですしかしめるとパッチ めるためえばパッチバグのみをパッチファイルするかもしれませんがしかわないようになるでしょうからなるバグカルとされるパッチいくつもえることになるかもしれませんこのようなパッケバグパッチったとするとらはその においてそのむでしょうからしいへのにはそのパッチりやめることができま

スツリしてパッチすることは退いやすいですがしくはありませんしかししなければならないパッチえるにしたがいさはすみやかにしますすくなからぬパッチむこと 有無したりそれらをすることが、「なことからされることへとするでしょ

いなことにMercurial Mercurial Queues あるいは“MQ”ばれるパッチするっています

12.2 Mercurial Queues

1990 かの Linux ネルLinux ネルえる パッチていましたつかのつかは網羅そのはより部分てていまし

これらのパッチサイズやかにしました 2002 Andrew Morton パッチキュするのいていたつかのシェルスクリプトしました Andrew Linux ネルソでのにはパッチこれらのスクリプト利用していました

12.2.1 A patchwork quilt ぎはぎの

2003 Andreas Gruenbacher Martin Quinson Andrew によるスクリプトれて

“patchwork quilt” [AG] あるいは“quilt” (これについてべた [Gru05]のこと) ばれるしましパッチされることから quilt プンソきな支持まし

quilt ディレクトリにおいてパッチスタックしますにはquilt してディレクトリツリするどのファイルしたいのかをえます quilt はこれらのファイル場所しますバグにはしいパッチコマンド使してするファイルパッチ “refresh” ます

refresh quilt ディレクトリツリしますquilt 実施されたてのパッチしますディレクトリにおいてしたパッチいることでつのパッチされたツリから つのパッチされたツリ させるためにすることができます

ツリするパッチすることもできますパッチ“pop” するとそのパッチによるディレクトリツリからかれますしかし quilt はどのパッチかれたのかをえているのでかれたパッチ“push” することができディレクトリツリにはパッチによるされます “refresh” コマンドそれによる パッチにできることですこれはパッチそのパッチによる できることをします

quilt しないためされた tarball ディレクトリにおいてもSubversion リポジトリにおいて 同等します

12.2.2 patchwork quilt から Mercurial Queues

2005 quilt いを Mercurial するためのMercurial Queues ばれるChris Mason により されました

quilt MQ きないはquilt システムしないのにしてMQ Mercurial されていることで push されるパッチMercurial チェンジセットとしてされますパッチpop することでチェンジセット かれます

システムしないことからMercurial MQ 利用できないについてとして quilt ソフトウェアです

12.3 MQ きな

パッチして MQ するもののぎることはありません

フリソフトウェアおよびプンソパッチ利用されけるのはそのさせている にもわらずパッチさをっていることがきなつです

実施したことにするてをしのないものとしてしますこのいに きながある堅苦しくもありますおうとするおうとすることにになるかとさ れないなおいことにはとなるいのがありま

MQ におけるパッチによりあなたのすることができますあなたのパッチ 存続にそれらの実施しをうことがますそのパッチらないそれを やめることができますそのパッチにはむものでない姿させるまでなだけでもすることが ます

えばパッチによりパッチとそのおよびになったとのデバッグ になりますてのパッチしたチェンジセットっているのでどのチェンジセットパッチがそのファイル ぼしているのかをhg log filename によってることがますbisect いることでバグまれたり れたるためにてのチェンジセットパッチしてのうことができますhg annotateコマンド いることでスファイルしたのがどのチェンジセットパッチであるかをることが

12.4 パッチ

MQ それがパッチつことをしているためパッチがどういったものであるかやパッチとともにする することがらをするけになります

Unix diff コマンドつのファイルいをしますpatch コマンドこのいをファイル するとみなしますこれらのコマンドとして 12.4てください


1  $ echo ’this is my first line’ > oldfile
2  $ echo ’my first line is here’ > newfile
3  $ diff -u oldfile newfile > tiny.patch
4  $ cat tiny.patch
5  --- oldfile 2009-07-20 21:58:49.000000000 +0000
6  +++ newfile 2009-07-20 21:58:49.000000000 +0000
7  @@ -1 +1 @@
8  -this is my first line
9  +my first line is here
10  $ patch < tiny.patch
11  patching file oldfile
12  $ cat oldfile
13  my first line is here

Figure 12.1: diff およびpatch コマンド利用

diff 生成するそしてpatch するファイルパッチpatchないし diffれますパッチいはありませんより使される パッチという使しま )。

パッチファイルテキストからめることができますpatch コマンドはこのテキストしますがMQ チェンジ セット生成するコミットメッセとみなしますパッチつけるためにpatch diff -まる します

MQ unified しますpatch はそれかのでもしますがMQ unified でないと しません)。 unified ヘッダっていますファイルヘッダ headerにはとなるファイルファイル されpatch コマンドファイルヘッダつけたにはうためにするファイルしま

ファイルヘッダいてhunk されますそれぞれの hunk ヘッダされその hunk によりされる ファイルにおけるしますヘッダhunk ファイルされない部分からなるテキスト されますこれらのされない部分のことをhunk するコンテキストびますhunk とのコンテキスト しかないdiff たな hunk ヘッダしませんコンテキストいてhunk をそのままけま

コンテキストまりますhunk では-まるされる+まる されるしますえばされるされます

パッチのよりしてはほど 12.6にてしますがMQ 利用するにたってはここまでの

12.5 Mercurial Queues 利用

MQ Mercurial としてされているので利用するがありますダウンロはありませ MQ Mercurial 布物まれています)。 MQ にするには~/.hgrc ファイル 12.5 してください


1  [extensions]
2  hgext.mq =

Figure 12.2: MQ のために ~/.hgrc する

されるといくつかのしいコマンドされますhg help使ってhg qinitコマンド利用ることですることをできます  12.3 してください


1  $ hg help qinit
2  hg qinit [-c]
3  
4  init a new queue repository
5  
6      The queue repository is unversioned by default. If
7      -c/--create-repo is specified, qinit will create a separate nested
8      repository for patches (qinit -c may also be run later to convert
9      an unversioned patch repository into a versioned one). You can use
10      qcommit to commit changes to this queue repository.
11  
12  options:
13  
14   -c --create-repo  create queue repository
15  
16  use "hg -v help qinit" to show global options

Figure 12.3: MQ 利用

MQ ての Mercurial リポジトリ利用できコマンドはそのリポジトリにしかしません利用にはhg qinitコマンドによりリポジトリいます 12.4 )。このコマンド.hg/patches ばれるディレクトリ MQ はこのディレクトリメタデしますくの Mercurial コマンドhg qinitコマンド正常 にはしません


1  $ hg init mq-sandbox
2  $ cd mq-sandbox
3  $ echo ’line 1’ > file1
4  $ echo ’another line 1’ > file2
5  $ hg add file1 file2
6  $ hg commit -m’first change’
7  $ hg qinit

Figure 12.4: MQ 利用けたリポジトリ


1  $ hg tip
2  changeset:   0:5ddbf74425a0
3  tag:         tip
4  user:        Bryan O’Sullivan <bos@serpentine.com>
5  date:        Mon Jul 20 21:58:51 2009 +0000
6  summary:     first change
7  
8  $ hg qnew first.patch
9  $ hg tip
10  changeset:   1:a3c1798530eb
11  tag:         qtip
12  tag:         first.patch
13  tag:         tip
14  tag:         qbase
15  user:        Bryan O’Sullivan <bos@serpentine.com>
16  date:        Mon Jul 20 21:58:51 2009 +0000
17  summary:     [mq]: first.patch
18  
19  $ ls .hg/patches
20  first.patch  series  status

Figure 12.5: しいパッチ

12.5.1 しいパッチ

しいパッチするにはhg qnewコマンド使いますこのコマンドするパッチ ります 12.5すようにMQ はこれを.hg/patchesディレクトリファイルとみなしま

.hg/patches ディレクトリにはそれにもseries statusというつのしいファイルされ ますseries そのリポジトリにおいて MQ するてのパッチパッチしていま status はそのリポジトリにおいて MQ したてのパッチするための簿使されま

: えばパッチ順序したいようなseries した があるかもしれませんしかしMQ なうことから でのstatus てのにおいてです

しいパッチしたならばじようにディレクトリファイルできますhg diffhg annotateといったMercurial てのコマンドはそれします

12.5.2 パッチrefresh

するになったならパッチするためにhg qrefresh使します 12.5)。このコマン ディレクトリでのパッチへとするチェンジセットそれらのするように ます


1  $ echo ’line 2’ >> file1
2  $ hg diff
3  diff -r a3c1798530eb file1
4  --- a/file1 Mon Jul 20 21:58:51 2009 +0000
5  +++ b/file1 Mon Jul 20 21:58:52 2009 +0000
6  @@ -1,1 +1,2 @@
7   line 1
8  +line 2
9  $ hg qrefresh
10  $ hg diff
11  $ hg tip --style=compact --patch
12  1[qtip,first.patch,tip,qbase]   b353a00003e1   2009-07-20 21:58 +0000   bos
13    [mq]: first.patch
14  
15  diff -r 5ddbf74425a0 -r b353a00003e1 file1
16  --- a/file1 Mon Jul 20 21:58:51 2009 +0000
17  +++ b/file1 Mon Jul 20 21:58:52 2009 +0000
18  @@ -1,1 +1,2 @@
19   line 1
20  +line 2
21  

Figure 12.6: パッチrefresh

hg qrefreshコマンドはいつでもでもできるのでチェックポイントとして利用するのもいでしょう パッチrefresh 実施することでってみてそれがうまくしないにはrefresh でのhg revertコマンドによりすことができます


1  $ echo ’line 3’ >> file1
2  $ hg status
3  M file1
4  $ hg qrefresh
5  $ hg tip --style=compact --patch
6  1[qtip,first.patch,tip,qbase]   9eb545de58b2   2009-07-20 21:58 +0000   bos
7    [mq]: first.patch
8  
9  diff -r 5ddbf74425a0 -r 9eb545de58b2 file1
10  --- a/file1 Mon Jul 20 21:58:51 2009 +0000
11  +++ b/file1 Mon Jul 20 21:58:52 2009 +0000
12  @@ -1,1 +1,3 @@
13   line 1
14  +line 2
15  +line 3
16  

Figure 12.7: パッチ refresh による

12.5.3 パッチねと

パッチするえるかパッチするになったならhg qnewコマンドすることでしい パッチしますMercurial したこのパッチパッチします 12.8してくださ していたパッチまれるこのしいパッチとしてまれますhg annotateれば のことはらかです)。


1  $ hg qnew second.patch
2  $ hg log --style=compact --limit=2
3  2[qtip,second.patch,tip]   f44a4270d8a8   2009-07-20 21:58 +0000   bos
4    [mq]: second.patch
5  
6  1[first.patch,qbase]   9eb545de58b2   2009-07-20 21:58 +0000   bos
7    [mq]: first.patch
8  
9  $ echo ’line 4’ >> file1
10  $ hg qrefresh
11  $ hg tip --style=compact --patch
12  2[qtip,second.patch,tip]   90c5baabf0e2   2009-07-20 21:58 +0000   bos
13    [mq]: second.patch
14  
15  diff -r 9eb545de58b2 -r 90c5baabf0e2 file1
16  --- a/file1 Mon Jul 20 21:58:52 2009 +0000
17  +++ b/file1 Mon Jul 20 21:58:53 2009 +0000
18  @@ -1,3 +1,4 @@
19   line 1
20   line 2
21   line 3
22  +line 4
23  
24  $ hg annotate file1
25  0: line 1
26  1: line 2
27  1: line 3
28  2: line 4

Figure 12.8: ねられるパッチ

これまではhg qnewhg qrefreshいてMercurial コマンドのみを使するようにしてきましたかし  12.5.3 すようにパッチするにより便くのコマンドMQ していま


1  $ hg qseries
2  first.patch
3  second.patch
4  $ hg qapplied
5  first.patch
6  second.patch

Figure 12.9: hg qseriesおよびhg qappliedによるパッチねの

12.5.4 パッチねの

されているパッチされているそれのいがあることをではしていますがには いがありますMQ することしにパッチリポジトリすることができます

されたパッチリポジトリするチェンジセットパッチチェンジセット ディレクトリにおいてることができますhg qpopコマンド使してパッチすこともできま

MQ かれたパッチけますがそのパッチはもはやリポジトリするチェンジセットたず ディレクトリにはパッチによるされていません 12.10されたパッチされているそれのいをしま



[Picture]

Figure 12.10: MQ パッチねにおけるパッチパッチ

hg qpushコマンド使することでパッチないしきをうことができますこのによりパッチ するしいチェンジセットされパッチによるディレクトリれます 12.11hg qpopおよ hg qpush実施しますのようにつないしつのパッチいてもhg qseriesしません そのhg qappliedします


1  $ hg qapplied
2  first.patch
3  second.patch
4  $ hg qpop
5  now at: first.patch
6  $ hg qseries
7  first.patch
8  second.patch
9  $ hg qapplied
10  first.patch
11  $ cat file1
12  line 1
13  line 2
14  line 3

Figure 12.11: パッチねの

12.5.5 パッチ(push) および(pop)

hg qpushおよびhg qpopのそれぞれがデフォルトではつのパッチして パッチしをうこともできますhg qpush-a オプションすることにより てのパッチhg qpop-a オプションすることによりてのパッチ しをうことができます。(それパッチしの方法しては 12.7 してくださ 。)


1  $ hg qpush -a
2  applying second.patch
3  now at: second.patch
4  $ cat file1
5  line 1
6  line 2
7  line 3
8  line 4

Figure 12.12: てのパッチ

12.5.6 とその

いくつかの MQ コマンドディレクトリらかのされたには中断します このパッチまれていないわないためにわれます 12.13 しますhg qnewコマンド みのこのでは file3 hg addするものがあるしいパッチ生成しませ


1  $ echo ’file 3, line 1’ >> file3
2  $ hg qnew add-file3.patch
3  $ hg qnew -f add-file3.patch
4  abort: patch "add-file3.patch" already exists

Figure 12.13: パッチ生成

ディレクトリするコマンドすべて オプションることができそのオプション-f づけられています -f オプションコマンドごとになりますえばhg qnew -fたに生成されるパッチみのみますがhg qpop -fされるパッチぼすファイルするしま 1 利用 するコマンド-f オプションドキュメントしましょう

12.5.7 パッチ

hg qrefreshコマンドパッチしますこれはあるパッチするrefresh することで 中断popないしpushによりパッチってくることでそのパッチしてすることができ ることをします

このによってになることをによってしますつのパッチによってしいしているものとしましょう パッチソフトウェア核機そしてパッチパッチ核機 使するためのインタフェ(UI) いますUI へのパッチ核機へのパッチ バグつけたとしてもそれをするのはなことですUI へのパッチするhg qrefreshにより したhg qpopによりパッチ核機へのそれにしますパッチスタッ へとします)。核機へのパッチバグhg qrefreshによってパッチへのった hg qpushによりパッチUI へのパッチすことでやりかけのすることができま

12.6 パッチしてしく

MQ パッチGNU patch コマンド使しますのでpatch コマンドパッチそのものにしてより ることは有用です

12.6.1

パッチファイルヘッダるとパスにはれないっていることにくでしょうこれは パッチ生成されていた方法ですでもこの方法いていますがでは )。

Alice tarball してファイルしたパッチしようとえたとしますディレクトリ tarball こののためにすることがになりますdiff コマンド-r および-N オプション することでディレクトリディレクトリパッチ生成しますには ディレクトリてのファイルパスされにはディレクトリされま

Alices からパッチったディレクトリするディレクト があるというのはありそうもないですからpatch コマンドパッチパス名要までを くかを-p オプションっていますこのオプションされるstrip countびま

-p1オプションとみなすことをしますpatch コマンドファイルヘッダにおいてファイル foo/bar/baz したfoo 部分したbar/baz というファイルしてパッチをあてますなことをえば されるパスおよびそれにするしますfoo/bar bar にしますが/foo/bar スラッシュfoo/bar になります)。

パッチにおける ですのでほとんどてのパッチかれるんでいますMercurial hg diffコマンドはこのパス生成しますのでhg importコマンドMQ パッチしていま

ではないパッチパッチキュしようとした -p オプションっていないhg qimport Mercurial バグ 311 のことではむことができませんそのhg qnewパッチMQ patch -pN によりパッチhg addremoveパッチによりされたファイルhg qrefreshうのが方法ですこのようなはいずれになるかもしれません  Mercurial バグ 311 してくだ さい

12.6.2 パッチ

patch hunk するにはit tries a handful of (successively はどこにかる) successively less accurate strategies to try to make the hunk apply XXXXX 心深いこの方法によりファイル生成されたパッチであってもしいファイル することがくのとなります

patch コマンドhunk におけるコンテキストおよびテキストみますができな するコンテキストのみのみますこれがしたpatch コマンドhunk されたこととからオフセットずれていることをします

コンテキストのみによるしたpatch およびいたコンテキストいてコンテキスト みによるみますコンテキストによる hunk したあいまいなhunk された ことをしますこの時示されるpatch コマンドパッチコンテキストからいた )。

これらのどのでもできないpatch コマンドとなっている hunk されたしますpatch コマンド された hunk “reject” ともばれます.rej ファイルしますにそのパッチ ファイルコピ.orig きでしますしのファイルにのされた hunk によるんでい ますファイル foo するつの hunk パッチがありそのうちのつができなかった foo.origできなかった hunk foo.rej およびできたつの hynk によるfooつのファイルがで きます

12.6.3 パッチ

patch コマンドファイルへの有用がいくつかあります

12.6.4 あいまいさに

オフセットきやあいまいなにしているであってもパッチすることがいのですがでこのよ うないたおのずとファイルへのパッチであるしてしまいます パッチ度適してしまうことやしてしまうことですpatch hg qpush オフセットやあいまいしてしたにはファイルされていることをからしてくださ

オフセットきやあいあまいなされたパッチrefresh するのがくのにおいておすすめなのはパッチ refresh パッチするためのしいコンテキスト生成するからですただしパッチrefresh ることでファイルなるしてパッチするようになるがあるためくのおす すめですがではありませんスツリしてパッチするような パッチする機会ることがるのでパッチにあいまいたせておくのは

12.6.5 された hunk

パッチするとhg qpushエラメッセしてします.rej ファイルされている それパッチpush したりをするされた hunk うことがには

パッチであるによりそれまではきちんとできていたパッチできなくなったMercurial Queues 使しては 12.8 してください

なことにされた hunk うための定的しませんくの.rej ファイルしながら ファイルされた hunk しなければなりません

ったさないのであればパッチしてはpatch よりもwiggle [Bro] ばれるLinux ネルハッカNeil Brown によりかれています

patch によりされた hunk するために便いるmpatch [Mas] ばれるLinux ネルハッカChris Mason Mercurial Queues ですによりかれていますmpatch つのよくある された hunk けることができます

wiggle ないしmpatch 使するには実施してがありますのところmpatch ジプログラムへとすることでしていますのでmpatch されたさせることがます

12.7 MQ 最高すために

MQ パッチいをよく実施します2006 EuroPython conference [O’S06] でののために2006 実施しましたパッチとして1,738 パッチLinux 2.6.17-mm1 パッチ使していますLinux 2.6.12-rc2 から Linux 2.6.17 にかけての27,472 リビジョンてをLinux ネルリポジトリしてこれらのパッチ したのです

ラップトップ PC 1,738 パッチてをhg qpush -aするのに 3.5 それらをhg qpop -aするの 30 かかりましたしいラップトップならてのパッチpush するまでがりました)。 きなパッチ22,779 287 ファイルしています6.6 hg qrefreshできていま

MQ スツリするのにしているのはらかですが最高すためにっておいたほうがつかの コツがあります

コツうことですhg qpushおよびhg qpopにはがされていないこと hg qrefreshれがないことをするためにディレクトリしていますさなスツリ このするになりませんしかし中程度10,000 ファイル程度スツリではからそれ です

hg qpushおよびhg qpopコマンドではパッチして push および pop するげる パッ することができますパッチきですることでhg qpushしたパッチスタックになる までパッチいますhg qpopパッチスタックになるまでパッチしをいま

パッチにはパッチ使できますパッチからめるためパッチ パッチとなります

12.8 パッチ

することのできないリポジトリしてパッチスタックつことはよくあるです三者 よりもかるしているとの できなくなったパッチhunk するがありますこのようなパッチリベばれま

リベ方法パッチしてhg qpop -ahg pullリポジトリ 最後hg qpush -aパッチしますMQ によるパッチではされているできないパッチ めることでパッチhg qrefresh機会けつつパッチスタックてのパッチわるまで パッチします

パッチ悪影ぼすいのであればこのするでしょうしか しながらされる部分れるようなパッチスタックされた hunk でのすぐにでも すでしょう

リベ部分するですつかのリビジョンしてきちんとできるパッチであれば なるリビジョンパッチとのでのしていたMQ によりうことができま

っています

  1. たってパッチがきちんとできているリビジョンしてhg qpush -aによりてのパッチ します
  2. hg qsave -e -cいてパッチディレクトリバックアップしますこのコマンドには パッチしたディレクトリしますN さい整数とした.hg/patches.N という ディレクトリパッチされますされたパッチされたチェンジセットコミット ますがこれはseries およびstatus するためです
  3. hgcmdpull によりリポジトリみますhg pull -uいないして ください)。
  4. hg update -Cいてtip リビジョンすることでしたパッチにしてください
  5. hg qpush -m -aいててのパッチしますhg qpushへの -m オプションによりパッ したMQ 3-way 実施します

hg qpush -m実施にはseriesファイルされたそれぞれのパッチされます いまいパッチされたりパッチされたMQ hg qsaveによりされた パッチキュパッチするチェンジセットいた 3-way いますこのには Mercurial 利用されますのでには GUI ジツされるかもしれませ

パッチえるとMQ によるパッチrefresh われます

このえたリポジトリにはパッチキュするチェンジセットにしたhead .hg/patches.N されたパッチキュりますhead hg qpop -a -n patches.N ないしhg strip うことができますバックアップとしてのがなくなったなら.hg/patches.N してしまっていませ

12.9 パッチ

パッチする MQ コマンドにおけるパッチパッチいますによるにわかりやすいで しょうえばhg qpushコマンドへのfoo.patch によりfoo.patch されるまでパッチされま

としてオフセットすることもできますfoo.patch-2 foo.patch パッチbar.patch+4 bar.patch パッチします

によるパッチはそれほどしくありませんhg qseriesによりされるパッチとなって いますそうからめるみです)。

MQ Mercurial コマンド利用におけるパッチ便にしますチェンジセットけるてのコマン みのパッチけますリポジトリあったタグえてパッチとなるリビジョン タグ2 されますそれにえてqbase およびqtip タグにより下位およびずみパッチをそれぞれできま

Mercurial タグするこれらのパッチいをより便にします

パッチ利用にするためにMQ Mercurial タグ使しているのでパッチするにはそのするはありません


1  $ hg qapplied
2  first.patch
3  second.patch
4  $ hg log -r qbase:qtip
5  changeset:   1:2c9f9a14ed72
6  tag:         first.patch
7  tag:         qbase
8  user:        Bryan O’Sullivan <bos@serpentine.com>
9  date:        Mon Jul 20 21:48:24 2009 +0000
10  summary:     [mq]: first.patch
11  
12  changeset:   2:1b8fcc30cf3e
13  tag:         qtip
14  tag:         second.patch
15  tag:         tip
16  user:        Bryan O’Sullivan <bos@serpentine.com>
17  date:        Mon Jul 20 21:48:24 2009 +0000
18  summary:     [mq]: second.patch
19  
20  $ hg export second.patch
21  # HG changeset patch
22  # User Bryan O’Sullivan <bos@serpentine.com>
23  # Date 1248126504 0
24  # Node ID 1b8fcc30cf3e3d7640a082057402061e7832301f
25  # Parent  2c9f9a14ed7225ad61f5178a726f1f72da46528e
26  [mq]: second.patch
27  
28  diff -r 2c9f9a14ed72 -r 1b8fcc30cf3e other.c
29  --- /dev/null Thu Jan 01 00:00:00 1970 +0000
30  +++ b/other.c Mon Jul 20 21:48:24 2009 +0000
31  @@ -0,0 +1,1 @@
32  +double u;

Figure 12.14: MQ タグ使したパッチ

パッチタグすることでhg logコマンドそのとしてタグとしてのパッチされるというられますこのことによりみのパッチリビジョンすることをにしますパッチする Mercurial コマンド 12.14 しま

12.10 っておくと便

MQ 利用してしたけるではないもののっておいたほうがつかありますここではそういった めてみました

12.11 リポジトリにおけるパッチ

MQ 利用する.hg/patches ディレクトリMercurial ディレクトリにあるためMQ にある”Mercurial ポジトリパッチしてしていません

このことはパッチディレクトリをそれMercurial リポジトリいてできるという もたらしますえばパッチするhg qrefreshをしたパッチhg commitすることでからそのへとパッチroll backすることができるなど有用しま

リポジトリパッチスタックなるすることもますLinux ネルにこの 使していますCPU キテクチャごとにそれぞれ真新しいネルソコピそれぞれに パッチリポジトリしますキテクチャにはするネルソパッチリポジト パッチpush てのパッチpop pushしたそのネルビルドおよびいま

リポジトリパッチすることでするわりでおいに ることしにパッチする実施できます

12.11.1 MQ パッチリポジトリサポ

MQ .hg/patches ディレクトリリポジトリとしてパッチしますがhg qinitでの -c オプションすることで.hg/patches ディレクトリMercurial リポジトリとしてすることが

: -c オプションれた.hg/patches ディレクトリhg initしてくださいstatus しようとうことはにあり ませんから.hgignore ファイルstatus するのをれないでくださいhg qinit -cこのいます)。

便性上.hg/patches ディレクトリMercurial リポジトリであるMQ みをったパッチてを hg addします

最後になりますが MQ .hg/patches においてhg commitするコマンドhg qcommitしていますのでディレクトリ動等わしいできます

12.11.2 つかの

MQ によるパッチリポジトリサポ定的なものです

MQ パッチディレクトリしてわれたすることはできませんhg pullでの あるいはhg updateによるパッチseries ったパッチリポジトリにおいてhg qpop -ahg qpush -aってそれらのにするがありますこのれたMQ されている パッチがどれなのかしてしまうでしょう

12.12 パッチのためのドパティ

くのパッチ使ったをしているとっているパッチするしくてたまらなくなっているに いありません

diffstat コマンド [Dic] パッチによってファイルがどれだけされるかをヒストグラム生成しますどのファイル どの程度けるのかといった全体感覚には方法ですdiffstat -p オプション利用論良いので すがファイルして-p オプションなくともにとってはわかりにくいで )。


1  $ diffstat -p1 remove-redundant-null-checks.patch
2   drivers/char/agp/sgi-agp.c        |    5 ++---
3   drivers/char/hvcs.c               |   11 +++++------
4   drivers/message/fusion/mptfc.c    |    6 ++----
5   drivers/message/fusion/mptsas.c   |    3 +--
6   drivers/net/fs_enet/fs_enet-mii.c |    3 +--
7   drivers/net/wireless/ipw2200.c    |   22 ++++++----------------
8   drivers/scsi/libata-scsi.c        |    4 +---
9   drivers/video/au1100fb.c          |    3 +--
10   8 files changed, 19 insertions(+), 38 deletions(-)
11  $ filterdiff -i ’*/video/*’ remove-redundant-null-checks.patch
12  --- a/drivers/video/au1100fb.c~remove-redundant-null-checks-before-free-in-drivers
13  +++ a/drivers/video/au1100fb.c
14  @@ -743,8 +743,7 @@ void __exit au1100fb_cleanup(void)
15   {
16    driver_unregister(&au1100fb_driver);
17  
18  - if (drv_info.opt_mode)
19  - kfree(drv_info.opt_mode);
20  + kfree(drv_info.opt_mode);
21   }
22  
23   module_init(au1100fb_init);

Figure 12.15: diffstatfilterdiff およびlsdiff コマンド

patchutils パッケ [Wau] ですこのパッケ“Unix ってそれぞれがパッチしてさなまりです patchutils 利用しているのはパッチファイルからする filterdiff ですえばあるパッチディレクトリってファイルするfilterdiff する ことでしたパタするファイルにだけさなパッチ生成することがますそれについ ては 13.9.2 してください

12.13 パッチ方法

パッチフリソフトウェアプンソスプロジェクトするものであろうとあなたのにお けるきとみなされるものであろうともよりするための利用できるがありま

まずはパッチをつけましょうえば rework-device-alloc.patch といったそのパッチうも のかというヒントをすばやくえてくれるのでえるでしょうくてもにはなりませんすること はそれほどくはないでしょうがhg qappliedhg qtopといったコマンドするものですからくの パッチくのなるタスクパッチくのけないようなさはとりわけ

どのパッチしてしているのかにしましょうhg qtopコマンドえばhg tip -pしつつ 使してパッチることでどんなをしているのかをしましょうしないパッチ してhg qrefreshしてしまったことがありますがったパッチんでしまったしいパッチさせるの にしてのかかるものです

から 12.12 しているdiffstat filterdiffのようなドパティしでもいの やすべきですパッチぼすしてすばやいることがパッチhunk 選択 せてなるパッチげることができます

12.14 MQ クックブック

12.14.1 些細パッチ

真新しい Mercurial リポジトリファイルするのはヘッドいのでダウンロした tarball してえるのだとしてもMQ によりパッチうことはにかなっていま

まずはtarball ダウンロMercurial リポジトリします

1  $ download netplug-1.2.5.tar.bz2
2  $ tar jxf netplug-1.2.5.tar.bz2
3  $ cd netplug-1.2.5
4  $ hg init
5  $ hg commit -q --addremove --message netplug-1.2.5
6  $ cd ..
7  $ hg clone netplug-1.2.5 netplug
8  updating working directory
9  18 files updated, 0 files merged, 0 files removed, 0 files unresolved

パッチスタックいます

1   $ cd netplug
2  $ hg qinit
3  $ hg qnew -m ’fix build problem with gcc 4’ build-fix.patch
4  $ perl -pi -e ’s/int addr_len/socklen_t addr_len/’ netlink.c
5  $ hg qrefresh
6  $ hg tip -p
7  changeset:   1:98dfa9fc14a2
8  tag:         qtip
9  tag:         build-fix.patch
10  tag:         tip
11  tag:         qbase
12  user:        Bryan O’Sullivan <bos@serpentine.com>
13  date:        Mon Jul 20 21:58:50 2009 +0000
14  summary:     fix build problem with gcc 4
15  
16  diff -r c57121a805d2 -r 98dfa9fc14a2 netlink.c
17  --- a/netlink.c Mon Jul 20 21:58:49 2009 +0000
18  +++ b/netlink.c Mon Jul 20 21:58:50 2009 +0000
19  @@ -275,7 +275,7 @@
20           exit(1);
21       }
22  
23  -    int addr_len = sizeof(addr);
24  +    socklen_t addr_len = sizeof(addr);
25  
26       if (getsockname(fd, (struct sockaddr *) &addr, &addr_len) == -1) {
27           do_log(LOG_ERR, "Could not get socket details: %m");
28  

から月経ってからそのパッケしいリリしたとしますまずはリポジトリみま

1  $ hg qpop -a
2  patch queue now empty
3  $ cd ..
4  $ download netplug-1.2.8.tar.bz2
5  $ hg clone netplug-1.2.5 netplug-1.2.8
6  updating working directory
7  18 files updated, 0 files merged, 0 files removed, 0 files unresolved
8  $ cd netplug-1.2.8
9  $ hg locate -0 | xargs -0 rm
10  $ cd ..
11  $ tar jxf netplug-1.2.8.tar.bz2
12  $ cd netplug-1.2.8
13  $ hg commit --addremove --message netplug-1.2.8

hg locateによりまるパイプラインディレクトリてのファイルしますのでhg commit--addremove オプションしいにおいてどのファイルされたのかをできま

最後しくなったスツリパッチします

1  $ cd ../netplug
2  $ hg pull ../netplug-1.2.8
3  pulling from ../netplug-1.2.8
4  searching for changes
5  adding changesets
6  adding manifests
7  adding file changes
8  added 1 changesets with 12 changes to 12 files
9  (run ’hg update’ to get a working copy)
10  $ hg qpush -a
11  (working directory not at a head)
12  applying build-fix.patch
13  now at: build-fix.patch

12.14.2 パッチ全体

MQ パッチ全体するhg qfoldコマンドしていますこのコマンドしたパッチした順序 パッチへと それらのパッチしますパッチ でなければなりません

パッチ順序ですパッチfoo そこにhg qfoldquux hg qfoldする foobar そして quuxするのとパッチができあがります

12.14.3 パッチパッチへの

パッチパッするのはパッチ全体するよりもです

あるファイルする全体したいfilterdiff -i および-x オプションいることでパッチから 選択してそのパッチへとむことでができますとなったパッチそのものはした くないものですそこでMQ パッチhg qpushするまれたhunk され たことがされますからhg qrefreshパッチすることでした hunk くことができま

つのファイルするhunk パッチだけがしいはもうですがそれ でも部分することができますlsdiff -nvv使うことでパッチするメタデさせま

1  $ lsdiff -nvv remove-redundant-null-checks.patch
2  22 File #1   a/drivers/char/agp/sgi-agp.c
3   24 Hunk #1 static int __devinit agp_sgi_init(void)
4  37 File #2   a/drivers/char/hvcs.c
5   39 Hunk #1 static struct tty_operations hvcs_ops =
6   53 Hunk #2 static int hvcs_alloc_index_list(int n)
7  69 File #3   a/drivers/message/fusion/mptfc.c
8   71 Hunk #1 mptfc_GetFcDevPage0(MPT_ADAPTER *ioc, in
9  85 File #4   a/drivers/message/fusion/mptsas.c
10   87 Hunk #1 mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
11  98 File #5   a/drivers/net/fs_enet/fs_enet-mii.c
12   100 Hunk #1 static struct fs_enet_mii_bus *create_bu
13  111 File #6   a/drivers/net/wireless/ipw2200.c
14   113 Hunk #1 static struct ipw_fw_error *ipw_alloc_er
15   126 Hunk #2 static ssize_t clear_error(struct device
16   140 Hunk #3 static void ipw_irq_tasklet(struct ipw_p
17   150 Hunk #4 static void ipw_pci_remove(struct pci_de
18  164 File #7   a/drivers/scsi/libata-scsi.c
19   166 Hunk #1 int ata_cmd_ioctl(struct scsi_device *sc
20  178 File #8   a/drivers/video/au1100fb.c
21   180 Hunk #1 void __exit au1100fb_cleanup(void)

このコマンドつのなるします

ファイルhunk するためにはパッチとされますがそれらの filterdiff --files --hunks といったオプションすることでファイルhunk 選択することができま

hunk してしまえばパッチして 12.14.2 りのすることができま

12.15 quilt MQ

quilt しているのであればMQ コマンドっていますがそのきにはいくらかのいがありま

どの quilt コマンドしてqまるする MQ コマンドがあることにくことでしょうquilt add よび remove コマンドするのがMercurial hg addおよびhg removeであるのがですまたMQ には quilt edit するコマンドはありません