Mercurial > hgbook
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}. |