Mercurial > hgbook
changeset 314:aa132d5e2b32
completed draft translation for undo.tex.
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Mon, 18 Feb 2008 03:53:20 +0900 |
parents | f3cb5fac471a |
children | 8666e23fd2db |
files | ja/undo.tex |
diffstat | 1 files changed, 315 insertions(+), 142 deletions(-) [+] |
line wrap: on
line diff
--- a/ja/undo.tex Sun Feb 17 22:53:01 2008 +0900 +++ b/ja/undo.tex Mon Feb 18 03:53:20 2008 +0900 @@ -1023,199 +1023,372 @@ $B$$$F$G$O$J$/!$%S%k%H%$%s%3%^%s%I$H$7$F$N(B\hgcmd{bisect}$B$K$D$$$F=R$Y$F$$$k!%(B \end{note} -Now let's create a repository, so that we can try out the -\hgcmd{bisect} command in isolation. +%Now let's create a repository, so that we can try out the +%\hgcmd{bisect} command in isolation. +%\interaction{bisect.init} +%We'll simulate a project that has a bug in it in a simple-minded way: +%create trivial changes in a loop, and nominate one specific change +%that will have the ``bug''. This loop creates 35 changesets, each +%adding a single file to the repository. We'll represent our ``bug'' +%with a file that contains the text ``i have a gub''. +%\interaction{bisect.commits} + +$BFHN)$7$F(B\hgcmd{bisect}$B$r;n$;$k$h$&$K%j%]%8%H%j$r:n@.$9$k!%(B \interaction{bisect.init} -We'll simulate a project that has a bug in it in a simple-minded way: -create trivial changes in a loop, and nominate one specific change -that will have the ``bug''. This loop creates 35 changesets, each -adding a single file to the repository. We'll represent our ``bug'' -with a file that contains the text ``i have a gub''. +$BC1=c$J%P%0$N$"$k%W%m%8%'%/%H$r%7%_%e%l!<%H$9$k!%%P%0$O7+JV$7A`:n$N4V$K<+(B +$BL@$JJQ99$r9T$$!$FCDj$N(B1$B$D$NJQ99$r%P%0$r;}$D$H;XL>$9$k!%$3$N%k!<%W$O(B35 +$B$N%A%'%s%8%;%C%H$r:n$j!$3F!9!$(B1$B$D$N%U%!%$%k$r%j%]%8%H%j$KDI2C$9$k!%%P%0(B +$B$O(B``i have a gub''$B$H$$$&J8;zNs$r;}$D%U%!%$%k$GI=8=$9$k!%(B \interaction{bisect.commits} -The next thing that we'd like to do is figure out how to use the -\hgcmd{bisect} command. We can use Mercurial's normal built-in help -mechanism for this. +%The next thing that we'd like to do is figure out how to use the +%\hgcmd{bisect} command. We can use Mercurial's normal built-in help +%mechanism for this. +%\interaction{bisect.help} + +$B<!$K(B\hgcmd{bisect}$B$N;H$$J}$r@bL@$7$?$$!%(BMercurial$B$N%S%k%H%$%s$N%X%k%W$,(B +$B;H$($k!%(B \interaction{bisect.help} -The \hgcmd{bisect} command works in steps. Each step proceeds as follows. +%The \hgcmd{bisect} command works in steps. Each step proceeds as follows. +%\begin{enumerate} +%\item You run your binary test. +% \begin{itemize} +% \item If the test succeeded, you tell \hgcmd{bisect} by running the +% \hgcmdargs{bisect}{good} command. +% \item If it failed, run the \hgcmdargs{bisect}{--bad} command. +% \end{itemize} +%\item The command uses your information to decide which changeset to +% test next. +%\item It updates the working directory to that changeset, and the +% process begins again. +%\end{enumerate} +%The process ends when \hgcmd{bisect} identifies a unique changeset +%that marks the point where your test transitioned from ``succeeding'' +%to ``failing''. + +\hgcmd{bisect}$B%3%^%s%I$OCJ3,$rF'$s$GF0:n$9$k!%3FCJ3,$O0J2<$N$h$&$K?J$`!%(B \begin{enumerate} -\item You run your binary test. +\item $B%P%$%J%j%F%9%H$r<B9T$9$k(B \begin{itemize} - \item If the test succeeded, you tell \hgcmd{bisect} by running the - \hgcmdargs{bisect}{good} command. - \item If it failed, run the \hgcmdargs{bisect}{--bad} command. + \item $B%F%9%H$,@.8y$7$?>l9g!$(B\hgcmd{bisect}$B$r0z?t(B\hgcmdargs{bisect}{good} + $B$rIU$1$F<B9T$9$k!%(B + \item $B%F%9%H$,<:GT$7$?>l9g$O(B\hgcmdargs{bisect}{--bad}$B%3%^%s%I$r<B9T$9(B + $B$k!%(B \end{itemize} -\item The command uses your information to decide which changeset to - test next. -\item It updates the working directory to that changeset, and the - process begins again. + \item $B%3%^%s%I$O0z?t$GEO$5$l$?>pJs$r;H$C$F<!$K$I$N%A%'%s%8%;%C%H$r%F%9(B + $B%H$9$Y$-$+7hDj$9$k!%(B + \item $B%3%^%s%I$O%o!<%-%s%0%G%#%l%/%H%j$r$=$N%A%'%s%8%;%C%H$K99?7$9$k!%(B + $B%W%m%;%9$r:F3+$9$k!%(B \end{enumerate} -The process ends when \hgcmd{bisect} identifies a unique changeset -that marks the point where your test transitioned from ``succeeding'' -to ``failing''. +\hgcmd{bisect}$B$N%W%m%;%9$O!$%F%9%H$,@.8y$+$i<:GT$XJQ2=$7$?%A%'%s%8%;%C%H(B +$B$rFCDj$G$-$k$H=*N;$9$k!%(B -To start the search, we must run the \hgcmdargs{bisect}{--reset} command. +%To start the search, we must run the \hgcmdargs{bisect}{--reset} command. +%\interaction{bisect.search.init} + +$B%5!<%A$r;O$a$k$K$O(B\hgcmdargs{bisect}{--reset}$B$r<B9T$9$k!%(B \interaction{bisect.search.init} -In our case, the binary test we use is simple: we check to see if any -file in the repository contains the string ``i have a gub''. If it -does, this changeset contains the change that ``caused the bug''. By -convention, a changeset that has the property we're searching for is -``bad'', while one that doesn't is ``good''. +%In our case, the binary test we use is simple: we check to see if any +%file in the repository contains the string ``i have a gub''. If it +%does, this changeset contains the change that ``caused the bug''. By +%convention, a changeset that has the property we're searching for is +%``bad'', while one that doesn't is ``good''. -Most of the time, the revision to which the working directory is -synced (usually the tip) already exhibits the problem introduced by -the buggy change, so we'll mark it as ``bad''. +$B$3$N%1!<%9$G$O!$%P%$%J%j%F%9%H$OC1=c$G!$%j%]%8%H%jFb$K(B``i have a gub''$B$r(B +$B4^$`%U%!%$%k$,$"$k$+$I$&$+$r%A%'%C%/$9$k$@$1$G$"$k!%$b$7$3$l$,$"$l$P!$$=(B +$B$N%A%'%s%8%;%C%H$,%P%0$r0z$-5/$3$7$F$$$kJQ99$r4^$s$G$$$k$H$$$&$3$H$K$J$k!%(B +$B47Nc$K=>$C$F!$C5$7$F$$$k%A%'%s%8%;%C%H$r(B``bad''$B!$$=$l0J30$r(B``good''$B$H8F(B +$B$V$3$H$K$9$k!%(B + +%Most of the time, the revision to which the working directory is +%synced (usually the tip) already exhibits the problem introduced by +%the buggy change, so we'll mark it as ``bad''. +%\interaction{bisect.search.bad-init} + +$BBgDq$N>l9g!$%o!<%-%s%0%G%#%l%/%H%j$,F14|$7$F$$$k%j%S%8%g%s!JDL>o$O(Btip$B$N(B +$B$O$:$@!K$O!$%P%0$N$"$kJQ99$K$h$C$F0z$-5/$3$5$l$?LdBj$r<($7$F$$$k$N$G!$$3(B +$B$N%j%S%8%g%s$r(B``bad''$B$H%^!<%/$9$k!%(B \interaction{bisect.search.bad-init} -Our next task is to nominate a changeset that we know \emph{doesn't} -have the bug; the \hgcmd{bisect} command will ``bracket'' its search -between the first pair of good and bad changesets. In our case, we -know that revision~10 didn't have the bug. (I'll have more words -about choosing the first ``good'' changeset later.) +%Our next task is to nominate a changeset that we know \emph{doesn't} +%have the bug; the \hgcmd{bisect} command will ``bracket'' its search +%between the first pair of good and bad changesets. In our case, we +%know that revision~10 didn't have the bug. (I'll have more words +%about choosing the first ``good'' changeset later.) +%\interaction{bisect.search.good-init} + +$B<!$K%P%0$r(B\emph{$B4^$^$J$$(B}$B%j%S%8%g%s$r;XL>$9$k!%(B\hgcmd{bisect}$B%3%^%s%I$O(B +$B:G=i$N(B``good''$B%A%'%s%8%;%C%H$H(B``bad''$B%A%'%s%8%;%C%H$r%V%i%1%C%H$9$k!%$3(B +$B$NNc$G$O!$%j%S%8%g%s(B~10$B$O%P%0$r;}$?$J$$$HJ,$+$C$F$$$k!%!J:G=i$N(B``good'' +$B%A%'%s%8%;%C%H$NA*$SJ}$K$D$$$F$O8e=R$9$k!%!K(B \interaction{bisect.search.good-init} -Notice that this command printed some output. +%Notice that this command printed some output. +%\begin{itemize} +%\item It told us how many changesets it must consider before it can +% identify the one that introduced the bug, and how many tests that +% will require. +%\item It updated the working directory to the next changeset to test, +% and told us which changeset it's testing. +%\end{itemize} + +$B%3%^%s%I$+$i=PNO$,$"$k$3$H$KCm0U!%(B \begin{itemize} -\item It told us how many changesets it must consider before it can - identify the one that introduced the bug, and how many tests that - will require. -\item It updated the working directory to the next changeset to test, - and told us which changeset it's testing. + \item $B%P%0$NF~$C$?%A%'%s%8%;%C%H$rFCDj$9$k$^$G$K9MN8$9$Y$-%A%'%s%8%;%C%H(B + $B$N8D?t$H!$I,MW$J8!::$N2s?t$rI=<($9$k!%(B + \item $B%o!<%-%s%0%G%#%l%/%H%j$r<!$N%F%9%H$9$Y$-%A%'%s%8%;%C%H$K99?7$7!$(B + $B$I$N%A%'%s%8%;%C%H$r%F%9%H$7$F$$$k$N$+$rI=<($9$k!%(B \end{itemize} -We now run our test in the working directory. We use the -\command{grep} command to see if our ``bad'' file is present in the -working directory. If it is, this revision is bad; if not, this -revision is good. +%We now run our test in the working directory. We use the +%\command{grep} command to see if our ``bad'' file is present in the +%working directory. If it is, this revision is bad; if not, this +%revision is good. +%\interaction{bisect.search.step1} + +$B$3$3$G%o!<%-%s%0%G%#%l%/%H%j$G%F%9%H$r9T$&$3$H$,$G$-$k!%(B\command{grep}$B%3(B +$B%^%s%I$r;H$C$F(B``bad''$B%U%!%$%k$,%o!<%-%s%0%G%#%l%/%H%j$K$"$k$+$I$&$+$r%A%'%C(B +$B%/$9$k!%$b$7B8:_$9$l$P!$%j%S%8%g%s$O(Bbad$B$G!$B8:_$7$J$1$l$P%j%S%8%g%s$O(B +good$B$H$$$&$3$H$K$J$k!%(B \interaction{bisect.search.step1} -This test looks like a perfect candidate for automation, so let's turn -it into a shell function. +%This test looks like a perfect candidate for automation, so let's turn +%it into a shell function. +%\interaction{bisect.search.mytest} +%We can now run an entire test step with a single command, +%\texttt{mytest}. +%\interaction{bisect.search.step2} +%A few more invocations of our canned test step command, and we're +%done. +%\interaction{bisect.search.rest} + +$B$3$N%F%9%H$O40A4$K<+F02=$G$-$k!%%7%'%k4X?t$K$7$F$_$h$&!%(B \interaction{bisect.search.mytest} -We can now run an entire test step with a single command, -\texttt{mytest}. +$B%F%9%HA4BN$r0l$D$N(B\texttt{mytest}$B%3%^%s%I$H$7$F<B9T$G$-$k$h$&$K$J$C$?!%(B \interaction{bisect.search.step2} -A few more invocations of our canned test step command, and we're -done. +$B$3$N%Q%C%/$5$l$?%F%9%H%3%^%s%I$r5/F0$9$k$@$1$G%F%9%H$,40N;$9$k!%(B \interaction{bisect.search.rest} -Even though we had~40 changesets to search through, the \hgcmd{bisect} -command let us find the changeset that introduced our ``bug'' with -only five tests. Because the number of tests that the \hgcmd{bisect} -command grows logarithmically with the number of changesets to -search, the advantage that it has over the ``brute force'' search -approach increases with every changeset you add. +%Even though we had~40 changesets to search through, the \hgcmd{bisect} +%command let us find the changeset that introduced our ``bug'' with +%only five tests. Because the number of tests that the \hgcmd{bisect} +%command grows logarithmically with the number of changesets to +%search, the advantage that it has over the ``brute force'' search +%approach increases with every changeset you add. + +40$B8D$N%A%'%s%8%;%C%H$,$"$k$K$b$+$+$o$i$:!$(B\hgcmd{bisect}$B%3%^%s%I$O%P%0$r(B +$B$b$?$i$7$?%A%'%s%8%;%C%H$r(B5$B2s$N%F%9%H$GH/8+$9$k$3$H$,$G$-$?!%(B +\hgcmd{bisect}$B$N%F%9%H2s?t$OC5:w$9$Y$-%A%'%s%8%;%C%H?t$,A}$($k$K=>$C$F!$(B +$BBP?tE($KA}$($k$,!$iMDY$7C5:w$KBP$9$kM%0L@-$O!$%A%'%s%8%;%C%H$,A}2C$9$k$K(B +$B=>$C$FA}2C$9$k!%(B + -\subsection{Cleaning up after your search} +%\subsection{Cleaning up after your search} +\subsection{$B%5!<%A8e$N%/%j!<%s%"%C%W(B} -When you're finished using the \hgcmd{bisect} command in a -repository, you can use the \hgcmdargs{bisect}{reset} command to drop -the information it was using to drive your search. The command -doesn't use much space, so it doesn't matter if you forget to run this -command. However, \hgcmd{bisect} won't let you start a new search in -that repository until you do a \hgcmdargs{bisect}{reset}. +%When you're finished using the \hgcmd{bisect} command in a +%repository, you can use the \hgcmdargs{bisect}{reset} command to drop +%the information it was using to drive your search. The command +%doesn't use much space, so it doesn't matter if you forget to run this +%command. However, \hgcmd{bisect} won't let you start a new search in +%that repository until you do a \hgcmdargs{bisect}{reset}. +%\interaction{bisect.search.reset} + +$B%j%]%8%H%jFb$G(B\hgcmd{bisect}$B%3%^%s%I$r;H$$=*$C$?8e$K(B +\hgcmdargs{bisect}{reset}$B%3%^%s%I$GC5:w$K;H$C$?>pJs$r>C5n$9$k$3$H$,$G$-(B +$B$k!%%3%^%s%I$OBg$-$J%9%Z!<%9$r;H$&$o$1$G$O$J$$$N$G!$$3$N%3%^%s%I$r<B9T$9(B +$B$k$N$rK:$l$F$bFC$KLdBj$O$J$$!%$7$+$7(B\hgcmd{bisect}$B$O(B +\hgcmdargs{bisect}{reset}$B$,<B9T$5$l$k$^$G!$$=$N%j%]%8%H%jFb$G?7$?$JC5:w(B +$B$r;O$a$k$3$H$O$G$-$J$$!%(B \interaction{bisect.search.reset} -\section{Tips for finding bugs effectively} +%\section{Tips for finding bugs effectively} +\section{$B8zN(E*$J%P%0$NH/8+K!(B} + +%\subsection{Give consistent input} +\subsection{$B0l4S$7$?F~NO$r9T$&(B} -\subsection{Give consistent input} +%The \hgcmd{bisect} command requires that you correctly report the +%result of every test you perform. If you tell it that a test failed +%when it really succeeded, it \emph{might} be able to detect the +%inconsistency. If it can identify an inconsistency in your reports, +%it will tell you that a particular changeset is both good and bad. +%However, it can't do this perfectly; it's about as likely to report +%the wrong changeset as the source of the bug. + +\hgcmd{bisect}$B%3%^%s%I$O3F%F%9%H$G@5$7$/7k2L$rF~NO$9$k$3$H$,I,MW$G$"$k!%(B +$B$b$7%F%9%H$K@.8y$7$?$N$K<:GT$HF~NO$9$k$P!$ITDj$J>uBV$r8!CN$9$k$+$b$7$l$J(B +$B$$!%F~NO$NCf$GITDj$rFCDj$G$-$l$P!$%3%^%s%I$OFCDj$N%A%'%s%8%;%C%H$,(Bgood$B$+(B +$B$D(Bbad$B$G$"$k$HI=<($9$k!%$7$+$740`z$K$3$l$r9T$&$3$H$OIT2DG=$G!$4V0c$C$?%A%'(B +$B%s%8%;%C%H$r%P%0$N860x$@$HJs9p$9$k2DG=@-$,9b$$!%(B + +%\subsection{Automate as much as possible} +\subsection{$B$G$-$k8B$j<+F02=$9$k(B} -The \hgcmd{bisect} command requires that you correctly report the -result of every test you perform. If you tell it that a test failed -when it really succeeded, it \emph{might} be able to detect the -inconsistency. If it can identify an inconsistency in your reports, -it will tell you that a particular changeset is both good and bad. -However, it can't do this perfectly; it's about as likely to report -the wrong changeset as the source of the bug. +%When I started using the \hgcmd{bisect} command, I tried a few times +%to run my tests by hand, on the command line. This is an approach +%that I, at least, am not suited to. After a few tries, I found that I +%was making enough mistakes that I was having to restart my searches +%several times before finally getting correct results. + +\hgcmd{bisect}$B%3%^%s%I$r;H$$$O$8$a$?;~!$?t2s!$%3%^%s%I%i%$%s$+$i<j$G%F%9(B +$B%H$r<B9T$7$?!%$3$NJ}K!$OE,$7$?J}K!$G$O$J$$!%?t2s$N%F%9%H$N8e$G!$:G=*E*$J(B +$B7k2L$rF@$k$?$a$K%5!<%A$r$d$j$J$*$5$J$1$l$P$J$i$J$$$3$H$K5$$E$/$3$H$,2?EY(B +$B$+$"$C$?!%(B -\subsection{Automate as much as possible} +%My initial problems with driving the \hgcmd{bisect} command by hand +%occurred even with simple searches on small repositories; if the +%problem you're looking for is more subtle, or the number of tests that +%\hgcmd{bisect} must perform increases, the likelihood of operator +%error ruining the search is much higher. Once I started automating my +%tests, I had much better results. -When I started using the \hgcmd{bisect} command, I tried a few times -to run my tests by hand, on the command line. This is an approach -that I, at least, am not suited to. After a few tries, I found that I -was making enough mistakes that I was having to restart my searches -several times before finally getting correct results. +\hgcmd{bisect}$B%3%^%s%I$r<j$G<B9T$7$F$$$?;~$N:G=i$NLdBj$O!$>.$5$J%j%]%8%H(B +$B%j$G$NC1=c$J%5!<%A$G$b5/$3$C$?!%$b$7LdBj$,$b$C$HNt0-$G!$(B\hgcmd{bisect}$B$,(B +$B<B9T$7$J$1$l$P$J$i$J$$%F%9%H$N?t$,A}$($l$P!$%*%Z%l!<%?$N%(%i!<$,5/$3$k2D(B +$BG=@-$O$:$C$H9b$/$J$k!%0lEY%F%9%H$r<+F02=$7$F$+$i$O!$$:$C$H$h$$7k2L$,F@$i(B +$B$l$k$h$&$K$J$C$?!%(B -My initial problems with driving the \hgcmd{bisect} command by hand -occurred even with simple searches on small repositories; if the -problem you're looking for is more subtle, or the number of tests that -\hgcmd{bisect} must perform increases, the likelihood of operator -error ruining the search is much higher. Once I started automating my -tests, I had much better results. +%The key to automated testing is twofold: +%\begin{itemize} +%\item always test for the same symptom, and +%\item always feed consistent input to the \hgcmd{bisect} command. +%\end{itemize} +%In my tutorial example above, the \command{grep} command tests for the +%symptom, and the \texttt{if} statement takes the result of this check +%and ensures that we always feed the same input to the \hgcmd{bisect} +%command. The \texttt{mytest} function marries these together in a +%reproducible way, so that every test is uniform and consistent. -The key to automated testing is twofold: +$B%F%9%H$r<+F02=$9$k%-!<$O(B2$B$D$"$k!%(B \begin{itemize} -\item always test for the same symptom, and -\item always feed consistent input to the \hgcmd{bisect} command. + \item $B>o$KF1$8C{8u$r%F%9%H$9$k!%$=$7$F(B + \item $B>o$K(B\hgcmd{bisect}$B%3%^%s%I$K0l4S$7$?F~NO$r9T$&!%(B \end{itemize} -In my tutorial example above, the \command{grep} command tests for the -symptom, and the \texttt{if} statement takes the result of this check -and ensures that we always feed the same input to the \hgcmd{bisect} -command. The \texttt{mytest} function marries these together in a -reproducible way, so that every test is uniform and consistent. +$B>e$N%A%e!<%H%j%"%kNc$G$O(B\command{grep}$B%3%^%s%I$,C{8u$r%F%9%H$7$F$*$j!$(B +\texttt{if}$BJ8$,$3$N%A%'%C%/$N7k2L$r<h$j!$>o$KF1$8F~NO$,(B\hgcmd{bisect}$B%3(B +$B%^%s%I$K$J$5$l$k$h$&$K$J$C$F$$$?!%(B\texttt{mytest}$B4X?t$O!$:F8=2DG=$JJ}K!(B +$B$G!$$3$l$i$r7k$S$D$1!$$3$3$N%F%9%H$,0lMM$G0l4S$9$k$h$&$K$J$C$F$$$?!%(B -\subsection{Check your results} + +%\subsection{Check your results} +\subsection{$B7k2L$r%A%'%C%/$9$k(B} -Because the output of a \hgcmd{bisect} search is only as good as the -input you give it, don't take the changeset it reports as the -absolute truth. A simple way to cross-check its report is to manually -run your test at each of the following changesets: +%Because the output of a \hgcmd{bisect} search is only as good as the +%input you give it, don't take the changeset it reports as the +%absolute truth. A simple way to cross-check its report is to manually +%run your test at each of the following changesets: +%\begin{itemize} +%\item The changeset that it reports as the first bad revision. Your +% test should still report this as bad. +%\item The parent of that changeset (either parent, if it's a merge). +% Your test should report this changeset as good. +%\item A child of that changeset. Your test should report this +% changeset as bad. +%\end{itemize} + +\hgcmd{bisect}$B%5!<%A$N=PNO$O!$%f!<%6$NF~NO$,@5$7$$>l9g$K8B$C$F@5$7$$$N$G!$(B +$B%3%^%s%I$,Js9p$9$k%A%'%s%8%;%C%H$r@dBP$K@5$7$$$H9M$($F$O$$$1$J$$!%Js9p$N(B +$B%/%m%9%A%'%C%/$r9T$&C1=c$JJ}K!$O!$0J2<$N%A%'%s%8%;%C%H$KBP$7$F!$<jF0$G%F(B +$B%9%H$r9T$&$3$H$G$"$k!%(B \begin{itemize} -\item The changeset that it reports as the first bad revision. Your - test should still report this as bad. -\item The parent of that changeset (either parent, if it's a merge). - Your test should report this changeset as good. -\item A child of that changeset. Your test should report this - changeset as bad. + \item $B:G=i$N(Bbad$B%j%S%8%g%s$H$7$FJs9p$5$l$k%A%'%s%8%;%C%H!%$3$l$K$D$$$F%F(B + $B%9%H$O(Bbad$B$H$J$kH&$G$"$k(B + \item $B$=$N%A%'%s%8%;%C%H$N?F!J%^!<%8$5$l$F$$$k$J$iN>J}$N?F!K!%%F%9%H$O(B + good$B$K$J$kH&$G$"$k(B + \item $B:G=i$N(Bbad$B%j%S%8%g%s$H$7$FJs9p$5$l$k%A%'%s%8%;%C%H$N;R!%%F%9%H$O(B + bad$B$H$J$kH&$G$"$k(B \end{itemize} -\subsection{Beware interference between bugs} +%\subsection{Beware interference between bugs} +\subsection{$B%P%0F1;N$NAj8_43>D$KN10U$9$k(B} -It's possible that your search for one bug could be disrupted by the -presence of another. For example, let's say your software crashes at -revision 100, and worked correctly at revision 50. Unknown to you, -someone else introduced a different crashing bug at revision 60, and -fixed it at revision 80. This could distort your results in one of -several ways. +%It's possible that your search for one bug could be disrupted by the +%presence of another. For example, let's say your software crashes at +%revision 100, and worked correctly at revision 50. Unknown to you, +%someone else introduced a different crashing bug at revision 60, and +%fixed it at revision 80. This could distort your results in one of +%several ways. + +$B0l$D$N%P%0$KBP$9$k%5!<%A$,$=$NB>$N%P%0$NB8:_$G:.Mp$5$;$i$l$k$3$H$,M-$jF@(B +$B$k!%Nc$($P%=%U%H%&%'%"$,%j%S%8%g%s(B100$B$G%/%i%C%7%e$7!$%j%S%8%g%s(B50$B$GF0:n(B +$B$7$?$H$9$k!%$"$J$?$K$OL$CN$@$,!$C/$+JL$N?M$,%j%S%8%g%s(B60$B$GB>$N%/%i%C%7%e(B +$B$9$k%P%0$r;}$A9~$_!$%j%S%8%g%s(B80$B$G=$@5$7$?$H$9$k!%$3$l$O7k2L$rJ#?t$NJ}8~(B +$B$XY`6J$2F@$k!%(B -It is possible that this other bug completely ``masks'' yours, which -is to say that it occurs before your bug has a chance to manifest -itself. If you can't avoid that other bug (for example, it prevents -your project from building), and so can't tell whether your bug is -present in a particular changeset, the \hgcmd{bisect} command cannot -help you directly. Instead, you can mark a changeset as untested by -running \hgcmdargs{bisect}{--skip}. +%It is possible that this other bug completely ``masks'' yours, which +%is to say that it occurs before your bug has a chance to manifest +%itself.If you can't avoid that other bug (for example, it prevents +%your project from building), and so can't tell whether your bug is +%present in a particular changeset, the \hgcmd{bisect} command cannot +%help you directly. Instead, you can mark a changeset as untested by +%running \hgcmdargs{bisect}{--skip}. -A different problem could arise if your test for a bug's presence is -not specific enough. If you check for ``my program crashes'', then -both your crashing bug and an unrelated crashing bug that masks it -will look like the same thing, and mislead \hgcmd{bisect}. +$B$3$NJL$N%P%0$,DI$$$+$1$F$$$k%P%0$r40A4$K%^%9%/$7$F$7$^$&$3$H$bM-$jF@$k!%(B +$BDI$$$+$1$F$$$k%P%0$,L@$i$+$K$J$kA0$K$3$l$,5/$-$k$3$H$bM-$jF@$k!%B>$N%P%0(B +$B$,KI$.@Z$l$J$$$J$i!$%P%0$,FCDj$N%A%'%s%8%;%C%H$K4^$^$l$k$H8@$&$3$H$b$G$-(B +$B$J$$!%(B\hgcmd{bisect}$B%3%^%s%I$OD>@\$"$J$?$r=u$1$k$3$H$,$G$-$J$$!%$=$NBe$o(B +$B$j!$$"$k%A%'%s%8%;%C%H$r(B\hgcmdargs{bisect}{--skip}$B$K$h$C$FL$%F%9%H$H%^!<(B +$B%/$9$k$3$H$,$G$-$k!%(B + + +%A different problem could arise if your test for a bug's presence is +%not specific enough. If you check for ``my program crashes'', then +%both your crashing bug and an unrelated crashing bug that masks it +%will look like the same thing, and mislead \hgcmd{bisect}. + +$B%P%0$N%F%9%H$,==J,$K>\:Y$G$J$+$C$?>l9g!$JL$NLdBj$,5/$3$jF@$k!%%W%m%0%i%`(B +$B$,%/%i%C%7%e$9$k$+$I$&$+$r%A%'%C%/$7$F$$$k;~!$DI@W$7$F$$$k%/%i%C%7%e%P%0(B +$B$H!$$=$l$H$OL54X78$J%/%i%C%7%e%P%0$,:.:_$F$$$k$H$3$l$i$OF1$8$K8+$($F$7$^(B +$B$$!$7k2LE*$K%A%'%C%/$r%^%9%/$7$F$7$^$$!$(B\hgcmd{bisect}$B$r%_%9%j!<%I$9$k!%(B + -Another useful situation in which to use \hgcmdargs{bisect}{--skip} is -if you can't test a revision because your project was in a broken and -hence untestable state at that revision, perhaps because someone -checked in a change that prevented the project from building. +%Another useful situation in which to use \hgcmdargs{bisect}{--skip} is +%if you can't test a revision because your project was in a broken and +%hence untestable state at that revision, perhaps because someone +%checked in a change that prevented the project from building. + +\hgcmdargs{bisect}{--skip}$B$N;HMQ$,M-MQ$J$b$&0l$DJL$N>u67$O!$C/$+$,%S%k%I(B +$B$G$-$J$/$J$k$h$&$JJQ99$r%A%'%C%/%$%s$7$?$?$a$K!$;n$=$&$H$7$F$$$k%j%S%8%g(B +$B%s$,%S%k%I$G$-$:!$$=$N%j%S%8%g%s$r%F%9%H$G$-$J$$$h$&$J>l9g$G$"$k!%(B -\subsection{Bracket your search lazily} + +%\subsection{Bracket your search lazily} +\subsection{$BC5:w$rBUBF$K%V%i%1%C%H$9$k(B} + +%Choosing the first ``good'' and ``bad'' changesets that will mark the +%end points of your search is often easy,but it bears a little +%discussion nevertheless. From the perspective of \hgcmd{bisect}, the +%``newest'' changeset is conventionally ``bad'', and the older +%changeset is ``good''. -Choosing the first ``good'' and ``bad'' changesets that will mark the -end points of your search is often easy, but it bears a little -discussion nevertheless. From the perspective of \hgcmd{bisect}, the -``newest'' changeset is conventionally ``bad'', and the older -changeset is ``good''. +$B:G=i$N(Bgood$B$H(Bbad$B%A%'%s%8%;%C%H$NAH$rA*$S!$%5!<%AHO0O$r;XDj$9$k$N$OB?$/$N(B +$B>l9g4JC1$@$,!$<c43$N5DO@$NM>CO$,$"$k!%(B\hgcmd{bisect}$B$+$i8+$?;~!$:G?7$N%A%'(B +$B%s%8%;%C%H$O(Bbad$B$G!$8E$$%A%'%s%8%;%C%H$O(Bgood$B$H$J$k!%(B + +%If you're having trouble remembering when a suitable ``good'' change +%was, so that you can tell \hgcmd{bisect}, you could do worse than +%testing changesets at random. Just remember to eliminate contenders +%that can't possibly exhibit the bug (perhaps because the feature with +%the bug isn't present yet) and those where another problem masks the +%bug (as I discussed above). -If you're having trouble remembering when a suitable ``good'' change -was, so that you can tell \hgcmd{bisect}, you could do worse than -testing changesets at random. Just remember to eliminate contenders -that can't possibly exhibit the bug (perhaps because the feature with -the bug isn't present yet) and those where another problem masks the -bug (as I discussed above). +$BE,@Z$J(Bgood$B%A%'%s%8%;%C%H$r3P$($F$$$J$$;~!$(B\hgcmd{bisect}$B$K$=$l$r;XDj$9$k(B +$B$H!$%i%s%@%`$KA*$V$h$j$b0-$$C5:w$r9T$&2DG=@-$,$"$k!%%P%0$r<($5$J$$!J$*$=(B +$B$i$/%P%0$N$"$k5!G=$,<BAu$5$l$F$$$J$$!K%A%'%s%8%;%C%H$H!$B>$NLdBj$,DI@WCf(B +$B$N%P%0$r%^%9%/$7$F$7$^$&$h$&$J%A%'%s%8%;%C%H$N$_$r>C5n$9$k$3$H$r3P$($F$*(B +$B$/$Y$-$@!%(B -Even if you end up ``early'' by thousands of changesets or months of -history, you will only add a handful of tests to the total number that -\hgcmd{bisect} must perform, thanks to its logarithmic behaviour. +%Even if you end up ``early'' by thousands of changesets or months of +%history, you will only add a handful of tests to the total number that +%\hgcmd{bisect} must perform, thanks to its logarithmic behaviour. + +\hgcmd{bisect}$B$,9T$o$J$1$l$P$J$i$J$$%F%9%H$N2s?t$O!$BP>]$H$9$k%A%'%s%8%;%C(B +$B%H$NBP?t$KHfNc$9$k$?$a!$?t%u7n$K5Z$VMzNr$NCf$N?t@i$N%A%'%s%8%;%C%H$NCf$K(B +$BBP$7$F$b>/?t$N%F%9%H$rDI2C$9$k$@$1$G:Q$`!%(B + %%% Local Variables: %%% mode: yatex