comparison es/hook.tex @ 540:4e0684e824e1

translated up to the tutorial on using hooks
author jerojasro@abu.no-ip.org
date Mon, 08 Dec 2008 11:16:54 -0500
parents 05bfbe50e7e4
children 606295a87ff2
comparison
equal deleted inserted replaced
539:aeda195f54a6 540:4e0684e824e1
124 usted puede, por ejemplo, proveer una instalación ``estándar'' de 124 usted puede, por ejemplo, proveer una instalación ``estándar'' de
125 Mercurial en un sistema de ficheros NFS, y usar un fichero \hgrc\ 125 Mercurial en un sistema de ficheros NFS, y usar un fichero \hgrc\
126 global para definir los ganchos que verán todos los usuarios. Sin 126 global para definir los ganchos que verán todos los usuarios. Sin
127 embargo, este enfoque tiene sus límites; vea más abajo. 127 embargo, este enfoque tiene sus límites; vea más abajo.
128 128
129 \subsection{Hooks can be overridden} 129 \subsection{Es posible hacer caso omiso de los ganchos}
130 130
131 Mercurial allows you to override a hook definition by redefining the 131 Mercurial le permite hacer caso omiso de la deficinión de un gancho,
132 hook. You can disable it by setting its value to the empty string, or 132 a través de la redefinición del mismo. Usted puede deshabilitar el
133 change its behaviour as you wish. 133 gancho fijando su valor como una cadena vacía, o cambiar su
134 134 comportamiento como desee.
135 If you deploy a system-~or site-wide \hgrc\ file that defines some 135
136 hooks, you should thus understand that your users can disable or 136 Si usted instala un fichero \hgrc\ a nivel de sistema o sitio completo
137 override those hooks. 137 que define algunos ganchos, debe entender que sus usuarios pueden
138 138 deshabilitar o hacer caso omiso de los mismos.
139 \subsection{Ensuring that critical hooks are run} 139
140 140 \subsection{Asegurarse de que ganchos críticos sean ejecutados}
141 Sometimes you may want to enforce a policy that you do not want others 141
142 to be able to work around. For example, you may have a requirement 142 Algunas veces usted puede querer hacer respetar una política, y no
143 that every changeset must pass a rigorous set of tests. Defining this 143 permitir que los demás sean capaces de evitarla. Por ejemplo, usted
144 requirement via a hook in a site-wide \hgrc\ won't work for remote 144 puede tener como requerimiento que cada conjunto de cambios debe pasar
145 users on laptops, and of course local users can subvert it at will by 145 un riguroso conjunto de pruebas. Definir este requerimientos a través
146 overriding the hook. 146 de un gancho en un fichero \hgrc\ global no servirá con usuarios
147 147 remotos en computadoras portátiles, y por supuesto que los usuarios
148 Instead, you can set up your policies for use of Mercurial so that 148 locales pueden evitar esto a voluntad haciendo caso omiso del gancho.
149 people are expected to propagate changes through a well-known 149
150 ``canonical'' server that you have locked down and configured 150 En vez de eso, usted puede definir las políticas para usar Mercurial
151 appropriately. 151 de tal forma que se espere que los usuarios propaguen los cambios a
152 152 través de un servidor ``canónico'' bien conocido que usted ha
153 One way to do this is via a combination of social engineering and 153 asegurado y configurado apropiadamente.
154 technology. Set up a restricted-access account; users can push 154
155 changes over the network to repositories managed by this account, but 155 Una manera de hacer esto es a través de una combinación de ingeniería
156 they cannot log into the account and run normal shell commands. In 156 socual y tecnología. Cree una cuenta de acceso restringido; los
157 this scenario, a user can commit a changeset that contains any old 157 usuarios pueden empujar cambios a través de la red a los repositorios
158 garbage they want. 158 administrados por esta cuenta, pero no podrán ingresar a dicha cuenta
159 159 para ejecutar órdenes en el intérprete de comandos. En este escenario,
160 When someone pushes a changeset to the server that everyone pulls 160 un usuario puede enviar un conjunto de cambios que contenga la
161 from, the server will test the changeset before it accepts it as 161 porquería que él desee.
162 permanent, and reject it if it fails to pass the test suite. If 162
163 people only pull changes from this filtering server, it will serve to 163 Cuando alguien empuja un conjunto de cambios al servidor del que todos
164 ensure that all changes that people pull have been automatically 164 jalan, el servidor probará el conjunto de cambios antes de aceptarlo
165 vetted. 165 como permanente, y lo rechazará si no logra pasar el conjunto de
166 166 pruebas. Si la gente sólo jala cambios desde este servidor de filtro,
167 \section{Care with \texttt{pretxn} hooks in a shared-access repository} 167 servirá para asegurarse de que todos los cambios que la gente jala han
168 168 sido examinados automáticamente
169 If you want to use hooks to do some automated work in a repository 169
170 that a number of people have shared access to, you need to be careful 170 \section{Precauciones con ganchos \texttt{pretxn} en un repositorio de
171 in how you do this. 171 acceso compartido}
172 172
173 Mercurial only locks a repository when it is writing to the 173 Si usted desea usar ganchos para llevar a cabo automáticamente algún
174 repository, and only the parts of Mercurial that write to the 174 trabajo en un repositorio al que varias personas tienen acceso
175 repository pay attention to locks. Write locks are necessary to 175 compartido, debe tener cuidado con la forma de hacerlo.
176 prevent multiple simultaneous writers from scribbling on each other's 176
177 work, corrupting the repository. 177 Mercurial sólo bloquea un repositorio cuando está escribiendo al
178 178 mismo, y sólo las partes de Mercurial que escriben al repositorio le
179 Because Mercurial is careful with the order in which it reads and 179 prestan atención a los bloqueos. Los bloqueos de escritura son
180 writes data, it does not need to acquire a lock when it wants to read 180 necesarios para evitar que múltiples escritores simultáneos
181 data from the repository. The parts of Mercurial that read from the 181 interfieran entre sí, corrompiendo el repositorio.
182 repository never pay attention to locks. This lockless reading scheme 182
183 greatly increases performance and concurrency. 183 Ya que Mercurial tiene cuidado con el orden en que lee y escribe
184 184 datos, no necesita adquirir un bloqueo cuando desea leer datos del
185 With great performance comes a trade-off, though, one which has the 185 repositorio. Las partes de Mercurial que leen del repositorio nunca le
186 potential to cause you trouble unless you're aware of it. To describe 186 prestan atención a los bloqueos. Este esquema de lectura libre de
187 this requires a little detail about how Mercurial adds changesets to a 187 bloqueos incremententa en gran medida el desempeño y la concurrencia.
188 repository and reads those changes. 188
189 189 Sin embargo, para tener un gran desempeño es necesario hacer
190 When Mercurial \emph{writes} metadata, it writes it straight into the 190 sacrificios, uno de los cuales tiene el potencial de causarle
191 destination file. It writes file data first, then manifest data 191 problemas a menos de que usted esté consciente de él. Describirlo
192 (which contains pointers to the new file data), then changelog data 192 requiere algo de detalle respecto a cómo Mercurial añade conjuntos de
193 (which contains pointers to the new manifest data). Before the first 193 cambios al repositorio y cómo lee esos cambios de vuelta.
194 write to each file, it stores a record of where the end of the file 194
195 was in its transaction log. If the transaction must be rolled back, 195 Cuando Mercurial \emph{escribe} metadatos, los escribe directamente en
196 Mercurial simply truncates each file back to the size it was before the 196 el fichero de destino. Primero escribe los datos del fichero, luego
197 transaction began. 197 los datos del manifiesto (que contienen punteros a los nuevos datos
198 198 del fichero), luego datos de la bitácora de cambios (que contienen
199 When Mercurial \emph{reads} metadata, it reads the changelog first, 199 punteros a los nuevos datos del manifiesto). Antes de la primera
200 then everything else. Since a reader will only access parts of the 200 escritura a cada fichero, se guarda un registro de dónde estaba el
201 manifest or file metadata that it can see in the changelog, it can 201 final de fichero en su registro de transacciones. Si la transacción
202 never see partially written data. 202 debe ser deshecha, Mercurial simplemente trunca cada fichero de vuelta
203 203 al tamaño que tenía antes de que empezara la transacción.
204 Some controlling hooks (\hook{pretxncommit} and 204
205 \hook{pretxnchangegroup}) run when a transaction is almost complete. 205 Cuando Mercurial \emph{lee} metadatos, lee la bitácora de cambios
206 All of the metadata has been written, but Mercurial can still roll the 206 primero, y luego todo lo demás. Como un lector sólo accederá a las
207 transaction back and cause the newly-written data to disappear. 207 partes del manifiesto o de los metadatos de fichero que él puede ver
208 208 en la bitácora de cambios, nunca puede ver datos parcialmente
209 If one of these hooks runs for long, it opens a window of time during 209 escritos.
210 which a reader can see the metadata for changesets that are not yet 210
211 permanent, and should not be thought of as ``really there''. The 211 Algunos ganchos de control (\hook{pretxncommit} y
212 longer the hook runs, the longer that window is open. 212 \hook{pretxnchangegroup}) se ejecutan cuando una transacción está casi
213 213 completa. Todos los metadatos han sido escritos, pero Mercurial aún
214 \subsection{The problem illustrated} 214 puede deshacer la transacción y hacer que los datos recién escritos
215 215 desaparezcan.
216 In principle, a good use for the \hook{pretxnchangegroup} hook would 216
217 be to automatically build and test incoming changes before they are 217 Si alguno de estos ganchos permanece en ejecución por mucho tiempo,
218 accepted into a central repository. This could let you guarantee that 218 abre una ventana de tiempo en la que un lector puede ver los metadatos
219 nobody can push changes to this repository that ``break the build''. 219 de conjuntos de cambios que aún no son permanentes y que no debería
220 But if a client can pull changes while they're being tested, the 220 considerarse que estén ``realmante ahí''. Entre más tiempo tome la
221 usefulness of the test is zero; an unsuspecting someone can pull 221 ejecución del gancho, más tiempo estará abierta esta ventana.
222 untested changes, potentially breaking their build. 222
223 223 \subsection{Ilustración del problema}
224 The safest technological answer to this challenge is to set up such a 224
225 ``gatekeeper'' repository as \emph{unidirectional}. Let it take 225 En principio, un buen uso del gancho \hook{pretxnchangegroup} sería
226 changes pushed in from the outside, but do not allow anyone to pull 226 ensamblar y probar automáticamente todos los cambios entrantes antes
227 changes from it (use the \hook{preoutgoing} hook to lock it down). 227 de que sean aceptados en un repositorio central. Esto le permitiría a
228 Configure a \hook{changegroup} hook so that if a build or test 228 usted garantizar que nadie pueda empujar cambios que ``rompan el
229 succeeds, the hook will push the new changes out to another repository 229 ensamblaje''. Pero si un cliente puede jalar cambios mientras están
230 that people \emph{can} pull from. 230 siendo probados, la utilidad de esta prueba es nula; alguien confiado
231 231 puede jalar cambios sin probar, lo que potencialmente podría romper su
232 In practice, putting a centralised bottleneck like this in place is 232 proceso de ensamblaje.
233 not often a good idea, and transaction visibility has nothing to do 233
234 with the problem. As the size of a project---and the time it takes to 234 La respuesta técnica más segura frente a este retos es montar dicho
235 build and test---grows, you rapidly run into a wall with this ``try 235 repositorio ``guardián'' como \emph{unidireccional}. Permita que
236 before you buy'' approach, where you have more changesets to test than 236 reciba cambios desde el exterior, pero no permita que nadie jale
237 time in which to deal with them. The inevitable result is frustration 237 cambios de él (use el gancho \hook{preoutgoing} para bloquear esto).
238 on the part of all involved. 238 Configure un gancho \hook{changegroup} para que si el ensamblaje o
239 239 prueba tiene éxito, el gancho empuje los nuevos cambios a otro
240 An approach that scales better is to get people to build and test 240 repositorio del que la gente \emph{pueda} jalar.
241 before they push, then run automated builds and tests centrally 241
242 \emph{after} a push, to be sure all is well. The advantage of this 242 En la práctica, montar un cuello de botella centralizado como éste a
243 approach is that it does not impose a limit on the rate at which the 243 menudo no es una buena idea, y la visibilidad de las transacciones no
244 repository can accept changes. 244 tiene nada que ver con el problema. A medida que el tamaño de un
245 245 proyecto---y el tiempo que toma ensamblarlo y probarlo---crece, usted
246 \section{A short tutorial on using hooks} 246 se acerca rápidamente a un límite con este enfoque ``pruebe antes de
247 comprar'', en el que tiene más conjuntos de cambios a probar que
248 tiempo para ocuparse de ellos. El resultado inevitable es frustración
249 para todos los que estén involucrados.
250
251 Una aproximación que permite manejar mejor el crecimiento es hacer que
252 la gente ensamble y pruebe antes de empujar, y ejecutar el ensamble y
253 pruebas automáticas centralmente \emph{después} de empujar, para
254 asegurarse de que todo esté bien. La ventaja de este enfoque es que no
255 impone un límite a la rata en la que un repositorio puede aceptar
256 cambios.
257
258 \section{Tutorial corto de uso de ganchos}
247 \label{sec:hook:simple} 259 \label{sec:hook:simple}
248 260
249 It is easy to write a Mercurial hook. Let's start with a hook that 261 It is easy to write a Mercurial hook. Let's start with a hook that
250 runs when you finish a \hgcmd{commit}, and simply prints the hash of 262 runs when you finish a \hgcmd{commit}, and simply prints the hash of
251 the changeset you just created. The hook is called \hook{commit}. 263 the changeset you just created. The hook is called \hook{commit}.