hgbook

diff ja/hook.tex @ 868:f817270b9234

Update home page.
author Bryan O'Sullivan <bos@serpentine.com>
date Thu Sep 10 14:45:51 2009 -0700 (2009-09-10)
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/ja/hook.tex	Thu Sep 10 14:45:51 2009 -0700
     1.3 @@ -0,0 +1,1910 @@
     1.4 +\chapter{Handling repository events with hooks}
     1.5 +\label{chap:hook}
     1.6 +
     1.7 +Mercurial $B$O!"%j%]%8%H%j$KH/@8$7$?%$%Y%s%H$K1~$8$F!"(B
     1.8 +$B<+F0E*$J=hM}$r<B9T$9$k6/NO$J;EAH$_$rDs6!$7$F$$$^$9!#(B
     1.9 +$B4v$D$+$N>u67$G$O!"(B
    1.10 +$B%$%Y%s%H$KBP$9$k(B Mercurial $B$N1~Ez7k2L$r@)8f$9$k$3$H$b$G$-$^$9!#(B
    1.11 +
    1.12 +Mercurial $B$,MxMQ$9$k$3$l$i$N=hM}$O!"(B
    1.13 +\emph{$B%U%C%/(B}$B!J(Bhook$B!K$H8F$P$l$F$$$^$9!#(B
    1.14 +$B9=@.4IM}%7%9%F%`$K$h$C$F$O%U%C%/$r(B``$B%H%j%,(B''$B$H8F$V$3$H$b$"$j$^$9$,!"(B
    1.15 +$B$3$l$i$O6&$KF1$89M$(J}$r;X$7$^$9!#(B
    1.16 +
    1.17 +\section{An overview of hooks in Mercurial}
    1.18 +
    1.19 +Mercurial $B$,Ds6!$9$k%U%C%/$N4JC1$J%j%9%H$r<($7$^$9!#(B
    1.20 +$B$3$l$i$N%U%C%/$K4X$9$k>\:Y$O(B \ref{sec:hook:ref}~$B@a$G@bL@$7$^$9!#(B
    1.21 +
    1.22 +\begin{description}
    1.23 +
    1.24 +\item[\small\hook{changegroup}]
    1.25 +  $B30It%j%]%8%H%j$+$i%A%'%s%8%;%C%H72$,;}$A9~$^$l$?8e$K<B9T$5$l$^$9!#(B
    1.26 +
    1.27 +\item[\small\hook{commit}] 
    1.28 +  $B%m!<%+%k%j%]%8%H%j$K$*$$$F?7$?$J%A%'%s%8%;%C%H$,:n@.$5$l$?8e$K<B9T$5$l$^$9!#(B
    1.29 +
    1.30 +\item[\small\hook{incoming}] 
    1.31 +  $B30It%j%]%8%H%j$+$i;}$A9~$^$l$??7$?$J%A%'%s%8%;%C%HKh$K#12s$E$D<B9T$5$l$^$9!#(B
    1.32 +  $B;}$A9~$^$l$?%A%'%s%8%;%C%H$N(B\emph{$B$^$H$^$j(B}$B$NC10L$G5/F0$5$l$k(B
    1.33 +  \hook{changegroup} $B$H$N0c$$$KCm0U$7$F$/$@$5$$!#(B
    1.34 +
    1.35 +\item[\small\hook{outgoing}] 
    1.36 +  $B30It%j%]%8%H%j$X%A%'%s%8%;%C%H72$,E>Aw$5$l$?8e$K<B9T$5$l$^$9!#(B
    1.37 +
    1.38 +\item[\small\hook{prechangegroup}] 
    1.39 +  $B30It%j%]%8%H%j$+$i%A%'%s%8%;%C%H72$,;}$A9~$^$l$kA0$K<B9T$5$l$^$9!#(B
    1.40 +
    1.41 +\item[\small\hook{precommit}] 
    1.42 +  $B@)8fMQ!#(B
    1.43 +  $B%m!<%+%k%j%]%8%H%j$X$N%3%_%C%HA0$K<B9T$5$l$^$9!#(B
    1.44 +
    1.45 +\item[\small\hook{preoutgoing}] 
    1.46 +  $B@)8fMQ!#(B
    1.47 +  $B30It%j%]%8%H%j$X%A%'%s%8%;%C%H72$,E>Aw$5$l$kA0$K<B9T$5$l$^$9!#(B
    1.48 +
    1.49 +\item[\small\hook{pretag}] 
    1.50 +  $B@)8fMQ!#%?%0@8@.A0$K<B9T$5$l$^$9!#(B
    1.51 +
    1.52 +\item[\small\hook{pretxnchangegroup}] 
    1.53 +  $B@)8fMQ!#(B
    1.54 +  $B30It$+$i%m!<%+%k%j%]%8%H%j$X$H%A%'%s%8%;%C%H72$,;}$A9~$^$l$?:]$K!"(B
    1.55 +  $BJQ99$r915WE*$J$b$N$K$9$k%H%i%s%6%/%7%g%s$,40N;$9$kA0$K<B9T$5$l$^$9!#(B
    1.56 +
    1.57 +\item[\small\hook{pretxncommit}] 
    1.58 +  $B@)8fMQ!#(B
    1.59 +  $B%m!<%+%k%j%]%8%H%j$K$*$$$F?7$?$J%A%'%s%8%;%C%H$,:n@.$5$l$?:]$K!"(B
    1.60 +  $BJQ99$r915WE*$J$b$N$K$9$k%H%i%s%6%/%7%g%s$,40N;$9$kA0$K<B9T$5$l$^$9!#(B
    1.61 +
    1.62 +\item[\small\hook{preupdate}] 
    1.63 +  $B@)8fMQ!#(B
    1.64 +  $B:n6HNN0h%G%#%l%/%H%j$N99?7!&%^!<%8$,<B;\$5$l$kA0$K<B9T$5$l$^$9!#(B
    1.65 +
    1.66 +\item[\small\hook{tag}] 
    1.67 +  $B%?%0$,@8@.$5$l$?8e$K<B9T$5$l$^$9!#(B
    1.68 +
    1.69 +\item[\small\hook{update}] 
    1.70 +  $B:n6HNN0h%G%#%l%/%H%j$N99?7!&%^!<%8$,40N;$7$?8e$K<B9T$5$l$^$9!#(B
    1.71 +
    1.72 +\end{description}
    1.73 +
    1.74 +``$B@)8fMQ(B''$B$H=q$+$l$F$$$k%U%C%/$O!"(B
    1.75 +$B=hM}$N7QB3@-$N2DH]$rH=Dj$9$k5!G=$r;}$C$F$$$^$9!#(B
    1.76 +$B%U%C%/$N<B9T$,@.8y$7$?>l9g!"(B
    1.77 +$B%U%C%/$KBP1~$9$k=hM}$O7QB3$5$l$^$9$,!"(B
    1.78 +$B%U%C%/$N<B9T$,<:GT$7$?>l9g!"(B
    1.79 +$BBP1~$9$k=hM}$O5v2D$5$l$J$$$+<B9T$7$J$+$C$?$3$H$K$J$j$^$9(B
    1.80 +$B!J$I$A$i$K$J$k$+$O%U%C%/$K1~$8$F7h$^$j$^$9!K!#(B
    1.81 +
    1.82 +\section{Hooks and security}
    1.83 +
    1.84 +\subsection{Hooks are run with your privileges}
    1.85 +
    1.86 +$B%j%]%8%H%j$K$*$$$F(B Mercurial $B$N%3%^%s%I$r<B9T$7!"(B
    1.87 +$B$=$N%3%^%s%I$,%U%C%/$r5/F0$9$k$3$H$K$J$C$?>l9g!"(B
    1.88 +\emph{$B%3%^%s%I<B9T<T$N(B}$B%7%9%F%`>e$K$*$$$F!"(B
    1.89 +\emph{$B%3%^%s%I<B9T<T$N(B}$B%f!<%6%"%+%&%s%H$K$h$j!"(B
    1.90 +\emph{$B%3%^%s%I<B9T<T$N(B}$B8"8B%l%Y%k$G<B9T$5$l$^$9!#(B
    1.91 +$B%U%C%/$OG$0U$N<B9T%3!<%I$G$9$+$i!"(B
    1.92 +$B==J,$JG[N8$r;}$C$F07$&I,MW$,$"$j$^$9!#(B
    1.93 +$BC/$,:n@.$7$F2?$r$9$k%U%C%/$J$N$+$r=OCN$7$F$$$k3N?.L5$7$K!"(B
    1.94 +$B%U%C%/$r%$%s%9%H!<%k$7$J$$$G$/$@$5$$!#(B
    1.95 +
    1.96 +$B;~$K$O!"(B
    1.97 +$B<+J,$G%$%s%9%H!<%k$7$?$N$G$O$J$$%U%C%/$K;/$5$l$k$+$b$7$l$^$;$s!#(B
    1.98 +$BFk@w$_$NL5$$%7%9%F%`>e$G(B Mercurial $B$r;HMQ$9$k:]$K$O!"(B
    1.99 +Mercurial $B$,%7%9%F%`6&DL$N(B \hgrc\ 
   1.100 +$B%U%!%$%k$GDj5A$5$l$?%U%C%/$r<B9T$9$k$+$b$7$l$^$;$s!#(B
   1.101 +
   1.102 +$BB>$N%f!<%6$,=jM-$9$k%j%]%8%H%j$G:n6H$9$k>l9g!"(B
   1.103 +Mercurial $B$O$=$N%f!<%6$N%j%]%8%H%j$GDj5A$5$l$?%U%C%/$r<B9T$G$-$^$9$,!"(B
   1.104 +$B$=$l$O(B``$B$"$J$?$N(B''$B8"8B$G<B9T$5$l$^$9!#(B
   1.105 +$BNc$($P!"$"$k%j%]%8%H%j$+$i(B \hgcmd{pull} $B$7$?:]$K!"(B
   1.106 +$B$=$N%j%]%8%H%j$N(B \sfilename{.hg/hgrc} $B%U%!%$%k$,(B
   1.107 +\hook{outgoing} $B%U%C%/$rDj5A$7$F$$$?>l9g!"(B
   1.108 +$B%j%b!<%H%j%]%8%H%j$N=jM-<T$GL5$+$C$?$H$7$F$b!"(B
   1.109 +$B%U%C%/$O$"$J$?$N%"%+%&%s%H$G<B9T$5$l$^$9!#(B
   1.110 +
   1.111 +\begin{note}
   1.112 +  $B$3$N86B'$O!"(B
   1.113 +  $B%m!<%+%k%U%!%$%k%7%9%F%`$+%M%C%H%o!<%/%U%!%$%k%7%9%F%`>e$N%j%]%8%H%j$+$i(B
   1.114 +  pull $B$7$?>l9g$K$N$_E,MQ$5$l$^$9!#(B
   1.115 +  http $B$d(B ssh $B7PM3$G(B pull $B$7$?>l9g!"(B
   1.116 +  $B%U%C%/$,<B9T$5$l$k:]$N%"%+%&%s%H$O!"(B
   1.117 +  $B%5!<%P>e$G%5!<%P%W%m%;%9$r<B9T$9$k%"%+%&%s%H$G$9!#(B
   1.118 +\end{note}
   1.119 +
   1.120 +$B%j%]%8%H%j$K$*$1$k%U%C%/$NDj5A>u67$r8+$k$K$O!"(B
   1.121 +\hgcmdargs{showconfig}{hooks} $B%3%^%s%I$,MxMQ$G$-$^$9!#(B
   1.122 +$B$"$k%j%]%8%H%j$G:n6HCf$K!"(B
   1.123 +$B<+J,$N=jM-$7$F$$$J$$JL$J%j%]%8%H%j(B
   1.124 +$B$H$NO"7H!JNc!'(B \hgcmd{pull} $B$J$$$7(B \hgcmd{incoming}$B!K$,I,MW$K$J$C$?>l9g!"(B
   1.125 +$B%j%]%8%H%j$N%U%C%/Dj5A>u67$r3NG'$9$Y$-$G$9(B\footnote{$BLuCm(B:
   1.126 +``XXX'' $B$,IUM?$5$l$F$$$k$3$H$+$i86J8L$40!)(B}$B!#(B
   1.127 +
   1.128 +\subsection{Hooks do not propagate}
   1.129 +
   1.130 +Mercurial $B$G$O!"%U%C%/@_Dj$N9=@.4IM}$O9T$o$l$J$$$?$a!"(B
   1.131 +$B%j%]%8%H%j$N(B clone $B$J$$$7(B pull $B$N:]$K!"(B
   1.132 +$B%U%C%/@_Dj$OEAGE$7$^$;$s!#(B
   1.133 +$B$=$NM}M3$O4JC1$G!"%U%C%/$O40A4$KG$0U$N<B9T%3!<%I$@$+$i$G$9!#(B
   1.134 +$B%U%C%/$O!"(B
   1.135 +$B%3%^%s%I<B9T<T$N%^%7%s>e$K$*$$$F!"(B
   1.136 +$B%3%^%s%I<B9T<T$N%f!<%6%"%+%&%s%H$K$h$j!"(B
   1.137 +$B%3%^%s%I<B9T<T$N8"8B%l%Y%k$G<B9T$5$l$^$9!#(B
   1.138 +
   1.139 +$B%U%C%/$N9=@.4IM}$N<BAu$O!"(B
   1.140 +$B9=@.4IM}%7%9%F%`MxMQ<T$N%"%+%&%s%H$r<eBN2=$5$;$k>e$G!"(B
   1.141 +$BMF0W$K0-MQ2DG=$JJ}K!$rDs6!$7$F$7$^$&$?$a!"(B
   1.142 +$B$"$i$f$kJ,;69=@.4IM}%7%9%F%`$K$H$C$F6K$a$FL5KE$H8@$($^$9!#(B
   1.143 +
   1.144 +Mercurial $B$O%U%C%/$rEAGE$7$J$$$?$a!"(B
   1.145 +$B6&DL$N%W%m%8%'%/%H$G$NB>$N%a%s%P!<$H$NO"7H$N:]$K$O!"(B
   1.146 +$BH`$i$,<+J,$HF1$8(B Mercurial $B$N%U%C%/$rMxMQ$7$F$$$k$3$H$d!"(B
   1.147 +$BH`$i$,%U%C%/$r@5$7$/@_Dj$7$F$$$k$3$H$r2>Dj$7$F$O$$$1$^$;$s!#(B
   1.148 +$BH`$i$K%U%C%/$N;HMQ$r4|BT$9$k$N$G$"$l$P!"(B
   1.149 +$B$=$l$rJ8=q2=$9$Y$-$G$9!#(B
   1.150 +
   1.151 +$B4k6H$N%$%s%H%i%M%C%H$N>l9g!"(B
   1.152 +$BNc$($P(B Mercurial $B$N(B``$BI8=`E*$J(B''$B%$%s%9%H!<%k$r(B NFS $B>e$G9T$$!"(B
   1.153 +$BAH?%$G6&DL$N(B \hgrc\ $B%U%!%$%k$GA4$F$N%f!<%6$,;HMQ$9$Y$-%U%C%/$rDj5A$9$k!"(B
   1.154 +$B$H$$$C$?$3$H$,2DG=$G$"$k$?$a!"(B
   1.155 +$B%U%C%/$N4IM}$O4vJ,MF0W$K$J$j$^$9!#(B
   1.156 +$B$7$+$7!"$=$l$G$b8e=R$9$k$h$&$J@)8B$,@8$8$^$9!#(B
   1.157 +
   1.158 +\subsection{Hooks can be overridden}
   1.159 +
   1.160 +Mercurial $B$O!":FDj5A$K$h$k%U%C%/$N>e=q$-$r5v$7$F$$$^$9!#(B
   1.161 +$B%U%C%/;XDj$K6uJ8;zNs$r@_Dj$9$k$3$H$G%U%C%/@_Dj$rL58z$K$9$k$3$H$b$G$-$^$9$7!"(B
   1.162 +$B4uK>DL$j$K?6$kIq$$$rJQ$($k$3$H$b$G$-$^$9!#(B
   1.163 +
   1.164 +$B4v$D$+$N%U%C%/$rDj5A$7$?!"(B
   1.165 +$B%^%7%s$J$$$7AH?%6&DL$N(B \hgrc\ $B%U%!%$%k$rG[Hw$7$?$H$7$F$b!"(B
   1.166 +$BMxMQ<T$K$h$k%U%C%/$NL58z2=$d>e=q$-$,9T$o$l$k2DG=@-$,$"$k$3$H$r!"(B
   1.167 +$BM}2r$7$F$*$/I,MW$,$"$j$^$9!#(B
   1.168 +
   1.169 +\subsection{Ensuring that critical hooks are run}
   1.170 +
   1.171 +$BB>$N%a%s%P!<$K<B;\$7$FM_$7$/$J$$;vJA$K$D$$$FE;$a$?J}?K$r!"(B
   1.172 +$B6/@)$7$?$$$3$H$b;~$K$O$"$k$+$b$7$l$^$;$s!#(B
   1.173 +$BNc$($P!"A4$F$N%A%'%s%8%;%C%H$K$OI,$:87L)$J%F%9%H0l<0$KDL$C$F$$$FM_$7$$!"(B
   1.174 +$B$H;W$&$+$b$7$l$^$;$s!#(B
   1.175 +$B$3$NMWK>$r<B8=$9$k$?$a$K!"(B
   1.176 +$BAH?%6&DL$N(B \hgrc\ $B%U%!%$%k$G%U%C%/$rDj5A$7$?$H$7$F$b!"(B
   1.177 +$B%b%P%$%k(B PC $B$+$i%"%/%;%9$9$k1s3V%f!<%6Ey$K$O5!G=$7$^$;$s$7!"(B
   1.178 +$BL^O@%m!<%+%k%f!<%6$K$H$C$F$b%U%C%/$N>e=q$-$K$h$C$FL58z2=$,2DG=$G$9!#(B
   1.179 +
   1.180 +$B!J%W%m%8%'%/%H$K$*$1$k!K(BMercurial $B$NMxMQJ}?K$H$7$F!"(B
   1.181 +$B%a%s%P!<$,JQ99EAGE$9$k:]$K$O!"(B
   1.182 +$B4XLg$N5!G=$r2L$?$9$h$&$KE,@Z$K@_Dj$5$l$?<~CN$N(B``$B@55,(B''$B%5!<%P$rDL$9!"(B
   1.183 +$B$H:vDj$9$k$3$H$G!"(B
   1.184 +$B%U%C%/$K$h$kMxMQJ}?K$N6/@)$rBeBX$9$k$3$H$,2DG=$G$9!#(B
   1.185 +
   1.186 +$B<B8=J}K!$N0l$D$H$7$F!"(B
   1.187 +$B%=!<%7%c%k%(%s%8%K%"%j%s%0$H5;=Q$NAH$_9g$o$;$K$h$k$b$N$,$"$j$^$9!#(B
   1.188 +$B%"%/%;%9@)8BIU$-%"%+%&%s%H$rMQ0U$7!"(B
   1.189 +$BEv3:%"%+%&%s%H$G4IM}$5$l$?%j%]%8%H%j$K!"(B
   1.190 +$B3F%a%s%P!<$O%M%C%H%o!<%/7PM3$GJQ99$r(B push $B$G$-$k$h$&$K$7$^$9$,!"(B
   1.191 +$B$=$N%"%+%&%s%H$G%m%0%$%s$7$?$j!"(B
   1.192 +$BDL>o$N%7%'%k%3%^%s%I$r<B9T$7$?$j$G$-$J$$$h$&$K$7$^$9!#(B
   1.193 +$B$3$N$^$^$G$O!"(B
   1.194 +$B%a%s%P!<$O!V%4%_!W$r4^$`$h$&$J%A%'%s%8%;%C%H$N%3%_%C%H$b2DG=$G$9!#(B
   1.195 +
   1.196 +$B%a%s%P!<$,(B pull $B$9$k%5!<%P!<$X$HC/$+$,%A%'%s%8%;%C%H$r(B push $B$7$?>l9g!"(B
   1.197 +$B$=$N%A%'%s%8%;%C%H$,1JB32=$5$l$kA0$K%5!<%P!<$O%F%9%H$r<B;\(B\footnote{
   1.198 +$BLuCm(B: $B%F%9%H<B;\$O%U%C%/$G<B8=$5$l$^$9$,!"(B
   1.199 +(1) $B%U%C%/$N<B9T$O%"%/%;%9@)8BIU$-%"%+%&%s%H$N8"8B$G<B9T$5$l!"(B
   1.200 +(2) $B%j%b!<%H$+$i$N(B push $B$N>l9g$O%U%C%/$N>e=q$-$,$G$-$J$$!"(B
   1.201 +$B$H$$$&$3$H$+$i!"%;%-%e%j%F%#!&%U%C%/@_Dj$NLdBj$,6&$K2r>C$5$l$^$9!#(B}$B$7!"(B
   1.202 +$B%F%9%H0l<0$KDL$i$J$1$l$P$=$N%A%'%s%8%;%C%H$r5qH]$7$^$9!#(B
   1.203 +$B%a%s%P!<$,$3$N%U%#%k%?%5!<%P$+$i$7$+%A%'%s%8%;%C%H$N(B pull $B$r$7$J$$$N$G$"$l$P!"(B
   1.204 +$B%a%s%P!<$,(B pull $B$9$kA4$F$N%A%'%s%8%;%C%H$O!"(B
   1.205 +$B<+F0E*$KE@8!$5$l$F$$$k$3$H$,J]>Z$5$l$^$9!#(B
   1.206 +
   1.207 +\section{Care with \texttt{pretxn} hooks in a shared-access repository}
   1.208 +\label{sec:hook:carepretxn}
   1.209 +
   1.210 +$BB?$/$N?M$K$h$j6&M-$5$l$F$$$k%j%]%8%H%j$KBP$7$F!"(B
   1.211 +$B%U%C%/$K$h$k<+F0<B9T$r@_Dj$9$k>l9g!"(B
   1.212 +$B<B;\J}<0$K$OCm0U$,I,MW$G$9!#(B
   1.213 +
   1.214 +Mercurial $B$,%j%]%8%H%j$K%m%C%/$r3]$1$k$N$O!"(B
   1.215 +$B%j%]%8%H%j$K=q$-9~$_$r9T$&;~$@$1$G$"$j!"(B
   1.216 +$B3n$D%m%C%/$KBP$7$FCm0U$rJ'$&$N$O!"(B
   1.217 +Mercurial $B$N=q$-9~$_=hM}$NItJ,E*$J2U=j$@$1$G$9!#(B
   1.218 +$B=q$-9~$_%m%C%/$O!"(B
   1.219 +$BJ#?t$N=hM}$NF1;~=q$-9~$_$K$h$k%j%]%8%H%jGKB;$rKI$0$3$H$G!"(B
   1.220 +$B$*8_$$$N=q$-9~$_FbMF$rJ]8n$7$^$9!#(B
   1.221 +
   1.222 +Mercurial $B$O%G!<%?$NFI$_9~$_=q$-=P$7=g=x$KCm0U$rJ'$C$F$$$^$9$+$i!"(B
   1.223 +$B%j%]%8%H%j$+$i$N%G!<%?FI$_9~$_$N:]$K%m%C%/$OI,MW$"$j$^$;$s!#(B
   1.224 +Mercurial $B$,%j%]%8%H%j$+$i%G!<%?$rFI$_9~$`:]$K$O!"(B
   1.225 +$B%m%C%/$KBP$7$FCm0U$rJ'$$$^$;$s!#(B
   1.226 +$B%m%C%/$rI,MW$H$7$J$$$3$N;EAH$_$O!"(B
   1.227 +$B@-G=$HJ?9T@-$rBg$-$/8~>e$5$;$F$$$^$9!#(B
   1.228 +
   1.229 +$B$7$+$7$J$,$i!"(B
   1.230 +$B!V%m%C%/$5$l$J$$!W$H$$$&$3$H$O!"(B
   1.231 +$B$=$l$rCN$i$J$$$H!"(B
   1.232 +$BBg$-$J@-G=8~>e$H0z$-49$($K%H%i%V%kH/@8$N@x:_E*$J4m81@-$r;}$C$F$$$^$9!#(B
   1.233 +$B$3$N4m81@-$K$D$$$F@bL@$9$k$K$O!"(B
   1.234 +$B%j%]%8%H%j$X$N%A%'%s%8%;%C%H$NDI2C!"(B
   1.235 +$B$*$h$S$=$l$i%A%'%s%8%;%C%H$NFI$_=P$7$r!"(B
   1.236 +Mercurial $B$,$I$&$$$C$?<j=g$G9T$&$+$K$D$$$F!"(B
   1.237 +$B4vJ,>\:Y$JCN<1$,I,MW$H$J$j$^$9!#(B
   1.238 +
   1.239 +Mercurial $B$,%a%?%G!<%?$r(B\emph{$B=q$-=P$9(B}$B:]$K$O!"(B
   1.240 +$BBP>]%U%!%$%k$K%a%?%G!<%?$rD>@\=q$-=P$7$^$9!#(B
   1.241 +$B:G=i$K(B filelog $B$K%a%?%G!<%?$r=q$-=P$7!"(B
   1.242 +$B<!$K(B manifest $B$N%G!<%?!J$3$l$K$O!"(B
   1.243 +filelog $B$K=q$-=P$7$??7$7$$%G!<%?$X$N%]%$%s%?$,4^$^$l$^$9!K!"(B
   1.244 +$B$=$7$F(Bchangelog$B$N%G!<%?!J$3$l$K$O!"(B
   1.245 +manifest $B$K=q$-=P$7$??7$7$$%G!<%?$X$N%]%$%s%?$,4^$^$l$^$9!K$,=q$-=P$5$l$^$9!#(B
   1.246 +$B8D!9$N%U%!%$%k$X$N:G=i$N=q$-=P$7$NA0$K!"(B
   1.247 +Mercurial $B$O8D!9$N%U%!%$%k$N=*C<0LCV>pJs$r%H%i%s%6%/%7%g%s%m%0$K5-O?$7$^$9!#(B
   1.248 +Mercurial $B$K$h$j%H%i%s%6%/%7%g%s$,4,$-La$5$l$k:]$K$O!"(B
   1.249 +$B%H%i%s%6%/%7%g%s3+;O;~E@$N%5%$%:$K$^$G8D!9$N%U%!%$%k$,@Z$j5M$a$i$l$^$9!#(B
   1.250 +
   1.251 +Mercurial $B$,%a%?%G!<%?$r(B\emph{$BFI$_9~$`(B}$B:]$K$O!"(B
   1.252 +changelog $B$rFI$_9~$s$@8e$G$=$NB>$N%U%!%$%k$NFI$_9~$_$r9T$$$^$9!#(B
   1.253 +$B%G!<%?FI$_9~$_$N:]$K$O!"(B
   1.254 +$B@h$KFI$_9~$s$@(B changelog $B$+$iE~C#2DG=$J(B
   1.255 +manifest $B$d(B filelog $B$NItJ,$K$7$+%"%/%;%9$7$J$$$N$G!"(B
   1.256 +$BIT==J,$J=q$-=P$7Cf$N%G!<%?$rFI$`$3$H$O$"$j$^$;$s!#(B
   1.257 +
   1.258 +$B4v$D$+$N@)8fMQ%U%C%/$N!J(B\hook{pretxncommit} $B$d(B \hook{pretxnchangegroup}$B!K(B
   1.259 +$B$O!"%H%i%s%6%/%7%g%s$N40N;D>A0$K<B9T$5$l$^$9!#(B
   1.260 +$B$3$N;~E@$GA4$F$N%a%?%G!<%?$O=q$-=P$7:Q$_$G$9$,!"(B
   1.261 +Mercurial $B$O%H%i%s%6%/%7%g%s$r4,$-La$9$3$H$G!"(B
   1.262 +$B?7$?$K=q$-=P$5$l$?%G!<%?$rGK4~$9$k$3$H$,$G$-$^$9!#(B
   1.263 +
   1.264 +$B%H%i%s%6%/%7%g%s40N;A0$N%A%'%s%8%;%C%H$O1JB3@-$,3NDj$7$F$*$i$:!"(B
   1.265 +$B$=$N$?$a(B``$BK\Ev$KB8:_$9$k(B''$B$H$_$J$9$3$H$,$G$-$J$$$3$H$+$i!"(B
   1.266 +$B%H%i%s%6%/%7%g%s40N;A0$K<B9T$5$l$k@)8fMQ%U%C%/$,=*N;$^$G$KD9;~4V$rMW$9$k>l9g!"(B
   1.267 +$B1JB3@-$,3NDj$7$F$$$J$$%A%'%s%8%;%C%H$N%a%?%G!<%?$,!"(B
   1.268 +$BJ?9T$7$FF0:n$7$F$$$kB>$N=hM}$K$h$jFI$_=P$5$l$k;~4VBS$,H/@8$7$^$9!#(B
   1.269 +$B%U%C%/$N<B9T;~4V$,D9$/$J$kDx!"$3$N;~4VBS$,D9$/$J$j$^$9!#(B
   1.270 +
   1.271 +\subsection{The problem illustrated}
   1.272 +
   1.273 +$B86B'E*$K(B \hook{pretxnchangegroup} $B%U%C%/$O!"(B
   1.274 +$B=8LsMQ%j%]%8%H%j$G$N<u$1F~$lA0$K!"(B
   1.275 +$B?75,%A%'%s%8%;%C%H$N%S%k%I$d%F%9%H$r<+F02=$9$k$N$KE,$7$F$$$^$9!#(B
   1.276 +$B$3$NMQK!$O(B
   1.277 +``$B%S%k%I$r<:GT$5$;$k(B''$BJQ99$,=8LsMQ%j%]%8%H%j$KH?1G$5$l$J$$$3$H$rJ]>Z$7$^$9!#(B
   1.278 +$B$7$+$7!"(B
   1.279 +\hook{pretxnchangegroup} $B%U%C%/$K$h$k%F%9%HES>e$NJQ99$r!"(B
   1.280 +$BB>$NMxMQ<T$,(B pull $B$G$-$F$7$^$&$h$&$G$O!"(B
   1.281 +$B%F%9%H$NM-MQ@-$,L5$/$J$C$F$7$^$$$^$9!#(B
   1.282 +$B%j%]%8%H%jFbMF$N@09g@-$K5?$$$r;}$?$J$$MxMQ<T$O!"(B
   1.283 +$B%S%k%I$r<:GT$5$;$k@x:_E*$J2DG=@-$r;}$D%F%9%HL$<B;\$NJQ99$r!"(B
   1.284 +$B<+?H$N%j%]%8%H%j$X$HH?1G$7$F$7$^$&$+$i$G$9!#(B
   1.285 +
   1.286 +$B$3$N$h$&$JFqBj$X$N:G$b0BA4$J5;=QE*2rK!$O!"(B
   1.287 +``$BLgHV(B''$B%j%]%8%H%j$NMxMQ$r(B\emph{$BC1J}8~(B}$B$K8BDj$7$F$7$^$&$3$H$G$9!#(B
   1.288 +$BLgHV%j%]%8%H%j$O!"(B
   1.289 +$B30It$+$i$N%A%'%s%8%;%C%H$N(B push $B$O5v$7$F$b!"(B
   1.290 +pull $B$O$G$-$J$$$h$&$K$7$^$9(B
   1.291 +$B!J(B\hook{preoutgoing} $B%U%C%/$G$=$N$h$&$J9T0Y$r6X;_$7$^$9!K!#(B
   1.292 +$B?7$7$$%A%'%s%8%;%C%H$K$*$1$k%S%k%I$J$$$7%F%9%H$,@.8y$7$?$J$i$P!"(B
   1.293 +$B$=$N%A%'%s%8%;%C%H$rJL$J%j%]%8%H%j$X$H(B push $B$9$k$h$&$K(B
   1.294 +\hook{changegroup} $B%U%C%/$r@_Dj$7!"(B
   1.295 +$BMxMQ<T$O$=$A$i$N%j%]%8%H%j$+$i(B pull \emph{$B$G$-$k(B}$B$h$&$K$7$^$7$g$&!#(B
   1.296 +
   1.297 +$B<B:]LdBj!"(B
   1.298 +$B$3$N$h$&$J=8Ls$5$l$?%\%H%k%M%C%/$r@_$1$k$3$H$O!"(B
   1.299 +$B$"$^$jNI$$%"%$%G%#%"$G$O$J$/(B(XXXX ?)$B!"(B
   1.300 +In practice, putting a centralised bottleneck like this in place is
   1.301 +not often a good idea
   1.302 +$B%H%i%s%6%/%7%g%s$NO31L(B\footnote{$BLuCm(B: 
   1.303 +$B1JB32=L$3NDj$N%A%'%s%8%;%C%H$,8+$($F$7$^$&$3$H(B}$B$OLdBj$K$J$j$^$;$s!#(B
   1.304 +$B%A%'%s%8%;%C%H$r<h$j07$&;~4V$h$j$b$=$l$r%F%9%H$9$k$N$K;~4V$rMW$9$k>u67$G$O!"(B
   1.305 +$B%W%m%8%'%/%H$NBg$-$5(B---$B$*$h$S%S%k%I!&%F%9%H$KMW$9$k;~4V(B
   1.306 +---$B$,A}2C$9$k$[$I!"(B
   1.307 +``$B9XF~A0$N;nMQ(B''$B<jK!$K$h$jJI$NFbB&$KAGAa$/Av$j$3$a$^$9!#(BXXXXX ????
   1.308 +As the size of a project---and the time it takes to
   1.309 +build and test---grows, you rapidly run into a wall with this ``try
   1.310 +before you buy'' approach, where you have more changesets to test than
   1.311 +time in which to deal with them.  
   1.312 +$BHr$1$i$l$J$$7k2L$O!"(B
   1.313 +$B$9$Y$F$,4,$-9~$^$l$?ItJ,$K$*$1$k%U%i%9%H%l!<%7%g%s$G$9!#(BXXXXXXX ????
   1.314 +The inevitable result is frustration
   1.315 +on the part of all involved.
   1.316 +
   1.317 +$B$h$jBg5,LO2=2DG=$J<jK!$O!"(B
   1.318 +push $BA0$K3F<+$G%S%k%I!&%F%9%H$r<B;\$7$F$b$i$$!"(B
   1.319 +push $B$N(B \emph{$B8e(B}$B$KCf1{$G<+F0E*$K%S%k%I!&%F%9%H$r9T$&$3$H$G!"(B
   1.320 +$BA4$F$N%A%'%s%8%;%C%H$,NI9%$G$"$k$3$H$r3NG'$9$k!"$H$$$&$b$N$G$9!#(B
   1.321 +$B$3$N<jK!$NMxE@$O!"(B
   1.322 +$B%j%]%8%H%j$K$*$1$k%A%'%s%8%;%C%H$N<uM}?JEY$K4X$7$F!"(B
   1.323 +$B@)8B$,2]$5$l$k$3$H$,L5$$E@$K$"$j$^$9!#(B
   1.324 +
   1.325 +\section{A short tutorial on using hooks}
   1.326 +\label{sec:hook:simple}
   1.327 +
   1.328 +Mercurial $B$N%U%C%/$O4JC1$K=q$1$^$9!#(B
   1.329 +\hgcmd{commit} $B$,40N;$7$?:]$K<B9T$5$l!"(B
   1.330 +$B:n@.$7$?$P$+$j$N%A%'%s%8%;%C%H$N%O%C%7%eCM$rI=<($9$k$@$1$N!"(B
   1.331 +$B4JC1$J%U%C%/$r=q$$$F$_$^$7$g$&!#(B
   1.332 +
   1.333 +\begin{figure}[ht]
   1.334 +  \interaction{hook.simple.init}
   1.335 +  \caption{A simple hook that runs when a changeset is committed}
   1.336 +  \label{ex:hook:init}
   1.337 +\end{figure}
   1.338 +
   1.339 +$BA4$F$N%U%C%/$O!"(B\ref{ex:hook:init} $B$NNc$K$*$1$k7A<0$rF'=1$7$^$9!#(B
   1.340 + \hgrc\ $B%U%!%$%k$N(B
   1.341 +\rcsection{hooks} $B%;%/%7%g%s$K%(%s%H%j$rDI2C$7$^$9!#(B
   1.342 +$B:8JU$O<B9T7@5!$K$J$k%$%Y%s%H$NL>A0$G!"(B
   1.343 +$B1&JU$O<B9T$5$l$k=hM}$G$9!#(B
   1.344 +$B8+$F$o$+$k$h$&$K!"(B
   1.345 +$B%U%C%/$K$*$$$F$OG$0U$N%7%'%k%3%^%s%I$r<B9T$G$-$^$9!#(B
   1.346 +$B4D6-JQ?t(B
   1.347 +$B!JNc$K$*$1$k(B \envar{HG\_NODE} $B$r;2>H$7$F$/$@$5$$!K$rMQ$$$F!"(B
   1.348 +Mercurial $B$O%U%C%/$KIU2C>pJs$rEO$7$^$9!#(B
   1.349 +
   1.350 +\subsection{Performing multiple actions per event}
   1.351 +
   1.352 +\ref{ex:hook:ext} $B$NNc$K<($9$h$&$J!"(B
   1.353 +$BFCDj$N<oN`$N%$%Y%s%H$KBP$7$F#1$D0J>e$N%U%C%/$rDj5A$7$?$$>u67$,!"(B
   1.354 +$B$7$P$7$PH/@8$9$k$3$H$G$7$g$&!#(B
   1.355 +Mercurial $B$G$O!"(B
   1.356 +$B%U%C%/L>$NKvHx$K(B\emph{$B3HD%;R(B}$B$rIUM?$9$k$3$H$G!"(B
   1.357 +$BF10l%$%Y%s%H$X$NJ#?t%U%C%/$NDj5A$,2DG=$K$J$j$^$9!#(B
   1.358 +$B3HD%;R$NIUM?$O!"(B
   1.359 +$B%U%C%/L>$K!"(B
   1.360 +$B%T%j%*%I!J(B``\texttt{.}'' $BJ8;z!K$HG$0U$KA*$s$@J8;zNs$rB3$1$k$3$H$G9T$$$^$9!#(B
   1.361 +$BNc$($P!"(B
   1.362 +\texttt{commit} $B$,H/@8$7$?>l9g!"(B
   1.363 +Mercurial $B$O(B 
   1.364 +\texttt{commit.foo} $B$*$h$S(B
   1.365 +\texttt{commit.bar} $B%U%C%/$r<B9T$7$^$9!#(B
   1.366 +
   1.367 +\begin{figure}[ht]
   1.368 +  \interaction{hook.simple.ext}
   1.369 +  \label{ex:hook:ext}
   1.370 +  \caption{Defining a second \hook{commit} hook}
   1.371 +\end{figure}
   1.372 +
   1.373 +$B$"$k%$%Y%s%H$KJ#?t$N%U%C%/$,Dj5A$5$l$F$$$k:]$K!"(B
   1.374 +$B$=$N<B9T=g=x$rL@3N$KDj5A$9$k$?$a$K!"(B
   1.375 +Mercurial $B$O%U%C%/$r3HD%;R$G@0Ns$5$;!"(B
   1.376 +$B%U%C%/%3%^%s%I$r$3$N@0Ns$5$l$?=g=x$G<B9T$7$^$9!#(B
   1.377 +$B>e5-$NNc$G$O!"(B
   1.378 +\texttt{commit.foo}
   1.379 +$B$NA0$K(B
   1.380 +\texttt{commit.bar} $B$r!"(B
   1.381 +$B$3$l$i$NA0$K(B
   1.382 +\texttt{commit} $B$r<B9T$7$^$9!#(B
   1.383 +
   1.384 +$B?7$7$$%U%C%/$rDj5A$9$k:]$K!"(B
   1.385 +$B2?$i$+$N@bL@E*$J3HD%;R$r;HMQ$9$k$N$ONI$$%"%$%G%#%"$G$9!#(B
   1.386 +$B$=$&$9$k$3$H$G!"(B
   1.387 +$B$=$N%U%C%/$,2?$r$9$k$?$a$N$b$N$+$r;W$$=P$7$d$9$/$J$j$^$9!#(B
   1.388 +$B%U%C%/$N<B9T$,<:GT$7$?>l9g!"(B
   1.389 +$B%U%C%/L>$H3HD%;R$r4^$`%(%i!<%a%C%;!<%8$,I=<($5$l$^$9$+$i!"(B
   1.390 +$B%U%C%/$,<:GT$7$?M}M3$K4X$7$F!"(B
   1.391 +$B@bL@E*$J3HD%;R$+$iB(@=$N%R%s%H$rF@$k$3$H$,$G$-$^$9(B
   1.392 +$B!JNc$K4X$7$F$O!"(B\ref{sec:hook:perm}~$B@a$r;2>H$7$F$/$@$5$$!K!#(B
   1.393 +
   1.394 +\subsection{Controlling whether an activity can proceed}
   1.395 +\label{sec:hook:perm}
   1.396 +
   1.397 +$B@h$NNc$G$O!"(B
   1.398 +$B%3%_%C%HA`:n$,40N;$7$?8e$G<B9T$5$l$k(B
   1.399 +\hook{commit} $B%U%C%/$r;HMQ$7$^$7$?!#(B
   1.400 +$B$3$N%U%C%/$O!"(B
   1.401 +$BA`:n$,40N;$7$?8e$G<B9T$5$l$k(B Mercurial $B$N%U%C%/$N#1$D$G$9!#(B
   1.402 +$B$3$l$i$N%U%C%/$O!"A`:n$=$N$b$N$K1F6A$r5Z$\$9$3$H$O$"$j$^$;$s!#(B
   1.403 +
   1.404 +Mercurial $B$G$O!"(B
   1.405 +$BA`:n$,3+;O$5$l$kA0$d!"(B
   1.406 +$BA`:n$,40N;$9$k$^$G$N4V$KH/@8$9$k%$%Y%s%H$,Dj5A$5$l$F$$$^$9!#(B
   1.407 +$B$3$l$i$N%$%Y%s%H$N:]$K5/F0$5$l$k%U%C%/$O!"(B
   1.408 +$BA`:n$r7QB32DG=$+CfCG$9$Y$-$+$rH=CG$9$k$3$H$,$G$-$^$9!#(B
   1.409 +
   1.410 +\hook{pretxncommit} $B%U%C%/$O!"(B
   1.411 +$B%3%_%C%HA`:n$,35$M=*N;$7$?8e!"%3%_%C%H$,40N;$9$kA0$NCJ3,$G5/F0$5$l$^$9!#(B
   1.412 +$B8@$$49$($k$J$i!"(B
   1.413 +$B%A%'%s%8%;%C%H$rI=$9%a%?%G!<%?$,%G%#%9%/$K=q$-9~$^$l$F$O$$$k$b$N$N!"(B
   1.414 +$B%H%i%s%6%/%7%g%s$,L$$@40N;$7$F$$$J$$>u67$G5/F0$5$l$^$9!#(B
   1.415 +\hook{pretxncommit} $B%U%C%/$O!"(B
   1.416 +$B%H%i%s%6%/%7%g%s$r40N;$5$;$k$N$+!"(B
   1.417 +$B$"$k$$$O4,$-La$9$Y$-$+$r7hDj$9$k$3$H$,$G$-$^$9!#(B
   1.418 +
   1.419 +\hook{pretxncommit} $B%U%C%/$,=*N;>uBVCM$H$7$F#0$rJV5Q$7$?>l9g!"(B
   1.420 +$B%H%i%s%6%/%7%g%s$O40N;$7!"%3%_%C%HA`:n$O=*N;$7$^$9$N$G!"(B
   1.421 +\hook{commit} $B%U%C%/$,<B9T$5$l$^$9!#(B
   1.422 +\hook{pretxncommit} $B%U%C%/$,=*N;>uBV$H$7$FHs#0$rJV5Q$7$?>l9g!"(B
   1.423 +$B%H%i%s%6%/%7%g%s$O4,$-La$5$l!"(B
   1.424 +$B%A%'%s%8%;%C%H$rI=$9%a%?%G!<%?$O:o=|$5$l!"(B
   1.425 +\hook{commit} $B%U%C%/$O<B9T$5$l$^$;$s!#(B
   1.426 +
   1.427 +\begin{figure}[ht]
   1.428 +  \interaction{hook.simple.pretxncommit}
   1.429 +  \label{ex:hook:pretxncommit}
   1.430 +  \caption{Using the \hook{pretxncommit} hook to control commits}
   1.431 +\end{figure}
   1.432 +
   1.433 +$BNc(B~\ref{ex:hook:pretxncommit} $BCf$N%U%C%/$O!"(B
   1.434 +$B%3%_%C%H;~$N%3%a%s%H$,%P%0(BID$B$r4^$s$G$$$k$3$H$r3NG'$7$F$$$^$9!#(B
   1.435 +$B%3%a%s%H$,%P%0(BID$B$r4^$s$G$$$k>l9g!"%3%_%C%H$O40N;$7$^$9!#(B
   1.436 +$B$=$&$G$J$1$l$P!"%3%_%C%HA`:n$O4,$-La$5$l$^$9!#(B
   1.437 +
   1.438 +\section{Writing your own hooks}
   1.439 +
   1.440 +\hggopt{-v} $B%*%W%7%g%sIU$-!"(B
   1.441 +$B$"$k$$$O(B\rcitem{ui}{verbose} $B@_Dj9`L\$r(B``true''$B$K$7$F(B
   1.442 +Mercurial $B$r<B9T$9$k$N$,!"(B
   1.443 +$B%U%C%/<BAu$N:]$K$OM-MQ$G$"$k$3$H$K5$IU$/$+$b$7$l$^$;$s!#(B
   1.444 +$B$3$N$h$&$K$7$F(B Mercurial $B$r<B9T$9$k$3$H$G!"(B
   1.445 +$B$=$l$>$l$N%U%C%/$r5/F0$9$k:]$K;vA0$K%a%C%;!<%8$rI=<($7$^$9!#(B
   1.446 +
   1.447 +\subsection{Choosing how your hook should run}
   1.448 +\label{sec:hook:lang}
   1.449 +
   1.450 +$B%U%C%/$r<BAu$9$k:]$K$O!"DL>o$N%W%m%0%i%`(B---$BE57?E*$K$O%7%'%k%9%/%j%W%H(B---
   1.451 +$B$H$7$F$b<BAu$G$-$^$9$,!"(B
   1.452 +Python $B4X?t$H$7$F$b<BAu$G$-!"(B
   1.453 +$B$=$N>l9g$O(B Mercurial $B%W%m%;%9Fb$G<B9T$5$l$^$9!#(B
   1.454 +
   1.455 +$B30It%W%m%0%i%`$H$7$F%U%C%/$r<BAu$9$kMxE@$O!"(B
   1.456 +Mercurial $B$NFbIt;v>p$K4X$7$FCN$kI,MW$,L5$$E@$K$"$j$^$9!#(B
   1.457 +$BIU2CE*$J>pJs$N<hF@$N$?$a$K!"(B
   1.458 +$BDL>o$N(B Mercurial $B%3%^%s%I$r5/F0$9$k$3$H$b$G$-$^$9!#(B
   1.459 +$B$=$NMxE@$H0z$-49$($K!"30It!J%W%m%0%i%`$H$7$F$N!K%U%C%/$O!"(B
   1.460 +$B%W%m%;%9Fb%U%C%/$h$j$bDcB.(B\footnote{$BLuCm(B:
   1.461 +$B8e=R$5$l$^$9$,!"(B
   1.462 +$B30It%W%m%0%i%`$K$h$k%U%C%/$,!VDcB.!W$G$"$k$N$O!"(B
   1.463 +(1)$B30It%W%m%;%9$H$7$F$N%U%C%/5/F0$H!"(B
   1.464 +(2)Mercurial $B%j%]%8%H%j$X$N%"%/%;%9$K4X$9$kItJ,$G!"(B
   1.465 +$B30It%W%m%;%9$N<B9T$=$N$b$N$,DcB.$J$o$1$G$O$"$j$^$;$s!#(B}$B$G$9!#(B
   1.466 +
   1.467 +Python $B4X?t$K$h$k%W%m%;%9Fb%U%C%/$O!"(B
   1.468 +$BA4$F$N(B Mercurial API $B$K%"%/%;%9$G$-!"(B
   1.469 +$BB>$N%W%m%;%9$r(B``$B@8@.(B''$B$9$kI,MW$O$"$j$^$;$s$N$G!"(B
   1.470 +$B4pK\E*$K30It%U%C%/$h$j$b9bB.$G$9!#(B
   1.471 +$B%U%C%/$,I,MW$H$9$kB?$/$N>pJs$NF~<j$b!"(B
   1.472 +Mercurial $B%3%^%s%I$+$iF@$k$h$j$b!"(B
   1.473 +Mercurial API $B$+$iF@$kJ}$,MF0W$G$9!#(B
   1.474 +
   1.475 +Python $B$NMxMQ$,6l$K$J$i$J$$$+!"(B
   1.476 +$B9b$$<B9T@-G=$,MW5a$5$l$k>l9g!"(B
   1.477 +Python $B$G$N%U%C%/<BAu$rA*Br$9$Y$-$G$9!#(B
   1.478 +$B$7$+$7$J$,$i!"(B
   1.479 +$B4JC1$J%U%C%/$G!"(B
   1.480 +$B@-G=$r5$$K$9$kI,MW$,L5$$!J$*$=$i$/B?$/$N%U%C%/$,$=$&$G$9!K$N$G$"$l$P!"(B
   1.481 +$B%7%'%k%9%/%j%W%H$G$N<BAu$G==J,$G$9!#(B
   1.482 +
   1.483 +\subsection{Hook parameters}
   1.484 +\label{sec:hook:param}
   1.485 +
   1.486 +Mercurial $B$,%U%C%/$r5/F0$9$k:]$K$O!"(B
   1.487 +$BL@3N$KDj5A$5$l$?%Q%i%a!<%?$,%U%C%/$KEO$5$l$^$9!#(B
   1.488 +Python $B$G$N%U%C%/<BAu$N>l9g!"(B
   1.489 +$B%Q%i%a!<%?$O%-!<%o!<%I0z?t$H$7$F%U%C%/4X?t$KEO$5$l$^$9!#(B
   1.490 +$B30It%W%m%0%i%`$G$N%U%C%/<BAu$N>l9g!"(B
   1.491 +$B%Q%i%a!<%?$O4D6-JQ?t$H$7$FEO$5$l$^$9!#(B
   1.492 +
   1.493 +$B%U%C%/<BAu$,(B Python $B!&%7%'%k%9%/%j%W%H$N$$$:$l$G$"$k$+$G!"(B
   1.494 +$B%U%C%/8GM-$N%Q%i%a!<%?L>$H$=$NCM$,7h$^$j$^$9(B\footnote{$BLuCm(B:
   1.495 +$B86J8$O(B
   1.496 +$B!V(BWhether your hook is written in Python or as a shell script, the
   1.497 +hook-specific parameter names and values will be the ``same''$B!W(B}
   1.498 +$B??56CM%Q%i%a!<%?$O!"(BPython $B%U%C%/$G$O??56CM7?$H$7$FI=8=$5$l$^$9$,!"(B
   1.499 +$B30It%U%C%/$KBP$7$F$O(B ``1''$B!J(B``true'' $BCM$H$7$F!K$J$$$7(B 
   1.500 +``0''$B!J(B``false'' $BCM$H$7$F!K$r;}$D4D6-JQ?t$GI=8=$5$l$^$9!#(B
   1.501 +$B%U%C%/%Q%i%a!<%?$,(B \texttt{foo} $B$H$$$&L>A0$G$"$k>l9g!"(B
   1.502 +Python $B%U%C%/$N%-!<%o!<%I0z?t$NL>A0$b(B \texttt{foo} $B$G$9$,!"(B
   1.503 +$B30It%U%C%/$N4D6-JQ?tL>$O(B \texttt{HG\_FOO} $B$H$J$j$^$9!#(B
   1.504 +
   1.505 +\subsection{Hook return values and activity control}
   1.506 +
   1.507 +$B<B9T$,@.8y$7$?%U%C%/$O!"30It%U%C%/$N>l9g$O=*N;%3!<%I#0$G!"(B
   1.508 +$B%W%m%;%9Fb%U%C%/$N>l9g$O??56CM(B``False''$B$G=*N;$7$J$1$l$P$J$j$^$;$s(B
   1.509 +\footnote{$BLuCm(B:Mercurial $B$NG[I[J*$K4^$^$l$k(B hgext $BG[2<$N%U%C%/$O!"(B
   1.510 +$B7k9=$J3NN($G!"(B
   1.511 +False $BL5$7$N(B return $B$d!"(B
   1.512 +$BL@<(E*$J(B return $BL5$7$N<BAu$G$9$,!"(B
   1.513 +Python $B$N8@8l;EMM>e!"(B
   1.514 +$B$3$l$i$O(B False $B$H(B``$B$[$\Ey2A(B''$B$J(B None $B$H$_$J$5$l$^$9!#(B}$B!#(B
   1.515 +$B%U%C%/$N<B9T<:GT$O!"(B
   1.516 +$B30It%U%C%/$N>l9g$OHs#0$N=*N;%3!<%I$G!"(B
   1.517 +$B%W%m%;%9Fb%U%C%/$N>l9g$O??56CM(B``true''$B$GI=$5$l$^$9!#(B
   1.518 +$B%W%m%;%9Fb$U$C$/$,Nc30$rIbMH$7$?>l9g!"(B
   1.519 +$B%U%C%/<B9T$O<:GT$7$?$H8+Pv$5$l$^$9!#(B
   1.520 +
   1.521 +$BA`:n$N7QB3@-$r@)8f$G$-$k%U%C%/$N>l9g!"(B
   1.522 +$B#0!?(Bfalse $B$O7QB3$N(B``$B5v2D(B''$B$r!"(B
   1.523 +$BHs#0!?(Btrue$B!?Nc30$O(B``$B5qH](B''$B$r0UL#$7$^$9!#(B
   1.524 +
   1.525 +\subsection{Writing an external hook}
   1.526 +
   1.527 +\hgrc\ $B%U%!%$%k$K30It%U%C%/$r5-=R$7$?>l9g!"(B
   1.528 +\hgrc\ $B%U%!%$%k$K5-=R$7$?%U%C%/$NFbMF$O!"(B
   1.529 +$B%7%'%k%W%m%;%9$KEO$5$l!"(B
   1.530 +$B$=$N%7%'%k%W%m%;%9$K$h$C$F2r<a$5$l$^$9!#(B
   1.531 +$B$3$l$O!"%U%C%/5-=R$NK\BN$K!"(B
   1.532 +$BDL>o$N%7%'%k%3%^%s%I%i%$%s$HF1MM$N9=B$$rMQ$$$k$3$H$,$G$-$k!"(B
   1.533 +$B$H$$$&$3$H$r0UL#$7$F$$$^$9!#(B
   1.534 +
   1.535 +$B<B9T2DG=$J%U%C%/$O!"(B
   1.536 +$B>o$K%j%]%8%H%j$N%k!<%H%G%#%l%/%H%jD>2<$G<B9T$5$l$^$9!#(B
   1.537 +
   1.538 +$B8D!9$N%U%C%/%Q%i%a!<%?$O4D6-JQ?t7PM3$GEO$5$l$^$9$,!"(B
   1.539 +$B4D6-JQ?tL>$K$O!"(B
   1.540 +$BBgJ8;z2=$5$l!"@\F,<-$H$7$F(B``\texttt{HG\_}''$B$,IUM?$5$l$?L>A0$,MQ$$$i$l$^$9!#(B
   1.541 +
   1.542 +$B%U%C%/%Q%i%a!<%?$rNc30$H$9$l$P!"(B
   1.543 +Mercurial $B$O%U%C%/<B9T;~$K4D6-JQ?t$N2~JQ$r9T$$$^$;$s!#(B
   1.544 +$B$=$l$>$l$K0[$J$k4D6-JQ?t@_Dj$r$7$F$$$kB?$/$N%f!<%6$K$h$C$F<B9T$5$l$k!"(B
   1.545 +$BAH?%A4BN$G6&MQ$5$l$k%U%C%/$r<BAu$9$k:]$K$O!"(B
   1.546 +$B$3$NCN<1$,Lr$KN)$D$G$7$g$&!#(B
   1.547 +$BJ#?t%f!<%6$K$h$j<B9T$5$l$k>u672<$G$O!"(B
   1.548 +$B%U%C%/$N;n834D6-$G@_Dj$5$l$F$$$?4D6-JQ?t$,!"(B
   1.549 +$B<B9T;~$K@_Dj$5$l$F$$$k$3$H$r4|BT$7$F$O$$$1$^$;$s!#(B
   1.550 +
   1.551 +\subsection{Telling Mercurial to use an in-process hook}
   1.552 +
   1.553 +$B%W%m%;%9Fb%U%C%/$r(B \hgrc\ $B%U%!%$%k$G@_Dj$9$k:]$NJ8K!$O!"(B
   1.554 +$B<B9T2DG=%U%C%/(B\footnote{$BLuCm(B: $B!V30It%U%C%/!W$N0U(B
   1.555 +}$B@_Dj$N:]$N$=$l$H$O>/!90[$J$j$^$9(B
   1.556 +$B%U%C%/@_Dj$O!"(B
   1.557 +$B@\F,<-(B``\texttt{python:}''$B$KB3$-!"(B
   1.558 +$B%U%C%/$H$7$F;HMQ$9$k8F$S=P$72DG=%*%V%8%'%/%H(B\footnote{$BLuCm(B: 
   1.559 +callable object}$B$N40A4=$>~$5$l$?L>A0$,5-=R$5$l$F$$$J$1$l$P$J$j$^$;$s!#(B
   1.560 +
   1.561 +$B%U%C%/Dj5A$,B8:_$9$k%b%8%e!<%k$O!"(B
   1.562 +$B%U%C%/<B9T;~$K<+F0E*$K(B import $B$5$l$^$9!#(B
   1.563 +$B%b%8%e!<%kL>$H(B \envar{PYTHONPATH} $B@_Dj$,@5$7$1$l$P!"(B
   1.564 +$B$-$C$HF0:n$9$kH&$G$9(B\footnote{$BLuCm(B: ``just work'' $B$N%K%e%"%s%9$O!)(B}$B!#(B
   1.565 +
   1.566 +$B0J2<$K<($9(B \hgrc\ $B%U%!%$%k$N0zMQNc$O!"(B
   1.567 +$BA0=R$7$?I=5-$K4X$9$kJ8K!$H0UL#$rNc<($7$F$$$^$9!#(B
   1.568 +
   1.569 +\begin{codesample2}
   1.570 +  [hooks]
   1.571 +  commit.example = python:mymodule.submodule.myhook
   1.572 +\end{codesample2}
   1.573 +
   1.574 +Mercurial $B$,(B \texttt{commit.example} $B%U%C%/$r5/F0$9$k:]$K$O!"(B
   1.575 +\texttt{mymodule.submodule} $B$r(B import $B$7!"(B
   1.576 +\texttt{myhook} $B$H$$$&L>A0$N8F$S=P$72DG=%*%V%8%'%/%H$rC5$7=P$7$F5/F0$7$^$9!#(B
   1.577 +
   1.578 +\subsection{Writing an in-process hook}
   1.579 +
   1.580 +$B0J2<$K<($9:G$bC1=c$J%W%m%;%9Fb%U%C%/$O!"(B
   1.581 +$B%U%C%/$H$7$F$O2?$b$7$^$;$s$,!"(B
   1.582 +$B%U%C%/(B API $B$N4pK\E*$J35MW$rNc<($G$-$^$9!#(B
   1.583 +
   1.584 +\begin{codesample2}
   1.585 +  def myhook(ui, repo, **kwargs):
   1.586 +      pass
   1.587 +\end{codesample2}
   1.588 +
   1.589 +Python $B%U%C%/(B\footnote{$BLuCm!'%W%m%;%9Fb%U%C%/$N0U(B}$B$N:G=i$N0z?t$O!"(B
   1.590 +$B>o$K(B \pymodclass{mercurial.ui}{ui} $B%*%V%8%'%/%H$G$9!#(B
   1.591 +$BBh#20z?t$O%j%]%8%H%j%*%V%8%'%/%H$G$9$,!"(B
   1.592 +$B8=:_$N(B Mercurial $B$N<BAu$G$O!"(B
   1.593 +$B$=$N%$%s%9%?%s%9$O>o$K(B \pymodclass{mercurial.localrepo}{localrepository} $B$G$9!#(B
   1.594 +$B$3$l$i$KB3$/$=$NB>$N0z?t$O%-!<%o!<%I0z?t$H$7$FEO$5$l$^$9!#(B
   1.595 +$BEO$5$l$kFbMF$O5/F0$5$l$k%U%C%/!J$N<oN`!K$K0MB8$7$^$9$,!"(B
   1.596 +$B>e5-Nc$K$*$1$k(B \texttt{**kwargs} $B$N$h$&$K!"(B
   1.597 +$B%-!<%o!<%I0z?t<-=q$KMn$H$79~$`(B\footnote{XXXXX:
   1.598 +Python $B8GM-$NLu8l$r3NG'(B}$B$3$H$G!"(B
   1.599 +$B6=L#$NL5$$0z?t$rL5;k$9$k$3$H$,$G$-$^$9!#(B
   1.600 +
   1.601 +\section{Some hook examples}
   1.602 +
   1.603 +\subsection{Writing meaningful commit messages}
   1.604 +
   1.605 +$BM-MQ$J%3%_%C%H%a%C%;!<%8$,Hs>o$KC;$$!"(B
   1.606 +$B$H$$$&>u67$OA[A|$7Fq$$$b$N$,$"$j$^$9!#(B
   1.607 +$B?^(B~\ref{ex:hook:msglen.go} $B$K<($9C1=c$J(B
   1.608 +\hook{pretxncommit} $B%U%C%/$O!"(B
   1.609 +$B#1#0%P%$%H$h$j$bC;$$%a%C%;!<%8$G$N%A%'%s%8%;%C%H$N%3%_%C%H$rK8$2$^$9!#(B
   1.610 +
   1.611 +\begin{figure}[ht]
   1.612 +  \interaction{hook.msglen.go}
   1.613 +  \caption{A hook that forbids overly short commit messages}
   1.614 +  \label{ex:hook:msglen.go}
   1.615 +\end{figure}
   1.616 +
   1.617 +\subsection{Checking for trailing whitespace}
   1.618 +
   1.619 +$B%3%_%C%H$K4X$9$k6=L#?<$$%U%C%/$NMxMQ$O!"(B
   1.620 +$Be:No$J%3!<%I$G$N<BAu$rJd=u$9$k$H$$$&$b$N$G$9!#(B
   1.621 +$B4JC1$J(B``$Be:No$J%3!<%I(B''$B$NNc$H$7$F$O!"(B
   1.622 +$BJQ99$,DI2C$9$k?7$7$$9T$K$O(B``$BKvHx6uGr(B''$B$,4^$^$l$F$$$F$O$J$i$J$$!"(B
   1.623 +$B$H$$$&3J8@$,$"$j$^$9!#(B
   1.624 +$BKvHx6uGr$H$O!"(B
   1.625 +$B6uGrJ8;z$*$h$S%?%V!J(Btab$B!KJ8;z$NO"B3$,9TKv$K$"$k$3$H$r0UL#$7$^$9!#(B
   1.626 +$BB?$/$N>l9g!"(B
   1.627 +$BKvHx6uGr$OI,MW$NL5$$IT2D;k$N;(2;$_$?$$$J$b$N$G$9$,!"(B
   1.628 +$B;~$K$OLdBj$r4^$`$3$H$+$i!"(B
   1.629 +$B$=$l$i$,<h$j=|$+$l$k$3$H$rK>$_$^$9!#(B
   1.630 +
   1.631 +\hook{precommit} $B$H(B \hook{pretxncommit} $B$N$$$:$l$N%U%C%/$G$b!"(B
   1.632 +$BKvHx6uGrLdBj$rDLCN$9$k$3$H$,2DG=$G$9!#(B
   1.633 +\hook{precommit} $B%U%C%/$r;HMQ$7$?>l9g!"(B
   1.634 +$B%U%C%/$O%3%_%C%HBP>]%U%!%$%k$rCN$k$3$H$,$G$-$J$$$N$G!"(B
   1.635 +$B%j%]%8%H%jCf$NJQ99$5$l$?%U%!%$%kA4$F$KBP$7$FKvHx6uGr$r3NG'$7$F$7$^$$$^$9!#(B
   1.636 +$B$=$&$9$k$H!"(B
   1.637 +$B%U%!%$%k(B \filename{foo} $B$NJQ99$N$_$r%3%_%C%H$7$?$$>l9g$G$b!"(B
   1.638 +\filename{bar} $B%U%!%$%k$,KvHx6uGr$r4^$s$G$$$?$J$i!"(B
   1.639 +\hook{precommit} $B%U%C%/$G$N%A%'%C%/$O!"(B
   1.640 +\filename{bar} $B$NLdBj$rM}M3$K(B \filename{foo} $B$N%3%_%C%H$rK8$2$F$7$^$$$^$9!#(B
   1.641 +$B$3$l$G$O$$$1$^$;$s!#(B
   1.642 +
   1.643 +\hook{pretxncommit} $B%U%C%/$G<B8=$9$k>l9g!"(B
   1.644 +$B%3%_%C%H$N%H%i%s%6%/%7%g%s$,40N;$9$kD>A0$^$G%A%'%C%/$,9T$o$l$^$;$s!#(B
   1.645 +$B$3$N$?$a!"KvHx6uGrLdBj$N3NG'$r!"(B
   1.646 +$B87L)$K%3%_%C%HBP>]$N%U%!%$%k$@$1$K9T$&$3$H$,$G$-$^$9!#(B
   1.647 +$B$7$+$7!"(B
   1.648 +$B%3%_%C%H%a%C%;!<%8$rBPOCE*$KF~NO$7$?8e$G$"$C$F$b!"(B
   1.649 +$B%U%C%/$N<B9T$,<:GT(B\footnote{
   1.650 +$BLuCm(B: $BKvHx6uGr$,8!=P$5$l$k$3$H$G$N!V<:GT!W(B}$B$7$?>l9g!"(B
   1.651 +$B%H%i%s%6%/%7%g%s$O4,$-La$5$l$F$7$^$$$^$9$N$G!"(B
   1.652 +$BKvHx6uGr$r<h$j=|$$$?8e$G:F$S(B \hgcmd{commit} $B%3%^%s%I<B9T$7$?:]$K$O!"(B
   1.653 +$B$b$&0lEY%3%_%C%H%a%C%;!<%8$rF~NO$9$kI,MW$,$"$j$^$9!#(B
   1.654 +
   1.655 +\begin{figure}[ht]
   1.656 +  \interaction{hook.ws.simple}
   1.657 +  \caption{A simple hook that checks for trailing whitespace}
   1.658 +  \label{ex:hook:ws.simple}
   1.659 +\end{figure}
   1.660 +
   1.661 +$B?^(B~\ref{ex:hook:ws.simple} $B$G$O!"(B
   1.662 +$BKvHx6uGr$r%A%'%C%/$9$k4JC1$J(B
   1.663 +\hook{pretxncommit} $B%U%C%/$r>R2p$7$F$$$^$9!#(B
   1.664 +$B$3$N%U%C%/$OC;$$$G$9$,!"Hs>o$KM-MQ$G$9!#(B
   1.665 +$BJQ99$K$h$j2?$l$+$N%U%!%$%k$KBP$7$FKvHx6uGr$r4^$`9T$,DI2C$5$l$?>l9g!"(B
   1.666 +$B$3$N%U%C%/$O%(%i!<%9%F!<%?%9$G=*N;$7$^$9$,!"(B
   1.667 +$BITL{2w$J%U%!%$%k$d9T$NFCDj$rJd=u$9$k>pJs$r2?$iI=<($7$^$;$s(B\footnote{$BLuCm!'(B
   1.668 +$B%U%C%/<B9T$N%3%^%s%I%i%$%s$+$i$o$+$k$h$&$K!"(B
   1.669 +export $B=PNO!J!a(B patch $B7A<0!K$KBP$7$F(B (e)grep $B$rE,MQ$7$F$$$^$9$+$i!"(B
   1.670 +$B%U%!%$%kL>$d9THV9f$KBP$7$F$O2?$iG'<1$5$l$F$$$^$;$s!#(B}$B!#(B
   1.671 +$B$3$N%U%C%/$O!"(B
   1.672 +$B2~JQ$5$l$F$$$J$$9T$K$OCm0U$rJ'$o$:!"(B
   1.673 +$BKvHx6uGrLdBj$r;}$A9~$`9T$K$N$_Cm0U$rJ'$&!"(B
   1.674 +$B$H$$$&M%$l$?FC<A$b;}$C$F$$$^$9!#(B
   1.675 +
   1.676 +\begin{figure}[ht]
   1.677 +  \interaction{hook.ws.better}
   1.678 +  \caption{A better trailing whitespace hook}
   1.679 +  \label{ex:hook:ws.better}
   1.680 +\end{figure}
   1.681 +
   1.682 +$B?^(B~\ref{ex:hook:ws.better} $B$O@h$NNc$h$j$OJ#;($G$9$,!"(B
   1.683 +$B$h$jM-MQ$J%U%C%/$NNc$r<($7$F$$$^$9(B\footnote{$BLuCm(B:
   1.684 +check\_whitespace.py $B$NFbMF$,ITL@!#(B
   1.685 +$B?^Cf$G%=!<%9$r(B cat $B$9$Y$-(B XXXX}$B!#(B
   1.686 +$B$3$N%U%C%/$O(B unified diff $B7A<0$r2r@O$7$F!"(B
   1.687 +$BKvHx6uGr$rDI2C$9$k9T$NM-L5$rH=Dj$7!"(B
   1.688 +$B$=$N$h$&$J%U%!%$%k$NL>A0$H9THV9f$rI=<($7$^$9!#(B
   1.689 +$B$=$l$K2C$($F$3$N%U%C%/$O!"(B
   1.690 +$B%A%'%s%8%;%C%H$,KvHx6uGr$rDI2C$9$k$3$H$r8!CN$7$?>l9g!"(B
   1.691 +$B<B9T$r=*N;$7$F(B Mercurial $B$K%H%i%s%6%/%7%g%s$N4,$-La$7$rEA$($kA0$K!"(B
   1.692 +$B%3%_%C%H%a%C%;!<%8$rJ]B8$7$F$=$N%U%!%$%kL>$rI=<($7$^$9$N$G!"(B
   1.693 +$BLdBjE@$r=$@5$7$?8e$N%3%_%C%H$N:]$K$O!"(B
   1.694 +\hgcmdargs{commit}{\hgopt{commit}{-l}~\emph{filename}}
   1.695 +$B$r;H$C$F%3%_%C%H%a%C%;!<%8$r:FMxMQ$9$k$3$H$,$G$-$^$9!#(B
   1.696 +
   1.697 +$B?^(B~\ref{ex:hook:ws.better}
   1.698 +$B%U%!%$%k$+$iKvHx6uGr$r<h$j=|$/(B
   1.699 +\command{perl} $B$N0l9T5-=R$NMQK!$r<($7$^$9!#(B
   1.700 +$B$3$NJ}K!$O$3$3$K:F7G$9$k$KB-$k$@$1$N!"(B
   1.701 +$B4J7i$5$HM-MQ@-$r;}$C$F$$$^$9(B\footnote{$BLuCm(B: 
   1.702 +$B%3!<%I$NI=<($,!J(BHTML $B7A<0$@$H!K#29T$KJ,3d$5$l$F$$$k(B XXXX}$B!#(B
   1.703 +
   1.704 +\begin{codesample2}
   1.705 +  perl -pi -e 's,\\s+\$,,' filename
   1.706 +\end{codesample2}
   1.707 +
   1.708 +\section{Bundled hooks}
   1.709 +
   1.710 +Mercurial $B$NG[I[HG$K$O!"4v$D$+$N%U%C%/$,E:IU$5$l$F$$$^$9!#(B
   1.711 +$BE:IU%U%C%/$O(B Mercurial $B%=!<%9%D%j!<$N(B
   1.712 +\dirname{hgext} $B%G%#%l%/%H%j$K3JG<$5$l$F$$$^$9!#(B
   1.713 +Mercurial $B$N%P%$%J%jG[I[HG$r;HMQ$7$F$$$k>l9g$K$O!"(B
   1.714 +$B%Q%C%1!<%8$N%$%s%9%H!<%i!<$,(B
   1.715 +Mercurial $B$r%$%s%9%H!<%k$7$?0LCV$K$"$k(B
   1.716 +\dirname{hgext} $B%G%#%l%/%H%j$K3JG<$5$l$F$$$^$9!#(B
   1.717 +
   1.718 +\subsection{\hgext{acl}---access control for parts of a repository}
   1.719 +
   1.720 +\hgext{acl} $B3HD%$K$h$j!"(B
   1.721 +$B%M%C%H%o!<%/>e$N%5!<%P$KBP$7$F%A%'%s%8%;%C%H$r(B
   1.722 +push $B2DG=$J1s3V%f!<%6$r@)8B$9$k$3$H$,$G$-$^$9!#(B
   1.723 +$B%j%]%8%H%j$N0lIt!JL^O@A4BN$b!K$rJ]8n$9$k$3$H$,$G$-$^$9$N$G!"(B
   1.724 +$BFCDj$N%f!<%6$KBP$7$F$O!"(B
   1.725 +$BJ]8n$5$l$?ItJ,$K1F6A$r5Z$\$5$J$$%A%'%s%8%;%C%H$N$_$N(B push $B$,2DG=$G$9!#(B
   1.726 +
   1.727 +$B$3$N3HD%$O(B
   1.728 +push $BBP>]$N%A%'%s%8%;%C%H$r%3%_%C%H$7$?%f!<%6(B\emph{$B$G$O$J$/(B}$B!"(B
   1.729 +push $B$r<B;\$9$k%f!<%6$N?H85>pJs$r85$K%"%/%;%9@)8f$r9T$$$^$9!#(B
   1.730 +$B1s3V%f!<%6$rG'>Z$9$k4F6X!J(Block-downed$B!K%5!<%P$,B8:_$9$k4D6-$G!"(B
   1.731 +$BFCDj$N%f!<%6$@$1$,4F6X%5!<%P$X$N%A%'%s%8%;%C%H$N(B
   1.732 +push $B$,5v$5$l$k$3$H$r3N<B$K$7$?$$>l9g$G$J$1$l$P!"(B
   1.733 +$B$3$N%U%C%/$N;HMQ$O0UL#$,$"$j$^$;$s!#(B
   1.734 +
   1.735 +\subsubsection{Configuring the \hook{acl} hook}
   1.736 +
   1.737 +$B;}$A9~$^$l$k%A%'%s%8%;%C%H$r4IM}$9$k$?$a$K!"(B
   1.738 +\hgext{acl} $B%U%C%/$O(B
   1.739 +\hook{pretxnchangegroup} $B%U%C%/$H$7$FMQ$$$^$9!#(B
   1.740 +\hook{pretxnchangegroup} $B%U%C%/$H$7$FMQ$$$i$l$k$3$H$G!"(B
   1.741 +$B30Mh$N%A%'%s%8%;%C%H$K$h$jJQ99$5$l$k%U%!%$%k$rCN$k$3$H$,$G$-$k$?$a!"(B
   1.742 +``$B6X;_$5$l$F$$$k(B''$B%U%!%$%k$X$NJQ99$r9T$&%A%'%s%8%;%C%H72$KBP$7$F$O!"(B
   1.743 +$B%H%i%s%6%/%7%g%s$N4,$-La$7$,9T$o$l$^$9!#(B
   1.744 +
   1.745 +\begin{codesample2}
   1.746 +  [hooks]
   1.747 +  pretxnchangegroup.acl = python:hgext.acl.hook
   1.748 +\end{codesample2}
   1.749 +
   1.750 +\hgext{acl} $B3HD%$O#3$D$N%;%/%7%g%s$G@_Dj$5$l$^$9!#(B
   1.751 +
   1.752 +\rcsection{acl} $B%;%/%7%g%s$K$O!"(B
   1.753 +$B%U%C%/$,Cm0U$rJ'$&$Y$-30Mh%A%'%s%8%;%C%H$N=P=j$rNs5s$9$k(B
   1.754 +\rcitem{acl}{sources} $B%(%s%H%j$@$1$,5-=R$5$l$^$9!#(B
   1.755 +$BDL>o$O$3$N%;%/%7%g%s$r@_Dj$9$kI,MW$O$"$j$^$;$s!#(B
   1.756 +
   1.757 +\begin{description}
   1.758 +\item[\rcitem{acl}{serve}] $B%j%b!<%H%j%]%8%H%j$+$i$N(B http $B$J$$$7(B ssh 
   1.759 +  $B7PM3$N%A%'%s%8%;%C%H$KBP$7$F@)8f$r9T$$$^$9!#(B
   1.760 +  $B$3$l$O(B \rcitem{acl}{sources} $B$N4{DjCM$G!"(B
   1.761 +  $BDL>o$O$3$N@_Dj9`L\$KBP$7$F9T$&M#0l$N@_Dj$G$9!#(B
   1.762 +
   1.763 +\item[\rcitem{acl}{pull}] $B%m!<%+%k%j%]%8%H%j$+$i$N(B
   1.764 +  pull $B7PM3$N%A%'%s%8%;%C%H$KBP$7$F@)8f$r9T$$$^$9!#(B
   1.765 +
   1.766 +\item[\rcitem{acl}{push}] $B%m!<%+%k%j%]%8%H%j$+$i$N(B
   1.767 +  push $B7PM3$N%A%'%s%8%;%C%H$KBP$7$F@)8f$r9T$$$^$9!#(B
   1.768 +
   1.769 +\item[\rcitem{acl}{bundle}] $BB>$N%j%]%8%H%j$+$i$N(B
   1.770 +  bundle $B7PM3$N%A%'%s%8%;%C%H$KBP$7$F@)8f$r9T$$$^$9!#(B
   1.771 +
   1.772 +\end{description}
   1.773 +
   1.774 +\rcsection{acl.allow} $B%;%/%7%g%s$O!"(B
   1.775 +$B%j%]%8%H%j$X$N%A%'%s%8%;%C%HDI2C$r5v2D$5$l$F$$$k%f!<%6$r7hDj$7$^$9!#(B
   1.776 +$B$3$N%;%/%7%g%s$,B8:_$7$J$$>l9g!"(B
   1.777 +$BL@<(E*$K6X;_$5$l$F$$$J$$%f!<%6$O!"(B
   1.778 +$BC/$G$b%A%'%s%8%;%C%H$NDI2C$r$G$-$^$9!#(B
   1.779 +$B$3$N%;%/%7%g%s$,B8:_$9$k>l9g!"(B
   1.780 +$BL@<(E*$K5v2D$5$l$F$$$J$$%f!<%6$O!"(B
   1.781 +$BC/$b%A%'%s%8%;%C%H$NDI2C$,$G$-$^$;$s!J(B
   1.782 +$B$G$9$N$G!"$3$N%;%/%7%g%s$r6u$K$7$?>l9g!"(B
   1.783 +$BA4$F$N%f!<%6$,%A%'%s%8%;%C%H$NDI2C$r6X;_$5$l$^$9!K!#(B
   1.784 +
   1.785 +\rcsection{acl.deny} $B%;%/%7%g%s$O!"(B
   1.786 +$B%j%]%8%H%j$X$N%A%'%s%8%;%C%HDI2C$r6X;_$5$l$F$$$k%f!<%6$r7hDj$7$^$9!#(B
   1.787 +$B$3$N%;%/%7%g%s$,5-=R$5$l$J$$>l9g!"(B
   1.788 +$BA4$F$N%f!<%6$O%A%'%s%8%;%C%H$NDI2C$r5v2D$5$l$^$9(B\footnote{$BLuCm!'(B 
   1.789 +$B86J8$O!V(Bno users are denied$B!W$G$9$,!"(B
   1.790 +acl.py $B$N<BAu>e$O!V6X;_$7$J$$!W$H!V5v2D!W$OEy2A$G$9!#(B}$B!#(B
   1.791 +
   1.792 +\rcsection{acl.allow} $B$*$h$S(B \rcsection{acl.deny} 
   1.793 +$B%;%/%7%g%s$NJ8K!$OF10l$G$9!#(B
   1.794 +$B3F%(%s%H%j$N:8JU$O!"(B
   1.795 +$B%j%]%8%H%j%k!<%HAjBP$G$N%U%!%$%k$J$$$7%G%#%l%/%H%j$N%^%C%A%s%0%Q%?!<%s$G!"(B
   1.796 +$B1&JU$O%f!<%6L>$H$J$C$F$$$^$9!#(B
   1.797 +
   1.798 +$B0J2<$NNc$G$O!"(B
   1.799 +$B%f!<%6(B \texttt{docwriter} $B$,%j%]%8%H%j$N(B
   1.800 +\dirname{docs} $BG[2<$KBP$9$kJQ99$N(B 
   1.801 +push $B$N$_$,5v2D$5$l$F$$$k0lJ}$G!"(B
   1.802 +$B%f!<%6(B \texttt{intern} $B$O(B
   1.803 +\dirname{source/sensitive} 
   1.804 +$B0J30$NG$0U$N%G%#%l%/%H%j!&%U%!%$%k$KBP$9$kJQ99$r(B
   1.805 +push $B2DG=$G$9(B
   1.806 +\footnote{$BLuCm!'(B
   1.807 +$B@_Dj$NH=Dj=g=x$O(B (1) $B6X;_(B (2) $B5v2D$N=g=x$G9T$o$l!"(B
   1.808 +(1) $B6X;_@_Dj$,$"$j!"Ev3:%f!<%6$N%"%/%;%9$,L@<(E*$K6X;_$5$l$F$$$k>l9g$H!"(B
   1.809 +(2) $B5v2D@_Dj$,$"$j!"Ev3:%f!<%6$N%"%/%;%9$,L@<(E*$K5v2D$5$l$F!V$$$J$$!W>l9g$K!"(B
   1.810 +$BIT@5%"%/%;%9$H$_$J$5$l!"(B
   1.811 +$B$=$l0J30$N>l9g$O%"%/%;%9$,5v2D$5$l$^$9!#(B}$B!#(B
   1.812 +
   1.813 +\begin{codesample2}
   1.814 +  [acl.allow]
   1.815 +  docs/** = docwriter
   1.816 +
   1.817 +  [acl.deny]
   1.818 +  source/sensitive/** = intern
   1.819 +\end{codesample2}
   1.820 +
   1.821 +\subsubsection{Testing and troubleshooting}
   1.822 +
   1.823 +\hgext{acl} $B%U%C%/$r;n$7$F$_$?$$>l9g!"(B
   1.824 +Mercurial $B$N%G%P%C%0=PNO$rM-8z$K$7$F<B9T$7$^$7$g$&!#(B
   1.825 +\hggopt{--debug} $B%*%W%7%g%s$r;XDj$7Fq$$!J$"$k$$$OIT2DG=$J!K(B
   1.826 +$B%5!<%P>e$G<B9T$9$k$3$H$b$"$k$G$7$g$&$+$i!"(B
   1.827 +$B%5!<%PB&$N(B \hgrc $B%U%!%$%k$G%G%P%C%0=PNO$rM-8z2=$G$-$k$3$H$r$*K:$l$J$/!#(B
   1.828 +
   1.829 +\begin{codesample2}
   1.830 +  [ui]
   1.831 +  debug = true
   1.832 +\end{codesample2}
   1.833 +
   1.834 +$B$3$l$rM-8z$K$9$k$3$H$G!"(B
   1.835 +$BEv3:%f!<%6$K$h$k(B push 
   1.836 +$B$r5v2D!&6X;_$9$kM}M3$rH=CG$9$k$KB-$k>pJs$rI=<($9$k$3$H$G$7$g$&!#(B
   1.837 +
   1.838 +\subsection{\hgext{bugzilla}---integration with Bugzilla}
   1.839 +
   1.840 +\hgext{bugzilla} $B3HD%$O!"(B
   1.841 +$B%3%_%C%H%a%C%;!<%8$K%P%0(BID$B$r8!CN$7$?:]$K(B
   1.842 +Bugzilla $B%P%0$X$N%3%a%s%HDI2C$r9T$$$^$9!#(B
   1.843 +$B$3$N%U%C%/$r6&M-%5!<%P$K@_Dj$9$k$3$H$G!"(B
   1.844 +$B$3$N%5!<%P$X$N%j%b!<%H$+$i$NJQ99EAGE$N:]$K$O!"(B
   1.845 +$B>o$K$3$N%U%C%/$,<B9T$5$l$^$9!#(B
   1.846 +
   1.847 +$B$3$N%U%C%/$O(B Bugzilla $B%P%0$K!"(B
   1.848 +$B0J2<$N$h$&$J%3%a%s%H$rDI2C$7$^$9(B
   1.849 +$B!JJ}K!$O8e=R$7$^$9$,!"%3%a%s%HFbMF$OJQ99$G$-$^$9!K!#(B
   1.850 +
   1.851 +\begin{codesample2}
   1.852 +  Changeset aad8b264143a, made by Joe User <joe.user@domain.com> in
   1.853 +  the frobnitz repository, refers to this bug.
   1.854 +
   1.855 +  For complete details, see
   1.856 +  http://hg.domain.com/frobnitz?cmd=changeset;node=aad8b264143a
   1.857 +
   1.858 +  Changeset description:
   1.859 +        Fix bug 10483 by guarding against some NULL pointers
   1.860 +\end{codesample2}
   1.861 +
   1.862 +$B$3$N%U%C%/$N2ACM$O!"(B
   1.863 +$B%A%'%s%8%;%C%H!J$N%3%_%C%H%a%C%;!<%8!K$,%P%0$r;2>H$7$F$$$k:]$K!"(B
   1.864 +$B%P%0>pJs$r99?7$9$k<j=g$r<+F02=$9$kE@$K$"$j$^$9!#(B
   1.865 +$B%U%C%/$N@_Dj$rE,@Z$K9T$&$3$H$G!"(B
   1.866 +Bugzilla $B%P%0$+$i;2>H85%A%'%s%8%;%C%H$X$H!"(B
   1.867 +$B0lD>@~$KE~C#$9$k$3$H$,MF0W$K$J$j$^$9!#(B
   1.868 +
   1.869 +$B$3$N%U%C%/$N<BAu$rB-3]$j$K$7$F!"(B
   1.870 +$B$h$j9bEY$J(B Bugzilla $B$H$NE}9g$r?^$k$3$H$b2DG=$G$9!#(B
   1.871 +$BNc$($P(B:
   1.872 +
   1.873 +\begin{itemize}
   1.874 +\item $B%5!<%P$K(B push $B$5$l$kA4$F$N%A%'%s%8%;%C%H$K$O!"(B
   1.875 +  $B%3%_%C%H%a%C%;!<%8$KE,@Z$J%P%0(B~ID$B$,4^$^$l$F$$$k$3$H$rMW5a(B:
   1.876 +  $B$3$N>l9g!"(B\hook{pretxncommit} 
   1.877 +  $B%U%C%/$KEv3:>r7o$r8!>Z$9$k%U%C%/$r@_Dj$9$k$N$,NI$$$G$7$g$&!#(B
   1.878 +  $B%3%_%C%H%a%C%;!<%8$,%P%0(B~ID$B$r4^$^$J$$%A%'%s%8%;%C%H$O!"(B
   1.879 +  $B%U%C%/$K$h$C$F5qH]$5$l$k$h$&$K$J$j$^$9!#(B
   1.880 +
   1.881 +\item $B?75,$N%A%'%s%8%;%C%H$KBP$7$F!"(B
   1.882 +  $B4JC1$J%3%a%s%H$NIUM?$HF1MM$K!"(B
   1.883 +  $B%P%0$N(B\emph{$B>uBV(B}$B$N<+F0E*$JJQ99$r5v2D(B:
   1.884 +  $BNc$($P!"(B``fixed bug 31337'' $B$H$$$&%3%_%C%H%a%C%;!<%8$NJ8;zNs$r!"(B
   1.885 +  $B%P%0(B 31337 $B$N>uBV$N(B ``requires testing'' $B$X$N99?7!"(B
   1.886 +  $B$HG'<1$5$;$k!"$H$$$C$?3HD%$b9M$($i$l$^$9!#(B
   1.887 +
   1.888 +\end{itemize}
   1.889 +
   1.890 +\subsubsection{Configuring the \hook{bugzilla} hook}
   1.891 +\label{sec:hook:bugzilla:config}
   1.892 +
   1.893 +\hook{bugzilla} $B%U%C%/$O!"(B
   1.894 +$B%5!<%PB&$N(B  \hgrc\ $BCf$G(B \hook{incoming} $B%U%C%/$H$7$F@_Dj$7$J$1$l$P$J$j$^$;$s!#(B
   1.895 +
   1.896 +\begin{codesample2}
   1.897 +  [hooks]
   1.898 +  incoming.bugzilla = python:hgext.bugzilla.hook
   1.899 +\end{codesample2}
   1.900 +
   1.901 +$B5!G=FC2=$5$l$?%U%C%/$N@-<A$H!"(B
   1.902 +Bugzilla $B$,85!9$3$N<o$NE}9g$rG0F,$KCV$$$F$$$J$$$3$H$+$i!"(B
   1.903 +$B$3$N%U%C%/$N@_Dj$O2?$+$HJ#;($K$J$j$^$9!#(B
   1.904 +
   1.905 +$B%U%C%/$N@_Dj$K@hN)$C$F!"(B
   1.906 +$B%U%C%/$,<B9T$5$l$k%[%9%H!J72!K$KBP$7$F!"(B
   1.907 +MySQL $B$N(B Python $B%P%$%s%G%#%s%0$r%$%s%9%H!<%k$7$F$/$@$5$$!#(B
   1.908 +$BBP>]%[%9%H$K$*$$$F%P%$%J%j%Q%C%1!<%8$,8+Ev$?$i$J$$>l9g!"(B
   1.909 +\cite{web:mysql-python} $B$+$i%@%&%s%m!<%I$G$-$^$9!#(B
   1.910 +
   1.911 +$B%U%C%/$N@_Dj$O!"(B
   1.912 + \hgrc\ $B%U%!%$%k$N(B
   1.913 +\rcsection{bugzilla} $B%;%/%7%g%s$K5-=R$5$l$^$9!#(B
   1.914 +
   1.915 +\begin{description}
   1.916 +
   1.917 +\item[\rcitem{bugzilla}{version}] $B%5!<%P$K%$%s%9%H!<%k$5$l$F$$$k(B
   1.918 +  Bugzilla $B$N%P!<%8%g%s!#(B
   1.919 +  Bugzilla $B$N%G!<%?%Y!<%9%9%-!<%^$O;~@^JQ99$5$l$^$9$N$G!"(B
   1.920 +  $B$I$N%9%-!<%^$,;HMQ$5$l$F$$$k$N$+$r87L)$KCN$C$F$$$kI,MW$,$"$j$^$9!#(B
   1.921 +  $B:#$N$H$3$m!"%5%]!<%HBP>]$O(B \texttt{2.16} $B$N$_$G$9!#(B
   1.922 +
   1.923 +\item[\rcitem{bugzilla}{host}] Bugzilla $B$N%G!<%?$,3JG<$5$l$F$$$k(B
   1.924 +  MySQL $B%5!<%P$,2TF0$7$F$$$k%[%9%HL>!#(B
   1.925 +  MySQL $B%5!<%P$O!"(B\hook{bugzilla} $B%U%C%/$,<B9T$5$l$kA4$F$N%[%9%H$KBP$7$F!"(B
   1.926 +  $B@\B3$r5v2D$7$F$$$kI,MW$,$"$j$^$9!#(B
   1.927 +
   1.928 +\item[\rcitem{bugzilla}{user}] MySQL $B%5!<%P$X$N@\B3;~$K;HMQ$9$k%f!<%6L>!#(B
   1.929 +  MySQL $B%5!<%P$O!"(B\hook{bugzilla} $B%U%C%/$,<B9T$5$l$kA4$F$N%[%9%H$KBP$7$F!"(B
   1.930 +  $B$3$N%f!<%6L>$G$N@\B3$r5v2D$7$F$$$kI,MW$,$"$j$^$9!#(B
   1.931 +  $B$3$N%f!<%6$O!"(B
   1.932 +  Bugzilla $B$,;HMQ$9$k%F!<%V%k$KBP$7$FFI$_<h$j!&JQ99$NN>J}$N8"8B$,I,MW$G$9!#(B
   1.933 +  $B$3$N9`L\$N4{DjCM$O!"(B
   1.934 +  MySQL $B%5!<%P$K$*$1$k(B Bugzilla $B$NI8=`E*$J%f!<%6L>$G$"$k(B
   1.935 + \texttt{bugs} $B$G$9!#(B
   1.936 +
   1.937 +\item[\rcitem{bugzilla}{password}] $B>e5-%f!<%6$N(B 
   1.938 +  MySQL $B%5!<%P$K$*$1$k%Q%9%o!<%I!#(B
   1.939 +  $B$3$NCM$OJ?J8$G3JG<$5$l$k$?$a!"(B
   1.940 +  $B8"8B$r;}$?$J$$%f!<%6$,$3$N>pJs$N=q$+$l$?(B \hgrc 
   1.941 +  $B%U%!%$%k$rGA$/$3$H$,L5$$$h$&$K$7$J$1$l$P$J$j$^$;$s!#(B
   1.942 +
   1.943 +\item[\rcitem{bugzilla}{db}] MySQL $B%5!<%P$K$*$1$k(B
   1.944 +  Bugzilla $B%G!<%?%Y!<%9$NL>A0!#(B
   1.945 +  $B$3$N9`L\$N4{DjCM$O!"(B
   1.946 +  MySQL $B%5!<%P$K$*$1$k(B Bugzilla $B$NI8=`E*$J%G!<%?%Y!<%9L>$G$"$k(B
   1.947 + \texttt{bugs} $B$G$9!#(B
   1.948 +
   1.949 +\item[\rcitem{bugzilla}{notify}] $B%U%C%/$K$h$k%P%0$X$N%3%a%s%HIUM?;~$K!"(B
   1.950 +  Bugzilla $B$K$h$k9XFI<T$X$NEE;R%a!<%kDLCN$r<B;\$7$?$$>l9g!"(B
   1.951 +  $B%G!<%?%Y!<%9$r99?7$9$kKh$K%3%^%s%I$r<B9T$5$;$kI,MW$,$"$j$^$9!#(B
   1.952 +  $B<B9T$9$k%3%^%s%I$O(B Bugzilla $B$N%$%s%9%H!<%k>l=j$K0MB8$7$^$9$,!"(B
   1.953 +  \dirname{/var/www/html/bugzilla} $B$K%$%s%9%H!<%k$7$?$H$9$k$H!"(B
   1.954 +  $BDL>o$O0J2<$N$h$&$K$J$j$^$9!#(B
   1.955 +
   1.956 +  \begin{codesample4}
   1.957 +    cd /var/www/html/bugzilla && ./processmail %s nobody@nowhere.com
   1.958 +  \end{codesample4}
   1.959 +
   1.960 +  Bugzilla $B$N(B \texttt{processmail} $B%W%m%0%i%`$O!"(B
   1.961 +  $B%P%0(B~ID$B!J%U%C%/$K$h$j(B ``\texttt{\%s}'' $B$,(B $B%P%0(B~ID $B$KCV49$5$l$^$9!K$H!"(B
   1.962 +  $BEE;R%a!<%k%"%I%l%9$rI,MW$H$7$^$9!#(B
   1.963 +  $B$3$N%W%m%0%i%`$O!"(B
   1.964 +  $B<B9T;~%G%#%l%/%H%j$X$N%U%!%$%k=q$-=P$7$N8"8B$bI,MW$H$7$^$9!#(B
   1.965 +  Bugzilla $B$H%U%C%/$,F1$8%5!<%P>e$K%$%s%9%H!<%k$5$l$F$$$J$$>l9g!"(B
   1.966 +  Bugzilla $B$,%$%s%9%H!<%k$5$l$F$$$k%5!<%P>e$G(B 
   1.967 +  \texttt{processmail} $B$r5/F0$9$kJ}K!$r8+$D$1=P$9I,MW$,$"$j$^$9!#(B
   1.968 +
   1.969 +\end{description}
   1.970 +
   1.971 +\subsubsection{Mapping committer names to Bugzilla user names}
   1.972 +
   1.973 +$B4{Dj>uBV$N(B \hgext{bugzilla} $B%U%C%/$O!"(B
   1.974 +$B%A%'%s%8%;%C%H$r%3%_%C%H$7$?%f!<%6$NEE;R%a!<%k%"%I%l%9$r!"(B
   1.975 +$B%P%0$N99?7$r9T$&(B Bugzilla $B%f!<%6L>$H$7$F;HMQ$9$k$3$H$r;n$_$^$9!#(B
   1.976 +$B$3$N5sF0$,>u67$KB($5$J$$>l9g!"(B
   1.977 +\rcsection{usermap} $B%;%/%7%g%s$r;HMQ$7$F!"(B
   1.978 +$B%A%'%s%8%;%C%H$r%3%_%C%H$7$?%f!<%6$NEE;R%a!<%k%"%I%l%9$r(B
   1.979 +Bugzilla $B$N%f!<%6L>$KJQ49$9$k$3$H$,$G$-$^$9!#(B
   1.980 +
   1.981 +\rcsection{usermap} $B%;%/%7%g%s$N8D!9$NMWAG$O!"(B
   1.982 +$B:8JU$KEE;R%a!<%k%"%I%l%9!"(B
   1.983 +$B1&JU$K(B Bugzilla $B%f!<%6L>$rJ];}$7$^$9!#(B
   1.984 +
   1.985 +\begin{codesample2}
   1.986 +  [usermap]
   1.987 +  jane.user@example.com = jane
   1.988 +\end{codesample2}
   1.989 +
   1.990 +$BDL>o$N(B \hgrc $B%U%!%$%k$K(B
   1.991 +\rcsection{usermap} $B%G!<%?$rD>@\J];}$9$k$3$H$b$G$-$^$9$,!"(B
   1.992 +\hgext{bugzilla} $B%U%C%/$K30It$N(B 
   1.993 +\filename{usermap} $B%U%!%$%k$+$i>pJs$rFI$_9~$`$h$&$K;X<($9$k$3$H$b$G$-$^$9!#(B
   1.994 +$B8e<T$N>l9g!"Nc$($P(B \filename{usermap} $B%G!<%?$=$N$b$N$r!"(B
   1.995 +$BMxMQ<T$,2~JQ2DG=$J%j%]%8%H%j$K3JG<$9$k$3$H$b$G$-$^$9!#(B
   1.996 +$B$=$&$9$k$3$H$G!"(B
   1.997 +$BMxMQ<T<+?H$,(B
   1.998 +\rcitem{bugzilla}{usermap} $BCf$N3F<+$NMWAG$rJ]<i$9$k$3$H$,$G$-$^$9!#(B
   1.999 +$B$3$N>l9g$N(B \hgrc\ $B%U%!%$%k$O0J2<$N$h$&$K5-=R$5$l$^$9!#(B
  1.1000 +
  1.1001 +\begin{codesample2}
  1.1002 +  # $BDL>o$N(B hgrc $B%U%!%$%k$O(B usermap $B30It%U%!%$%k$r;2>H(B
  1.1003 +  [bugzilla]
  1.1004 +  usermap = /home/hg/repos/userdata/bugzilla-usermap.conf
  1.1005 +\end{codesample2}
  1.1006 +
  1.1007 +\filename{usermap} $B$,;2>H$9$k%U%!%$%k$NFbMF$O!"(B
  1.1008 +$B0J2<$N$h$&$K$J$j$^$9!#(B
  1.1009 +
  1.1010 +\begin{codesample2}
  1.1011 +  # bugzilla-usermap.conf $B$O(B hg $B%j%]%8%H%jFb$KG[CV(B
  1.1012 +  [usermap]
  1.1013 +  stephanie@example.com = steph
  1.1014 +\end{codesample2}
  1.1015 +
  1.1016 +\subsubsection{Configuring the text that gets added to a bug}
  1.1017 +
  1.1018 +Mercurial $B$N%F%s%W%l!<%H7A<0$G5-=R$9$k$3$H$G!"(B
  1.1019 +\hgext{bugzilla} $B%U%C%/$,DI2C$9$k%3%a%s%H$NFbMF$r@_Dj$9$k$3$H$,2DG=$G$9!#(B
  1.1020 +$B4v$D$+$N!J(B\rcsection{bugzilla} $B%;%/%7%g%s$K$*$1$k!K(B \hgrc\ $BMWAG$K$h$j!"(B
  1.1021 +$B!J%F%s%W%l!<%H$N!)!K?6$kIq$$$r@)8f$9$k$3$H$,$G$-$^$9!#(B
  1.1022 +
  1.1023 +\begin{description}
  1.1024 +\item[\texttt{strip}] URL $B$K$*$1$kItJ,%Q%9L>!J(Ba
  1.1025 +  partial path for a URL$B!K$r@8@.$9$k:]$K!"(B
  1.1026 +  $B%j%]%8%H%j$K$*$1$k%Q%9L>$+$i<h$j=|$/%Q%9MWAG$N?t$r;XDj$7$^$9!#(B
  1.1027 +  $BNc$($P!"%5!<%P$K$*$1$k%j%]%8%H%j72$,(B \dirname{/home/hg/repos} $BG[2<$K$"$j!"(B
  1.1028 +  \dirname{/home/hg/repos/app/tests} $B$N%j%]%8%H%j$rBP>]$H$9$k>l9g!"(B
  1.1029 +  \texttt{strip} $B$r(B \texttt{4} $B$H$9$k$3$H$G!"(B
  1.1030 +  \dirname{app/tests} $B$H$$$&ItJ,%Q%9$rF@$k$3$H$,$G$-$^$9!#(B
  1.1031 +  \hgext{bugzilla} $B%U%C%/$O$3$NItJ,%Q%9L>$r!"(B
  1.1032 +  $B%F%s%W%l!<%H$NE,MQ$N:]$K(B \texttt{webroot} $B$H$$$&L>A0$GMxMQ2DG=$K$7$^$9!#(B
  1.1033 +
  1.1034 +\item[\texttt{template}] $B;HMQ$9$k%F%s%W%l!<%H%F%-%9%H$r;XDj$7$^$9!#(B
  1.1035 +  $BDL>o$N%A%'%s%8%;%C%H4XO"$NCV49$K2C$($F!"(B
  1.1036 +  $B$3$N%F%s%W%l!<%H$G$O(B \texttt{hgweb}$B!J8e=RNc$K$"$k$h$&$K(B
  1.1037 +  \texttt{hgweb} $B9`L\$G@_Dj$7$^$9!K(B
  1.1038 +  $B$*$h$S(B \texttt{webroot}$B!JA0=R$N$h$&$K(B
  1.1039 +  \texttt{strip} $B$K$h$C$F@8@.$5$l$k%Q%9$G$9!K$,;HMQ$G$-$^$9!#(B
  1.1040 +
  1.1041 +\end{description}
  1.1042 +
  1.1043 +$B$3$l$i$K2C$($F!"(B
  1.1044 + \hgrc\ $B%U%!%$%k$N(B \rcsection{web} $B%;%/%7%g%s$K(B
  1.1045 +\rcitem{web}{baseurl} $B9`L\$rDI2C$9$k$3$H$,$G$-$^$9!#(B
  1.1046 +Bugzilla $B%3%a%s%H$+$i$N%A%'%s%8%;%C%H;2>H$K;HMQ$9$k%j%s%/$N(B
  1.1047 +URL $B$r9=C[$9$k:]$N4pDlJ8;zNs$H$7$F(B
  1.1048 +\hgext{bugzilla} $B%U%C%/$O%F%s%W%l!<%HE83+$N:]$K$3$NCM$r;HMQ$7$^$9!#(B
  1.1049 +$BNc$($P!'(B
  1.1050 +
  1.1051 +\begin{codesample2}
  1.1052 +  [web]
  1.1053 +  baseurl = http://hg.domain.com/
  1.1054 +\end{codesample2}
  1.1055 +
  1.1056 +\hgext{bugzilla} $B%U%C%/$N@_DjNc$r0J2<$K<($7$^$9(B\footnote{$BLuCm(B:
  1.1057 +$B86J8$N(B ``\\n'' $B$,@5$7$/5!G=$7$F$$$J$$$?$a!"(B
  1.1058 +$BNc<($N%l%$%"%&%H$,Mp$l$F$$$k(B}$B!#(B
  1.1059 +
  1.1060 +\begin{codesample2}
  1.1061 +  [bugzilla]
  1.1062 +  host = bugzilla.example.com
  1.1063 +  password = mypassword
  1.1064 +  version = 2.16
  1.1065 +  # $B%5!<%PB&%j%]%8%H%j$O(B /home/hg/repos $B$K$"$k$?$a!"(B
  1.1066 +  # $BKAF,$N(B 4 $B$D$N%;%Q%l!<%?(B\footnote{$BLuCm(B: $B%Q%96h@Z$j(B ``/''}$B$r=|30(B
  1.1067 +  strip = 4
  1.1068 +  hgweb = http://hg.example.com/
  1.1069 +  usermap = /home/hg/repos/notify/bugzilla.conf
  1.1070 +  template = Changeset \{node|short\}, made by \{author\} in the \{webroot\}
  1.1071 +    repo, refers to this bug.\\nFor complete details, see 
  1.1072 +    \{hgweb\}\{webroot\}?cmd=changeset;node=\{node|short\}\\nChangeset
  1.1073 +    description:\\n\\t\{desc|tabindent\}
  1.1074 +\end{codesample2}
  1.1075 +
  1.1076 +\subsubsection{Testing and troubleshooting}
  1.1077 +
  1.1078 +\hgext{bugzilla} $B%U%C%/@_Dj$K$*$$$F:G$bNI$/$"$kLdBj$O!"(B
  1.1079 +Bugzilla $B$N(B \filename{processmail} $B%9%/%j%W%H<B9T$K4X$9$k$b$N$H!"(B
  1.1080 +$B%3%_%C%H%f!<%6L>$+$i(B Bugzilla $B%f!<%6L>$X$NJQ49$K4X$9$k$b$N$G$9!#(B
  1.1081 +
  1.1082 +$B@h$N(B \ref{sec:hook:bugzilla:config}~$B@a$+$i$N@bL@$G=R$Y$?$h$&$K!"(B
  1.1083 +Mercurial $B%W%m%;%9$r%5!<%P$G<B9T$9$k%f!<%6$,!"(B
  1.1084 +\filename{processmail} $B%9%/%j%W%H$r<B9T$9$k%f!<%6$G$b$"$j$^$9!#(B
  1.1085 +\filename{processmail} $B%9%/%j%W%H$O(B
  1.1086 +Bugzilla $B$,@_Dj%G%#%l%/%H%jCf$N%U%!%$%k$K2?$i$+$N>pJs$r=q$-=P$97@5!$H$J$k$?$a!"(B
  1.1087 +$BDL>o(B Bugzilla $B$N@_Dj%U%!%$%k$O(B
  1.1088 +Bugzilla $B$,F0:n$9$k%&%'%V%5!<%P$N<B9T<T$N8"8B2<$K$"$j$^$9!#(B
  1.1089 +
  1.1090 +\filename{processmail} $B<B9T$N:]$K$O!"(B
  1.1091 +\command{sudo} $B%3%^%s%I$rMxMQ$9$k$J$I$7$FE,@Z$J%f!<%68"8B$G<B9T$7$^$7$g$&!#(B
  1.1092 +\filename{sudoers} $B%U%#%k$N@_DjNc$r0J2<$K<($7$^$9!#(B
  1.1093 +
  1.1094 +\begin{codesample2}
  1.1095 +  hg_user = (httpd_user) NOPASSWD: /var/www/html/bugzilla/processmail-wrapper %s
  1.1096 +\end{codesample2}
  1.1097 +
  1.1098 +$B$3$NNc$G$O!"(B\texttt{hg\_user} $B%f!<%6$O!"(B
  1.1099 +\filename{processmail-wrapper} $B%W%m%0%i%`$r(B
  1.1100 +\texttt{httpd\_user} $B%f!<%6$N8"8B2<$G<B9T$9$k$3$H$,$G$-$^$9!#(B
  1.1101 +
  1.1102 +\filename{processmail} $B%W%m%0%i%`$O(B
  1.1103 +Bugzilla $B$r%$%s%9%H!<%k$7$?%G%#%l%/%H%jD>2<$G$N<B9T$,I,MW$G$9$,!"(B
  1.1104 +\filename{sudoers} $B%U%!%$%k$K$O$=$N$h$&$J@)Ls$r5-=R$9$k$3$H$,$G$-$J$$$N$G!"(B
  1.1105 +$B$3$N$h$&$J4V@\<B9T$N$?$a$N%i%C%Q!<%9%/%j%W%H$,I,MW$H$J$j$^$9!#(B
  1.1106 +$B%i%C%Q!<%9%/%j%W%H$NFbMF$O0J2<$N$h$&$K4JC1$J$b$N$G$9!#(B
  1.1107 +
  1.1108 +\begin{codesample2}
  1.1109 +  #!/bin/sh
  1.1110 +  cd `dirname $0` && ./processmail "$1" nobody@example.com
  1.1111 +\end{codesample2}
  1.1112 +
  1.1113 +\filename{processmail} 
  1.1114 +$B$K;XDj$9$kEE;R%a!<%k%"%I%l%9$O!"(B
  1.1115 +$B$I$N$h$&$J$b$N$G$b9=$$$^$;$s!#(B
  1.1116 +
  1.1117 +\rcsection{usermap} $B$,@5$7$/@_Dj$5$l$F$$$J$$>l9g!"(B
  1.1118 +$B%A%'%s%8%;%C%H$r%5!<%P$K(B push $B$7$?:]$K(B
  1.1119 +\hgext{bugzilla} $B%U%C%/$K$h$j%(%i!<%a%C%;!<%8$,I=<($5$l$^$9!#(B
  1.1120 +$B%(%i!<%a%C%;!<%8$O0J2<$N$h$&$J$b$N$G$9!#(B
  1.1121 +
  1.1122 +\begin{codesample2}
  1.1123 +  cannot find bugzilla user id for john.q.public@example.com
  1.1124 +\end{codesample2}
  1.1125 +
  1.1126 +$B$3$N%a%C%;!<%8$O!"(B
  1.1127 +$B%3%_%C%H$7$?%f!<%6$NEE;R%a!<%k%"%I%l%9(B
  1.1128 +\texttt{john.q.public@example.com} 
  1.1129 +$B$,M-8z$J(B Bugzilla $B%f!<%6L>$G$O$J$$$+!"(B
  1.1130 +\texttt{john.q.public@example.com} 
  1.1131 +$B$rM-8z$J(B Bugzilla $B%f!<%6L>$KJQ49$9$k%(%s%H%j$,(B
  1.1132 +rcsection{usermap} $B$K5-=R$5$l$F$$$J$$$3$H$r0UL#$7$^$9!#(B
  1.1133 +
  1.1134 +\subsection{\hgext{notify}---send email notifications}
  1.1135 +
  1.1136 +Mercurial $B$NAH$_9~$_%&%'%V%5!<%P$K$h$j!"(B
  1.1137 +$BA4$F$N%j%]%8%H%j$KBP$7$F%A%'%s%8%;%C%H>pJs$N(B RSS $BG[?.5!G=$,Ds6!$5$l$^$9$,!"(B
  1.1138 +$BEE;R%a!<%k$K$h$kJQ99DLCN$,A*Br$5$l$k>l9g$,B?$$$G$9!#(B
  1.1139 +\hgext{notify} $B%U%C%/$O!"(B
  1.1140 +$B9XFI<T$,6=L#$r;}$D?7$?$J%A%'%s%8%;%C%H$4$H$K!"(B
  1.1141 +$BEE;R%a!<%k%"%I%l%9!J72!K$K08$F$FDLCN$r9T$$$^$9!#(B
  1.1142 +
  1.1143 +\hgext{notify} $B$O%F%s%W%l!<%H6nF07?$N%U%C%/$G$9$N$G!"(B
  1.1144 +\hgext{bugzilla} $B%U%C%/$HF1MM$K!"(B
  1.1145 +$BAw?.$5$l$kDLCN$NFbMF$r%+%9%?%^%$%:$9$k$3$H$,$G$-$^$9!#(B
  1.1146 +
  1.1147 +$B4{Dj>uBV$G$O(B
  1.1148 +\hgext{notify} $B%U%C%/$O%A%'%s%8%;%C%H$4$H$N:9J,>pJs$r<h$j9~$_$^$9$,!"(B
  1.1149 +$B:9J,>pJs$NNL$r@)8B$7$?$j!"(B
  1.1150 +$B$3$N5!G=$r40A4$KDd;_$9$k$3$H$b$G$-$^$9!#(B
  1.1151 +$B9XFI<T$K$h$kJQ99$NB(;~%l%S%e!<$rA[Dj$9$k>l9g!"(B
  1.1152 +$B;XDj$5$l$?(B URL $B$r%/%j%C%/$9$k$h$j$b!"(B
  1.1153 +$B:9J,>pJs$r<h$j9~$`$[$&$,M-MQ$G$9!#(B
  1.1154 +
  1.1155 +\subsubsection{Configuring the \hgext{notify} hook}
  1.1156 +
  1.1157 +\hgext{notify} $B%U%C%/$O!"(B
  1.1158 +$B?7$?$J%A%'%s%8%;%C%H$4$H$K#1DL$NEE;R%a!<%k$rAw?.$9$k$3$H$b$G$-$l$P!"(B
  1.1159 +$B!JC1FH$N(B \hgcmd{pull} $B$J$$$7(B \hgcmd{push} $B$K$h$j%j%]%8%H%j$KDI2C$5$l$k(B
  1.1160 +$B!K?7$?$J%A%'%s%8%;%C%H72$4$H$KAw?.$9$k$3$H$b$G$-$^$9!#(B
  1.1161 +
  1.1162 +\begin{codesample2}
  1.1163 +  [hooks]
  1.1164 +  # $B%A%'%s%8%;%C%H72$4$H$K#1DL$N%a!<%k$rAw?.(B
  1.1165 +  changegroup.notify = python:hgext.notify.hook
  1.1166 +  # $B%A%'%s%8%;%C%H$4$H$K#1DL$N%a!<%k$rAw?.(B
  1.1167 +  incoming.notify = python:hgext.notify.hook
  1.1168 +\end{codesample2}
  1.1169 +
  1.1170 +$B$3$N%U%C%/$N@_Dj>pJs$O!"(B
  1.1171 + \hgrc\ $B%U%!%$%k$N(B
  1.1172 +\rcsection{notify} $B%;%/%7%g%s$K5-=R$5$l$^$9!#(B
  1.1173 +
  1.1174 +\begin{description}
  1.1175 +\item[\rcitem{notify}{test}] $B4{Dj>uBV$G$O!"(B
  1.1176 +  $B$3$N%U%C%/$OA4$/%a!<%k$rAw?.$7$^$;$s!#(B
  1.1177 +  $B$=$NBX$o$j!"Aw?.$9$k(B\emph{$B$G$"$m$&(B}$B%a%C%;!<%8$rI=<($7$^$9!#(B
  1.1178 +  $B$3$N9`L\$r(B \texttt{false} $B$K$9$k$3$H$GEE;R%a!<%k$,Aw?.$5$l$k$h$&$K$J$j$^$9!#(B
  1.1179 +  $B4pDl>uBV$GEE;R%a!<%k$NAw?.$,Dd;_$5$l$F$$$k$N$O!"(B
  1.1180 +  $B$3$N3HD%!J!?%U%C%/!K$r$-$A$s$H@_Dj$9$k$N$K$O4vJ,$+$N;n9T:x8m$,I,MW$J$N$G!"(B
  1.1181 +  $B@_Dj;n9TCf$K(B``$B2u$l$?(B''$BDLCN$r9XFI<T$KAw?.$7$F$7$^$&$?$a$G$9!#(B
  1.1182 +
  1.1183 +\item[\rcitem{notify}{config}] $B9XFI>pJs$rJ];}$7$F$$$k@_Dj%U%!%$%k$X$N%Q%9!#(B
  1.1184 +  $B$3$N>pJs$O(B \hgrc\ $B$H$OJ,N%$5$l$F$$$k$N$G!"(B
  1.1185 +  $B$3$N%U%!%$%k$=$N$b$N$rBP>]%j%]%8%H%j$G4IM}$9$k$3$H$b2DG=$G$9!#(B
  1.1186 +  $B$3$&$9$k$3$H$G!"(B
  1.1187 +  $BBP>]%j%]%8%H%j$rJ#@=$7!"9XFI@_Dj$r99?7$7$?>e$G!"(B
  1.1188 +  $BJQ99$r%5!<%P$K(B \hgcmd{push} $B$GLa$9$3$H$,$G$-$^$9!#(B
  1.1189 +
  1.1190 +\item[\rcitem{notify}{strip}] $B%j%]%8%H%j$KBP$9$k9XFI<T$NM-L5$rH=Dj$9$k:]$K!"(B
  1.1191 +  $B%j%]%8%H%j$N%Q%9KAF,$+$i<h$j=|$/%Q%96h@Z$j$N?t(B\footnote{$BLuCm(B:
  1.1192 +  $B$3$3$G$O(B strip $BBP>]$r(B
  1.1193 +  ``leading path separator characters'' $B$HI=8=$7$F$$$k$,!"(B
  1.1194 +  \rcsection{bugzilla} $B$N@bL@$G$O(B
  1.1195 +  ``leading path elements'' $B$HI=8=$7$F$$$k!#(B
  1.1196 +  $BE}0lE*$JI=8=$,I,MW$H;W$o$l$k!#(B}$B!#(B
  1.1197 +  $BNc$($P!"(B
  1.1198 +  $B%5!<%P>e$N%j%]%8%H%j$,(B \dirname{/home/hg/repos} $BG[2<$K$"$j!"(B
  1.1199 +  \hgext{notify} $B$,(B
  1.1200 +  \dirname{/home/hg/repos/shared/test} $B$H$$$&%j%]%8%H%j$rG'<1$7$F$$$k>l9g!"(B
  1.1201 +  \rcitem{notify}{strip} $B$r(B \texttt{4} $B$K@_Dj$9$k$3$H$G(B
  1.1202 +  \hgext{notify} $B$K$h$k9XFI<T$H$N%Q%?!<%s%^%C%A%s%0$O!"(B
  1.1203 +  $B%Q%9$r(B \dirname{shared/test} $B$HG'<1$7$?>e$G9T$o$l$^$9!#(B
  1.1204 +
  1.1205 +\item[\rcitem{notify}{template}] 
  1.1206 +  $B%a%C%;!<%8Aw?.$N:]$K;HMQ$5$l$k%F%s%W%l!<%H%F%-%9%H!#(B
  1.1207 +  $B$3$N%F%s%W%l!<%H$O!"%a%C%;!<%8$N%X%C%@$H%\%G%#$NN>J}$NFbMF$r;XDj$7$^$9!#(B
  1.1208 +
  1.1209 +\item[\rcitem{notify}{maxdiff}] 
  1.1210 +  $B%a%C%;!<%8KvHx$KIUM?$5$l$k:9J,%G!<%?$N:GBg9T?t!#(B
  1.1211 +  $B$3$N9T?t$h$j$bBg$-$$>l9g!":9J,%G!<%?$O@Z$j5M$a$i$l$^$9!#(B
  1.1212 +  $B$3$NCM$N4{DjCM$O(B 300 $B$K@_Dj$5$l$F$$$^$9!#(B
  1.1213 +  $B$3$NCM$r(B \texttt{0} $B$K$7$?>l9g!"(B
  1.1214 +  $BDLCN$NEE;R%a!<%k$K:9J,%G!<%?$OIUM?$5$l$^$;$s!#(B
  1.1215 +
  1.1216 +\item[\rcitem{notify}{sources}] $BG[N8$9$Y$-%A%'%s%8%;%C%H$NM3Mh85$N0lMw!#(B
  1.1217 +  $B$3$N@_Dj$K$h$jNc$($P!"(B
  1.1218 +  $B1s3V%f!<%6$,%5!<%P$r7PM3$7$FEv3:%j%]%8%H%j$X(B
  1.1219 +  \hgcmd{push} $B$7$?%A%'%s%8%;%C%H$KBP$7$F$N$_(B
  1.1220 +  \hgext{notify} $B$,EE;R%a!<%k$GDLCN$9$k!"(B
  1.1221 +  $B$H$$$C$?@_Dj$r$9$k$3$H$,$G$-$^$9!#(B
  1.1222 +  $B$3$3$G5-=R2DG=$JM3Mh85$N0lMw$O!"(B\ref{sec:hook:sources}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1223 +
  1.1224 +\end{description}
  1.1225 +
  1.1226 +\rcsection{web} $B%;%/%7%g%s$G(B
  1.1227 +\rcitem{web}{baseurl} $B9`L\$r@_Dj$7$F$$$k>l9g!"(B
  1.1228 +$B%F%s%W%l!<%HCf$G(B \texttt{webroot} $B$H$7$F;HMQ$9$k$3$H$,$G$-$^$9!#(B
  1.1229 +
  1.1230 +\hgext{notify} $B@_Dj>pJs$N0l<0$r0J2<$K<($7$^$9!#(B
  1.1231 +
  1.1232 +\begin{codesample2}
  1.1233 +  [notify]
  1.1234 +  # $B<B:]$KEE;R%a!<%k$rAw$k$+H]$+(B
  1.1235 +  test = false
  1.1236 +  # $BDLCN$r9T$&%j%]%8%H%j<+?H$NCf$KCV$+$l$F$$$k9XFI<T>pJs(B
  1.1237 +  config = /home/hg/repos/notify/notify.conf
  1.1238 +  # $B%j%]%8%H%j$,(B /home/hg/repos $BG[2<$K$"$k$N$G(B "/" $BJ8;z$r(B4$B$D=|5n(B
  1.1239 +  strip = 4
  1.1240 +  template = X-Hg-Repo: \{webroot\}\\n\\\\
  1.1241 +    Subject: \{webroot\}: \{desc|firstline|strip\}\\n\\\\
  1.1242 +    From: \{author\}\\n\\\\
  1.1243 +    \\n\\\\
  1.1244 +    changeset \{node|short\} in \{root\}\\n\\\\
  1.1245 +    details: \{baseurl\}\{webroot\}?cmd=changeset;node=\{node|short\}\\n\\\\
  1.1246 +    description:\\n\\\\
  1.1247 +    \\t\{desc|tabindent|strip\}
  1.1248 +
  1.1249 +  [web]
  1.1250 +  baseurl = http://hg.example.com/
  1.1251 +\end{codesample2}
  1.1252 +
  1.1253 +$B$3$N@_Dj$K$h$j!"(B
  1.1254 +$B0J2<$N$h$&$J%a%C%;!<%8$,@8@.$5$l$^$9!#(B
  1.1255 +
  1.1256 +\begin{codesample2}
  1.1257 +  X-Hg-Repo: tests/slave
  1.1258 +  Subject: tests/slave: Handle error case when slave has no buffers
  1.1259 +  Date: Wed,  2 Aug 2006 15:25:46 -0700 (PDT)
  1.1260 +
  1.1261 +  changeset 3cba9bfe74b5 in /home/hg/repos/tests/slave
  1.1262 +  details: http://hg.example.com/tests/slave?cmd=changeset;node=3cba9bfe74b5
  1.1263 +  description:
  1.1264 +          Handle error case when slave has no buffers
  1.1265 +  diffs (54 lines):
  1.1266 +
  1.1267 +  diff -r 9d95df7cf2ad -r 3cba9bfe74b5 include/tests.h
  1.1268 +  --- a/include/tests.h      Wed Aug 02 15:19:52 2006 -0700
  1.1269 +  +++ b/include/tests.h      Wed Aug 02 15:25:26 2006 -0700
  1.1270 +  @@ -212,6 +212,15 @@ static __inline__ void test_headers(void *h)
  1.1271 +  [...snip...]
  1.1272 +\end{codesample2}
  1.1273 +
  1.1274 +\subsubsection{Testing and troubleshooting}
  1.1275 +
  1.1276 +$B4{DjCM$N$^$^$G$O(B \hgext{notify} $B3HD%$O(B
  1.1277 +\emph{$B0l@Z$N%a!<%k$rAw?.$7$^$;$s(B}$B$N$G!"(B
  1.1278 +\rcitem{notify}{test} $B9`L\$rL@<(E*$K(B
  1.1279 +\texttt{false} $B$G@_Dj$9$k$3$H$rK:$l$J$$$G$/$@$5$$!#(B
  1.1280 +$B$3$N@_Dj$r9T$&$^$G$O!"(B
  1.1281 +\hgext{notify} $B3HD%$OAw?.$9$k(B\emph{$B$G$"$m$&(B}$B%a%C%;!<%8$rI=<($7$^$9!#(B
  1.1282 +
  1.1283 +\section{Information for writers of hooks}
  1.1284 +\label{sec:hook:ref}
  1.1285 +
  1.1286 +\subsection{In-process hook execution}
  1.1287 +
  1.1288 +$B%W%m%;%9Fb%U%C%/$O!"0J2<$N0z?t7A<0$G5/F0$5$l$^$9!#(B
  1.1289 +
  1.1290 +\begin{codesample2}
  1.1291 +  def myhook(ui, repo, **kwargs):
  1.1292 +      pass
  1.1293 +\end{codesample2}
  1.1294 +
  1.1295 +\texttt{ui} $B0z?t$O(B
  1.1296 +\pymodclass{mercurial.ui}{ui} $B%*%V%8%'%/%H!"(B
  1.1297 +\texttt{repo} $B0z?t$O(B
  1.1298 +\pymodclass{mercurial.localrepo}{localrepository} $B%*%V%8%'%/%H$G$9!#(B
  1.1299 +\texttt{**kwargs} $B%Q%i%a!<%?$N;}$DL>A0$HCM$O!"(B
  1.1300 +$B5/F0$5$l$k%U%C%/$N<oN`$K0MB8$7!"(B
  1.1301 +$B0J2<$N6&DL$NFCD'$r;}$C$F$$$^$9!#(B
  1.1302 +
  1.1303 +\begin{itemize}
  1.1304 +\item \texttt{node} $B$J$$$7(B \texttt{parent\emph{N}} $B$H$$$&L>A0$N0z?t$O!"(B
  1.1305 +  16$B?J?t$N%A%'%s%8%;%C%H(BID$B$rJ];}$7$F$$$^$9!#(B
  1.1306 +  $B6u$NJ8;zNs$O!"(B
  1.1307 +  0 $BB3$-$NJ8;zNs$NBe$o$j$K(B ``null $B%A%'%s%8%;%C%H(BID'' $B$r0UL#$7$^$9!#(B
  1.1308 +
  1.1309 +\item \texttt{url} $B$H$$$&L>A0$N0z?t$O!"(B
  1.1310 +  $B$=$l$,FCDj2DG=$G$"$l$P!"1s3V%j%]%8%H%j$N(B URL $B$rI=$7$^$9!#(B
  1.1311 +
  1.1312 +\item $B??56CM0z?t$O!"(BPython $B$N(B \texttt{bool} $B%*%V%8%'%/%H$GI=$5$l$^$9!#(B
  1.1313 +
  1.1314 +\end{itemize}
  1.1315 +
  1.1316 +$B%W%m%;%9Fb%U%C%/$O!"(B
  1.1317 +$B!J30It%U%C%/$,%j%]%8%H%jD>2<$G<B9T$5$l$k$N$H0c$$!K(B
  1.1318 +$B%W%m%;%9$N:n6H%G%#%l%/%H%j$rJQ99$;$:$K5/F0$5$l$^$9!#(B
  1.1319 +$B%W%m%;%9$N:n6H%G%#%l%/%H%j$r0\F0$5$;$k$H!"(B
  1.1320 +Mercurial API $B$N8F$S=P$7$,<:GT$9$kMW0x$H@.$j$($^$9$N$G!"(B
  1.1321 +$B%W%m%;%9Fb%U%C%/$O:n6H%G%#%l%/%H%j$rJQ99$7$F$O$$$1$^$;$s!#(B
  1.1322 +
  1.1323 +$B!J%W%m%;%9Fb!K%U%C%/$,??56CM(B ``false'' $B$rJV5Q$7$?>l9g!"(B
  1.1324 +$B%U%C%/8F$S=P$7$O@.8y$7$?$b$N$H$_$J$5$l$^$9!#(B
  1.1325 +$B??56CM(B ``true'' $B$,JV5Q$5$l$k$+!"(B
  1.1326 +$BNc30$,IbMH$5$l$?>l9g!"(B
  1.1327 +$B%U%C%/8F$S=P$7$O<:GT$7$?$b$N$H$_$J$5$l$^$9!#(B
  1.1328 +$B5/F0$N47=,$rM}2r$9$k$K$O!"(B
  1.1329 +``$B<:GT$7$?$+H]$+$rDLCN$9$k(B''$B$H3P$($k$N$,NI$$$G$7$g$&!#(B
  1.1330 +
  1.1331 +$B%A%'%s%8%;%C%H(BID$B$O!"(B
  1.1332 +Mercurial API $B$,>oMQ$7$F$$$k%P%$%J%j%O%C%7%e7A<0$G$O$J$/!"(B
  1.1333 +Python $B%U%C%/$K(B16$B?JJ8;zNs$N7A<0$GEO$5$l$kE@$KCm0U$7$F$/$@$5$$!#(B
  1.1334 +16$B?J%O%C%7%eCM$r%P%$%J%j%O%C%7%eCM7A<0$KJQ49$9$k$K$O!"(B
  1.1335 +\pymodfunc{mercurial.node}{bin} $B4X?t$r;HMQ$7$F$/$@$5$$!#(B
  1.1336 +
  1.1337 +\subsection{External hook execution}
  1.1338 +
  1.1339 +$B%W%m%;%930%U%C%/!J$N5/F0J8;zNs!K$O!"(B
  1.1340 +Mercurial $B$r<B9T$7$F$$$k%7%'%k$KEO$5$l$^$9!#(B
  1.1341 +$B$=$N$?$a!"(B
  1.1342 +$BJQ?tCV49$d%3%^%s%I=PNO$N%j%@%$%l%/%H$H$$$C$?!"(B
  1.1343 +$B%7%'%k$N5!G=$,MxMQ2DG=$G$9!#(B
  1.1344 +$B%W%m%;%930%U%C%/$O!"(B
  1.1345 +$B!J%W%m%;%9Fb%U%C%/$,(B Mercurial $B$,5/F0$5$l$?%G%#%l%/%H%j$G<B9T$5$l$k$N$H0c$$!K(B
  1.1346 +$B%j%]%8%H%j%k!<%HD>2<$G<B9T$5$l$^$9!#(B
  1.1347 +
  1.1348 +$B%U%C%/0z?t$O!"4D6-JQ?t$r7PM3$7$FEO$5$l$^$9!#(B
  1.1349 +$B8D!9$N4D6-JQ?t$NL>A0$O!"(B
  1.1350 +$BBgJ8;z$G3n$D(B ``\texttt{HG\_}'' $B@\F,<-$,IUM?$5$l$?7A<0$KJQ49$5$l$^$9!#(B
  1.1351 +$BNc$($P!"(B
  1.1352 +$B0z?tL>$,(B ``\texttt{node}'' $B$N>l9g!"(B
  1.1353 +$BEv3:0z?t$rI=$94D6-JQ?t$NL>A0$O(B ``\texttt{HG\_NODE}'' $B$H$J$j$^$9!#(B
  1.1354 +
  1.1355 +$B??56CM0z?t$O!"(B
  1.1356 +``true'' $B$,J8;zNs(B ``\texttt{1}'' $B$G!"(B
  1.1357 +``false'' $B$,J8;zNs(B ``\texttt{0}'' $B$GI=$5$l$^$9!#(B
  1.1358 +$B4D6-JQ?t(B
  1.1359 +\envar{HG\_NODE}$B!"(B\envar{HG\_PARENT1} $B$J$$$7(B \envar{HG\_PARENT2} $B$O!"(B
  1.1360 +$B%A%'%s%8%;%C%H(BID$B$r(B16$B?JJ8;zNs$GJ];}$7$^$9!#(B
  1.1361 +``$B6u$N%A%'%s%8%;%C%H(BID''$B$O!"(B
  1.1362 +``0'' $B$NO"B3$G$O$J$/6u$NJ8;zNs$H$7$FI=8=$5$l$^$9!#(B
  1.1363 +$B4D6-JQ?t(B \envar{HG\_URL} $B$O!"(B
  1.1364 +$B$=$l$,FCDj2DG=$J>l9g$K8B$j!"1s3V%j%]%8%H%j$N(B URL $B$rJ];}$7$^$9!#(B
  1.1365 +
  1.1366 +$B%W%m%;%930%U%C%/$,=*N;%3!<%I(B0$B$G=*N;$7$?>l9g!"(B
  1.1367 +$B%U%C%/$N<B9T$O@.8y$7$?$b$N$H$_$J$5$l$^$9!#(B
  1.1368 +$B=*N;%3!<%I$,(B0$B0J30$N>l9g!"(B
  1.1369 +$B%U%C%/$N<B9T$O<:GT$7$?$b$N$H$_$J$5$l$^$9!#(B
  1.1370 +
  1.1371 +\subsection{Finding out where changesets come from}
  1.1372 +
  1.1373 +$B%m!<%+%k%j%]%8%H%j$HB>$N%j%]%8%H%j$N4V$N%A%'%s%8%;%C%H$NE>Aw$K4X$o$k%U%C%/$O!"(B
  1.1374 +``$B8~$3$&B&(B''$B$N>pJs$rCN$k$3$H$,$G$-$k>l9g$,$"$j$^$9!#(B
  1.1375 +Mercurial $B$O!"(B
  1.1376 +$B%A%'%s%8%;%C%H$,(B\emph{$B$I$N$h$&$K$7$F(B}$BE>Aw$5$l$?$N$+$H!"(B
  1.1377 +$BB?$/$N>l9g!"(B
  1.1378 +\emph{$B$I$N%j%]%8%H%j(B}$B$H$N4V$G%A%'%s%8%;%C%H$,E>Aw$5$l$k$N$+$bCN$C$F$$$^$9!#(B
  1.1379 +
  1.1380 +\subsubsection{Sources of changesets}
  1.1381 +\label{sec:hook:sources}
  1.1382 +
  1.1383 +Mercurial $B$O%j%]%8%H%j4V$G%A%'%s%8%;%C%H$rE>Aw$9$k0U?^$r!"(B
  1.1384 +$B%U%C%/$KBP$7$F;vA0!J$J$$$7;v8e$K!KDLCN$7$^$9!#(B
  1.1385 +$B$3$N>pJs$O!"(B
  1.1386 +Python $B$K$h$k%W%m%;%9Fb%U%C%/$N>l9g$O(B \texttt{source} $B$H$$$&L>A0$N0z?t$G!"(B
  1.1387 +$B30It%U%C%/$N>l9g$O(B \envar{HG\_SOURCE} $B$H$$$&L>A0$N4D6-JQ?t$G!"(B
  1.1388 +Mercurial $B$+$i%U%C%/$KEO$5$l$^$9!#(B
  1.1389 +
  1.1390 +\begin{description}
  1.1391 +\item[\texttt{serve}] $B1s3V%j%]%8%H%j$H$N4V$r!"(B
  1.1392 +  http $B$J$$$7(B ssh $B7PM3$G%A%'%s%8%;%C%H$,E>Aw$5$l$^$9!#(B
  1.1393 +
  1.1394 +\item[\texttt{pull}] $B$"$k%j%]%8%H%j$+$iB>$N%j%]%8%H%j$X!"(B
  1.1395 +  \hgcmd{pull} $B$K$h$j%A%'%s%8%;%C%H$,E>Aw$5$l$^$9!#(B
  1.1396 +
  1.1397 +\item[\texttt{push}] $B$"$k%j%]%8%H%j$+$iB>$N%j%]%8%H%j$X!"(B
  1.1398 +  \hgcmd{push} $B$K$h$j%A%'%s%8%;%C%H$,E>Aw$5$l$^$9!#(B
  1.1399 +
  1.1400 +\item[\texttt{bundle}] $B$"$k%j%]%8%H%j$+$iB>$N%j%]%8%H%j$X!"(B
  1.1401 +  \hgcmd{bundle} $B$K$h$j%A%'%s%8%;%C%H$,E>Aw$5$l$^$9!#(B
  1.1402 +
  1.1403 +\end{description}
  1.1404 +
  1.1405 +\subsubsection{Where changes are going---remote repository URLs}
  1.1406 +\label{sec:hook:url}
  1.1407 +
  1.1408 +Mercurial $B$O!"(B
  1.1409 +$B%j%]%8%H%j4V$G$N%A%'%s%8%;%C%HE>Aw=hM}$K$*$1$k(B``$B8~$3$&B&(B''$B$N0LCV$r!"(B
  1.1410 +$B2DG=$G$"$l$P%U%C%/$KCN$i$;$^$9!#(B
  1.1411 +$B$3$N>pJs$O!"(B
  1.1412 +Python $B$K$h$k%W%m%;%9Fb%U%C%/$N>l9g$O(B \texttt{url} $B$H$$$&L>A0$N0z?t$G!"(B
  1.1413 +$B30It%U%C%/$N>l9g$O(B \envar{HG\_URL} $B$H$$$&L>A0$N4D6-JQ?t$G!"(B
  1.1414 +Mercurial $B$+$i%U%C%/$KEO$5$l$^$9!#(B
  1.1415 +
  1.1416 +$B$3$N>pJs$O>o$K$o$+$k$H$$$&$o$1$G$O$"$j$^$;$s!#(B
  1.1417 +http $B$J$$$7(B ssh 
  1.1418 +$B7PM3$G%5!<%S%9$rDs6!$7$F$$$k%j%]%8%H%j$K$*$$$F%U%C%/$,5/F0$5$l$?>l9g!"(B
  1.1419 +Mercurial $B$O1s3V%j%]%8%H%j$rFCDj$9$k$3$H$O$G$-$^$;$s$,!"(B
  1.1420 +$B%/%i%$%"%s%H$,$I$N%"%I%l%9$+$i@\B3$7$F$$$k$N$+$OFCDj$9$k$3$H$,$G$-$^$9!#(B
  1.1421 +$B$3$N$h$&$J>l9g!"(BURL $B$O0J2<$N$$$:$l$+$N7A<0$K$J$j$^$9!#(B
  1.1422 +
  1.1423 +\begin{itemize}
  1.1424 +\item \texttt{remote:ssh:\emph{ip-address}}---$BM?$($i$l$?(B IP $B%"%I%l%9$+$i$N(B
  1.1425 +  ssh $B1s3V@\B3!#(B
  1.1426 +
  1.1427 +\item \texttt{remote:http:\emph{ip-address}}---$BM?$($i$l$?(B IP $B%"%I%l%9$+$i$N(B
  1.1428 +  http $B1s3V@\B3!#(B
  1.1429 +  $B%/%i%$%"%s%H$,(B SSL $B$r;HMQ$7$?>l9g!"(B
  1.1430 +  \texttt{remote:https:\emph{ip-address}} $B7A<0$K$J$j$^$9!#(B
  1.1431 +
  1.1432 +\item Empty---$B1s3V@\B3$K4X$9$k>pJs$r<hF@$G$-$J$+$C$?>l9g!#(B
  1.1433 +
  1.1434 +\end{itemize}
  1.1435 +
  1.1436 +\section{Hook reference}
  1.1437 +
  1.1438 +\subsection{\hook{changegroup}---after remote changesets added}
  1.1439 +\label{sec:hook:changegroup}
  1.1440 +
  1.1441 +$B$3$N%U%C%/$O!"(B
  1.1442 +$BNc$($P(B \hgcmd{pull} $B$J$$$7(B \hgcmd{unbundle} $B$K$h$C$F!"(B
  1.1443 +$B$"$i$+$8$aB8:_$7$F$$$k%A%'%s%8%;%C%H$N0l72$,!"(B
  1.1444 +$B%j%]%8%H%j$KDI2C$5$l$?8e$K<B9T$5$l$^$9!#(B
  1.1445 +$B$3$l$i$NA`:n$OG$0U8D$N%A%'%s%8%;%C%H$rDI2C$G$-$^$9$,!"(B
  1.1446 +$B$3$N%U%C%/$O3FA`:nKh$K#12s$E$D<B9T$5$l$^$9!#(B
  1.1447 +$B$3$N$3$H$O!"(B
  1.1448 +$B%A%'%s%8%;%C%H$,$^$H$^$C$FDI2C$5$l$k$+H]$+$K4X$o$i$:!"(B
  1.1449 +\hook{incoming} $B%U%C%/$N<B9T$,%A%'%s%8%;%C%HKh$K<B9T$5$l$k$N$HBP>HE*$G$9!#(B
  1.1450 +
  1.1451 +$BDI2C$5$l$?%A%'%s%8%;%C%H$KBP$9$k<+F02=$5$l$?%S%k%I!&%F%9%H$N3+;O7@5!$H$7$?$j!"(B
  1.1452 +$B%P%0%G!<%?%Y!<%9$N99?7!"(B
  1.1453 +$B%j%]%8%H%j$,?7$?$J%A%'%s%8%;%C%H$r<h$j9~$s$@$3$H$N9XFI<T$X$NDLCN!"(B
  1.1454 +$B$H$$$C$?$b$N$,!"(B
  1.1455 +$B$3$N%U%C%/$KA[Dj$5$l$kMQES$N0lIt$G$9!#(B
  1.1456 +
  1.1457 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1458 +
  1.1459 +\begin{description}
  1.1460 +\item[\texttt{node}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1461 +  $BDI2C$5$l$k0l72$NCf$N:G=i$N%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1462 +  $B$3$N%A%'%s%8%;%C%H$+$i(B
  1.1463 +  \index{tags!\texttt{tip}}\texttt{tip} 
  1.1464 +  $B$^$G!J(B\texttt{tip} $B<+?H$b4^$`!K$NA4$F$N%A%'%s%8%;%C%H$,!"(B
  1.1465 +  $BC1FH$N(B \hgcmd{pull}$B!"(B\hgcmd{push} $B$J$$$7(B \hgcmd{unbundle}
  1.1466 +  $BA`:n$K$h$jDI2C$5$l$?$3$H$K$J$j$^$9!#(B
  1.1467 +
  1.1468 +\item[\texttt{source}] $BJ8;zNs!#(B
  1.1469 +  $B%A%'%s%8%;%C%H$NM3Mh85$rI=$7$^$9!#(B
  1.1470 +  $B>\:Y$O(B\ref{sec:hook:sources}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1471 +
  1.1472 +\item[\texttt{url}] URL$B!#(B
  1.1473 +  $BFCDj$G$-$k>l9g$K8B$j!"1s3V%j%]%8%H%j$N>l=j$rI=$7$^$9!#(B
  1.1474 +  $B>\:Y$O(B\ref{sec:hook:url}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1475 +
  1.1476 +\end{description}
  1.1477 +
  1.1478 +$BMWJLES;2>H(B:
  1.1479 +\hook{incoming} $B!J(B\ref{sec:hook:incoming}~$B@a!K!"(B
  1.1480 +\hook{prechangegroup} $B!J(B\ref{sec:hook:prechangegroup}~$B@a!K!"(B
  1.1481 +\hook{pretxnchangegroup} $B!J(B\ref{sec:hook:pretxnchangegroup}~$B@a!K(B
  1.1482 +
  1.1483 +\subsection{\hook{commit}---after a new changeset is created}
  1.1484 +\label{sec:hook:commit}
  1.1485 +
  1.1486 +$B$3$N%U%C%/$O!"?7$7$$%A%'%s%8%;%C%H$,:n@.$5$l$?8e$G<B9T$5$l$^$9!#(B
  1.1487 +
  1.1488 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1489 +
  1.1490 +\begin{description}
  1.1491 +\item[\texttt{node}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1492 +  $B?7$7$/%3%_%C%H$5$l$?%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1493 +
  1.1494 +\item[\texttt{parent1}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1495 +  $B?7$7$/%3%_%C%H$5$l$?%A%'%s%8%;%C%H$K$H$C$F!"(B
  1.1496 +  $BBh#1?F$H$J$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1497 +
  1.1498 +\item[\texttt{parent2}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1499 +  $B?7$7$/%3%_%C%H$5$l$?%A%'%s%8%;%C%H$K$H$C$F!"(B
  1.1500 +  $BBh#2?F$H$J$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1501 +
  1.1502 +\end{description}
  1.1503 +
  1.1504 +$BMWJLES;2>H(B: \hook{precommit} $B!J(B\ref{sec:hook:precommit}~$B@a!K!"(B
  1.1505 +\hook{pretxncommit} $B!J(B\ref{sec:hook:pretxncommit}~$B@a!K(B
  1.1506 +
  1.1507 +\subsection{\hook{incoming}---after one remote changeset is added}
  1.1508 +\label{sec:hook:incoming}
  1.1509 +
  1.1510 +$B$3$N%U%C%/$O!"(B
  1.1511 +$BNc$($P(B \hgcmd{push} $B$K$h$C$F!"(B
  1.1512 +$B$"$i$+$8$aB8:_$7$F$$$k%A%'%s%8%;%C%H$,!"(B
  1.1513 +$B%j%]%8%H%j$KDI2C$5$l$?8e$K<B9T$5$l$^$9!#(B
  1.1514 +$BJ#?t$N%A%'%s%8%;%C%H$,C10l$NA`:n$GDI2C$5$l$?>l9g$G$b!"(B
  1.1515 +$B$3$N%U%C%/$ODI2C$5$l$?8D!9$N%A%'%s%8%;%C%HKh$K<B9T$5$l$^$9!#(B
  1.1516 +
  1.1517 +$B$3$N%U%C%/$r(B \hook{changegroup} $B%U%C%/!J(B\ref{sec:hook:changegroup}~$B@a;2>H!K(B
  1.1518 +$B$HF1MM$NL\E*$K;HMQ$9$k$3$H$,$G$-$^$9!#(B
  1.1519 +$B0l72$N%A%'%s%8%;%C%HKh$N%U%C%/5/F0$NJ}$,JXMx$J>l9g$b$"$j$^$9$,!"(B
  1.1520 +$B;~$K$O%A%'%s%8%;%C%H$4$H$N%U%C%/5/F0$bJXMx$G$9!#(B
  1.1521 +
  1.1522 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1523 +
  1.1524 +\begin{description}
  1.1525 +\item[\texttt{node}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1526 +  $B?7$7$/DI2C$5$l$?%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1527 +
  1.1528 +\item[\texttt{source}] $BJ8;zNs!#(B
  1.1529 +  $B%A%'%s%8%;%C%H$NM3Mh85$rI=$7$^$9!#(B
  1.1530 +  $B>\:Y$O(B\ref{sec:hook:sources}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1531 +
  1.1532 +\item[\texttt{url}] URL$B!#(B
  1.1533 +  $BFCDj$G$-$k>l9g$K8B$j!"1s3V%j%]%8%H%j$N>l=j$rI=$7$^$9!#(B
  1.1534 +  $B>\:Y$O(B\ref{sec:hook:url}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1535 +
  1.1536 +\end{description}
  1.1537 +
  1.1538 +$BMWJLES;2>H(B: 
  1.1539 +\hook{changegroup} $B!J(B\ref{sec:hook:changegroup}~$B@a!K!"(B
  1.1540 +\hook{prechangegroup} $B!J(B\ref{sec:hook:prechangegroup}~$B@a!K!"(B
  1.1541 +\hook{pretxnchangegroup} $B!J(B\ref{sec:hook:pretxnchangegroup}~$B@a!K(B
  1.1542 +
  1.1543 +\subsection{\hook{outgoing}---after changesets are propagated}
  1.1544 +\label{sec:hook:outgoing}
  1.1545 +
  1.1546 +$B$3$N%U%C%/$O!"(B
  1.1547 +$BNc$($P(B \hgcmd{push} $B$J$$$7(B \hgcmd{bundle} $B$K$h$C$F!"(B
  1.1548 +$BB>$N%j%]%8%H%j$X$H%A%'%s%8%;%C%H$N0l72$,EAGE$7$?8e$K<B9T$5$l$^$9!#(B
  1.1549 +
  1.1550 +$B%A%'%s%8%;%C%H$,30It$KEAGE$7$?$3$H$N4IM}<T$X$NDLCN$J$I$O!"(B
  1.1551 +$B$3$N%U%C%/$KA[Dj$5$l$kMQES$N#1$D$G$9!#(B
  1.1552 +
  1.1553 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1554 +
  1.1555 +\begin{description}
  1.1556 +\item[\texttt{node}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1557 +  $BB>$N%j%]%8%H%j$X$HEAGE$9$k0l72$NCf$N:G=i$N%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1558 +
  1.1559 +\item[\texttt{source}] $BJ8;zNs!#(B
  1.1560 +  $BEAGEA`:n$NH/9TM3Mh$rI=$7$^$9!J(B\ref{sec:hook:sources}~$B@a$r;2>H$7$F$/$@$5$$!K!#(B
  1.1561 +  $B1s3V%/%i%$%"%s%H$+$i$N(B \hgcmd{pull} $BMW5a$N>l9g!"(B
  1.1562 +  \texttt{source} $B$O(B \texttt{serve} $B$H$J$j$^$9!#(B
  1.1563 +  $B%A%'%s%8%;%C%H72$r<hF@$7$h$&$H$9$k%/%i%$%"%s%H$,%m!<%+%k%[%9%H>e$K5o$k>l9g!"(B
  1.1564 +  $B%/%i%$%"%s%H$NA`:n<oJL$K1~$8$F!"(B
  1.1565 +  \texttt{source} $B$NCM$O(B
  1.1566 +  \texttt{bundle}$B!"(B\texttt{pull} $B$J$$$7(B \texttt{push} $B$N$$$:$l$+$K$J$j$^$9!#(B
  1.1567 +
  1.1568 +\item[\texttt{url}] URL$B!#(B
  1.1569 +  $BFCDj$G$-$k>l9g$K8B$j!"1s3V%j%]%8%H%j$N>l=j$rI=$7$^$9!#(B
  1.1570 +  $B>\:Y$O(B\ref{sec:hook:url}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1571 +
  1.1572 +\end{description}
  1.1573 +
  1.1574 +$BMWJLES;2>H!'(B
  1.1575 +\hook{preoutgoing} $B!J(B\ref{sec:hook:preoutgoing}~$B@a!K(B
  1.1576 +
  1.1577 +\subsection{\hook{prechangegroup}---before starting to add remote changesets}
  1.1578 +\label{sec:hook:prechangegroup}
  1.1579 +
  1.1580 +$B$3$N@)8fMQ%U%C%/$O!"(B
  1.1581 +$BB>$N%j%]%8%H%j$+$i$N%A%'%s%8%;%C%H72$NDI2C$,(B
  1.1582 +Mercurial $B$K$h$j3+;O$5$l$kD>A0$K<B9T$5$l$^$9!#(B
  1.1583 +
  1.1584 +$B$3$N%U%C%/$O%A%'%s%8%;%C%H72$NE>Aw3+;O$,5v2D$5$l$kA0$K<B9T$5$l$k$?$a!"(B
  1.1585 +$B%U%C%/<+BN$ODI2C$5$l$k%A%'%s%8%;%C%H$K4X$9$k>pJs$rF@$k$3$H$,$G$-$^$;$s!#(B
  1.1586 +$B$3$N%U%C%/$N<B9T$,<:GT$7$?>l9g!"%A%'%s%8%;%C%H72$OE>Aw$5$l$^$;$s!#(B
  1.1587 +
  1.1588 +$B$3$N%U%C%/$NMQES$N0l$D$K!"(B
  1.1589 +$B%j%]%8%H%j$KBP$9$k30It$+$i$N%A%'%s%8%;%C%HDI2C$N6X;_$,$"$j$^$9!#(B
  1.1590 +$BNc$($P!"(B
  1.1591 +$B%m!<%+%k%[%9%H>e$N4IM}<T$,%j%]%8%H%j$rJQ99$G$-$k0lJ}$G!"(B
  1.1592 +$BMxMQ<T$,%5!<%P7PM3$GJQ99$r(B \hgcmd{push} $B$G$-$J$$$h$&$K!"(B
  1.1593 +$B0l;~E*$J$$$71J5W$K(B``$BE`7k(B''$B$9$k$3$H$b$G$-$^$9!#(B
  1.1594 +
  1.1595 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1596 +
  1.1597 +\begin{description}
  1.1598 +
  1.1599 +\item[\texttt{source}] $BJ8;zNs!#(B
  1.1600 +  $B%A%'%s%8%;%C%H$NM3Mh85$rI=$7$^$9!#(B
  1.1601 +  $B>\:Y$O(B\ref{sec:hook:sources}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1602 +
  1.1603 +\item[\texttt{url}] URL$B!#(B
  1.1604 +  $BFCDj$G$-$k>l9g$K8B$j!"1s3V%j%]%8%H%j$N>l=j$rI=$7$^$9!#(B
  1.1605 +  $B>\:Y$O(B\ref{sec:hook:url}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1606 +
  1.1607 +\end{description}
  1.1608 +
  1.1609 +$BMWJLES;2>H!'(B
  1.1610 +\hook{changegroup} $B!J(B\ref{sec:hook:changegroup}~$B@a!K!"(B
  1.1611 +\hook{incoming} $B!J(B\ref{sec:hook:incoming}~$B@a!K!"(B
  1.1612 +\hook{pretxnchangegroup} $B!J(B\ref{sec:hook:pretxnchangegroup}~$B@a!K(B
  1.1613 +
  1.1614 +\subsection{\hook{precommit}---before starting to commit a changeset}
  1.1615 +\label{sec:hook:precommit}
  1.1616 +
  1.1617 +$B$3$N%U%C%/$O!"(B
  1.1618 +Mercurial $B$,?7$?$J%A%'%s%8%;%C%H$r%3%_%C%H$9$kA0$K<B9T$5$l$^$9!#(B
  1.1619 +$B%3%_%C%H$5$l$k%U%!%$%k!"%3%_%C%H%a%C%;!<%8$J$$$7F|IU$H$$$C$?!"(B
  1.1620 +$B%3%_%C%H$K4X$9$k%a%?%G!<%?$r(B
  1.1621 +Mercurial $B$,B7$($kA0$K<B9T$5$l$^$9!#(B
  1.1622 +
  1.1623 +$B$3$N%U%C%/$NMQES$N0l$D$K!"(B
  1.1624 +$B%A%'%s%8%;%C%H$N<u$1F~$l$r5v$90lJ}$G$N!"(B
  1.1625 +$B?7$?$J%A%'%s%8%;%C%H$N%3%_%C%H$N6X;_$,$"$j$^$9!#(B
  1.1626 +$BB>$NMQES$H$H$7$F$O!"(B
  1.1627 +$B%S%k%I$d%F%9%H$r<B;\$7!"(B
  1.1628 +$B$=$l$i$,@.8y$7$?>l9g$K$N$_%3%_%C%H$r5v2D$9$k!"(B
  1.1629 +$B$H$$$&$b$N$b$"$j$^$9!#(B
  1.1630 +
  1.1631 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1632 +
  1.1633 +\begin{description}
  1.1634 +\item[\texttt{parent1}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1635 +  $B:n6HNN0h%G%#%l%/%H%j$K$H$C$F!"(B
  1.1636 +  $BBh#1?F$H$J$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1637 +
  1.1638 +\item[\texttt{parent2}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1639 +  $B:n6HNN0h%G%#%l%/%H%j$K$H$C$F!"(B
  1.1640 +  $BBh#2?F$H$J$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1641 +
  1.1642 +\end{description}
  1.1643 +
  1.1644 +$B%3%_%C%H$,?J9T$7$?>l9g!"(B
  1.1645 +$B:n6HNN0h%G%#%l%/%H%j$N!JN>!K?F$,!"(B
  1.1646 +$B?7$?$J%A%'%s%8%;%C%H$N?F$H$J$j$^$9!#(B
  1.1647 +
  1.1648 +$BMWJLES;2>H!'(B
  1.1649 +\hook{commit} $B!J(B\ref{sec:hook:commit}~$B@a!K!"(B
  1.1650 +\hook{pretxncommit} $B!J(B\ref{sec:hook:pretxncommit}~$B@a!K(B
  1.1651 +
  1.1652 +\subsection{\hook{preoutgoing}---before starting to propagate changesets}
  1.1653 +\label{sec:hook:preoutgoing}
  1.1654 +
  1.1655 +$B$3$N%U%C%/$O!"(B
  1.1656 +Mercurial $B$,30It$KE>Aw$5$l$k%A%'%s%8%;%C%H$rFCDj$9$kD>A0$K<B9T$5$l$^$9!#(B
  1.1657 +
  1.1658 +$B%A%'%s%8%;%C%H$,B>$N%j%]%8%H%j$XE>Aw$5$l$k$N$rKI$0$3$H$O!"(B
  1.1659 +$B$3$N%U%C%/$KA[Dj$5$l$kMQES$N#1$&$G$9!#(B
  1.1660 +
  1.1661 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1662 +
  1.1663 +\begin{description}
  1.1664 +\item[\texttt{source}] $BJ8;zNs!#(B
  1.1665 +  $BEv3:%j%]%8%H%j$KBP$9$k%A%'%s%8%;%C%H$N<hF@MW5a$NH/9TM3Mh$rI=$7$^$9(B
  1.1666 +  $B!J(B\ref{sec:hook:sources}~$B@a$r;2>H$7$F$/$@$5$$!K!#(B
  1.1667 +  $B$3$N%Q%i%a!<%?$,<h$jF@$kCM$K4X$7$F$O!"(B
  1.1668 +  \hook{outgoing} $B$N(B \texttt{source} $B%Q%i%a!<%?$K4X$9$k(B
  1.1669 +  \ref{sec:hook:outgoing}~$B@a$N5-=R$r;2>H$7$F$/$@$5$$!#(B
  1.1670 +
  1.1671 +\item[\texttt{url}] URL$B!#(B
  1.1672 +  $BFCDj$G$-$k>l9g$K8B$j!"1s3V%j%]%8%H%j$N>l=j$rI=$7$^$9!#(B
  1.1673 +  $B>\:Y$O(B\ref{sec:hook:url}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1674 +
  1.1675 +\end{description}
  1.1676 +
  1.1677 +$BMWJLES;2>H(B:
  1.1678 +\hook{outgoing} $B!J(B\ref{sec:hook:outgoing}~$B@a!K(B
  1.1679 +
  1.1680 +\subsection{\hook{pretag}---before tagging a changeset}
  1.1681 +\label{sec:hook:pretag}
  1.1682 +
  1.1683 +$B$3$N@)8f%U%C%/$O!"(B
  1.1684 +$B%?%0$,@8@.$5$l$kA0$K<B9T$5$l$^$9!#(B
  1.1685 +$B%U%C%/$N<B9T$,@.8y$7$?>l9g!"%?%0$N@8@.$O7QB3$5$l!"(B
  1.1686 +$B%U%C%/$N<B9T$,<:GT$7$?>l9g!"%?%0$O@8@.$5$l$^$;$s!#(B
  1.1687 +
  1.1688 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1689 +
  1.1690 +\begin{description}
  1.1691 +\item[\texttt{local}] $B??56CM!#(B
  1.1692 +  $B%?%0$,%j%]%8%H%j$KBP$7$F%m!<%+%k$J$b$N(B
  1.1693 +  $B!J(B\sfilename{.hg/localtags} $B$K>pJs$,3JG<$5$l$k!K$J$N$+!"(B
  1.1694 +  Mercurial $B$K4IM}$5$l$k$b$N!J(B\sfilename{.hgtags} $B$K>pJs$,3JG<!K(B
  1.1695 +  $B$J$N$+$rI=$7$^$9!#(B
  1.1696 +
  1.1697 +\item[\texttt{node}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1698 +  $B%?%0IU$1$5$l$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1699 +
  1.1700 +\item[\texttt{tag}] $BJ8;zNs!#(B
  1.1701 +  $B:n@.$5$l$k%?%0$NL>A0!#(B
  1.1702 +
  1.1703 +\end{description}
  1.1704 +
  1.1705 +$B@8@.$5$l$k%?%0$,9=@.4IM}BP>]$H$J$k>l9g!"(B
  1.1706 +\hook{precommit} $B!J(B\ref{sec:hook:commit}~$B@a!K$*$h$S(B
  1.1707 +\hook{pretxncommit} $B!J(B\ref{sec:hook:pretxncommit}~$B@a!K(B
  1.1708 +$B%U%C%/$b<B9T$5$l$^$9!#(B
  1.1709 +
  1.1710 +$BMWJLES;2>H!'(B
  1.1711 +\hook{tag} $B!J(B\ref{sec:hook:tag}~$B@a!K(B
  1.1712 +
  1.1713 +\subsection{\hook{pretxnchangegroup}---before completing addition of
  1.1714 +  remote changesets}
  1.1715 +\label{sec:hook:pretxnchangegroup}
  1.1716 +
  1.1717 +$B$3$N@)8f%U%C%/$O!"(B
  1.1718 +$B%H%i%s%6%/%7%g%s(B---
  1.1719 +$B$3$N%H%i%s%6%/%7%g%s$O!"(B
  1.1720 +$BB>$N%j%]%8%H%j$+$i$N0l72$N%A%'%s%8%;%C%H$NDI2C$r4IM}$7$^$9(B
  1.1721 +---$B$,40N;$9$kA0$K<B9T$5$l$^$9!#(B
  1.1722 +$B%U%C%/$N<B9T$,@.8y$7$?>l9g!"%H%i%s%6%/%7%g%s$O40N;$7!"(B
  1.1723 +$BA4$F$N%A%'%s%8%;%C%H$,%j%]%8%H%j$K$*$$$F1JB32=$5$l$^$9!#(B
  1.1724 +$B%U%C%/$N<B9T$,<:GT$7$?>l9g!"(B
  1.1725 +$B%H%i%s%6%/%7%g%s$O4,$-La$5$l!"(B
  1.1726 +$B%A%'%s%8%;%C%H$K4X$9$k%G!<%?$OGK4~$5$l$^$9!#(B
  1.1727 +
  1.1728 +$B$3$N%U%C%/$O!"(B
  1.1729 +$B!V$[$\DI2C$5$l$?!W%A%'%s%8%;%C%H$K4X$9$k%a%?%G!<%?$K%"%/%;%9$G$-$^$9$,!"(B
  1.1730 +$B1JB32=$5$l$k$h$&$JA`:n(B\footnote{$BLuCm(B:
  1.1731 +$BNc$($P!"30It$N(B DBMS $B$X$N%G!<%?3JG<$d!"(B
  1.1732 +$B8x3+MQ%U%!%$%k$X$N=q$-=P$7Ey!#(B}
  1.1733 +$B$r$3$l$i$N%G!<%?$K4p$E$$$F9T$&$Y$-$G$O$"$j$^$;$s(B
  1.1734 +$B:n6H%G%#%l%/%H%j$bJQ99$9$Y$-$G$O$"$j$^$;$s!#(B
  1.1735 +
  1.1736 +$B$3$N%U%C%/$N<B9TCf$K!"(B
  1.1737 +$BB>$N(B Mercurial $B%W%m%;%9$,F1$8%j%]%8%H%j$K%"%/%;%9$7$F$-$?>l9g!"(B
  1.1738 +$B$3$N%W%m%;%9$+$i$O!"(B
  1.1739 +$B!V$[$\DI2C$5$l$?!W%A%'%s%8%;%C%H$,1JB32=$5$l$?$b$N$N$h$&$K8+$($^$9!#(B
  1.1740 +$B$3$N>u67$r2sHr$9$k<j=g$rF'$^$J$$$H!"(B
  1.1741 +$B6%9g>uBV$K$J$j$+$M$^$;$s!#(B
  1.1742 +
  1.1743 +$B$3$N%U%C%/$O!"%A%'%s%8%;%C%H72$KBP$9$k?GCG$KMxMQ2DG=$G$9!#(B
  1.1744 +$B%U%C%/$N<B9T$,<:GT$7$?>l9g!"(B
  1.1745 +$B%H%i%s%6%/%7%g%s$,4,$-La$5$l!"(B
  1.1746 +$BA4$F$N%A%'%s%8%;%C%H$,(B``$B5qH](B''$B$5$l$^$9!#(B
  1.1747 +
  1.1748 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1749 +
  1.1750 +\begin{description}
  1.1751 +\item[\texttt{node}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1752 +  $BDI2C$5$l$k0l72$NCf$N:G=i$N%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1753 +  $B$3$N%A%'%s%8%;%C%H$+$i(B
  1.1754 +  \index{tags!\texttt{tip}}\texttt{tip} 
  1.1755 +  $B$^$G!J(B\texttt{tip} $B<+?H$b4^$`!K$NA4$F$N%A%'%s%8%;%C%H$,!"(B
  1.1756 +  $BC1FH$N(B \hgcmd{pull}$B!"(B\hgcmd{push} $B$J$$$7(B \hgcmd{unbundle}
  1.1757 +  $BA`:n$K$h$jDI2C$5$l$?$3$H$K$J$j$^$9!#(B
  1.1758 +
  1.1759 +\item[\texttt{source}] $BJ8;zNs!#(B
  1.1760 +  $B%A%'%s%8%;%C%H$NM3Mh85$rI=$7$^$9!#(B
  1.1761 +  $B>\:Y$O(B\ref{sec:hook:sources}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1762 +
  1.1763 +\item[\texttt{url}] URL$B!#(B
  1.1764 +  $BFCDj$G$-$k>l9g$K8B$j!"1s3V%j%]%8%H%j$N>l=j$rI=$7$^$9!#(B
  1.1765 +  $B>\:Y$O(B\ref{sec:hook:url}~$B@a$r;2>H$7$F$/$@$5$$!#(B
  1.1766 +
  1.1767 +\end{description}
  1.1768 +
  1.1769 +$BMWJLES;2>H!'(B
  1.1770 +\hook{changegroup} $B!J(B\ref{sec:hook:changegroup}$B!K!"(B
  1.1771 +\hook{incoming} $B!J(B\ref{sec:hook:incoming}$B!K!"(B
  1.1772 +\hook{prechangegroup} $B!J(B\ref{sec:hook:prechangegroup}$B!K(B
  1.1773 +
  1.1774 +\subsection{\hook{pretxncommit}---before completing commit of new changeset}
  1.1775 +\label{sec:hook:pretxncommit}
  1.1776 +
  1.1777 +$B$3$N@)8f%U%C%/$O!"(B
  1.1778 +$B%H%i%s%6%/%7%g%s(B---
  1.1779 +$B$3$N%H%i%s%6%/%7%g%s$O!"(B
  1.1780 +$B?7$?$J%A%'%s%8%;%C%H$N%3%_%C%H$r4IM}$7$^$9(B
  1.1781 +---$B$,40N;$9$kA0$K<B9T$5$l$^$9!#(B
  1.1782 +$B%U%C%/$N<B9T$,@.8y$7$?>l9g!"%H%i%s%6%/%7%g%s$O40N;$7!"(B
  1.1783 +$B%A%'%s%8%;%C%H$,%j%]%8%H%j$K$*$$$F1JB32=$5$l$^$9!#(B
  1.1784 +$B%U%C%/$N<B9T$,<:GT$7$?>l9g!"(B
  1.1785 +$B%H%i%s%6%/%7%g%s$O4,$-La$5$l!"(B
  1.1786 +$B%3%_%C%H$K4X$9$k%G!<%?$OGK4~$5$l$^$9!#(B
  1.1787 +
  1.1788 +$B$3$N%U%C%/$O!"(B
  1.1789 +$B!V$[$\?75,:n@.$5$l$?!W%A%'%s%8%;%C%H$K4X$9$k%a%?%G!<%?$K%"%/%;%9$G$-$^$9$,!"(B
  1.1790 +$B1JB32=$5$l$k$h$&$JA`:n$r$3$l$i$N%G!<%?$K4p$E$$$F9T$&$Y$-$G$O$"$j$^$;$s(B
  1.1791 +$B:n6H%G%#%l%/%H%j$bJQ99$9$Y$-$G$O$"$j$^$;$s!#(B
  1.1792 +
  1.1793 +$B$3$N%U%C%/$N<B9TCf$K!"(B
  1.1794 +$BB>$N(B Mercurial $B%W%m%;%9$,F1$8%j%]%8%H%j$K%"%/%;%9$7$F$-$?>l9g!"(B
  1.1795 +$B$3$N%W%m%;%9$+$i$O!"(B
  1.1796 +$B!V$[$\?75,:n@.$5$l$?!W%A%'%s%8%;%C%H$,1JB32=$5$l$?$b$N$N$h$&$K8+$($^$9!#(B
  1.1797 +$B$3$N>u67$r2sHr$9$k<j=g$rF'$^$J$$$H!"(B
  1.1798 +$B6%9g>uBV$K$J$j$+$M$^$;$s!#(B
  1.1799 +
  1.1800 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1801 +
  1.1802 +\begin{description}
  1.1803 +
  1.1804 +\item[\texttt{node}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1805 +  $B?7$7$/%3%_%C%H$5$l$?%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1806 +
  1.1807 +\item[\texttt{parent1}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1808 +  $B?7$7$/%3%_%C%H$5$l$?%A%'%s%8%;%C%H$K$H$C$F!"(B
  1.1809 +  $BBh#1?F$H$J$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1810 +
  1.1811 +\item[\texttt{parent2}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1812 +  $B?7$7$/%3%_%C%H$5$l$?%A%'%s%8%;%C%H$K$H$C$F!"(B
  1.1813 +  $BBh#2?F$H$J$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1814 +
  1.1815 +\end{description}
  1.1816 +
  1.1817 +$BMWJLES;2>H!'(B
  1.1818 +\hook{precommit} $B!J(B\ref{sec:hook:precommit}~$B@a!K(B
  1.1819 +
  1.1820 +\subsection{\hook{preupdate}---before updating or merging working directory}
  1.1821 +\label{sec:hook:preupdate}
  1.1822 +
  1.1823 +$B$3$N@)8f%U%C%/$O!"(B
  1.1824 +$B:n6HNN0h%G%#%l%/%H%j$K$*$1$k(B \hgcmd{update} $B$J$$$7(B \hgcmd{merge}
  1.1825 +$B$N<B;\A0$K<B9T$5$l$^$9!#(B
  1.1826 +$B$3$N%U%C%/$O!"(B
  1.1827 +Mercurial $B$N(B \hgcmd{update} 
  1.1828 +$B<B;\A03NG'$,(B \hgcmd{update} $B$J$$$7(B \hgcmd{merge} 
  1.1829 +$B$r<B9T2DG=$HH=CG$7$?>l9g$K$7$+<B9T$5$l$^$;$s!#(B
  1.1830 +$B%U%C%/$N<B9T$,@.8y$7$?>l9g!"(B
  1.1831 +\hgcmd{update} $B$J$$$7(B \hgcmd{merge} $B$N<B9T$O7QB3$5$l$^$9$,!"(B
  1.1832 +$B%U%C%/$N<B9T$,<:GT$7$?>l9g!"(B
  1.1833 +\hgcmd{update} $B$J$$$7(B \hgcmd{merge} $B$O<B9T$5$l$^$;$s!#(B
  1.1834 +
  1.1835 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1836 +
  1.1837 +\begin{description}
  1.1838 +\item[\texttt{parent1}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1839 +  $B:n6HNN0h%G%#%l%/%H%j$,(B \hgcmd{update} $B$5$l$k?F%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1840 +  $B:n6HNN0h%G%#%l%/%H%j$,(B \hgcmd{merge} $B$5$l$k>l9g$O!"(B
  1.1841 +  $B8=:_$N?F%A%'%s%8%;%C%H$HF1$8$K$J$j$^$9!#(B
  1.1842 +
  1.1843 +\item[\texttt{parent2}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1844 +  $B:n6HNN0h%G%#%l%/%H%j$,(B \hgcmd{merge} $B$5$l$k>l9g$K$N$_@_Dj$5$l$^$9!#(B
  1.1845 +  $B:n6HNN0h%G%#%l%/%H%j$N(B \hgcmd{merge} $BBP>]$H$J$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1846 +
  1.1847 +\end{description}
  1.1848 +
  1.1849 +$BMWJLES;2>H!'(B
  1.1850 +\hook{update} $B!J(B\ref{sec:hook:update}~$B@a!K(B
  1.1851 +
  1.1852 +\subsection{\hook{tag}---after tagging a changeset}
  1.1853 +\label{sec:hook:tag}
  1.1854 +
  1.1855 +$B$3$N%U%C%/$O!"%?%0$,@8@.$5$l$?8e$G<B9T$5$l$^$9!#(B
  1.1856 +
  1.1857 +$B$3$N%U%C%/$KEO$5$l$k%Q%i%a!<%?$O(B:
  1.1858 +
  1.1859 +\begin{description}
  1.1860 +\item[\texttt{local}] $B??56CM!#(B
  1.1861 +  $B%?%0$,%j%]%8%H%j$KBP$7$F%m!<%+%k$J$b$N(B
  1.1862 +  $B!J(B\sfilename{.hg/localtags} $B$K>pJs$,3JG<$5$l$k!K$J$N$+!"(B
  1.1863 +  Mercurial $B$K4IM}$5$l$k$b$N!J(B\sfilename{.hgtags} $B$K>pJs$,3JG<!K(B
  1.1864 +  $B$J$N$+$rI=$7$^$9!#(B
  1.1865 +
  1.1866 +\item[\texttt{node}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1867 +  $B%?%0IU$1$5$l$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1868 +
  1.1869 +\item[\texttt{tag}] $BJ8;zNs!#(B
  1.1870 +  $B:n@.$5$l$k%?%0$NL>A0!#(B
  1.1871 +
  1.1872 +\end{description}
  1.1873 +
  1.1874 +$B@8@.$5$l$k%?%0$,9=@.4IM}BP>]$H$J$k>l9g!"(B
  1.1875 +$B$3$N%U%C%/$N<B9T$K@hN)$C$F(B
  1.1876 +\hook{commit} $B%U%C%/!J(B\ref{sec:hook:commit}~$B@a!K$,<B9T$5$l$^$9!#(B
  1.1877 +
  1.1878 +$BMWJLES;2>H!'(B
  1.1879 +\hook{pretag} $B!J(B\ref{sec:hook:pretag}~$B@a!K(B
  1.1880 +
  1.1881 +\subsection{\hook{update}---after updating or merging working directory}
  1.1882 +\label{sec:hook:update}
  1.1883 +
  1.1884 +$B$3$N%U%C%/$O!"(B
  1.1885 +$B:n6HNN0h%G%#%l%/%H%j$K$*$1$k(B \hgcmd{update} $B$J$$$7(B \hgcmd{merge}
  1.1886 +$B$,40N;$7$?:]$K<B9T$5$l$^$9!#(B
  1.1887 +\hgcmd{merge} $B$O<:GT$7F@$k(B
  1.1888 +$B!J30It%3%^%s%I$N(B \command{hgmerge} 
  1.1889 +$B$,3F%U%!%$%k$K$*$1$k>WFM$N2r>C$K<:GT$7$?>l9g!K$N$G!"(B
  1.1890 +$B$3$N%U%C%/$K$O(B \hgcmd{update} $B$J$$$7(B \hgcmd{merge} 
  1.1891 +$B$N@.H]$,EA$($i$l$^$9!#(B
  1.1892 +
  1.1893 +\begin{description}
  1.1894 +\item[\texttt{error}] $B??56CM!#(B
  1.1895 +   \hgcmd{update} $B$J$$$7(B \hgcmd{merge} $B<B9T$,@.8y$7$?$+H]$+$rI=$7$^$9!#(B
  1.1896 +
  1.1897 +\item[\texttt{parent1}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1898 +  $B?7$7$/%3%_%C%H$5$l$?%A%'%s%8%;%C%H$K$H$C$F!"(B
  1.1899 +  $BBh#1?F$H$J$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1900 +
  1.1901 +\item[\texttt{parent2}] $B%A%'%s%8%;%C%H(BID$B!#(B
  1.1902 +  $B?7$7$/%3%_%C%H$5$l$?%A%'%s%8%;%C%H$K$H$C$F!"(B
  1.1903 +  $BBh#2?F$H$J$k%A%'%s%8%;%C%H$N(BID$B!#(B
  1.1904 +
  1.1905 +\end{description}
  1.1906 +
  1.1907 +$BMWJLES;2>H!'(B
  1.1908 +\hook{preupdate} $B!J(B\ref{sec:hook:preupdate}$B@a!K(B
  1.1909 +
  1.1910 +%%% Local Variables: 
  1.1911 +%%% mode: latex
  1.1912 +%%% TeX-master: "00book"
  1.1913 +%%% End: