annotate ja/mq-collab.tex @ 351:f3fa98815193

a bit more mq-collab.tex
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 18 Aug 2008 18:15:26 +0900
parents 5a5419eeab70
children 89a903605c74
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
1 %\chapter{Advanced uses of Mercurial Queues}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
2 \chapter{Mercurial Queues$B$N9bEY$J;H$$J}(B}
224
34943a3d50d6 Start writing up extensions. Begin with inotify.
Bryan O'Sullivan <bos@serpentine.com>
parents: 107
diff changeset
3 \label{chap:mq-collab}
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
4
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
5 %While it's easy to pick up straightforward uses of Mercurial Queues,
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
6 %use of a little discipline and some of MQ's less frequently used
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
7 %capabilities makes it possible to work in complicated development
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
8 %environments.
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
9
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
10 Mercurial Queues$B$NC1=c$J;H$$J}$r<h$j>e$2$?0lJ}!$>/!9$NE}@)$H(BMQ$B$N$"$^$jMQ(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
11 $B$$$i$l$J$$5!G=$rMQ$$$k$3$H$GJ#;($J3+H/4D6-$G$N:n6H$,2DG=$H$J$k!%(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
12
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
13 %In this chapter, I will use as an example a technique I have used to
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
14 %manage the development of an Infiniband device driver for the Linux
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
15 %kernel. The driver in question is large (at least as drivers go),
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
16 %with 25,000 lines of code spread across 35 source files. It is
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
17 %maintained by a small team of developers.
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
18
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
19 $B$3$N>O$G$O!$(BLinux$B%+!<%M%kMQ(BInfiniband$B%G%P%$%9%I%i%$%P$N3+H/$r4IM}$9$k$N$K(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
20 $BMQ$$$?%F%/%K%C%/$rNc$H$7$FMQ$$$k!%$3$N%I%i%$%P$O!J%I%i%$%P$H$7$F$O!KBg5,(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
21 $BLO$G!$(B35$B$N%=!<%9%U%!%$%k$K$o$?$k(B25000$B9T$+$i$J$k!%$3$N%=!<%9$O>.5,LO$J3+H/(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
22 $B<T$N%A!<%`$K$h$C$F$$;~4IM}$5$l$F$$$k!%(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
23
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
24 %While much of the material in this chapter is specific to Linux, the
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
25 %same principles apply to any code base for which you're not the
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
26 %primary owner, and upon which you need to do a lot of development.
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
27
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
28 $B$3$N>O$G$NAG:`$O(BLinux$B$KFC2=$7$F$$$k$,!$F1$886B'$O$$$+$J$k%3!<%I%Y!<%9$KBP(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
29 $B$7$F$bE,MQ2DG=$G!$<+J,<+?H$G=jM-$7$F$$$J$$$,!$B?$/$N3+H/$r9T$&I,MW$N$"$k(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
30 $B%3!<%I$J$I$K$bE,MQ$G$-$k!%(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
31
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
32
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
33 %\section{The problem of many targets}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
34 \section{$B%?!<%2%C%H$,J#?t$"$k$H$$$&LdBj(B}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
35
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
36 %The Linux kernel changes rapidly, and has never been internally
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
37 %stable; developers frequently make drastic changes between releases.
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
38 %This means that a version of the driver that works well with a
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
39 %particular released version of the kernel will not even \emph{compile}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
40 %correctly against, typically, any other version.
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
41
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
42 Linux$B%+!<%M%k$O5^B.$KJQ2=$7!$$=$NFbIt$O7h$7$F0lDj$G$O$J$$!%3+H/<T$?$A$OIQ(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
43 $BHK$K%j%j!<%94V$G7`E*$JJQ99$r9T$&!%$3$N$?$a!$FCDj$N%j%j!<%9%P!<%8%g%s$GNI(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
44 $B$/F0$$$?%I%i%$%P$,!$Nc$($PJL$N%P!<%8%g%s$G$O@5$7$/%3%s%Q%$%k$9$k$3$H$9$i(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
45 $B$G$-$J$/$J$k$H$$$&$3$H$r0UL#$9$k!%(B
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
46
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
47 %To maintain a driver, we have to keep a number of distinct versions of
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
48 %Linux in mind.
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
49
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
50 $B%I%i%$%P$r0];}$9$k$?$a$K!$3+H/<T$O$$$/$D$b$NJL$N%P!<%8%g%s$N(BLinux$B$rA[Dj(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
51 $B$7$J$1$l$P$J$i$J$$!%(B
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
52 \begin{itemize}
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
53 %\item One target is the main Linux kernel development tree.
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
54
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
55 % Maintenance of the code is in this case partly shared by other
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
56 % developers in the kernel community, who make ``drive-by''
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
57 % modifications to the driver as they develop and refine kernel
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
58 % subsystems.
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
59 \item $B0l$D$N%?!<%2%C%H$O(BLinux$B%+!<%M%k$N3+H/%D%j!<$G$"$k!%$3$N>l9g!$%3!<%I(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
60 $B$N0];}4IM}$O%+!<%M%k%3%_%e%K%F%#$NB>$N3+H/<T!J$3$l$O%+!<%M%k$N%5%V(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
61 $B%7%9%F%`$r2~NI$9$k$?$a$K%I%i%$%P$r(B``$BDI$$N)$F$k(B''$BJQ99$r9T$&3+H/<T$G(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
62 $B$"$k!K$HItJ,E*$K6&M-$5$l$F$$$k!%(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
63 %\item We also maintain a number of ``backports'' to older versions of
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
64 % the Linux kernel, to support the needs of customers who are running
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
65 % older Linux distributions that do not incorporate our drivers. (To
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
66 % \emph{backport} a piece of code is to modify it to work in an older
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
67 % version of its target environment than the version it was developed
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
68 % for.)
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
69 \item $B3+H/<T$O2f!9$N%I%i%$%P$,AH$_9~$^$l$F$$$J$$8E$$(BLinux$B%G%#%9%H%j%S%e!<(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
70 $B%7%g%s$r;H$C$F$$$k8\5R$r%5%]!<%H$9$k$?$a$K!$8E$$%P!<%8%g%s$N(BLinux$B%+!<(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
71 $B%M%k$X$N(B``$B%P%C%/%]!<%H(B''$B$rJz$($F$$$k!%%3!<%I$N0lIt$r(B\emph{$B%P%C%/%]!<(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
72 $B%H(B}$B$9$k$3$H$O!$%I%i%$%P$,3+H/$5$l$?%P!<%8%g%s$h$j$b8E$$%P!<%8%g%s(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
73 $B$N4D6-$GF0$/$h$&$K$9$k$3$H$r0UL#$9$k!%(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
74 %\item Finally, we make software releases on a schedule that is
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
75 % necessarily not aligned with those used by Linux distributors and
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
76 % kernel developers, so that we can deliver new features to customers
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
77 % without forcing them to upgrade their entire kernels or
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
78 % distributions.
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
79 \item $B:G=*E*$K(BLinux$B%G%#%9%H%j%S%e!<%?$d%+!<%M%k3+H/<T$rBT$?$;$k$3$H$J$/%9(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
80 $B%1%8%e!<%kDL$j$K%=%U%H%&%'%"$r%j%j!<%9$9$k$3$H$,I,MW$G$"$j!$$3$l$K$h$C$F(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
81 $B8\5R$K%+!<%M%k$d%G%#%9%H%j%S%e!<%7%g%sA4BN$r%"%C%W%0%l!<%I$5$;$k$3$H$J$/(B
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
82 $B?75!G=$r8\5R$KFO$1$i$l$k!%(B
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
83 \end{itemize}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
84
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
85 %\subsection{Tempting approaches that don't work well}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
86 \subsection{$B$d$C$F$7$^$$$,$A$J4V0c$C$?J}K!(B}
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
87
350
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
88 %There are two ``standard'' ways to maintain a piece of software that
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
89 %has to target many different environments.
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
90
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
91 $B$5$^$6$^$J4D6-$r%?!<%2%C%H$K$7$?%=%U%H%&%'%"$r4IM}$9$k(B2$B$D$NI8=`E*$JJ}K!(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
92 $B$,$"$k!%(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
93
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
94 %The first is to maintain a number of branches, each intended for a
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
95 %single target. The trouble with this approach is that you must
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
96 %maintain iron discipline in the flow of changes between repositories.
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
97 %A new feature or bug fix must start life in a ``pristine'' repository,
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
98 %then percolate out to every backport repository. Backport changes are
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
99 %more limited in the branches they should propagate to; a backport
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
100 %change that is applied to a branch where it doesn't belong will
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
101 %probably stop the driver from compiling.
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
102
350
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
103 $BBh(B1$B$NJ}K!$O!$C10l$N%?!<%2%C%H8~$1$NJ#?t$N%V%i%s%A$r0];}$9$k$3$H$G$"$k!%$3(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
104 $B$NJ}K!$NLdBjE@$O!$%j%]%8%H%j4V$G$NJQ99$NN.$l$K$D$$$F873J$J5,N'$r0];}$7$J(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
105 $B$1$l$P$J$i$J$$$3$H$G$"$k!%?75!G=$d%P%0=$@5$O!$$-$l$$$J>uBV$N%j%]%8%H%j$G(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
106 $B3+;O$7!$%P%C%/%]!<%H%j%]%8%H%j$K?;F)$9$kI,MW$,$"$k!%%P%C%/%]!<%HJQ99$OGH(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
107 $B5Z$9$Y$-%V%i%s%AFb$K8BDj$5$l$F$$$J$1$l$P$J$i$J$$!%I,MW$N$J$$%V%i%s%A$X$N(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
108 $B%P%C%/%]!<%H$NGH5Z$O$*$=$i$/%I%i%$%P$r%3%s%Q%$%kITG=$K$7$F$7$^$&$@$m$&!%(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
109
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
110 %The second is to maintain a single source tree filled with conditional
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
111 %statements that turn chunks of code on or off depending on the
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
112 %intended target. Because these ``ifdefs'' are not allowed in the
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
113 %Linux kernel tree, a manual or automatic process must be followed to
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
114 %strip them out and yield a clean tree. A code base maintained in this
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
115 %fashion rapidly becomes a rat's nest of conditional blocks that are
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
116 %difficult to understand and maintain.
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
117
350
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
118 $BBh(B2$B$NJ}K!$O!$%A%c%s%/$d%3!<%I$r!$L\E*$H$9$k%?!<%2%C%HKh$K(Bon/off$B$9$k>r7oJ8(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
119 $B$rDI2C$7$?C10l$N%=!<%9%D%j!<$r0];}$9$kJ}K!$G$"$k!%$3$l$i$N(B``ifdef''$B$O(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
120 linux$B%+!<%M%k%D%j!<$G$O5v$5$l$F$$$J$$$?$a!$<jF0$^$?$O<+F0$G$3$l$i$N%3!<%I(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
121 $B$r=|5n$7!$%/%j!<%s$J%D%j!<$r:n$k%W%m%;%9$,I,MW$K$J$k!%$3$N$h$&$J$d$jJ}$G(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
122 $B4IM}$5$l$?%3!<%I%Y!<%9$O$9$0$K>r7o@a$NAc7"$H2=$7!"M}2r$d4IM}$NK8$2$H$J$k!#(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
123
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
124 %Neither of these approaches is well suited to a situation where you
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
125 %don't ``own'' the canonical copy of a source tree. In the case of a
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
126
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
127 %Linux driver that is distributed with the standard kernel, Linus's
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
128 %tree contains the copy of the code that will be treated by the world
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
129 %as canonical. The upstream version of ``my'' driver can be modified
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
130 %by people I don't know, without me even finding out about it until
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
131 %after the changes show up in Linus's tree.
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
132
350
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
133 $B$"$J$?$,@5<0$J%=!<%9%D%j!<$r=jM-$7$F$$$k$N$G$J$1$l$P!"$3$l$i$N$d$jJ}$N$I(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
134 $B$A$i$b$=$0$o$J$$$@$m$&!#I8=`$N(Blinux$B%+!<%M%k$KF1:-$5$l$F$$$k%I%i%$%P$N>l(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
135 $B9g!$(BLinus$B$N%D%j!<$O@$3&Cf$G@5<0$J%3!<%I$H$7$F07$o$l$k%3%T!<$r4^$s$G$$$k!%(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
136 ``$B;d(B''$B$N%I%i%$%P$N>eN.HG$O!$CN$i$J$$?M$K$h$C$FJQ99$5$lF@$k$7!$<+J,$NJQ99(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
137 $B$,(BLinus$B$N%D%j!<$KF~$C$?$"$H$G$5$($bJQ99$5$lF@$k!%(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
138
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
139 %These approaches have the added weakness of making it difficult to
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
140 %generate well-formed patches to submit upstream.
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
141
350
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
142 $B$3$l$i$N%"%W%m!<%A$O!$$&$^$/=q$+$l$?%Q%C%A$r>eN.$XDs=P$9$k$3$H$r:$Fq$K$7(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
143 $B$F$7$^$&!%(B
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
144
350
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
145 %In principle, Mercurial Queues seems like a good candidate to manage a
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
146 %development scenario such as the above. While this is indeed the
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
147 %case, MQ contains a few added features that make the job more
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
148 %pleasant.
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
149
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
150 Mercurial Queues$B$O>e5-$N$h$&$J3+H/%7%J%j%*$r4IM}$9$k$h$$8uJd$N0l$D$G$"$k(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
151 $B$H$$$($k!%$3$N$h$&$J>l9g$N$?$a$K(BMQ$B$K$O:n6H$r$h$j2wE,$K$9$k$$$/$D$+$N5!G=(B
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
152 $B$,$"$k!%(B
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
153
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
154 %\section{Conditionally applying patches with guards}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
155 \section{$B%,!<%I$r;H$C$?%Q%C%A$N>r7oE*$JE,MQ(B}
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
156
350
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
157 %Perhaps the best way to maintain sanity with so many targets is to be
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
158 %able to choose specific patches to apply for a given situation. MQ
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
159 %provides a feature called ``guards'' (which originates with quilt's
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
160 %\texttt{guards} command) that does just this. To start off, let's
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
161 %create a simple repository for experimenting in.
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
162 %\interaction{mq.guards.init}
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
163 %This gives us a tiny repository that contains two patches that don't
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
164 %have any dependencies on each other, because they touch different files.
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
165
351
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
166 $BB?$/$N%?!<%2%C%H$rBP>]$H$7$J$,$i@5>o$KJ]$D0lHVNI$$J}J}$O!$>u67$K1~$8$FFC(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
167 $BDj$N%Q%C%A$rA*$Y$k$h$&$K$9$k$3$H$G$"$k!%(BMQ$B$O$3$NL\E*$N$?$a$K(Bquilt$B$N(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
168 \texttt{guards}$B%3%^%s%I$KN`;w$7$?(B``guards''$B$H8F$P$l$k5!G=$rDs6!$7$F$$$k!%(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
169 $B3+;O$KEv$?$C$F!$<B83$N$?$a$KC1=c$J%j%]%8%H%j$r:n@.$9$k!%(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
170 \interaction{mq.guards.init}
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
171 $B>.$5$J%j%]%8%H%j$r:n$j!$JL!9$N%U%!%$%k$rA`:n$9$k8_$$$K0MB8@-$N$J$$(B2$B$D$N%Q%C(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
172 $B%A$rCV$/!%(B
350
5a5419eeab70 more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 349
diff changeset
173
351
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
174 %The idea behind conditional application is that you can ``tag'' a
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
175 %patch with a \emph{guard}, which is simply a text string of your
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
176 %choosing, then tell MQ to select specific guards to use when applying
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
177 %patches. MQ will then either apply, or skip over, a guarded patch,
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
178 %depending on the guards that you have selected.
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
179
351
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
180 $B>r7oIU$-$G%Q%C%A%Q%C%A$NE,MQ$r%3%s%H%m!<%k$9$kJ}K!$NGX8e$K$"$k$N(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
181 $B$O!$(B\emph{guard}$B$K$h$C$F%Q%C%A$KIU$1$i$l$?(B``$B%?%0(B''$B$G$"$k!%%?%0$O<+M3$KA*(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
182 $B$s$@C1=c$J%F%-%9%H$G!$(BMQ$B$,%Q%C%A$rE,MQ$9$k$H$-$KMQ$$$kFCDj$N%,!<%I$r;XDj(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
183 $B$9$k!%(BMQ$B$O%,!<%I%Q%C%A$NE,MQ$^$?$O%9%-%C%W$r!$;XDj$5$l$?%,!<%I$K$h$C$F7h(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
184 $BDj$9$k!%(B
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
185
351
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
186 %A patch can have an arbitrary number of guards;
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
187 %each one is \emph{positive} (``apply this patch if this guard is
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
188 %selected'') or \emph{negative} (``skip this patch if this guard is
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
189 %selected''). A patch with no guards is always applied.
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
190
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
191 $B%Q%C%A$OG$0U$N?t$N%,!<%I$r;}$D$3$H$,$G$-$k!%3F!9$N%,!<%I(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
192 $B$O!$(B\emph{positive}$B!J$3$N%,!<%I$,A*Br$5$l$F$$$k$H$-$K$3$N%Q%C%A$rE,MQ!K$^(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
193 $B$?$O(B\emph{negative}$B!J$3$N%,!<%I$,A*Br$5$l$F$$$k$H$-$K$3$N%Q%C%A$r%9%-%C(B
f3fa98815193 a bit more mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 350
diff changeset
194 $B%W!K$G$"$k!%%,!<%I$r;}$?$J$$%Q%C%A$O>o$KE,MQ$5$l$k!%(B
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
195
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
196 %\section{Controlling the guards on a patch}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
197 \section{$B%Q%C%AFb$N%,!<%I$rA`:n$9$k(B}
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
198
233
696b1e0c01df Tag all MQ commands as belonging to the mq extension.
Bryan O'Sullivan <bos@serpentine.com>
parents: 224
diff changeset
199 The \hgxcmd{mq}{qguard} command lets you determine which guards should
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
200 apply to a patch, or display the guards that are already in effect.
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
201 Without any arguments, it displays the guards on the current topmost
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
202 patch.
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
203 \interaction{mq.guards.qguard}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
204 To set a positive guard on a patch, prefix the name of the guard with
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
205 a ``\texttt{+}''.
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
206 \interaction{mq.guards.qguard.pos}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
207 To set a negative guard on a patch, prefix the name of the guard with
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
208 a ``\texttt{-}''.
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
209 \interaction{mq.guards.qguard.neg}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
210
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
211 \begin{note}
233
696b1e0c01df Tag all MQ commands as belonging to the mq extension.
Bryan O'Sullivan <bos@serpentine.com>
parents: 224
diff changeset
212 The \hgxcmd{mq}{qguard} command \emph{sets} the guards on a patch; it
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
213 doesn't \emph{modify} them. What this means is that if you run
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
214 \hgcmdargs{qguard}{+a +b} on a patch, then \hgcmdargs{qguard}{+c} on
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
215 the same patch, the \emph{only} guard that will be set on it
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
216 afterwards is \texttt{+c}.
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
217 \end{note}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
218
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
219 Mercurial stores guards in the \sfilename{series} file; the form in
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
220 which they are stored is easy both to understand and to edit by hand.
233
696b1e0c01df Tag all MQ commands as belonging to the mq extension.
Bryan O'Sullivan <bos@serpentine.com>
parents: 224
diff changeset
221 (In other words, you don't have to use the \hgxcmd{mq}{qguard} command if
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
222 you don't want to; it's okay to simply edit the \sfilename{series}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
223 file.)
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
224 \interaction{mq.guards.series}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
225
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
226 %\section{Selecting the guards to use}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
227 \section{$B;HMQ$9$k%,!<%I$rA*$V(B}
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
228
233
696b1e0c01df Tag all MQ commands as belonging to the mq extension.
Bryan O'Sullivan <bos@serpentine.com>
parents: 224
diff changeset
229 The \hgxcmd{mq}{qselect} command determines which guards are active at a
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
230 given time. The effect of this is to determine which patches MQ will
233
696b1e0c01df Tag all MQ commands as belonging to the mq extension.
Bryan O'Sullivan <bos@serpentine.com>
parents: 224
diff changeset
231 apply the next time you run \hgxcmd{mq}{qpush}. It has no other effect; in
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
232 particular, it doesn't do anything to patches that are already
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
233 applied.
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
234
233
696b1e0c01df Tag all MQ commands as belonging to the mq extension.
Bryan O'Sullivan <bos@serpentine.com>
parents: 224
diff changeset
235 With no arguments, the \hgxcmd{mq}{qselect} command lists the guards
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
236 currently in effect, one per line of output. Each argument is treated
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
237 as the name of a guard to apply.
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
238 \interaction{mq.guards.qselect.foo}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
239 In case you're interested, the currently selected guards are stored in
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
240 the \sfilename{guards} file.
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
241 \interaction{mq.guards.qselect.cat}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
242 We can see the effect the selected guards have when we run
233
696b1e0c01df Tag all MQ commands as belonging to the mq extension.
Bryan O'Sullivan <bos@serpentine.com>
parents: 224
diff changeset
243 \hgxcmd{mq}{qpush}.
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
244 \interaction{mq.guards.qselect.qpush}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
245
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
246 A guard cannot start with a ``\texttt{+}'' or ``\texttt{-}''
106
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
247 character. The name of a guard must not contain white space, but most
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
248 othter characters are acceptable. If you try to use a guard with an
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
249 invalid name, MQ will complain:
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
250 \interaction{mq.guards.qselect.error}
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
251 Changing the selected guards changes the patches that are applied.
106
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
252 \interaction{mq.guards.qselect.quux}
105
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
253 You can see in the example below that negative guards take precedence
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
254 over positive guards.
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
255 \interaction{mq.guards.qselect.foobar}
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
256
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
257 %\section{MQ's rules for applying patches}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
258 \section{MQ$B$N%Q%C%AE,MQ%k!<%k(B}
105
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
259
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
260 The rules that MQ uses when deciding whether to apply a patch
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
261 are as follows.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
262 \begin{itemize}
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
263 \item A patch that has no guards is always applied.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
264 \item If the patch has any negative guard that matches any currently
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
265 selected guard, the patch is skipped.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
266 \item If the patch has any positive guard that matches any currently
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
267 selected guard, the patch is applied.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
268 \item If the patch has positive or negative guards, but none matches
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
269 any currently selected guard, the patch is skipped.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
270 \end{itemize}
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
271
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
272 %\section{Trimming the work environment}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
273 \section{$B:n6H4D6-$r=L>.$9$k(B}
105
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
274
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
275 In working on the device driver I mentioned earlier, I don't apply the
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
276 patches to a normal Linux kernel tree. Instead, I use a repository
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
277 that contains only a snapshot of the source files and headers that are
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
278 relevant to Infiniband development. This repository is~1\% the size
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
279 of a kernel repository, so it's easier to work with.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
280
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
281 I then choose a ``base'' version on top of which the patches are
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
282 applied. This is a snapshot of the Linux kernel tree as of a revision
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
283 of my choosing. When I take the snapshot, I record the changeset ID
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
284 from the kernel repository in the commit message. Since the snapshot
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
285 preserves the ``shape'' and content of the relevant parts of the
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
286 kernel tree, I can apply my patches on top of either my tiny
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
287 repository or a normal kernel tree.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
288
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
289 Normally, the base tree atop which the patches apply should be a
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
290 snapshot of a very recent upstream tree. This best facilitates the
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
291 development of patches that can easily be submitted upstream with few
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
292 or no modifications.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
293
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
294 %\section{Dividing up the \sfilename{series} file}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
295 \section{\sfilename{series}$B%U%!%$%k$X%@%$%V$9$k(B}
105
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
296
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
297 I categorise the patches in the \sfilename{series} file into a number
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
298 of logical groups. Each section of like patches begins with a block
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
299 of comments that describes the purpose of the patches that follow.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
300
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
301 The sequence of patch groups that I maintain follows. The ordering of
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
302 these groups is important; I'll describe why after I introduce the
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
303 groups.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
304 \begin{itemize}
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
305 \item The ``accepted'' group. Patches that the development team has
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
306 submitted to the maintainer of the Infiniband subsystem, and which
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
307 he has accepted, but which are not present in the snapshot that the
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
308 tiny repository is based on. These are ``read only'' patches,
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
309 present only to transform the tree into a similar state as it is in
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
310 the upstream maintainer's repository.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
311 \item The ``rework'' group. Patches that I have submitted, but that
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
312 the upstream maintainer has requested modifications to before he
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
313 will accept them.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
314 \item The ``pending'' group. Patches that I have not yet submitted to
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
315 the upstream maintainer, but which we have finished working on.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
316 These will be ``read only'' for a while. If the upstream maintainer
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
317 accepts them upon submission, I'll move them to the end of the
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
318 ``accepted'' group. If he requests that I modify any, I'll move
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
319 them to the beginning of the ``rework'' group.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
320 \item The ``in progress'' group. Patches that are actively being
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
321 developed, and should not be submitted anywhere yet.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
322 \item The ``backport'' group. Patches that adapt the source tree to
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
323 older versions of the kernel tree.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
324 \item The ``do not ship'' group. Patches that for some reason should
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
325 never be submitted upstream. For example, one such patch might
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
326 change embedded driver identification strings to make it easier to
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
327 distinguish, in the field, between an out-of-tree version of the
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
328 driver and a version shipped by a distribution vendor.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
329 \end{itemize}
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
330
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
331 Now to return to the reasons for ordering groups of patches in this
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
332 way. We would like the lowest patches in the stack to be as stable as
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
333 possible, so that we will not need to rework higher patches due to
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
334 changes in context. Putting patches that will never be changed first
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
335 in the \sfilename{series} file serves this purpose.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
336
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
337 We would also like the patches that we know we'll need to modify to be
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
338 applied on top of a source tree that resembles the upstream tree as
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
339 closely as possible. This is why we keep accepted patches around for
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
340 a while.
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
341
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
342 The ``backport'' and ``do not ship'' patches float at the end of the
106
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
343 \sfilename{series} file. The backport patches must be applied on top
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
344 of all other patches, and the ``do not ship'' patches might as well
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
345 stay out of harm's way.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
346
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
347 %\section{Maintaining the patch series}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
348 \section{$B%Q%C%A%7%j!<%:$r4IM}$9$k(B}
106
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
349
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
350 In my work, I use a number of guards to control which patches are to
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
351 be applied.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
352
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
353 \begin{itemize}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
354 \item ``Accepted'' patches are guarded with \texttt{accepted}. I
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
355 enable this guard most of the time. When I'm applying the patches
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
356 on top of a tree where the patches are already present, I can turn
271
8627f718517a Fix typo "paptches"
Max Vozeler <max@nusquama.org>
parents: 240
diff changeset
357 this patch off, and the patches that follow it will apply cleanly.
106
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
358 \item Patches that are ``finished'', but not yet submitted, have no
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
359 guards. If I'm applying the patch stack to a copy of the upstream
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
360 tree, I don't need to enable any guards in order to get a reasonably
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
361 safe source tree.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
362 \item Those patches that need reworking before being resubmitted are
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
363 guarded with \texttt{rework}.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
364 \item For those patches that are still under development, I use
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
365 \texttt{devel}.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
366 \item A backport patch may have several guards, one for each version
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
367 of the kernel to which it applies. For example, a patch that
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
368 backports a piece of code to~2.6.9 will have a~\texttt{2.6.9} guard.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
369 \end{itemize}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
370 This variety of guards gives me considerable flexibility in
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
371 qdetermining what kind of source tree I want to end up with. For most
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
372 situations, the selection of appropriate guards is automated during
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
373 the build process, but I can manually tune the guards to use for less
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
374 common circumstances.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
375
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
376 %\subsection{The art of writing backport patches}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
377 \subsection{$B%P%C%/%]!<%H%Q%C%A$r=q$/5;=Q(B}
106
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
378
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
379 Using MQ, writing a backport patch is a simple process. All such a
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
380 patch has to do is modify a piece of code that uses a kernel feature
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
381 not present in the older version of the kernel, so that the driver
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
382 continues to work correctly under that older version.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
383
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
384 A useful goal when writing a good backport patch is to make your code
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
385 look as if it was written for the older version of the kernel you're
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
386 targeting. The less obtrusive the patch, the easier it will be to
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
387 understand and maintain. If you're writing a collection of backport
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
388 patches to avoid the ``rat's nest'' effect of lots of
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
389 \texttt{\#ifdef}s (hunks of source code that are only used
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
390 conditionally) in your code, don't introduce version-dependent
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
391 \texttt{\#ifdef}s into the patches. Instead, write several patches,
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
392 each of which makes unconditional changes, and control their
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
393 application using guards.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
394
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
395 There are two reasons to divide backport patches into a distinct
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
396 group, away from the ``regular'' patches whose effects they modify.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
397 The first is that intermingling the two makes it more difficult to use
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
398 a tool like the \hgext{patchbomb} extension to automate the process of
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
399 submitting the patches to an upstream maintainer. The second is that
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
400 a backport patch could perturb the context in which a subsequent
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
401 regular patch is applied, making it impossible to apply the regular
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
402 patch cleanly \emph{without} the earlier backport patch already being
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
403 applied.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
404
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
405 %\section{Useful tips for developing with MQ}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
406 \section{MQ$B$K$h$k3+H/$N(Btips}
106
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
407
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
408 %\subsection{Organising patches in directories}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
409 \subsection{$B%G%#%l%/%H%jFb$G%Q%C%A$r4IM}$9$k(B}
106
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
410
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
411 If you're working on a substantial project with MQ, it's not difficult
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
412 to accumulate a large number of patches. For example, I have one
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
413 patch repository that contains over 250 patches.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
414
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
415 If you can group these patches into separate logical categories, you
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
416 can if you like store them in different directories; MQ has no
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
417 problems with patch names that contain path separators.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
418
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
419 %\subsection{Viewing the history of a patch}
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
420 \subsection{$B%Q%C%A$N%R%9%H%j$r8+$k(B}
106
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
421 \label{mq-collab:tips:interdiff}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
422
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
423 If you're developing a set of patches over a long time, it's a good
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
424 idea to maintain them in a repository, as discussed in
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
425 section~\ref{sec:mq:repo}. If you do so, you'll quickly discover that
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
426 using the \hgcmd{diff} command to look at the history of changes to a
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
427 patch is unworkable. This is in part because you're looking at the
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
428 second derivative of the real code (a diff of a diff), but also
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
429 because MQ adds noise to the process by modifying time stamps and
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
430 directory names when it updates a patch.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
431
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
432 However, you can use the \hgext{extdiff} extension, which is bundled
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
433 with Mercurial, to turn a diff of two versions of a patch into
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
434 something readable. To do this, you will need a third-party package
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
435 called \package{patchutils}~\cite{web:patchutils}. This provides a
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
436 command named \command{interdiff}, which shows the differences between
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
437 two diffs as a diff. Used on two versions of the same diff, it
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
438 generates a diff that represents the diff from the first to the second
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
439 version.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
440
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
441 You can enable the \hgext{extdiff} extension in the usual way, by
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
442 adding a line to the \rcsection{extensions} section of your \hgrc.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
443 \begin{codesample2}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
444 [extensions]
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
445 extdiff =
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
446 \end{codesample2}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
447 The \command{interdiff} command expects to be passed the names of two
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
448 files, but the \hgext{extdiff} extension passes the program it runs a
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
449 pair of directories, each of which can contain an arbitrary number of
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
450 files. We thus need a small program that will run \command{interdiff}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
451 on each pair of files in these two directories. This program is
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
452 available as \sfilename{hg-interdiff} in the \dirname{examples}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
453 directory of the source code repository that accompanies this book.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
454 \excode{hg-interdiff}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
455
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
456 With the \sfilename{hg-interdiff} program in your shell's search path,
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
457 you can run it as follows, from inside an MQ patch directory:
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
458 \begin{codesample2}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
459 hg extdiff -p hg-interdiff -r A:B my-change.patch
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
460 \end{codesample2}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
461 Since you'll probably want to use this long-winded command a lot, you
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
462 can get \hgext{hgext} to make it available as a normal Mercurial
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
463 command, again by editing your \hgrc.
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
464 \begin{codesample2}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
465 [extdiff]
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
466 cmd.interdiff = hg-interdiff
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
467 \end{codesample2}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
468 This directs \hgext{hgext} to make an \texttt{interdiff} command
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
469 available, so you can now shorten the previous invocation of
238
4b315189e01f Fix typo.
Bryan O'Sullivan <bos@serpentine.com>
parents: 233
diff changeset
470 \hgxcmd{extdiff}{extdiff} to something a little more wieldy.
106
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
471 \begin{codesample2}
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
472 hg interdiff -r A:B my-change.patch
9cbc5d0db542 Finish off advanced MQ chapter (maybe).
Bryan O'Sullivan <bos@serpentine.com>
parents: 105
diff changeset
473 \end{codesample2}
105
ecacb6b4c9fd Grouping patches in the series file.
Bryan O'Sullivan <bos@serpentine.com>
parents: 104
diff changeset
474
107
a0d7e11db169 A brief note on interdiff.
Bryan O'Sullivan <bos@serpentine.com>
parents: 106
diff changeset
475 \begin{note}
a0d7e11db169 A brief note on interdiff.
Bryan O'Sullivan <bos@serpentine.com>
parents: 106
diff changeset
476 The \command{interdiff} command works well only if the underlying
a0d7e11db169 A brief note on interdiff.
Bryan O'Sullivan <bos@serpentine.com>
parents: 106
diff changeset
477 files against which versions of a patch are generated remain the
a0d7e11db169 A brief note on interdiff.
Bryan O'Sullivan <bos@serpentine.com>
parents: 106
diff changeset
478 same. If you create a patch, modify the underlying files, and then
a0d7e11db169 A brief note on interdiff.
Bryan O'Sullivan <bos@serpentine.com>
parents: 106
diff changeset
479 regenerate the patch, \command{interdiff} may not produce useful
a0d7e11db169 A brief note on interdiff.
Bryan O'Sullivan <bos@serpentine.com>
parents: 106
diff changeset
480 output.
a0d7e11db169 A brief note on interdiff.
Bryan O'Sullivan <bos@serpentine.com>
parents: 106
diff changeset
481 \end{note}
a0d7e11db169 A brief note on interdiff.
Bryan O'Sullivan <bos@serpentine.com>
parents: 106
diff changeset
482
240
4119e57679f7 Twiddle wording trivially.
Bryan O'Sullivan <bos@serpentine.com>
parents: 239
diff changeset
483 The \hgext{extdiff} extension is useful for more than merely improving
239
fe8598eb99c4 Refer to main coverage of extdiff extension.
Bryan O'Sullivan <bos@serpentine.com>
parents: 238
diff changeset
484 the presentation of MQ~patches. To read more about it, go to
fe8598eb99c4 Refer to main coverage of extdiff extension.
Bryan O'Sullivan <bos@serpentine.com>
parents: 238
diff changeset
485 section~\ref{sec:hgext:extdiff}.
fe8598eb99c4 Refer to main coverage of extdiff extension.
Bryan O'Sullivan <bos@serpentine.com>
parents: 238
diff changeset
486
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
487 %%% Local Variables:
293
3b1291f24c0d - replaved latex-mode to yatex-mode
Yoshiki Yazawa <yaz@cc.rim.or.jp>
parents: 290
diff changeset
488 %%% mode: yatex
104
32bf9a5f22c0 Refactor MQ chapter into three.
Bryan O'Sullivan <bos@serpentine.com>
parents:
diff changeset
489 %%% TeX-master: "00book"
349
84ae26ab0ac3 started mq-collab.tex
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents: 293
diff changeset
490 %%% End: