hgbook

annotate es/hgext.tex @ 516:9da096de3c52

changed "historia" to "historial".
changed "archivo" to "fichero"
corrected some typos
author Javier Rojas <jerojasro@devnull.li>
date Sun Jan 18 21:37:11 2009 -0500 (2009-01-18)
parents d1962e8a986f
children bbc5db74bd77
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
igor@453 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
igor@453 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
igor@455 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á
igor@455 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: