rev |
line source |
igor@440
|
1 \chapter{Añadir funcionalidad con extensiones}
|
jerojasro@336
|
2 \label{chap:hgext}
|
jerojasro@336
|
3
|
igor@451
|
4 A pesar de que el corazón de Mercurial es muy completo desde el punto
|
igor@451
|
5 de vista de funcionalidad, carece de características rimbombantes
|
igor@451
|
6 deliberadamente. Esta aproximación de preservar la simplicidad
|
igor@451
|
7 mantiene el programa sencillo tanto para mantenedores como para
|
igor@451
|
8 usuarios.
|
igor@451
|
9
|
igor@451
|
10 Si embargo Mercurial no le cierra las posibilidades a un conjunto
|
igor@451
|
11 inflexible de órdenes: usted puede añadir características como
|
igor@451
|
12 \emph{extensiones} (aveces llamadas \emph{añadidos}\ndt{plugins}). Ya
|
igor@451
|
13 hemos discutido algunas de estas extensiones en capítulos anteriores:
|
jerojasro@336
|
14 \begin{itemize}
|
igor@451
|
15 \item La sección~\ref{sec:tour-merge:fetch} cubre la extensión
|
igor@451
|
16 \hgext{fetch}; que combina jalar cambios y fusionarlos con los
|
igor@451
|
17 cambios locales en una sola orden: \hgxcmd{fetch}{fetch}.
|
igor@451
|
18 \item En el capítulo~\ref{chap:hook}, cubrimos muchas extensiones que
|
igor@451
|
19 son útiles en funcionalidades relacionadas con ganchos: Los
|
igor@451
|
20 \hgext{acl} añaden listas de control de acceso; \hgext{bugzilla}
|
igor@451
|
21 añade integración con el sistema de seguimiento de fallos Bugzilla; y
|
igor@451
|
22 \hgext{notify} envía notificaciones por correo de nuevos cambios.
|
igor@451
|
23 \item La extensión de administración de parches MQ es tan invaluable
|
igor@451
|
24 que amerita dos capítulos y un apéndice por sí misma.
|
igor@451
|
25 El capítulo~\ref{chap:mq} cubre lo básico; el
|
igor@451
|
26 capítulo~\ref{chap:mq-collab} discute temas avanzados; y el
|
igor@451
|
27 apéndice~\ref{chap:mqref} muestra en detalle cada orden.
|
jerojasro@336
|
28 \end{itemize}
|
jerojasro@336
|
29
|
igor@451
|
30 En este capítulo cubriremos algunas extensiones adicionales
|
igor@451
|
31 disponibles para Mercurial, y daremos un vistazo a la maquinaria que
|
igor@451
|
32 necesita conocer en caso de que desee escribir una extensión.
|
jerojasro@336
|
33 \begin{itemize}
|
igor@451
|
34 \item En la sección~\ref{sec:hgext:inotify}, discutiremos la
|
igor@451
|
35 posibilidad de mejorar el desempeño \emph{en gran medida} con la extensión
|
igor@451
|
36 \hgext{inotify}.
|
jerojasro@336
|
37 \end{itemize}
|
jerojasro@336
|
38
|
igor@451
|
39 \section{Mejorar el desempeño con la extensión \hgext{inotify}}
|
jerojasro@336
|
40 \label{sec:hgext:inotify}
|
jerojasro@336
|
41
|
igor@451
|
42 ¿Desea lograr que las operaciones más comunmente usadas de Mercurial se
|
igor@451
|
43 ejecuten centenas de veces más rápido? ¡A leer!
|
igor@451
|
44
|
igor@451
|
45 Mercurial tiene gran desempeño bajo circunstancias normales. Por
|
igor@451
|
46 ejemplo, cuando ejecuta la orden \hgcmd{status}, Mercurial tiene que
|
igor@451
|
47 revisar casi todos los ficheros y directorios en su repositorio de
|
igor@451
|
48 forma que pueda desplegar el estado de los ficheros. Muchas otras
|
igor@451
|
49 órdenes tienen que hacer tal trabajo tras bambalinas; por ejemplo la
|
igor@451
|
50 orden \hgcmd{diff} usa la maquinaria de estado para evitar hacer
|
igor@451
|
51 operaciones de comparación costosas en ficheros que obviamente no han
|
igor@451
|
52 cambiado.
|
igor@451
|
53
|
igor@451
|
54 Dado que obtener el estado de los ficheros es crucial para obtener
|
igor@451
|
55 buen desempeño, los autores de Mercurial han optimizado este código en
|
igor@451
|
56 la medida de lo posible. Sin embargo, no puede obviarse el hecho de
|
igor@451
|
57 que cuando ejecuta \hgcmd{status}, Mercurial tendrá que hacer por lo
|
jerojasro@516
|
58 menos una costosa llamada al sistema por cada fichero administrado
|
igor@451
|
59 para determinar si ha cambiado desde la última vez que se consignó.
|
igor@451
|
60 Para un repositorio suficientemente grande, puede tardar bastante
|
igor@451
|
61 tiempo.
|
igor@451
|
62
|
igor@451
|
63 Para mostrar en números la magnitud de este efect, creé un repositorio
|
jerojasro@516
|
64 que contenía 150.000 ficheros administrador. Tardó diez segundos para
|
igor@451
|
65 ejecutar \hgcmd{status}, a pesar de que \emph{ninguno} de los ficheros
|
igor@451
|
66 había sido modificado.
|
igor@451
|
67
|
igor@451
|
68 Muchos sistemas operativos modernos contienen una facilidad de
|
jerojasro@516
|
69 notificación de ficheros. Si un programa se registra con un servicio
|
igor@451
|
70 apropiado, el sistema operativo le notificará siempre que un fichero
|
igor@451
|
71 de interés haya sido creado, modificado o borrado. En sistemas Linux,
|
igor@451
|
72 el componente del núcleo que lo hace se llama \texttt{inotify}.
|
igor@451
|
73
|
igor@451
|
74 La extensión \hgext{inotify} habla con el componente \texttt{inotify}
|
igor@451
|
75 del núcleo para optimizar las órdenes de \hgcmd{status}. La extensión
|
igor@451
|
76 tiene dos componentes. Un daemonio está en el fondo recibiendo
|
igor@451
|
77 notificaciones del subsistema \texttt{inotify}. También escucha
|
igor@451
|
78 conexiones de una orden regular de Mercurial. La extensión modifica
|
igor@451
|
79 el comportamiento de Mercurial de tal forma que, en lugar de revisar
|
igor@451
|
80 el sistema de ficheros, le pregunta al daemonio. Dado que el daemonio
|
igor@451
|
81 tiene información perfecta acerca del estado del repositorio, puede
|
igor@451
|
82 responder instantáneamente con el resultado, evitando la necesidad de
|
igor@451
|
83 revisar cada directorio y fichero del repositorio.
|
igor@451
|
84
|
igor@451
|
85 Retomando los diez segundos que medí al ejecutar la orden
|
igor@451
|
86 \hgcmd{status} de Mercurial sobre un repositorio de 150.000
|
igor@451
|
87 ficheros. Con la extensión \hgext{inotify} habilitada, el tiempo se
|
igor@451
|
88 disipó a 0.1~seconds, un factor \emph{cien veces} más rápido.
|
igor@451
|
89
|
igor@451
|
90 Antes de continuar, tenga en cuenta algunos detalles:
|
jerojasro@336
|
91 \begin{itemize}
|
igor@451
|
92 \item La extensión \hgext{inotify} es específica de Linux. Porque se
|
igor@451
|
93 enlaza directamente con el subsistema \texttt{inotify} del núcleo
|
igor@451
|
94 Linux, no funciona en otros sistemas operativos.
|
igor@451
|
95 \item Debería funcionar en cualquier distribución Linux a partir de
|
igor@451
|
96 comienzos del 2005. Las distribuciones más antiguas deben tener un
|
igor@451
|
97 kernel sin \texttt{inotify}, o una versión de \texttt{glibc} que no
|
igor@451
|
98 tiene necesariamente el soporte para la interfaz.
|
igor@451
|
99 \item No todos los sistemas de ficheros pueden usarse con la extensión
|
igor@451
|
100 \hgext{inotify}. Los sistemas de ficheros tales como NFS no lo
|
igor@451
|
101 soportan, por ejemplo, si está corriendo Mercurial en vaios
|
igor@451
|
102 sistemas, montados todos sobre el mismo sistema de ficheros en red.
|
igor@451
|
103 El sistema \texttt{inotify} del kernel no tiene forma de saber
|
igor@451
|
104 acerca de los cambios hechos en otro sistema. La mayoría de
|
igor@451
|
105 sistemas de ficheros locales (p.e.~ext3, XFS, ReiserFS) deberían
|
igor@451
|
106 funcionar bien.
|
jerojasro@336
|
107 \end{itemize}
|
jerojasro@336
|
108
|
igor@451
|
109 Hacia mayo de 2007 la extensión \hgext{inotify} no venía de forma
|
igor@451
|
110 predeterminada en Mercurial\ndt{Desde el 2008 para kernels 2.6 viene
|
igor@451
|
111 en Mercurial, pero no está activada de forma predeterminada}, y es
|
igor@451
|
112 un poco más compleja de activar que otras extensiones. Pero la mejora
|
igor@451
|
113 en el desempeño bien vale la pena!
|
igor@451
|
114
|
igor@451
|
115 La extensión venía en dos partes: un conjunto de parches al código
|
igor@451
|
116 fuente de Mercurial, y una librería de interfaces de Python hacia el
|
igor@451
|
117 subsistema \texttt{inotify}.
|
jerojasro@336
|
118 \begin{note}
|
igor@451
|
119 Hay \emph{dos} librerías de enlace de Python hacia \texttt{inotify}.
|
igor@451
|
120 Una de ellas se llama \texttt{pyinotify}, y en algunas
|
igor@451
|
121 distribuciones de Linux se encuentra como \texttt{python-inotify}.
|
igor@451
|
122 Esta es la que \emph{no} necesita, puesto que tiene muchos fallos,
|
igor@451
|
123 y es ineficiente para ser práctica.
|
jerojasro@336
|
124 \end{note}
|
igor@451
|
125 Para comenzar, es mejor tener una copia de Mercurial funcional
|
igor@451
|
126 instalada:
|
jerojasro@336
|
127 \begin{note}
|
igor@451
|
128 Si sigue las instrucciones a continuación, estará
|
igor@451
|
129 \emph{reemplazando} y sobreescribiendo cualquier instalación previa
|
igor@451
|
130 de Mercurial que pudiera tener, con el código de Mercurial ``más
|
igor@451
|
131 reciente y peligrosa''. No diga que no se le advirtio!
|
jerojasro@336
|
132 \end{note}
|
jerojasro@336
|
133 \begin{enumerate}
|
igor@451
|
134 \item Clone el repositorio de interfaz entre Python e
|
igor@451
|
135 \texttt{inotify}. Ármelo e instálelo:
|
jerojasro@336
|
136 \begin{codesample4}
|
jerojasro@336
|
137 hg clone http://hg.kublai.com/python/inotify
|
jerojasro@336
|
138 cd inotify
|
jerojasro@336
|
139 python setup.py build --force
|
jerojasro@336
|
140 sudo python setup.py install --skip-build
|
jerojasro@336
|
141 \end{codesample4}
|
igor@451
|
142 \item Clone el repositorio \dirname{crew} de Mercurial. Clone el
|
igor@451
|
143 repositorio de parches de \hgext{inotify} de forma tal que las colas
|
igor@451
|
144 de Mercurial puedan aplicar los parches sobre el repositorio \dirname{crew}.
|
jerojasro@336
|
145 \begin{codesample4}
|
jerojasro@336
|
146 hg clone http://hg.intevation.org/mercurial/crew
|
jerojasro@336
|
147 hg clone crew inotify
|
jerojasro@336
|
148 hg clone http://hg.kublai.com/mercurial/patches/inotify inotify/.hg/patches
|
jerojasro@336
|
149 \end{codesample4}
|
igor@451
|
150 \item Asegúrese de instalar la extensión Colas de Mercurial
|
igor@451
|
151 \hgext{mq} y que estén habilitadas. Si nunca ha usado MQ, lea la
|
igor@451
|
152 sección~\ref{sec:mq:start} para poder comenzar rápidamente.
|
igor@451
|
153 \item Vaya al repositorio de \dirname{inotify} y aplique todos los
|
igor@451
|
154 parches de \hgext{inotify} con la opción \hgxopt{mq}{qpush}{-a} de
|
igor@451
|
155 la orden \hgxcmd{mq}{qpush}.
|
jerojasro@336
|
156 \begin{codesample4}
|
jerojasro@336
|
157 cd inotify
|
jerojasro@336
|
158 hg qpush -a
|
jerojasro@336
|
159 \end{codesample4}
|
igor@451
|
160 Si obtiene un mensaje de error de \hgxcmd{mq}{qpush}, no debería
|
igor@451
|
161 continuar. Mejor pida ayuda.
|
igor@451
|
162 \item Arme e instale la versión parchada de Mercurial.
|
jerojasro@336
|
163 \begin{codesample4}
|
jerojasro@336
|
164 python setup.py build --force
|
jerojasro@336
|
165 sudo python setup.py install --skip-build
|
jerojasro@336
|
166 \end{codesample4}
|
jerojasro@336
|
167 \end{enumerate}
|
igor@451
|
168 Una vez que haya armado una versión funcional parchada de Mercurial,
|
igor@451
|
169 todo lo que necesita es habilitar la extensión \hgext{inotify}
|
igor@451
|
170 colocando una entrada en su \hgrc.
|
jerojasro@336
|
171 \begin{codesample2}
|
jerojasro@336
|
172 [extensions]
|
jerojasro@336
|
173 inotify =
|
jerojasro@336
|
174 \end{codesample2}
|
igor@451
|
175 Cuando la extensión \hgext{inotify} esté habilitada, Mercurial
|
igor@451
|
176 iniciará transparente y automáticamente el daemonio de estado la
|
igor@451
|
177 primera vez que ejecute un comando que requiera estado del
|
jerojasro@483
|
178 repositorio. Ejecuta un daemonio de estado por repositorio.
|
igor@451
|
179
|
igor@451
|
180 El daemonio de estado se inicia silenciosamente y se ejecuta en el
|
igor@451
|
181 fondo. Si mira a la lista de procesos en ejecución después de
|
igor@451
|
182 habilitar la extensión \hgext{inotify} y ejecuta unos pocos comandos
|
igor@451
|
183 en diferentes repositorios, verá que hay algunos procesos de
|
igor@451
|
184 \texttt{hg} por ahí, esperando actualizaciones del kernel y
|
igor@451
|
185 solicitudes de Mercurial.
|
igor@451
|
186
|
igor@451
|
187 La primera vez que ejecuta un comando de Mercurial en un repositorio
|
igor@451
|
188 cuando tiene la extensión \hgext{inotify} habilitada, correrá casi con
|
igor@451
|
189 el mismo desempeño que una orden usual de Mercurial. Esto es debido a
|
igor@451
|
190 que el estado del daemonio necesita aplicar una búsqueda normal sobre
|
igor@451
|
191 el estado para poder tener una línea de partida frente a la cual
|
igor@451
|
192 aplicar posteriormente actualizaciones del núcleo. De todas formas,
|
igor@451
|
193 \emph{todo} comando posterior que haga cualquier clase de revisión del
|
igor@451
|
194 estado debería ser notablemente más rápido en repositorios con incluso
|
igor@451
|
195 un tamaño modesto. Aún mejor, a medida que su repositorio sea más
|
igor@451
|
196 grande, mejor desempeño verá. El daemonio \hgext{inotify} hace
|
igor@451
|
197 operaciones de estado de forma casi instantánea en repositorios de
|
igor@451
|
198 todos los tamaños!
|
igor@451
|
199
|
igor@451
|
200 Si lo desea, puede iniciar manualmente un daemonio de estado con la orden
|
igor@451
|
201 \hgxcmd{inotify}{inserve}. Esto le da un control un poco más fino
|
igor@451
|
202 acerca de cómo debería ejecutarse el daemonio. Esta orden solamente
|
igor@451
|
203 estará disponible cuando haya habilitado la extensión \hgext{inotify}.
|
igor@451
|
204
|
igor@451
|
205 Cuando esté usando la extensión \hgext{inotify},
|
igor@451
|
206 \emph{no debería ver diferencia} en el comportamiento de Mercurial,
|
igor@451
|
207 con la única excepción de que los comandos relacionados con el estado
|
igor@451
|
208 deberían ejectuarse mucho más rápido que como solían hacerlo. Debería
|
igor@451
|
209 esperar específicamente que las órdenes no deberían ofrecer salidas
|
igor@451
|
210 distintas; ni ofrecer resultados diferentes. Si alguna de estas
|
igor@451
|
211 situaciones ocurre, por favor reporte el fallo.
|
igor@451
|
212
|
igor@451
|
213 \section{Soporte flexible de diff con la extensión \hgext{extdiff}}
|
jerojasro@336
|
214 \label{sec:hgext:extdiff}
|
jerojasro@336
|
215
|
igor@451
|
216 La orden predeterminada \hgcmd{diff} de Mercurial despliega diffs en
|
igor@451
|
217 texto plano unificadas.
|
jerojasro@336
|
218 \interaction{extdiff.diff}
|
igor@451
|
219 Si dese emplear una herramienta externa para desplegar las
|
igor@451
|
220 modificaciones, querrá usar la extensión \hgext{extdiff}. Esta le
|
igor@451
|
221 permitirá usar por ejemplo una herramienta gráfica de diff.
|
igor@451
|
222
|
igor@451
|
223 La extensión \hgext{extdiff} viene con Mercurial, y es fácil
|
jerojasro@486
|
224 configurar. En la sección \rcsection{extensions} de su \hgrc,
|
igor@451
|
225 basta con añadir una entrada de una línea para habilitar la extensión.
|
jerojasro@336
|
226 \begin{codesample2}
|
jerojasro@336
|
227 [extensions]
|
jerojasro@336
|
228 extdiff =
|
jerojasro@336
|
229 \end{codesample2}
|
igor@451
|
230 Esto introduce una orden llamada \hgxcmd{extdiff}{extdiff}, que de
|
igor@451
|
231 forma predeterminada usa su orden del sistema \command{diff} para
|
igor@451
|
232 generar un diff unificado de la misma forma que lo hace el comando
|
igor@451
|
233 predeterminado \hgcmd{diff}.
|
jerojasro@336
|
234 \interaction{extdiff.extdiff}
|
igor@451
|
235 El resultado no será exactamente el mismo que con la orden interna
|
igor@451
|
236 \hgcmd{diff}, puesto que la salida de \command{diff} varía de un
|
igor@451
|
237 sistema a otro, incluso pasando las mismas opciones.
|
jerojasro@336
|
238
|
igor@453
|
239 Como lo indican las líneas``\texttt{making snapshot}'', la orden
|
igor@453
|
240 \hgxcmd{extdiff}{extdiff} funciona creando dos instantáneas de su
|
igor@453
|
241 árbol de fuentes. La primera instantánea es la revisión fuente; la
|
igor@453
|
242 segunda es la revisión objetivo del directorio de trabajo. La orden
|
igor@453
|
243 \hgxcmd{extdiff}{extdiff} genera estas instantáneas en un directorio
|
igor@453
|
244 temporal, pasa el nombre de cada directorio a un visor de diffs
|
igor@453
|
245 temporal y borra los directorios temporales. Por cuestiones de
|
igor@453
|
246 eficiencia solamente genera instantáneas de los directorios y ficheros
|
igor@453
|
247 que han cambiado entre dos revisiones.
|
igor@453
|
248
|
igor@453
|
249 Los nombres de los directorios de instantáneas tienen los mismos
|
igor@453
|
250 nombres base de su repositorio. Si su repositorio tiene por ruta
|
igor@453
|
251 \dirname{/quux/bar/foo}, \dirname{foo} será el nombre de cada
|
igor@453
|
252 instantánea de directorio. Cada instantánea de directorio tiene sus
|
igor@453
|
253 identificadores de conjuntos de cambios al final del nombre en caso de
|
igor@453
|
254 que sea apropiado. Si una instantánea viene de la revisión
|
igor@453
|
255 \texttt{a631aca1083f}, el directorio se llamará
|
igor@453
|
256 \dirname{foo.a631aca1083f}. Una instantánea del directorio de trabajo
|
igor@453
|
257 no tendrá el identificador del conjunto de cambios, y por lo tanto
|
igor@453
|
258 será solamente \dirname{foo} en este ejemplo. Para ver cómo luce en
|
igor@453
|
259 la práctica, veamos de nuevo el ejemplo \hgxcmd{extdiff}{extdiff}
|
igor@453
|
260 antes mencionado. Tenga en cuenta que los diffs tienen los nombres de
|
igor@453
|
261 las instantáneas de directorio dentro de su encabezado.
|
igor@453
|
262
|
igor@453
|
263 La orden \hgxcmd{extdiff}{extdiff} acepta dos opciones importantes.
|
igor@453
|
264 La opción \hgxopt{extdiff}{extdiff}{-p} le permite elegir un programa
|
igor@453
|
265 para ver las diferencias, en lugar de \command{diff}. Con la opción
|
igor@453
|
266 \hgxopt{extdiff}{extdiff}{-o} puede cambiar las opciones que
|
jerojasro@520
|
267 \hgxcmd{extdiff}{extdiff} pasa a tal programa (de forma predeterminada
|
igor@453
|
268 las opciones son``\texttt{-Npru}'', que tienen sentido únicamente si
|
igor@453
|
269 está usando \command{diff}). En otros aspectos, la orden
|
igor@453
|
270 \hgxcmd{extdiff}{extdiff} actúa de forma similar a como lo hace la
|
igor@453
|
271 orden \hgcmd{diff} de Mercurial: usted usa los mismos nombres de
|
igor@453
|
272 opciones, sintaxis y argumentos para especificar las revisiones y los
|
igor@453
|
273 ficheros que quiere, y así sucesivamente.
|
igor@453
|
274
|
igor@453
|
275 Por ejemplo, para ejecutar la orden usual del sistema \command{diff},
|
igor@453
|
276 para lograr que se generen diferencias de contexto (con la opción
|
igor@453
|
277 \cmdopt{diff}{-c}) en lugar de diferencias unificadas, y cinco líneas
|
jerojasro@520
|
278 de contexto en lugar de las tres predeterminadas (pasando \texttt{5}
|
igor@453
|
279 como argumento a la opción \cmdopt{diff}{-C}).
|
jerojasro@336
|
280 \interaction{extdiff.extdiff-ctx}
|
jerojasro@336
|
281
|
igor@453
|
282 Es sencillo lanzar unas herramienta usual de diferencias. Para lanzar
|
igor@453
|
283 el visor \command{kdiff3}:
|
jerojasro@336
|
284 \begin{codesample2}
|
jerojasro@336
|
285 hg extdiff -p kdiff3 -o ''
|
jerojasro@336
|
286 \end{codesample2}
|
jerojasro@336
|
287
|
igor@453
|
288 Si su orden para visualizar diferencias no puede tratar con
|
igor@453
|
289 directorios, puede usar un poco de scripting para lograrlo. Un
|
igor@453
|
290 ejemplo de un script con la extensión \hgext{mq} junto con la orden
|
igor@453
|
291 \command{interdiff} está en la sección~\ref{mq-collab:tips:interdiff}.
|
igor@453
|
292
|
igor@453
|
293 \subsection{Definición de alias de comandos}
|
jerojasro@336
|
294
|
igor@454
|
295 Acordarse de todas las opciones de las órdenes
|
igor@454
|
296 \hgxcmd{extdiff}{extdiff} y el visor de diferencias de su preferencia
|
igor@454
|
297 puede ser dispendioso, y por lo tanto la extensión \hgext{extdiff} le
|
igor@454
|
298 permite definir \emph{nuevas} órdenes que invocarán su visor de
|
igor@454
|
299 diferencias con las opciones exactas.
|
igor@454
|
300
|
igor@454
|
301 Basta con editar su fichero \hgrc, y añadir una sección llamada
|
igor@454
|
302 \rcsection{extdiff}. Dentro de esta sección puede definir varias
|
igor@454
|
303 órdenes. Mostraremos como añadir la orden \texttt{kdiff3}. Después de
|
igor@454
|
304 definido, puede teclear ``\texttt{hg kdiff3}'' y la extensión a
|
igor@454
|
305 \hgext{extdiff} ejecutará la orden \command{kdiff3}.
|
jerojasro@336
|
306 \begin{codesample2}
|
jerojasro@336
|
307 [extdiff]
|
jerojasro@336
|
308 cmd.kdiff3 =
|
jerojasro@336
|
309 \end{codesample2}
|
igor@454
|
310 Si deja vacía la porción derecha de la definición, como en el ejemplo,
|
igor@454
|
311 la extensión \hgext{extdiff} usa el nombre de la orden se definirá
|
igor@454
|
312 como el nombre del programa externo a ejecutar. Pero tales nombres no
|
igor@454
|
313 tienen por qué ser iguales. Definimos ahora la orden llamada
|
igor@454
|
314 ``\texttt{hg wibble}'', que ejecuta \command{kdiff3}.
|
jerojasro@336
|
315 \begin{codesample2}
|
jerojasro@336
|
316 [extdiff]
|
jerojasro@336
|
317 cmd.wibble = kdiff3
|
jerojasro@336
|
318 \end{codesample2}
|
jerojasro@336
|
319
|
igor@454
|
320 También puede especificar las opciones predeterminadas con las cuales
|
igor@454
|
321 desea invocar el visor de diferencias. Se usa el prefijo ``\texttt{opts.}'',
|
igor@454
|
322 seguido por el nombre de la orden a la cual se aplican las opciones.
|
igor@454
|
323 En este ejemplos se define la orden ``\texttt{hg vimdiff}'' que
|
igor@454
|
324 ejecuta la extensión \texttt{DirDiff} del editor \command{vim}.
|
jerojasro@336
|
325 \begin{codesample2}
|
jerojasro@336
|
326 [extdiff]
|
jerojasro@336
|
327 cmd.vimdiff = vim
|
jerojasro@336
|
328 opts.vimdiff = -f '+next' '+execute "DirDiff" argv(0) argv(1)'
|
jerojasro@336
|
329 \end{codesample2}
|
jerojasro@336
|
330
|
igor@454
|
331 \section{Uso de la extensión \hgext{transplant} para seleccionar}
|
jerojasro@336
|
332 \label{sec:hgext:transplant}
|
jerojasro@336
|
333
|
jerojasro@336
|
334 Need to have a long chat with Brendan about this.
|
jerojasro@336
|
335
|
igor@454
|
336 \section{Enviar cambios vía correo electrónico con la extensión \hgext{patchbomb}}
|
jerojasro@336
|
337 \label{sec:hgext:patchbomb}
|
jerojasro@336
|
338
|
igor@454
|
339 Varios proyectos tienen la cultura de ``revisión de cambios'', en la
|
igor@454
|
340 cual la gente envía sus modificaciones a una lista de correo para que
|
igor@454
|
341 otros las lean y comenten antes de consignar la versión final a un
|
igor@454
|
342 repositorio compartido. Algunos proyectos tienen personas que actúan
|
igor@454
|
343 como cancerberos; ellos aplican los cambios de otras personas a un
|
igor@454
|
344 repositorio para aquellos que no tienen acceso.
|
igor@454
|
345
|
igor@454
|
346 Mercurial facilita enviar cambios por correo para revisión o
|
igor@454
|
347 aplicación gracias a su extensión \hgext{patchbomb}. La extensión es
|
igor@454
|
348 tan popular porque los cambios se formatean como parches y es usual
|
igor@454
|
349 que se envía un conjunto de cambios por cada correo. Enviar una gran
|
igor@454
|
350 cantidad de cambios por correos se llama por tanto ``bombardear'' el
|
igor@454
|
351 buzón de entrada del destinatario, de ahí su nombre ``bombardeo de
|
igor@454
|
352 parches''.
|
jerojasro@336
|
353
|
igor@455
|
354 Como es usual, la configuración básica de la extensión
|
igor@455
|
355 \hgext{patchbomb} consta de una o dos líneas en su \hgrc.
|
jerojasro@336
|
356 \begin{codesample2}
|
jerojasro@336
|
357 [extensions]
|
jerojasro@336
|
358 patchbomb =
|
jerojasro@336
|
359 \end{codesample2}
|
igor@455
|
360 Cuando haya habilitado la extensión, dispondrá de una nueva orden,
|
igor@455
|
361 llamada \hgxcmd{patchbomb}{email}.
|
igor@455
|
362
|
igor@455
|
363 La forma mejor y más segura para invocar la orden
|
igor@455
|
364 \hgxcmd{patchbomb}{email} es ejecutarla \emph{siempre} con la opción
|
igor@455
|
365 \hgxopt{patchbomb}{email}{-n}; que le mostrará lo que la orden
|
igor@455
|
366 \emph{enviaría}, sin enviar nada. Una vez que haya dado un vistazo a
|
igor@455
|
367 los cambios y verificado que está enviando los correctos, puede volver
|
igor@455
|
368 a ejecutar la misma orden, sin la opción \hgxopt{patchbomb}{email}{-n}.
|
igor@455
|
369
|
igor@455
|
370 La orden \hgxcmd{patchbomb}{email} acepta la misma clase de sintaxis
|
igor@455
|
371 de revisiones como cualquier otra orden de Mercurial. Por ejemplo,
|
igor@455
|
372 enviará todas las revisiones entre la 7 y la \texttt{punta}, inclusive.
|
jerojasro@336
|
373 \begin{codesample2}
|
jerojasro@336
|
374 hg email -n 7:tip
|
jerojasro@336
|
375 \end{codesample2}
|
igor@455
|
376 También puede especificar un \emph{repositorio} para comparar. Si
|
igor@455
|
377 indica un repositoro sin revisiones, la orden \hgxcmd{patchbomb}{email}
|
igor@455
|
378 enviará todas las revisiones en el repositorio local que no están
|
igor@455
|
379 presentes en el repositorio remoto. Si especifica revisiones
|
jerojasro@520
|
380 adicionalmente o el nombre de una rama (la última con la opción
|
igor@455
|
381 \hgxopt{patchbomb}{email}{-b}), respetará las revisiones enviadas.
|
igor@455
|
382
|
igor@455
|
383 Ejecutar la orden \hgxcmd{patchbomb}{email} sin los nombres de
|
igor@455
|
384 aquellas personas a las cuales desea enviar el correo es completamente
|
igor@455
|
385 seguro: si lo hace, solicitará tales valores de forma interactiva.
|
igor@455
|
386 (Si está usando Linux o un sistema tipo Unix, tendrá capacidades
|
igor@455
|
387 estilo--\texttt{readline} aumentadas cuando ingrese tales encabezados,
|
igor@455
|
388 lo cual es sumamente útil.)
|
igor@455
|
389
|
igor@455
|
390 Cuando envíe una sola revisión, la orden \hgxcmd{patchbomb}{email}
|
igor@455
|
391 de forma predeterminada usará la primera línea de descripción del
|
igor@455
|
392 conjunto de cambios como el tema del único mensaje que se enviará.
|
igor@455
|
393
|
igor@455
|
394 Si envía varias revisiones, la orden \hgxcmd{patchbomb}{email} enviará
|
jerojasro@525
|
395 normalmente un mensaje por conjunto de cambios. Colocará como
|
igor@455
|
396 prefacio un mensaje introductorio en el cual usted debería describir
|
igor@455
|
397 el propósito de la serie de cambios que está enviando.
|
igor@455
|
398
|
igor@455
|
399 \subsection{Cambiar el comportamiento de las bombas de parches}
|
igor@455
|
400
|
igor@455
|
401 Cada proyecto tiene sus propias convenciones para enviar cambios en un
|
igor@455
|
402 correo electrónico; la extensión \hgext{patchbomb} intenta acomodarse
|
igor@455
|
403 a diferentes variaciones gracias a las opciones de la línea de órdenes:
|
jerojasro@336
|
404 \begin{itemize}
|
igor@455
|
405 \item Puede escribir un tema para el mensaje introductorio en la línea
|
igor@455
|
406 de órdenes con la opciń \hgxopt{patchbomb}{email}{-s}. Toma un
|
igor@455
|
407 argumento: el tema del mensaje a usar.
|
igor@455
|
408 \item Para cambiar el correo electrónico del campo del cual se
|
igor@455
|
409 origina, use la opción \hgxopt{patchbomb}{email}{-f}. Toma un
|
igor@455
|
410 argumento, el correo electrónico a usar.
|
igor@455
|
411 \item El comportamiento predeterminado es enviar diferencias
|
igor@455
|
412 unificadas (consulte la sección~\ref{sec:mq:patch} si desea una
|
igor@455
|
413 descripción del formato), una por mensaje. Puede enviar un conjunto
|
igor@455
|
414 binario\ndt{binary bundle} con la opción \hgxopt{patchbomb}{email}{-b}.
|
igor@455
|
415 \item Las diferencias unificadas están precedidas por un encabezado de
|
igor@455
|
416 metadatos. Puede omitirlo, y enviar diferencias sin adornos con la
|
igor@455
|
417 opción \hgxopt{patchbomb}{email}{--plain}.
|
igor@455
|
418 \item Las diferencias usualmente se envían ``en línea'', como parte
|
igor@455
|
419 del cuerpo del mensaje con la descripción del parche. Que facilita a
|
igor@455
|
420 a la mayor cantidad de lectores citar y responder partes de un diff,
|
igor@455
|
421 dado que algunos clientes de correo solamente citarán la primera
|
igor@455
|
422 parte MIME del cuerpo de un mensaje. Si prefiere enviar la
|
igor@455
|
423 descripción y el diff en partes separadas del cuerpo, use la opción
|
igor@455
|
424 \hgxopt{patchbomb}{email}{-a}.
|
igor@455
|
425 \item En lugar de enviar mensajes de correo puede escribirlos a un
|
igor@455
|
426 fichero con formato-\texttt{mbox}- con la opción
|
igor@455
|
427 \hgxopt{patchbomb}{email}{-m}. La opción recibe un argumento, el
|
igor@455
|
428 nombre del fichero en el cual escribir.
|
igor@455
|
429 \item Si desea añadir un resumen con formato-\command{diffstat} en
|
igor@455
|
430 cada parche, y uno como mensaje introductorio, use la opción
|
igor@455
|
431 \hgxopt{patchbomb}{email}{-d}. La orden \command{diffstat}
|
igor@455
|
432 despliega una tabla que contiene el nombre de cada fichero parchado,
|
igor@455
|
433 el número de líneas afectadas, y un historgrama mostrando cuánto ha
|
igor@455
|
434 sido modificado cada fichero. Lo cual ofrece a los lectores una
|
igor@455
|
435 mirada cuantitativa de cuan complejo es el parche.
|
jerojasro@336
|
436 \end{itemize}
|
jerojasro@336
|
437
|
jerojasro@336
|
438 %%% Local Variables:
|
jerojasro@336
|
439 %%% mode: latex
|
jerojasro@336
|
440 %%% TeX-master: "00book"
|
jerojasro@336
|
441 %%% End:
|