Mercurial > hgbook
annotate es/mq-collab.tex @ 746:d0160b0b1a9e
Merge with http://hg.serpentine.com/mercurial/book
author | Dongsheng Song <dongsheng.song@gmail.com> |
---|---|
date | Wed, 18 Mar 2009 20:32:37 +0800 |
parents | 9da096de3c52 |
children |
rev | line source |
---|---|
580
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
1 \chapter{Usos avanzados de las Colas de Mercurial} |
435 | 2 \label{chap:mq-collab} |
3 | |
580
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
4 Auunque es fácil aprender los usos más directos de las Colas de |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
5 Mercurial, tener algo de disciplina junto con algunas de las |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
6 capacidadees menos usadas de MQ hace posible trabajar en entornos de |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
7 desarrollo complejos. |
435 | 8 |
580
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
9 En este capítulo, usaré como ejemplo una técnica que he usado para |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
10 administrar el desarrollo de un controlador de dispositivo Infiniband |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
11 para el kernel de Linux. El controlador en cuestión es grande |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
12 (al menos en lo que se refiere a controladores), con 25,000 líneas de |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
13 código esparcidas en 35 ficheros fuente. Es mantenido por un equipo |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
14 pequeño de desarrolladores. |
435 | 15 |
580
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
16 Aunque mucho del material en este capítulo es específico de Linux, los |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
17 mismos principios aplican a cualquier base de código de la que usted |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
18 no sea el propietario principal, y sobre la que usted necesita hacer |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
19 un montón de desarrollo. |
435 | 20 |
580
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
21 \section{El problema de múltiples objetivos} |
435 | 22 |
580
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
23 El kernel de Linux cambia con rapidez, y nunca ha sido estable |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
24 internamente; los desarrolladores hacen cambios drásticos entre |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
25 %TODO no encontré una traducción adecuada para "release". Por eso el |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
26 %cambio |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
27 versiones frecuentemente. Esto significa que una versión del |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
28 controlador que funciona bien con una versión particular del kernel ni |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
29 siquiera \emph{compilará} correctamente contra, típicamente, cualquier |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
30 otra versión. |
435 | 31 |
580
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
32 Para mantener un controlador, debemos tener en cuenta una buena |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
33 cantidad de versiones de Linux en mente. |
435 | 34 \begin{itemize} |
580
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
35 \item Un objetivo es el árbol de desarrollo principal del kernel de |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
36 Linux. En este caso el mantenimiento del código es compartido |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
37 parcialmente por otros desarrolladores en la comunidad del kernel, |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
38 %TODO drive-by. |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
39 quienes hacen modificaciones ``de-afán'' al controlador a medida que |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
40 desarrollan y refinan subsistemas en el kernel. |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
41 %TODO backport |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
42 \item También mantenemos algunos ``backports'' para versiones antiguas |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
43 del kernel de Linux, para dar soporte a las necesidades de los |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
44 clientes que están corriendo versiones antiguas de Linux que no |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
45 incorporan nuestros controladores. (Hacer el \emph{backport} de un |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
46 pedazo de código es modificarlo para que trabaje en una versión |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
47 de su entorno objetivo anterior a aquella para la cual fue escrito.) |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
48 \item Finalmente, nosotros liberamos nuestro software de acuerdo a un |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
49 cronograma que no necesariamente está alineado con el que usan los |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
50 distribuidores de Linux y los desarrolladores del kernel, así que |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
51 podemos entregar nuevas características a los clientes sin forzarlos |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
52 a actualizar kernels completos o distribuciones. |
435 | 53 \end{itemize} |
54 | |
580
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
55 \subsection{Aproximaciones tentadoras que no funcionan adecuadamente} |
435 | 56 |
580
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
57 Hay dos maneras estándar de mantener una porción de software que debe |
6cf30b3ed48f
translated some paragraphs
Javier Rojas <jerojasro@devnull.li>
parents:
435
diff
changeset
|
58 funcionar en muchos entornos diferentes. |
435 | 59 |
584 | 60 La primera es mantener varias ramas, cada una pensada para un único |
61 entorno. El problema de esta aproximación es que usted debe tener una | |
62 disciplina férrea con el flujo de cambios entre repositorios. Una | |
63 nueva característica o un arreglo de fallo deben empezar su vida en un | |
64 repositorio ``prístino'', y luego propagarse a cada repositorio de | |
65 backport. Los cambios para backports están más limitados respecto a | |
66 las ramas a las que deberían propagarse; un cambio para backport que | |
67 es aplicado a una rama en la que no corresponde probablemente hará que | |
68 el controlador no compile. | |
69 | |
70 La segunda es mantener un único árbol de código fuente lleno de | |
71 declaraciones que activen o desactiven secciones de código dependiendo | |
72 del entorno objetivo. Ya que estos ``ifdefs'' no están permitidos en | |
73 el árbol del kernel de Linux, debe seguirse algún proceso manual o | |
74 automático para eliminarlos y producir un árbol limpio. Una base de | |
75 código mantenida de esta manera se convierte rápidamente en un nido de | |
76 ratas de bloques condicionales que son difíciles de entender y | |
77 mantener. | |
435 | 78 |
584 | 79 %TODO canónica? |
80 Ninguno de estos enfoques es adecuado para situaciones en las que | |
81 usted no es ``dueño'' de la copia canónica de un árbol de fuentes. En | |
82 el caso de un controlador de Linux que es distribuido con el kernel | |
83 estándar, el árbol de Linux contiene la copia del código que será | |
84 considerada por el mundo como la canónica. La versión oficial de | |
85 ``mi'' controlador puede ser modificada por gente que no conozco, sin | |
86 que yo siquiera me entere de ello hasta después de que los cambios | |
87 aparecen en el árbol de Linus. | |
435 | 88 |
584 | 89 Estos enfoques tienen la debilidad adicional de dificultar la |
90 %TODO upstream. no no es río arriba | |
91 generación de parches bien formados para enviarlos a la versión | |
92 oficial. | |
435 | 93 |
584 | 94 En principio, las Colas de Mercurial parecen ser un buen candidato |
95 para administrar un escenario de desarrollo como el de arriba. Aunque | |
96 este es de hecho el caso, MQ tiene unas cuantas características | |
97 adicionales que hacen el trabajo más agradable. | |
435 | 98 |
588 | 99 \section{Aplicar parches condicionalmente mediante guardias} |
435 | 100 |
588 | 101 Tal vez la mejor manera de conservar la cordura con tantos entornos |
102 objetivo es poder escoger parches específicos para aplicar para cada | |
103 situación. MQ provee una característica llamada ``guardias'' | |
104 (que se origina del comando \texttt{guards} de Quilt) que hace | |
105 precisamente ésto. Para empezar, creemos un repositorio sencillo para | |
106 experimentar. | |
435 | 107 \interaction{mq.guards.init} |
588 | 108 Esto nos brinda un pequeño repositorio que contiene dos parches que no |
109 tienen ninguna dependencia respecto al otro, porque tocan ficheros | |
110 diferentes. | |
435 | 111 |
588 | 112 La idea detrás de la aplicación condicional es que usted puede |
113 ``etiquetar'' un parche con un \emph{guardia}, que simplemente es una | |
114 cadena de texto de su elección, y luego decirle a MQ que seleccione | |
115 guardias específicos para usar cuando aplique parches. MQ entonces | |
116 aplicará, u omitirá, un parche vigilado, dependiendo de los guardias | |
117 que usted haya seleccionado. | |
435 | 118 |
588 | 119 Un parche puede tener una cantidad arbitraria de guardias; cada uno es |
120 \emph{positivo} (``aplique el parche si este guardia es | |
121 seleccionado'') o \emph{negativo} (``omita este parche si este guardia | |
122 es seleccionado''). Un parche sin guardias siempre es aplicado. | |
435 | 123 |
589
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
124 \section{Controlar los guardias de un parche} |
435 | 125 |
590
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
126 %TODO tal vez no decir determinar, sino definir? |
589
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
127 El comando \hgxcmd{mq}{qguard} le permite determinar qué guardias |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
128 deben aplicarse a un parche, o mostrar los guardias que están en |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
129 efecto. Sin ningún argumento, el comando muestra los guardias del |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
130 parche actual de la parte más alta de la pila. |
435 | 131 \interaction{mq.guards.qguard} |
589
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
132 Para poner un guardia positivo en un parche, prefije el nombre del |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
133 guardia con un ``\texttt{+}''. |
435 | 134 \interaction{mq.guards.qguard.pos} |
589
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
135 Para poner un guardia negativo en un parche, prefije el nombre del |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
136 guardia con un ``\texttt{-}''. |
435 | 137 \interaction{mq.guards.qguard.neg} |
138 | |
139 \begin{note} | |
589
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
140 El comando \hgxcmd{mq}{qguard} \emph{pone} los guardias en un |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
141 parche; no los \emph{modifica}. Esto significa que si usted ejecuta |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
142 \hgcmdargs{qguard}{+a +b} sobre un parche, y luego |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
143 \hgcmdargs{qguard}{+c} en el mismo parche, el único guardia sobre el |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
144 parche después del comando será \texttt{+c}. |
435 | 145 \end{note} |
146 | |
589
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
147 Mercurial almacena los guardias en el fichero \sfilename{series}; la |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
148 forma en que son almacenados es fácil tanto de entender como de editar |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
149 a mano. (En otras palabras, usted no tiene que usar el comando |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
150 \hgxcmd{mq}{qguard} si no lo desea; está bien simplemente editar el |
254888ffaf0a
translated another section
Javier Rojas <jerojasro@devnull.li>
parents:
588
diff
changeset
|
151 fichero \sfilename{series}) |
435 | 152 \interaction{mq.guards.series} |
153 | |
590
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
154 \section{Selecccionar los guardias a usar} |
435 | 155 |
590
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
156 %TODO tal vez no decir determinar, sino definir? |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
157 El comando \hgxcmd{mq}{qselect} determina qué guardias están activos |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
158 en cualquier momento. El efecto de esto es determinar qué parches |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
159 aplicará MQ la próxima vez que usted ejecute \hgxcmd{mq}{qpush}. No |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
160 tiene ningún otro efecto; en particular, no hace nada a los parches |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
161 que ya han sido aplicados. |
435 | 162 |
590
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
163 Sin argumentos, el comando \hgxcmd{mq}{qselect} lista los guardias en |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
164 efecto actualmente, uno por cada línea de salida. Cada argumento es |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
165 tratado como el nombre de un guardia a aplicar. |
435 | 166 \interaction{mq.guards.qselect.foo} |
590
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
167 Si está interesado, los guardias seleccionados actualmente están |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
168 almacenados en el fichero \sfilename{guards}. |
435 | 169 \interaction{mq.guards.qselect.cat} |
590
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
170 Podemos ver el efecto que tienen los guardias seleccionados cuando |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
171 ejecutamos \hgxcmd{mq}{qpush}. |
435 | 172 \interaction{mq.guards.qselect.qpush} |
173 | |
590
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
174 Un guardia no puede empezar con un caracter ``\texttt{+}'' o |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
175 ``\texttt{-}''. El nombre del guardia no debe contener espacios en |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
176 blanco, pero muchos otros caracteres son aceptables. Si usted trata de |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
177 usar un guardia con un nombre inválido, MQ se quejará: |
435 | 178 \interaction{mq.guards.qselect.error} |
590
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
179 Cambiar los guardias seleccionados cambia los parches que son |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
180 aplicados. |
435 | 181 \interaction{mq.guards.qselect.quux} |
590
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
182 Usted puede ver en el ejemplo de abajo que los guardias negativos |
795f2964e104
translated section 13.4
Javier Rojas <jerojasro@devnull.li>
parents:
589
diff
changeset
|
183 tienen precedencia sobre los guardias positivos. |
435 | 184 \interaction{mq.guards.qselect.foobar} |
185 | |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
186 \section{Reglas de MQ para aplicar parches} |
435 | 187 |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
188 Las reglas que MQ usa para decidir si debe aplicar un parche son las |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
189 siguientes. |
435 | 190 \begin{itemize} |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
191 \item Un parche sin guardias es aplicado siempre. |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
192 \item Si el parche tiene algún guardia negativo que corresponda con |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
193 cualquiera de los guardias seleccionados, se salta el parche. |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
194 \item Si el parche tiene algún guardia positivo que corresponda con |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
195 cualquiera de los guardias seleccionados, se aplica el parche. |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
196 \item Si el parche tiene guardias positivos o negativos, pero ninguno |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
197 corresponde con cualquiera de los guardias seleccionados, se salta |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
198 el parche. |
435 | 199 \end{itemize} |
200 | |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
201 \section{Podar el entorno de trabajo} |
435 | 202 |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
203 En el trabajo del controlador de dispositivo que mencioné |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
204 anteriormente, yo no aplico los parches a un árbol normal del kernel |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
205 de Linux. En cambio, uso un repositorio que sólo contiene una |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
206 instantánea de los ficheros fuente y de cabecera que son relevantes |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
207 para el desarrollo de Infiniband. Este repositorio tiene un~1\% del |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
208 tamaño del repositorio del kernel, por lo que es más fácil trabajar |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
209 con él. |
435 | 210 |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
211 Luego escojo una versión ``base'' sobre la cual son aplicados los |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
212 parches. Es una instantánea del árbol del kernel de Linux en una |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
213 revisión de mi elección. Cuando tomo la instantánea, almaceno el ID de |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
214 conjunto de cambios en el mensaje de consignación. Ya que la |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
215 instantánea preserva la ``forma'' y el contenido de las partes |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
216 relevantes del árbol del kernel, puedo aplicar mis parches sobre mi |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
217 pequeño repositorio o sobre un árbol normal del kernel. |
435 | 218 |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
219 Normalmente, el árbol base sobre el que se aplican los parches debería |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
220 ser una instantánea de un árbol de desarrollo muy reciente. Esto |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
221 facilita mucho el desarrollo de parches que puedan ser enviados al |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
222 árbol oficial con pocas o ninguna modificación. |
435 | 223 |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
224 \section{Dividir el fichero \sfilename{series}} |
435 | 225 |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
226 Yo categorizo los parches en el fichero \sfilename{series} en una |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
227 serie de grupos lógicos. Cada sección de parches similares empieza con |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
228 un bloque de comentarios que describen el propósito de los parches que |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
229 le siguen. |
435 | 230 |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
231 La secuencia de grupos de parches que mantengo se muestra a |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
232 continuación. El orden de los grupos es importante; explicaré porqué |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
233 luego de que presente los grupos. |
435 | 234 \begin{itemize} |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
235 \item El grupo ``aceptado''. Son parches que el equipo de desarrollo |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
236 ha enviado al mantenedor del subsistema Infiniband, y que él ha |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
237 aceptado, pero que no están presentes en la instantánea en la cual |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
238 está basada el repositorio pequeño. Estos son parches de |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
239 ``sólo lectura'', presentes únicamente para transformar el árbol en |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
240 un estado similar al del repositorio del mantenedor oficial. |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
241 \item El grupo ``revisar''. Parches que yo he enviado, pero sobre los |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
242 que que el mantenedor oficial ha solicitado modificaciones antes de |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
243 aceptarlos. |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
244 \item El grupo ``pendiente''. Parches que no he enviado al mantenedor |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
245 oficial, pero que ya están terminados. Estos parches serán de |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
246 ``sólo lectura'' por un buen tiempo. Si el mantenedor oficial los |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
247 acepta cuando los envíe, los moveré al final del grupo ``aceptado''. |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
248 Si él solicita que modificaciones en alguno de ellos, los moveré al |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
249 principio del grupo ``revisar''. |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
250 \item El grupo ``en proceso''. Parches que están siendo activamente |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
251 desarrollados, y no deberían ser enviados a ninguna parte aún. |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
252 \item El grupo ``backport''. Parches que adaptan el árbol de fuentes a |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
253 versiones antiguas del árbol del kernel. |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
254 \item El grupo ``no enviar''. Parches que por alguna razón nunca deben |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
255 ser enviados al mantenedor oficial del kernel. Por ejemplo, alguno |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
256 de esos parches podría cambiar las cadenas de identificación |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
257 embebidas del controlador para hacer más fácil la distinción, en |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
258 pruebas de campo, entre una versión del controlador de |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
259 salida-del-árbol y una versión entregada por un vendedor de alguna |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
260 distribución. |
435 | 261 \end{itemize} |
262 | |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
263 Ahora volvemos a las razones para ordenar los grupos de parches en |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
264 esta manera. Quisiéramos que los parches del fondo de la pila sean tan |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
265 estables como sea posible, para no tener que revisar parches más |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
266 arriba debido a cambios de contexto. Poner los parches que nunca |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
267 cambiarán en el primer lugar del fichero \sfilename{series} sirve a |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
268 este propósito. |
435 | 269 |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
270 También desearíamos que los parches que sabemos que debemos modificar |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
271 sean aplicados sobre un árbol de fuentes que se parezca al oficial |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
272 tanto como sea posible. Es por esto que mantenemos los parches |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
273 aceptados disponibles por una buena cantidad de tiempo. |
435 | 274 |
593
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
275 Los parches ``backport'' y ``no enviar'' flotan al final del fichero |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
276 \sfilename{series}. Los parches de backport deben ser aplicados encima |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
277 de todos los otros parches, y los parches ``no enviar'' pueden |
f89480678965
translated section 13.7
Javier Rojas <jerojasro@devnull.li>
parents:
590
diff
changeset
|
278 perfectamente quedarse fuera del camino. |
435 | 279 |
594
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
280 \section{Mantener la serie de parches} |
435 | 281 |
594
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
282 En mi trabajo, uso varios guardias para controlar qué parches deben |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
283 ser aplicados. |
435 | 284 |
285 \begin{itemize} | |
594
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
286 \item Los parches ``aceptados'' son vigilados con |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
287 \texttt{accepted}. Yo habilito este guardia la mayoría de las veces. |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
288 Cuando aplico los parches sobre un árbol donde los parches ya están |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
289 %TODO no será ``desactivar este guardia''? si sí, corregir versión |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
290 %en inglés también |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
291 presentes, puedo desactivar este parche, y los parches que lo siguen |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
292 se aplicarán sin problemas. |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
293 \item Los parches que están ``terminados'', pero no han sido enviados, |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
294 no tienen guardias. Si estoy aplicando la pila de parches a una |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
295 copia del árbol oficial, no necesito habilitar ningún guardia para |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
296 obtener un árbol de fuentes razonablemente seguro. |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
297 \item Los parches que necesitan revisión antes de ser reenviados |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
298 tienen el guardia \texttt{rework}. |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
299 \item Para aquellos parches que aún están bajo desarrollo, uso |
435 | 300 \texttt{devel}. |
594
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
301 \item Un parche de backport puede tener varios guardias, uno para cada |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
302 versión del kernel a la que aplica. Por ejemplo, un parche que hace |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
303 backport de un segmento de código a~2.6.9 tendrá un guardia~\texttt{2.6.9}. |
435 | 304 \end{itemize} |
594
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
305 La variedad de guardias me brinda una flexibilidad considerable para |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
306 determinar qué tipo de árbol de fuentes acabaré por obtener. En la |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
307 mayoría de las situaciones, la selección de guardias apropiados es |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
308 automatizada durante el proceso de compilación, pero puedo ajustar |
dfa2890d9b30
translated most of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
593
diff
changeset
|
309 manualmente los guardias a usar para circunstancias poco comunes. |
435 | 310 |
596
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
311 \subsection{El arte de escribir parches de backport} |
435 | 312 |
596
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
313 Al usar MQ, escribir un parche de backport es un proceso simple. Todo |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
314 lo que dicho parche debe hacer es modificar una sección de código que |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
315 usa una característica del kernel que no está presente en la versión |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
316 anterior del kernel, para que el controlador siga funcionando |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
317 correctamente en esa versión anterior. |
435 | 318 |
596
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
319 Una meta útil al escribir un buen parche de backport es hacer parecer |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
320 que el código hubiera sido escrito para la versión vieja del kernel |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
321 que usted tiene como objetivo. Entre menos intrusivo el parche, más |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
322 fácil será entenderlo y mantenerlo. Si usted está escribiendo una |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
323 colección de parches de backport para evitar el efecto de ``nido de |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
324 ratas'' de tener muchos \texttt{\#ifdef}s (secciones de código fuente |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
325 que sólo son usados condicionalmente) en su código, no introduzca |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
326 \texttt{\#ifdef}s dependientes de versiones específicas en los |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
327 parches. En vez de eso, escriba varios parches, cada uno de ellos |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
328 haciendo cambios incondicionales, y controle su aplicación usando |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
329 guardias. |
435 | 330 |
596
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
331 Hay dos razones para ubicar los parches de backport en un grupo |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
332 diferente, aparte de los parches ``regulares'' cuyos efectos son |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
333 modificados por ellos. La primera es que mezclar los dos hace más |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
334 difícil usar herramientas como la extensión \hgext{patchbomb} para |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
335 automatizar el proceso de enviar los parches a un mantenedor oficial. |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
336 La segunda es que un parche de backport puede perturbar el contexto en |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
337 el que se aplica un parche regular subsecuente, haciendo imposible |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
338 aplicar el parche normal limpiamente \emph{sin} que el parche de |
58dbbfef964f
translated all of section 13.8
Javier Rojas <jerojasro@devnull.li>
parents:
594
diff
changeset
|
339 backport sea aplicado antes. |
435 | 340 |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
341 \section{Consejos útiles para hacer desarrollo con MQ} |
435 | 342 |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
343 \subsection{Organizar parches en directorios} |
435 | 344 |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
345 Si está trabajando en un proyecto grande con MQ, no es difícil |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
346 acumular un gran número de parches. Por ejemplo, tengo un repositorio |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
347 de parches que contiene más de 250 parches. |
435 | 348 |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
349 Si usted puede agrupar estos parches en categorías lógicas separadas, |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
350 usted puede almacenarlos en diferentes directorios si lo desea; MQ no |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
351 tiene problemas manejando nombres de parches que contienen separadores |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
352 de ruta. |
435 | 353 |
615
9da096de3c52
changed "historia" to "historial".
Javier Rojas <jerojasro@devnull.li>
parents:
597
diff
changeset
|
354 \subsection{Ver el historial de un parche} |
435 | 355 \label{mq-collab:tips:interdiff} |
356 | |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
357 Si usted está desarrollando un conjunto de parches en un período de |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
358 tiempo grande, es una buena idea mantenerlos en un repositorio, como |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
359 se discutió en la sección~\ref{sec:mq:repo}. Si lo hace, notará |
615
9da096de3c52
changed "historia" to "historial".
Javier Rojas <jerojasro@devnull.li>
parents:
597
diff
changeset
|
360 rápidamente que usar el comando \hgcmd{diff} para mirar el historial |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
361 del repositorio no es viable. Esto es debido en parte a que usted está |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
362 mirando la segunda derivada del código real (el diff de un diff), pero |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
363 también porque MQ añade ruido al proceso al modificar las marcas de |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
364 tiempo y los nombres de directorio cuando actualiza un parche. |
435 | 365 |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
366 Sin embargo, usted puede usar la extensión \hgext{extdiff}, que es |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
367 provisto junto con Mercurial, para convertir un diff de dos versiones |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
368 de un parche en algo legible. Para hacer esto, usted necesitará un |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
369 paquete de un tercero llamado |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
370 \package{patchutils}~\cite{web:patchutils}. Éste paquete provee un |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
371 comando llamado \command{interdiff}, que muestra las diferencias entre |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
372 dos diffs como un diff. Al usarlo en dos versiones del mismo diff, |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
373 genera un diff que representa el diff de la primera a la segunda |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
374 versión. |
435 | 375 |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
376 Usted puede habilitar la extensión \hgext{extdiff} de la manera usual, |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
377 añadiendo una línea a la sección \rcsection{extensions} de su \hgrc. |
435 | 378 \begin{codesample2} |
379 [extensions] | |
380 extdiff = | |
381 \end{codesample2} | |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
382 El comando \command{interdiff} espera recibir los nombres de dos |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
383 ficheros, pero la extensión \hgext{extdiff} le pasa un par de |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
384 directorios al programa que ejecuta, cada uno de los cuales puede |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
385 contener una cantidad arbitraria de ficheros. Por esto necesitamos un |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
386 programa pequeño que ejecute \command{interdiff} en cada par de |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
387 ficheros de estos dos directorios. Este programa está disponible como |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
388 \sfilename{hg-interdiff} en el directorio \dirname{examples} del |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
389 repositorio de código fuente que acompaña a este libro. |
435 | 390 \excode{hg-interdiff} |
391 | |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
392 Con el programa \sfilename{hg-interdiff} en la ruta de búsqueda de su |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
393 intérprete de comandos, puede ejecutarlo como sigue, desde dentro de |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
394 un directorio de parches MQ: |
435 | 395 \begin{codesample2} |
396 hg extdiff -p hg-interdiff -r A:B my-change.patch | |
397 \end{codesample2} | |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
398 Ya que usted seguramente querrá usar este comando tan largo a menudo, |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
399 puede hacer que \hgext{hgext} lo haga disponible como un comando |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
400 normal de Mercurial, editando de nuevo su \hgrc. |
435 | 401 \begin{codesample2} |
402 [extdiff] | |
403 cmd.interdiff = hg-interdiff | |
404 \end{codesample2} | |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
405 Esto le indica a \hgext{hgext} que ponga a disposición un comando |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
406 \texttt{interdiff}, con lo que usted puede abreviar la invocación |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
407 anterior de \hgxcmd{extdiff}{extdiff} a algo un poco más manejable. |
435 | 408 \begin{codesample2} |
409 hg interdiff -r A:B my-change.patch | |
410 \end{codesample2} | |
411 | |
412 \begin{note} | |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
413 %TODO revisar redacción |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
414 El comando \command{interdiff} trabaja bien sólo si los ficheros |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
415 contra los cuales son generadas las versiones de un parche se |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
416 mantienen iguales. Si usted crea un parche, modifica los ficheros |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
417 subyacentes, y luego regenera el parche, \command{interdiff} podría |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
418 no producir ningún resultado útil. |
435 | 419 \end{note} |
420 | |
597
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
421 La extensión \hgext{extdiff} es útil para más que solamente mejorar la |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
422 presentación de los parches~MQ. Para leer más acerca de esto, vaya a |
a8cdb3cac133
finished mq-collab and updated the project status table
Javier Rojas <jerojasro@devnull.li>
parents:
596
diff
changeset
|
423 la sección~\ref{sec:hgext:extdiff}. |
435 | 424 |
425 %%% Local Variables: | |
426 %%% mode: latex | |
427 %%% TeX-master: "00book" | |
428 %%% End: |