rev |
line source |
igor@412
|
1 \chapter{Colaborar con otros}
|
igor@402
|
2 \label{cha:collab}
|
igor@402
|
3
|
igor@412
|
4 Debido a su naturaleza descentralizada, Mercurial no impone política
|
igor@412
|
5 alguna de cómo deben trabajar los grupos de personas. Sin embargo, si
|
jerojasro@414
|
6 usted es nuevo al control distribuido de versiones, es bueno tener
|
igor@412
|
7 herramientas y ejemplos a la mano al pensar en posibles modelos de
|
igor@412
|
8 flujo de trabajo.
|
igor@412
|
9
|
igor@412
|
10 \section{La interfaz web de Mercurial}
|
igor@412
|
11
|
igor@412
|
12 Mercurial tiene una poderosa interfaz web que provee bastantes
|
igor@412
|
13 capacidades útiles.
|
igor@412
|
14
|
igor@412
|
15 Para uso interactivo, la interfaz le permite visualizar uno o varios
|
jerojasro@516
|
16 repositorios. Puede ver el historial de un repositorio, examinar cada
|
jerojasro@520
|
17 cambio (comentarios y diferencias), y ver los contenidos de cada
|
igor@412
|
18 directorio y fichero.
|
igor@412
|
19
|
jerojasro@542
|
20 Adicionalmente la interfaz provee notificaciones RSS de los cambios de los
|
igor@412
|
21 repositorios. Que le permite ``subscribirse''a un repositorio usando
|
jerojasro@542
|
22 su herramienta de lectura de notificaciones favorita, y ser notificado
|
igor@412
|
23 automáticamente de la actividad en el repositorio tan pronto como
|
igor@412
|
24 sucede. Me gusta mucho más este modelo que el estar suscrito a una
|
igor@412
|
25 lista de correo a la cual se envían las notificaciones, dado que no
|
igor@412
|
26 requiere configuración adicional de parte de quien sea que está
|
igor@412
|
27 administrando el repositorio.
|
igor@412
|
28
|
igor@412
|
29 La interfaz web también permite clonar repositorios a los usuarios
|
igor@412
|
30 remotos, jalar cambios, y (cuando el servidor está configurado para
|
jerojasro@542
|
31 permitirlo) publicar cambios en el mismo. El protocolo de entunelamiento
|
igor@412
|
32 de Mercurial comprime datos agresivamente, de forma que trabaja
|
igor@412
|
33 eficientemente incluso con conexiones de red con poco ancho de banda.
|
igor@412
|
34
|
igor@412
|
35 La forma más sencilla de iniciarse con la interfaz web es usar su
|
igor@412
|
36 navegador para visitar un repositorio existente, como por ejemplo el
|
igor@412
|
37 repositorio principal de Mercurial \url{http://www.selenic.com/repo/hg?style=gitweb}.
|
igor@412
|
38
|
igor@412
|
39 Si está interesado en proveer una interfaz web a sus propios
|
igor@412
|
40 repositorios, Mercurial provee dos formas de hacerlo. La primera es
|
igor@412
|
41 usando la orden \hgcmd{serve}, que está enfocada a servir ``de forma
|
igor@412
|
42 liviana'' y por intervalos cortos. Para más detalles de cómo usar
|
igor@412
|
43 esta orden vea la sección~\ref{sec:collab:serve} más adelante. Si
|
igor@412
|
44 tiene un repositorio que desea hacer permanente, Mercurial tiene
|
igor@412
|
45 soporte embebido del \command{ssh} para publicar cambios con seguridad
|
igor@412
|
46 al repositorio central, como se documenta en la
|
igor@412
|
47 sección~\ref{sec:collab:ssh}. Es muy usual que se publique una copia
|
igor@412
|
48 de sólo lectura en el repositorio que está corriendo sobre HTTP usando
|
igor@412
|
49 CGI, como en la sección~\ref{sec:collab:cgi}. Publicar sobre HTTP
|
igor@412
|
50 satisface las necesidades de la gente que no tiene permisos de
|
igor@412
|
51 publicación y de aquellos que quieren usar navegadores web para
|
jerojasro@516
|
52 visualizar el historial del repositorio.
|
igor@412
|
53
|
igor@412
|
54 \subsection{Trabajo con muchas ramas}
|
igor@412
|
55
|
jerojasro@542
|
56 Los proyectos de cierta talla tienden naturalmente a progresar de
|
igor@412
|
57 forma simultánea en varios frentes. En el caso del software, es común
|
igor@412
|
58 que un proyecto tenga versiones periódicas oficiales. Una versión
|
igor@412
|
59 puede entrar a ``modo mantenimiento'' por un tiempo después de su
|
igor@412
|
60 primera publicación; las versiones de mantenimiento tienden a contener
|
igor@412
|
61 solamente arreglos de fallos, pero no nuevas características. En
|
igor@412
|
62 paralelo con las versiones de mantenimiento puede haber una o muchas
|
igor@412
|
63 versiones futuras pueden estar en desarrollo. La gente usa normalmente
|
igor@412
|
64 la palabra ``rama'' para referirse a una de las direcciones
|
igor@412
|
65 ligeramente distintas en las cuales procede el desarrollo.
|
igor@412
|
66
|
igor@412
|
67 Mercurial está especialmente preparado para administrar un buen número
|
igor@412
|
68 de ramas simultáneas pero no idénticas. Cada ``dirección de
|
igor@412
|
69 desarrollo'' puede vivir en su propio repositorio central, y puede
|
igor@412
|
70 mezclar los cambios de una a otra de acuerdo con las necesidades. Dado
|
igor@412
|
71 que los repositorios son independientes, uno del otro, los cambios
|
igor@412
|
72 inestables de una rama de desarrollo nunca afectarán una rama estable
|
igor@412
|
73 a menos que alguien explícitamente mezcle los cambios.
|
igor@412
|
74
|
igor@412
|
75 A continuación un ejemplo de cómo podría hacerse esto en la
|
igor@412
|
76 práctica. Digamos que tiene una ``rama principal'' en un servidor
|
igor@412
|
77 central.
|
igor@402
|
78 \interaction{branching.init}
|
igor@412
|
79 Alguien lo clona, hace cambios locales, los prueba, y los publica allí
|
igor@412
|
80 mismo.
|
igor@412
|
81
|
igor@412
|
82 Una vez que la rama principal alcanza una estado de versión se puede
|
igor@412
|
83 usar la orden \hgcmd{tag} para dar un nombre permanente a la revisión.
|
igor@402
|
84 \interaction{branching.tag}
|
igor@412
|
85 Digamos que en la rama principal ocurre más desarrollo.
|
igor@402
|
86 \interaction{branching.main}
|
igor@412
|
87 Cuando se usa la etiqueta con que se identificó la versión, la gente
|
igor@412
|
88 puede clonar el repositorio en cualquier momento en el futuro
|
igor@412
|
89 empleando \hgcmd{update} para obtener una copia del directorio de
|
igor@412
|
90 trabajo exacta como cuando se creó la etiqueta de la revisión que se
|
igor@412
|
91 consignó.
|
igor@402
|
92 \interaction{branching.update}
|
igor@402
|
93
|
igor@412
|
94 Adicionalmente, justo después de que la rama principal se etiquete,
|
igor@412
|
95 alguien puede clonarla en el servidor a una nueva rama ``estable'',
|
igor@412
|
96 también en el servidor.
|
igor@402
|
97 \interaction{branching.clone}
|
igor@402
|
98
|
igor@412
|
99 Alguien que requiera hacer un cambio en la rama estable puede clonar
|
igor@412
|
100 \emph{ese} repositorio, hacer sus cambios, consignar y publicarlos
|
igor@412
|
101 posteriormente al inicial.
|
igor@402
|
102 \interaction{branching.stable}
|
igor@412
|
103 Puesto que los repositorios de Mercurial son independientes, y que
|
igor@412
|
104 Mercurial no mueve los cambios de un lado a otro automáticamente, las
|
igor@412
|
105 ramas estable y principal están \emph{aisladas} la una de la otra.
|
igor@412
|
106 Los cambios que haga en la rama principal no ``se filtran'' a la rama
|
igor@412
|
107 estable o vice versa.
|
igor@412
|
108
|
igor@412
|
109 Es usual que los arreglos de fallos de la rama estable deban hacerse
|
igor@412
|
110 aparecer en la rama principal también. En lugar de reescribir el
|
igor@412
|
111 arreglo del fallo en la rama principal, puede jalar y mezclar los
|
igor@412
|
112 cambios de la rama estable a la principal, Mercurial traerá tales
|
igor@412
|
113 arreglos por usted.
|
igor@402
|
114 \interaction{branching.merge}
|
jerojasro@542
|
115 La rama principal contendrá aún los cambios que no están en la
|
igor@412
|
116 estable y contendrá además todos los arreglos de fallos de la rama
|
igor@412
|
117 estable. La rama estable permanece incólume a tales cambios.
|
igor@402
|
118
|
igor@417
|
119 \subsection{Ramas de Características}
|
igor@417
|
120
|
igor@417
|
121 En proyectos grandes, una forma efectiva de administrar los cambios es
|
igor@417
|
122 dividir el equipo en grupos más pequeños. Cada grupo tiene una rama
|
igor@417
|
123 compartida, clonada de una rama ``principal'' que conforma el proyecto
|
igor@417
|
124 completo. Aquellos que trabajan en ramas individuales típicamente
|
igor@417
|
125 están aislados de los desarrollos de otras ramas.
|
igor@402
|
126
|
igor@402
|
127 \begin{figure}[ht]
|
igor@402
|
128 \centering
|
igor@402
|
129 \grafix{feature-branches}
|
igor@417
|
130 \caption{Ramas de Características}
|
igor@402
|
131 \label{fig:collab:feature-branches}
|
igor@402
|
132 \end{figure}
|
igor@402
|
133
|
igor@417
|
134 Cuando una rama particular alcanza un estado deseado, alguien del
|
igor@417
|
135 equipo de características jala y fusiona de la rama principal hacia
|
igor@417
|
136 la rama de características y publica posteriormente a la rama principal.
|
igor@417
|
137
|
igor@417
|
138 \subsection{El tren de publicación}
|
igor@417
|
139
|
igor@417
|
140 Algunos proyectos se organizan al estilo``tren'': Una versión se
|
igor@417
|
141 planifica para ser liberada cada cierto tiempo, y las características
|
igor@417
|
142 que estén listas cuando ha llegado el momento ``tren'', se incorporan.
|
igor@417
|
143
|
igor@417
|
144 Este modelo tiene cierta similitud a las ramas de características. La
|
igor@417
|
145 diferencia es que cuando una característica pierde el tren, alguien en
|
igor@417
|
146 el equipo de características jala y fusiona los cambios que se fueron
|
igor@417
|
147 en la versión liberada hacia la rama de característica, y el trabajo
|
igor@417
|
148 continúa sobre lo fusionado para que la característica logre estar en
|
igor@417
|
149 la próxima versión.
|
igor@417
|
150
|
igor@417
|
151 \subsection{El modelo del kernel linux}
|
igor@417
|
152
|
igor@417
|
153 El desarrollo del Kernel Linux tiene una estructura jerárquica
|
igor@417
|
154 bastante horizontal, rodeada de una nube de caos aparente. Dado que la
|
igor@417
|
155 mayoría de desarrolladores usan \command{git}, una herramienta distribuida
|
igor@417
|
156 de control de versiones con capacidades similares a Mercurial, resulta
|
igor@417
|
157 de utilidad describir la forma en que el trabajo fluye en tal
|
igor@417
|
158 ambiente; si le gustan las ideas, la aproximación se traduce bien
|
igor@417
|
159 entre Git y Mercurial.
|
igor@417
|
160
|
igor@417
|
161 En el centro de la comunidad está Linus Torvalds, el creador de Linux.
|
igor@417
|
162 Él publica un único repositorio que es considerado el árbol
|
igor@417
|
163 ``oficial'' actual por la comunidad completa de
|
igor@417
|
164 desarrolladores. Cualquiera puede clonar el árbol de Linus, pero él es
|
igor@417
|
165 muy selectivo acerca de los árboles de los cuales jala.
|
igor@417
|
166
|
jerojasro@419
|
167 Linus tiene varios ``lugartenientes confiables''. Como regla, él jala
|
igor@417
|
168 todos los cambios que ellos publican, en la mayoría de los casos sin
|
igor@417
|
169 siquiera revisarlos. Algunos de sus lugartenientes generalmente
|
igor@417
|
170 aceptan ser los ``mantenedores'', responsables de subsistemas
|
igor@417
|
171 específicos dentro del kernel. Si un hacker cualquiera desea hacer un
|
igor@417
|
172 cambio a un subsistema y busca que termine en el árbol de Linus, debe
|
jerojasro@419
|
173 encontrar quién es el mantenedor del subsistema y solicitarle que
|
igor@417
|
174 tenga en cuenta su cambio. Si el mantenedor revisa los cambios y está
|
igor@417
|
175 de acuerdo en tomarlos, estos pasarán al árbol de Linus de acuerdo a
|
igor@417
|
176 lo expuesto.
|
igor@417
|
177
|
igor@417
|
178 Cada lugarteniente tiene su forma particular de revisar, aceptar y
|
igor@417
|
179 publicar los cambios; y para decidir cuando hacerlos presentes a
|
igor@417
|
180 Linus. Adicionalmente existen varias ramas conocidas que mucha gente
|
igor@417
|
181 usa para propósitos distintos. Por ejemplo, pocas personas mantienen
|
igor@417
|
182 repositorios ``estables'' de versiones anteriores del kernel, a los
|
igor@417
|
183 cuales aplican arreglos de fallos críticos necesarios. Algunos
|
igor@417
|
184 mantenedores publican varios árboles: uno para cambios
|
igor@417
|
185 experimentales; uno para cambios que van a ofrecer al mantenedor
|
igor@417
|
186 principal; y así sucesivamente. Otros publican un solo árbol.
|
igor@417
|
187
|
igor@417
|
188 Este modelo tiene dos características notables. La primera es que son
|
igor@417
|
189 de ``jalar exclusivamente''. Usted debe solicitar, convencer o
|
jerojasro@542
|
190 incluso rogar a otro desarrollador para que tome sus cambios, porque
|
igor@417
|
191 casi no hay árboles en los cuales más de una persona pueda publicar, y
|
igor@417
|
192 no hay forma de publicar cambios en un árbol que otra persona controla.
|
igor@417
|
193
|
igor@417
|
194 El segundo está basado en reputación y meritocracia. Si usted es un
|
igor@417
|
195 desconocido, Linus probablemente ignorará sus cambios, sin siquiera
|
igor@417
|
196 responderle. Pero un mantenedor de un subsistema probablemente los
|
igor@417
|
197 revisara, y los acogerá en caso de que aprueben su criterio de
|
igor@417
|
198 aplicabilidad. A medida que usted ofrezca ``mejores'' cambios a un
|
jerojasro@419
|
199 mantenedor, habrá más posibilidad de que se confíe en su juicio y se
|
jerojasro@542
|
200 acepten los cambios. Si usted es reconocido y mantiene una rama
|
igor@417
|
201 durante bastante tiempo para algo que Linus no ha aceptado, personas
|
igor@417
|
202 con intereses similares pueden jalar sus cambios regularmente para
|
igor@417
|
203 estar al día con su trabajo.
|
igor@417
|
204
|
igor@417
|
205 La reputación y meritocracia no necesariamente es transversal entre
|
igor@417
|
206 ``personas'' de diferentes subsistemas. Si usted es respetado pero es
|
igor@417
|
207 un hacker en almacenamiento y trata de arreglar un fallo de redes,
|
igor@417
|
208 tal cambio puede recibir un nivel de escrutinio de un mantenedor de
|
igor@417
|
209 redes comparable con el que se le haría a un completo extraño.
|
igor@417
|
210
|
igor@417
|
211 Personas que vienen de proyectos con un ordenamiento distinto, sienten
|
igor@417
|
212 que el proceso comparativamente caótico del Kernel Linux es
|
igor@417
|
213 completamente lunático. Es objeto de los caprichos individuales; la
|
igor@417
|
214 gente desecha cambios cuando lo desean; y la fase de desarrollo es
|
igor@417
|
215 alucinante. A pesar de eso Linux es una pieza de software exitosa y
|
igor@417
|
216 bien reconocida.
|
igor@417
|
217
|
igor@417
|
218 \subsection{Solamente jalar frente a colaboración pública}
|
igor@417
|
219
|
igor@417
|
220 Una fuente perpetua de discusiones en la comunidad de código abierto
|
igor@417
|
221 yace en el modelo de desarrollo en el cual la gente solamente jala
|
igor@417
|
222 cambios de otros ``es mejor que'' uno en el cual muchas personas
|
igor@417
|
223 pueden publicar cambios a un repositorio compartido.
|
igor@417
|
224
|
jerojasro@542
|
225 Típicamente los partidarios del modelo de publicar usan las herramientas
|
igor@417
|
226 que se apegan a este modelo. Si usted usa una herramienta
|
igor@417
|
227 centralizada de control de versiones como Subversion, no hay forma de
|
igor@417
|
228 elegir qué modelo va a usar: La herramienta le ofrece publicación
|
igor@417
|
229 compartida, y si desea hacer cualquier otra cosa, va a tener que
|
igor@417
|
230 aplicar una aproximación artificial (tal como aplicar parches a mano).
|
igor@417
|
231
|
igor@417
|
232 Una buena herramienta distribuida de control de versiones, tal como
|
igor@417
|
233 Mercurial soportará los dos modelos. Usted y sus colaboradores
|
igor@417
|
234 pueden estructurar cómo trabajarán juntos basados en sus propias
|
igor@417
|
235 necesidades y preferencias, sin depender de las peripecias que la
|
igor@417
|
236 herramienta les obligue a hacer.
|
igor@417
|
237
|
igor@417
|
238 \subsection{Cuando la colaboración encuentra la administración ramificada}
|
igor@417
|
239
|
igor@417
|
240 Una vez que usted y su equipo configurar algunos repositorios
|
igor@417
|
241 compartidos y comienzan a propagar cambios entre sus repositorios
|
igor@417
|
242 locales y compartidos, comenzará a encarar un reto relacionado, pero
|
igor@417
|
243 un poco distinto: Administrar las direcciones en las cuales su equipo
|
jerojasro@542
|
244 puede moverse. A pesar de que está íntimamente ligado acerca de cómo
|
igor@417
|
245 interactúa su equipo, es lo suficientemente denso para ameritar un
|
igor@417
|
246 tratamiento en el capítulo~\ref{chap:branch}.
|
igor@417
|
247
|
igor@417
|
248 \section{Aspectos técnicos de la colaboración}
|
igor@417
|
249
|
igor@417
|
250 Lo que resta del capítulo lo dedicamos a las cuestiones de servir
|
igor@417
|
251 datos a sus colaboradores.
|
igor@417
|
252
|
igor@417
|
253 \section{Compartir informalmente con \hgcmd{serve}}
|
igor@402
|
254 \label{sec:collab:serve}
|
igor@402
|
255
|
igor@417
|
256 La orden \hgcmd{serve} de Mercurial satisface de forma espectacular
|
igor@417
|
257 las necesidades de un grupo pequeño, acoplado y de corto
|
igor@417
|
258 tiempo. Se constituye en una demostración de cómo se siente usar los
|
igor@417
|
259 comandos usando la red.
|
igor@417
|
260
|
igor@417
|
261 Ejecute \hgcmd{serve} dentro de un repositorio, y en pocos segundos
|
igor@417
|
262 iniciará un servidor HTTP especializado; aceptará conexiones desde
|
igor@417
|
263 cualquier cliente y servirá datos de este repositorio mientrs lo
|
igor@417
|
264 mantenga funcionando. Todo el que sepa el URL del servidor que ha
|
igor@417
|
265 iniciado, y que puede comunicarse con su computador por la red, puede
|
igor@417
|
266 usar un navegador web o Mercurial para leer datos del repositorio. Un
|
igor@417
|
267 URL para una instancia de \hgcmd{serve} ejecutándose en un portátil
|
igor@417
|
268 debería lucir algo \Verb|http://my-laptop.local:8000/|.
|
igor@417
|
269
|
igor@417
|
270 La orden \hgcmd{serve} \emph{no} es un servidor web de propósito
|
igor@417
|
271 general. Solamente puede hacer dos cosas:
|
igor@402
|
272 \begin{itemize}
|
jerojasro@516
|
273 \item Permitir que se pueda visualizar el historial del repositorio que
|
igor@417
|
274 está sirviendo desde navegadores web.
|
igor@417
|
275 \item Hablar el protocolo de conexión de Mercurial para que puedan hacer
|
igor@417
|
276 \hgcmd{clone} o \hgcmd{pull} (jalar) cambios de tal repositorio.
|
igor@402
|
277 \end{itemize}
|
igor@417
|
278 En particular, \hgcmd{serve} no permitirá que los usuarios remotos
|
igor@417
|
279 puedan \emph{modificar} su repositorio. Es de tipo solo lectura.
|
igor@417
|
280
|
igor@417
|
281 Si está comenzando con Mercurial, no hay nada que le impida usar
|
igor@417
|
282 \hgcmd{serve} para servir un repositorio en su propio computador, y
|
igor@417
|
283 usar posteriormente órdenes como \hgcmd{clone}, \hgcmd{incoming}, para
|
igor@417
|
284 comunicarse con el servidor como si el repositorio estuviera alojado
|
igor@417
|
285 remotamente. Lo que además puede ayudarle a adecuarse rápidamente para
|
igor@417
|
286 usar comandos en repositorios alojados en la red.
|
igor@417
|
287
|
igor@417
|
288 \subsection{Cuestiones adicionales para tener en cuenta}
|
igor@417
|
289
|
igor@417
|
290 Dado que permite lectura sin autenticación a todos sus clientes,
|
igor@417
|
291 debería usar \hgcmd{serve} exclusivamente en ambientes en los cuáles
|
igor@417
|
292 no tenga problema en que otros vean, o en los cuales tenga control
|
igor@417
|
293 completo acerca de quien puede acceder a su red y jalar cambios de su
|
igor@417
|
294 repositorio.
|
igor@417
|
295
|
igor@417
|
296 La orden \hgcmd{serve} no tiene conocimiento acerca de programas
|
igor@417
|
297 cortafuegos que puedan estar instalados en su sistema o en su red. No
|
igor@417
|
298 puede detectar o controlar sus cortafuegos. Si otras personas no
|
igor@417
|
299 pueden acceder a su instancia \hgcmd{serve}, lo siguiente que debería hacer
|
igor@417
|
300 (\emph{después} de asegurarse que tienen el URL correcto) es verificar
|
igor@417
|
301 su configuración de cortafuegos.
|
igor@417
|
302
|
igor@417
|
303 De forma predeterminada, \hgcmd{serve} escucha conexiones entrantes en
|
igor@417
|
304 el puerto~8000. Si otro proceso está escuchando en tal puerto, usted
|
igor@417
|
305 podrá especificar un puerto distinto para escuchar con la opción
|
jerojasro@522
|
306 \hgopt{serve}{-p}.
|
igor@417
|
307
|
igor@417
|
308 Normalmente, cuando se inicia \hgcmd{serve}, no imprime nada, lo cual
|
igor@417
|
309 puede ser desconcertante. Si desea confirmar que en efecto está
|
igor@417
|
310 ejecutándose correctamente, y darse cuenta qué URL debería enviar a
|
igor@417
|
311 sus colaboradores, inícielo con la opción \hggopt{-v}.
|
igor@402
|
312
|
igor@427
|
313 \section{Uso del protocolo Secure Shell (ssh)}
|
igor@402
|
314 \label{sec:collab:ssh}
|
igor@402
|
315
|
igor@427
|
316 Usted puede publicar y jalar cambios en la red de forma segura usando
|
igor@427
|
317 el protocolo Secure Shell (\texttt{ssh}). Para usarlo satisfactoriamente,
|
igor@427
|
318 tendrá que hacer algo de configuración a nivel de cliente o el
|
igor@427
|
319 servidor.
|
igor@427
|
320
|
jerojasro@542
|
321 Si no está familiarizado con ssh, es un protocolo de red que le permite
|
igor@427
|
322 comunicarse con seguridad con otro computador. Para usarlo con
|
igor@427
|
323 Mercurial, estará estableciendo una o más cuentas de usuario en un
|
igor@427
|
324 servidor de forma tal que los usuarios remotos puedan entrar y
|
igor@427
|
325 ejecutar órdenes.
|
igor@427
|
326
|
igor@427
|
327 (Si ssh le \emph{es} familiar, encontrará probablemente elemental una
|
igor@427
|
328 porción del material a continuación.)
|
igor@427
|
329
|
igor@427
|
330 \subsection{Cómo leer y escribir URLs de ssh}
|
igor@427
|
331
|
igor@427
|
332 Los URLs de ssh tienden a lucir de la siguiente forma:
|
igor@402
|
333 \begin{codesample2}
|
igor@402
|
334 ssh://bos@hg.serpentine.com:22/hg/hgbook
|
igor@402
|
335 \end{codesample2}
|
igor@402
|
336 \begin{enumerate}
|
igor@427
|
337 \item La parte ``\texttt{ssh://}'' indica a Mercurial que use el
|
igor@427
|
338 protocolo ssh.
|
igor@427
|
339 \item El componente ``\texttt{bos@}'' indica el nombre del usuario que
|
jerojasro@542
|
340 está entrando al servidor. Puede omitirlo si el usuario remoto
|
igor@427
|
341 coincide con el usuario local.
|
igor@427
|
342 \item ``\texttt{hg.serpentine.com}'' es el nombre del servidor al cual
|
igor@427
|
343 se desea entrar.
|
igor@427
|
344 \item El ``:22'' identifica el número del puerto en el servidor al cual
|
igor@427
|
345 se conectará. El predeterminado es el~22, así que solamente
|
igor@427
|
346 necesitará especificar esa porción si \emph{no} está usando el
|
igor@427
|
347 puerto~22.
|
igor@427
|
348 \item La última porción del URL es la ruta local al repositorio en el
|
igor@427
|
349 servidor.
|
igor@402
|
350 \end{enumerate}
|
igor@402
|
351
|
igor@427
|
352 El componente de la ruta del URL para ssh es una fuente de confusión,
|
igor@427
|
353 puesto que no hay una forma estándar para que las herramientas puedan
|
igor@427
|
354 interpretarlo. Algunos programas se comportan de manera distinta a
|
igor@427
|
355 otros cuando manipulan estas rutas. No es la situación ideal, pero
|
igor@427
|
356 es muy poco probable que vaya a cambiar. Por favor lea los párrafos
|
igor@427
|
357 siguientes cuidadosamente.
|
igor@427
|
358
|
igor@427
|
359 Mercurial trata la ruta al repositorio en el servidor como relativo al
|
jerojasro@542
|
360 directorio personal del usuario remoto. Por ejemplo, si el usuario
|
igor@427
|
361 \texttt{foo} en el servidor tiene el directorio casa
|
igor@427
|
362 \dirname{/home/foo},
|
igor@427
|
363 entonces un URL ssh que contenga en su ruta a \dirname{bar}
|
igor@427
|
364 \emph{realmente} se refiere al directorio \dirname{/home/foo/bar}.
|
igor@427
|
365
|
igor@427
|
366 Si desea especificar una ruta relativa a otro directorio de usuario,
|
igor@427
|
367 puede usar una ruta que comience con un caracter tildado, seguido del
|
jerojasro@520
|
368 nombre del usuario (llamémosle \texttt{otrousuario}, así
|
igor@427
|
369 \begin{codesample2}
|
igor@427
|
370 ssh://server/~otrousuario/hg/repo
|
igor@427
|
371 \end{codesample2}
|
igor@427
|
372
|
igor@427
|
373 Y si realmente desea especifica una ruta \emph{absoluta} en el
|
igor@427
|
374 servidor, comience con el componente de la ruta con dos barras como
|
igor@427
|
375 en el siguiente ejemplo:
|
igor@402
|
376 \begin{codesample2}
|
igor@402
|
377 ssh://server//absolute/path
|
igor@402
|
378 \end{codesample2}
|
igor@402
|
379
|
igor@427
|
380 \subsection{Encontrar un cliente ssh para su sistema}
|
igor@427
|
381
|
igor@427
|
382 Casi todos los sistemas tipo Unix vienen con OpenSSH preinstalado. Si
|
igor@427
|
383 usted está usando un sistema de estos, ejecute \Verb|which ssh| para
|
igor@427
|
384 identificar dónde está instalada la orden \command{ssh} (usualmente
|
igor@427
|
385 estará en \dirname{/usr/bin}). Si por casualidad no está presente,
|
igor@427
|
386 vea la documentación de sus sistema para lograr instalarlo.
|
igor@427
|
387
|
igor@427
|
388 En Windows, tendrá que escoger primero un cliente adecuado para
|
igor@427
|
389 descargarlo. Hay dos alternativas:
|
igor@402
|
390 \begin{itemize}
|
igor@427
|
391 \item El excelente paquete PuTTY~\cite{web:putty} de Simon Tatham, que
|
igor@427
|
392 ofrece un suite completo de órdenes de cliente ssh.
|
igor@427
|
393 \item Si tiene alta tolerancia al dolor, puede usar el porte de Cygwin
|
igor@427
|
394 para OpenSSH.
|
igor@402
|
395 \end{itemize}
|
igor@427
|
396 En cualquier caso, tendrá que editar su fichero \hgini\ para indicarle
|
igor@427
|
397 a Mercurial dónde encontrar la orden real del cliente. Por ejemplo, si
|
igor@427
|
398 está usando PuTTY, tendrá que usar la orden \command{plink} como un
|
igor@427
|
399 cliente de línea de órdenes.
|
igor@402
|
400 \begin{codesample2}
|
igor@402
|
401 [ui]
|
igor@427
|
402 ssh = C:/ruta/a/plink.exe -ssh -i "C:/ruta/a/mi/llave/privada"
|
igor@402
|
403 \end{codesample2}
|
igor@402
|
404
|
igor@402
|
405 \begin{note}
|
igor@427
|
406 La ruta a \command{plink} no debería contener espacios o caracteres
|
igor@427
|
407 en blanco, o Mercurial no podrá encontrarlo correctamente (por lo
|
igor@427
|
408 tanto, probablemente no sería buena idea colocarlo en
|
igor@427
|
409 \dirname{C:\\Program Files}
|
igor@402
|
410 \end{note}
|
igor@402
|
411
|
igor@427
|
412 \subsection{Generar un par de llaves}
|
igor@427
|
413
|
jerojasro@542
|
414 Para evitar la necesidad de teclear una clave de forma repetitiva cada
|
igor@427
|
415 vez que necesita usar el cliente, recomiendo generar un par de llaves.
|
igor@427
|
416 En un sistema tipo Unix, la orden \command{ssh-keygen} también se
|
igor@427
|
417 comportará bien. En Windows, si está usando PuTTY, la orden
|
igor@427
|
418 \command{puttygen} es la que necesitará.
|
igor@427
|
419
|
igor@427
|
420 Cuando genera un par de llaves, se aconseja \emph{comedidamente}
|
igor@427
|
421 protegerlas con una frase de clave. (La única oportunidad en la cual
|
igor@427
|
422 usted querría identificarse una única vez, es cuando está usando
|
igor@427
|
423 el protocolo ssh para tareas automatizadas en una red segura.)
|
igor@427
|
424
|
igor@427
|
425 No basta con generar un par de llaves. Se requiere adicionar una llave
|
igor@427
|
426 pública al conjunto de llaves autorizadas para todos los usuarios
|
igor@427
|
427 remotos que se vayan a autenticar. Para aquellos servidores que usen
|
jerojasro@520
|
428 OpenSSH (la gran mayoría), significará añadir la llave pública a la
|
igor@427
|
429 lista en el fichero llamado \sfilename{authorized\_keys} en su
|
igor@427
|
430 directorio \sdirname{.ssh}.
|
igor@427
|
431
|
igor@427
|
432 En sistemas tipo Unix, su llave pública tendrá la extensión
|
igor@427
|
433 \filename{.pub}. Si usa \command{puttygen} en Windows, puede
|
igor@427
|
434 guardar la llave pública en un fichero de su elección, o pegarla desde
|
igor@427
|
435 la ventana en la cual se despliega directamente en el fichero
|
igor@427
|
436 \sfilename{authorized\_keys}.
|
igor@402
|
437
|
igor@428
|
438 \subsection{Uso de un agente de autenticación}
|
igor@428
|
439
|
jerojasro@542
|
440 Un agente de autenticación es un demonio que almacena frases clave en
|
jerojasro@520
|
441 memoria (olvidará las frases clave si sale y vuelve a entrar). Un cliente
|
igor@428
|
442 ssh notará si está corriendo, y solicitará una frase clave. Si no hay
|
igor@428
|
443 un agente de autenticación corriendo, o el agente no almacena la frase
|
igor@428
|
444 clave necesaria, tendrá que teclear su frase clave cada vez que
|
jerojasro@520
|
445 Mercurial intente comunicarse con un servidor para usted (p.e.~cada vez
|
igor@428
|
446 que jale o publique cambios).
|
igor@428
|
447
|
igor@428
|
448 El problema de almacenar frases claves en un agente es que es posible
|
igor@428
|
449 para un atacante bien preparado recuperar el texto plano de su frase
|
jerojasro@542
|
450 clave, en algunos casos incluso si su sistema sea muy alternante.
|
igor@428
|
451 Es su decisión si es un riesgo aceptable. Lo que si es seguro es que
|
igor@428
|
452 evita reteclear.
|
igor@428
|
453
|
igor@428
|
454 En sistemas tipo Unix, el agente se llama \command{ssh-agent}, y
|
igor@428
|
455 usualmente se ejecuta automáticamente cuando usted entra. Tendrá que
|
igor@428
|
456 usar la orden \command{ssh-add} para añadir frases claves al agente. En
|
igor@428
|
457 Windows, si está usando PuTTY, la orden \command{pageant} actúa como
|
jerojasro@542
|
458 el agente. Añade un icono a su barra del sistema que le permitirá
|
igor@428
|
459 almacenar frases clave.
|
igor@428
|
460
|
igor@428
|
461 \subsection{Configurar el lado del servidor apropiadamente}
|
igor@428
|
462
|
igor@428
|
463 Dado que puede ser dispendioso configurar ssh si usted es nuevo, hay
|
igor@428
|
464 una variedad de cosas que podrían ir mal. Añada piense primero en
|
igor@428
|
465 Mercurial y hay mucho más en qué pensar. La mayor parte de estos
|
jerojasro@542
|
466 problemas potenciales ocurren en el lado del servidor, no en el cliente.
|
igor@428
|
467 Las buenas noticias es que una vez tiene una configuración funcional,
|
igor@428
|
468 usualmente continuará trabajando indefinidamente.
|
igor@428
|
469
|
igor@428
|
470 Antes de intentar que Mercurial hable con un servidor ssh, es mejor
|
igor@428
|
471 asegurarse que puede usar la orden normal \command{ssh} o \command{putty}
|
igor@428
|
472 para comunicarse con el servidor primero. Si tiene problemas usando
|
igor@428
|
473 estas órdenes directamente, de seguro Mercurial no funcionará. Pero aún,
|
igor@428
|
474 esconderá el problema subyacente. Cuando desee revisar un problema
|
igor@428
|
475 relacionado con ssh y Mercurial, debería asegurarse primero que las
|
igor@428
|
476 órdenes de ssh en el lado del cliente funcionan primero, \emph{antes}
|
igor@428
|
477 de preocuparse por si existe un problema con Mercurial.
|
igor@428
|
478
|
igor@428
|
479 Lo primero para asegurar en el lado del servidor es que puede entrar
|
igor@428
|
480 desde otra máquina. Si no puede entrar con \command{ssh} o
|
igor@428
|
481 \command{putty}, el mensaje de error que obtenga le puede dar pistas
|
igor@428
|
482 de qué ha ido mal. Los problemas más comunes son los siguientes:
|
igor@402
|
483 \begin{itemize}
|
jerojasro@542
|
484 \item Si obtiene un error de ``conexión rehusada'', es posible que no
|
jerojasro@542
|
485 haya un demonio SSH corriendo en el servidor o que no pueda accederse
|
igor@428
|
486 a él por configuraciones de cortafuegos.
|
igor@428
|
487 \item Si obtiene un error de ``no hay ruta hasta el servidor'', puede
|
igor@428
|
488 tener la dirección del servidor incorrecta o un cortafuegos con
|
igor@428
|
489 bloqueo agresivo que no permitirá su existencia.
|
igor@428
|
490 \item Si obtiene un mensaje de ``permiso denegado'', puede que haya
|
igor@428
|
491 tecleado mal el usuario en el servidor, o que haya tecleado
|
igor@428
|
492 incorrectamente la frase clave o la clave del usuario remoto.
|
igor@402
|
493 \end{itemize}
|
jerojasro@542
|
494 En resumen, si tiene problemas al comunicarse con el demonio ssh del
|
igor@428
|
495 servidor, primero asegúrese de que está corriendo. En muchos sistemas
|
igor@428
|
496 estará instalado, pero deshabilitado de forma predeterminada. Una vez
|
igor@428
|
497 que haya hecho este paso tendrá que revisar si el cortafuegos del
|
igor@428
|
498 servidor está configurado para recibir conexiones entrantes en el
|
jerojasro@542
|
499 puerto en el cual el demonio de ssh está escuchando (usualmente el~22).
|
igor@428
|
500 No trate de buscar otras posibilidades exóticas o configuraciones
|
jerojasro@542
|
501 erradas hasta que haya revisado primero estas dos.
|
igor@428
|
502
|
igor@428
|
503 Si está usando un agente de autenticación en el lado del cliente para
|
igor@428
|
504 almacenar las frase claves de sus contraseñas, debería poder entrar al
|
igor@428
|
505 servidor sin necesidad de que se le solicite frases claves o
|
igor@428
|
506 contraseñas. Si se le pregunta alguna, a continuación algunas
|
igor@428
|
507 posibilidades:
|
igor@402
|
508 \begin{itemize}
|
igor@428
|
509 \item Puede haber olvidado usar \command{ssh-add} o
|
igor@428
|
510 \command{pageant} para guardar la frase clave.
|
igor@428
|
511 \item Puede haber almacenado una frase clave errónea para la llave.
|
igor@402
|
512 \end{itemize}
|
igor@428
|
513 Si se le solicita la clave del usuario remoto, hay otras posibilidades
|
igor@428
|
514 que deben revisarse:
|
igor@402
|
515 \begin{itemize}
|
igor@428
|
516 \item O bien el directorio del usuario o su directorio \sdirname{.ssh}
|
igor@428
|
517 tiene permisos excesivamente abiertos. Como resultado el daemonio
|
igor@428
|
518 ssh no creerá o leerá su fichero \sfilename{authorized\_keys}.
|
igor@428
|
519 Por ejemplo, un directorio casa o \sdirname{.ssh} causará aveces
|
igor@428
|
520 este síntoma.
|
igor@428
|
521 \item El fichero de usuario \sfilename{authorized\_keys} puede tener
|
igor@428
|
522 un problema. Si alguien distinto al usuario es dueño o puede
|
jerojasro@542
|
523 escribir el fichero, el demonio ssh no confiará o lo leerá.
|
igor@402
|
524 \end{itemize}
|
igor@402
|
525
|
igor@428
|
526 En un mundo ideal, debería poder ejecutar la siguiente orden
|
jerojasro@542
|
527 exitosamente, y debería imprimir exactamente una línea de salida,
|
igor@428
|
528 la fecha y hora actual.
|
igor@428
|
529 \begin{codesample2}
|
igor@428
|
530 ssh miservidor fecha
|
igor@428
|
531 \end{codesample2}
|
igor@428
|
532
|
jerojasro@542
|
533 Si en su servidor tiene guión que se ejecuta a la entrada e imprime
|
igor@428
|
534 letreros o cualquier otra cosa, incluso cuando se ejecutan órdenes no
|
igor@428
|
535 interactivas como esta, debería arreglarlo antes de continuar, de
|
igor@428
|
536 forma que solamente imprima algo si se ejecuta interactivamente. De
|
jerojasro@525
|
537 otra forma estos letreros al menos llenarán la salida de Mercurial.
|
jerojasro@525
|
538 Incluso podrían causar problemas potenciales cuando se ejecuten
|
igor@428
|
539 órdenes de forma remota. Mercurial intenta detectar e ignorar los
|
igor@428
|
540 letreros en sesiones no interactivas de \command{ssh}, pero no es
|
igor@428
|
541 a prueba de tontos. (Si edita sus guiones de entrada en el servidor,
|
jerojasro@542
|
542 la forma usual de ver si un guión de línea de comandos se ejecuta en un intérprete
|
igor@428
|
543 interactivo, es verificar el código de retorno de la orden
|
igor@428
|
544 \Verb|tty -s|.)
|
igor@428
|
545
|
igor@428
|
546 Cuando verifique que el venerado ssh funciona en su servidor, el
|
igor@428
|
547 paso siguiente es asegurar que Mercurial corre en el servidor. La
|
igor@428
|
548 orden siguiente debería ejecutarse satisfactoriamente:
|
igor@428
|
549 \begin{codesample2}
|
igor@428
|
550 ssh miservidor hg version
|
igor@428
|
551 \end{codesample2}
|
igor@428
|
552 Si ve un mensaje de error en lugar de la salida usual de
|
igor@428
|
553 \hgcmd{version}, será porque no ha instalado Mercurial en
|
igor@428
|
554 \dirname{/usr/bin}. No se preocupe si este es el caso; no necesita
|
igor@428
|
555 hacerlo. Pero debería revisar los posibles problemas presentados a
|
igor@428
|
556 continuación:
|
igor@402
|
557 \begin{itemize}
|
igor@428
|
558 \item Está instalado Mercurial en el servidor? Se que suena trivial
|
igor@428
|
559 pero es mejor revisar!
|
igor@428
|
560 \item Tal vez la ruta de búsqueda de la interfaz de órdenes
|
igor@428
|
561 (normalmente vía la variable de ambiente \envar{PATH}) simplemente
|
igor@428
|
562 está mal configurada.
|
igor@428
|
563 \item Puede ser que su variable de ambiente \envar{PATH} soalamente
|
igor@428
|
564 apunte al lugar en el cual está el ejecutable \command{hg} si la
|
igor@428
|
565 sesión de entrada es interactiva. Puede suceder si establece la
|
jerojasro@542
|
566 ruta en el guión de línea de comandos de entrada incorrecto. Consulte la
|
igor@428
|
567 documentación de su línea de órdenes.
|
igor@428
|
568 \item La variable de ambiente \envar{PYTHONPATH} puede requerir la
|
jerojasro@542
|
569 ruta a los módulos de Mercurial en Python. Puede que ni siquiera
|
igor@428
|
570 está establecida; podría estar incorrecta; o puede ser que se
|
igor@428
|
571 establezca únicamente cuando hay entradas interactivas.
|
igor@402
|
572 \end{itemize}
|
igor@402
|
573
|
igor@428
|
574 Si puede ejecutar \hgcmd{version} sobre una conexión ssh,
|
igor@428
|
575 felicitaciones! Ha logrado la interacción entre el cliente y el
|
igor@428
|
576 servidor. Ahora debería poder acceder a los repositorios de
|
igor@428
|
577 Mercurial que tiene el usuario en el servidor. Si tiene problemas
|
igor@428
|
578 con Mercurial y ssh en este punto, intente usar la opción
|
igor@428
|
579 \hggopt{--debug} para tener información más clara de lo que está
|
igor@428
|
580 sucediendo.
|
igor@428
|
581
|
igor@428
|
582 \subsection{Compresión con ssh}
|
igor@428
|
583
|
igor@428
|
584 Mercurial no comprime datos cuando usa el protocolo ssh, dado que
|
igor@428
|
585 el protocolo puede comprimir datos transparentemente. Pero el
|
igor@428
|
586 comportamiento predeterminado del cliente ssh es \emph{no}
|
igor@428
|
587 solicitar compresión.
|
igor@428
|
588
|
jerojasro@520
|
589 Sobre cualquier red distinta a una LAN rápida (incluso con una red
|
igor@428
|
590 inalámbrica), hacer uso de compresión puede mejorar el rendimiento
|
igor@428
|
591 de las operaciones de Mercurial que involucren la red. Por ejemplo,
|
igor@428
|
592 sobre WAN, alguien ha medido la compresión reduciendo la cantidad
|
igor@428
|
593 de tiempo requerido para clonar un repositorio particularmente
|
igor@428
|
594 grande de~51 minutos a~17 minutos.
|
igor@428
|
595
|
igor@428
|
596 Tanto \command{ssh} como \command{plink} aceptan la opción
|
igor@428
|
597 \cmdopt{ssh}{-C} que activa la compresión. Puede editar fácilmente
|
igor@428
|
598 su \hgrc\ para habilitar la compresión para todos los usos de
|
igor@428
|
599 Mercurial sobre el protocolo ssh.
|
igor@402
|
600 \begin{codesample2}
|
igor@402
|
601 [ui]
|
igor@402
|
602 ssh = ssh -C
|
igor@402
|
603 \end{codesample2}
|
igor@402
|
604
|
igor@428
|
605 Si usa \command{ssh}, puede reconfigurarlo para que siempre use
|
igor@428
|
606 compresión cuando se comunique con su servidor. Para hacerlo,
|
jerojasro@520
|
607 edite su fichero \sfilename{.ssh/config} (que puede no existir
|
igor@428
|
608 aún), de la siguiente forma:
|
igor@402
|
609 \begin{codesample2}
|
igor@402
|
610 Host hg
|
igor@402
|
611 Compression yes
|
igor@428
|
612 HostName hg.ejemplo.com
|
igor@428
|
613 \end{codesample2}
|
igor@428
|
614 Que define un alias, \texttt{hg}. Cuando lo usa con la orden
|
igor@428
|
615 \command{ssh} o con una URL de Mercurial con protocolo\texttt{ssh},
|
igor@428
|
616 logrará que \command{ssh} se conecte a \texttt{hg.ejemplo.com}
|
igor@428
|
617 con compresión. Que le dará un nombre más corto para teclear y
|
igor@428
|
618 compresión, los cuales por derecho propio son buenos.
|
igor@402
|
619
|
igor@429
|
620 \section{Uso de CGI a través de HTTP}
|
igor@402
|
621 \label{sec:collab:cgi}
|
igor@402
|
622
|
igor@429
|
623 Dependiendo de qué tan ambicioso sea, configurar la interfaz CGI
|
igor@429
|
624 de Mercurial puede tomar desde unos minutos hasta varias horas.
|
igor@429
|
625
|
igor@429
|
626 Comenzaremos con el ejemplo más sencillo, y nos dirigiremos hacia
|
igor@429
|
627 configuraciones más complejas. Incluso para el caso más básico
|
igor@429
|
628 necesitará leer y modificar su configuración del servidor web.
|
igor@402
|
629
|
igor@402
|
630 \begin{note}
|
igor@429
|
631 Configurar un servidor web es una actividad compleja, engorrosa y
|
igor@429
|
632 altamente dependiente del sistema. De ninguna manera podremos
|
igor@429
|
633 cubrir todos los casos posibles con los cuales pueda encontrarse.
|
jerojasro@542
|
634 Use su discreción y juicio respecto a las secciones siguientes.
|
igor@429
|
635 Esté preparado para cometer muchas equivocaciones, y emplear
|
igor@429
|
636 bastante tiempo leyendo sus bitácoras de error del servidor.
|
igor@402
|
637 \end{note}
|
igor@402
|
638
|
igor@429
|
639 \subsection{Lista de chequeo de la configuración del servidor web}
|
igor@429
|
640
|
igor@429
|
641 Antes de continuar, tómese un tiempo para revisar ciertos aspectos de
|
igor@429
|
642 la configuración de su sistema:
|
igor@402
|
643
|
igor@402
|
644 \begin{enumerate}
|
igor@429
|
645 \item ¿Tiene un servidor web? Mac OS X viene con Apache, pero otros
|
igor@429
|
646 sistemas pueden no tener un servidor web instalado.
|
igor@429
|
647 \item Si tiene un servidor web instalado, ¿Está ejecutándose? En la
|
igor@429
|
648 mayoría de sistemas, aunque esté presente, puede no estar habilitado
|
igor@429
|
649 de forma predeterminada.
|
igor@429
|
650 \item ¿u servidor está configurado para permitir ejecutar programas
|
igor@429
|
651 CGI en el directorio donde planea hacerlo? Casi todos los
|
igor@429
|
652 servidores de forma predeterminada explícitamente inhiben la
|
igor@429
|
653 habilidad de ejecutar programas CGI.
|
igor@402
|
654 \end{enumerate}
|
igor@402
|
655
|
igor@429
|
656 Si no tiene un servidor web instalado, y no tiene cierta experiencia
|
igor@429
|
657 configurando Apache, debería considerar usar el servidor web
|
igor@429
|
658 \texttt{lighttpd} en lugar de Apache. Apache tiene una reputación
|
igor@429
|
659 bien ganada por su configuración barroca y confusa.
|
igor@429
|
660 A pesar de que \texttt{lighttpd} tiene menos características que
|
igor@429
|
661 Apache en ciertas áreas, las mismas no son relevantes para servir
|
igor@429
|
662 repositorios de Mercurial. Definitivamente es mucho más sencillo
|
igor@429
|
663 comenzar con \texttt{lighttpd} que con Apache.
|
igor@429
|
664
|
igor@429
|
665 \subsection{Configuración básica de CGI}
|
igor@429
|
666
|
igor@429
|
667 En sistemas tipo Unix es común que los usuarios tengan un subdirectorio
|
igor@429
|
668 con un nombre como \dirname{public\_html} en su directorio personal,
|
igor@429
|
669 desde el cual pueden servir páginas web. Un fichero llamado \filename{foo}
|
igor@429
|
670 en este directorio será visible en una URL de la forma
|
igor@402
|
671 \texttt{http://www.example.com/\~username/foo}.
|
igor@402
|
672
|
igor@429
|
673 Para comenzar, encuentre el guión \sfilename{hgweb.cgi} que debería
|
igor@429
|
674 estar presente en su instalación de Mercurial. Si no puede
|
igor@429
|
675 encontrarlo rápidamente una copia local en su sistema, puede
|
igor@429
|
676 descargarlo del repositorio principal de Mercurial en
|
igor@402
|
677 \url{http://www.selenic.com/repo/hg/raw-file/tip/hgweb.cgi}.
|
igor@402
|
678
|
igor@429
|
679 Tendrá que copiar este guión en su directorio \dirname{public\_html},
|
igor@429
|
680 y asegurarse que sea ejecutable.
|
igor@402
|
681 \begin{codesample2}
|
igor@402
|
682 cp .../hgweb.cgi ~/public_html
|
igor@402
|
683 chmod 755 ~/public_html/hgweb.cgi
|
igor@402
|
684 \end{codesample2}
|
igor@429
|
685 El argumento \texttt{755} de la orden \command{chmod} es un poco más
|
igor@429
|
686 general que hacerlo ejecutable: Asegura que el guión sea ejecutable
|
jerojasro@542
|
687 por cualquiera, y que el ``grupo'' y los ``otros'' \emph{no} tengan
|
igor@429
|
688 permiso de escritura. Si dejara los permisos de escritura abiertos,
|
igor@429
|
689 , el subsistema \texttt{suexec} de Apache probablemente se negaría
|
igor@429
|
690 a ejecutar el guión. De hecho, \texttt{suexec} también insiste en que
|
igor@429
|
691 el \emph{directorio} en el cual reside el guión no tenga permiso de
|
igor@429
|
692 escritura para otros.
|
igor@402
|
693 \begin{codesample2}
|
igor@402
|
694 chmod 755 ~/public_html
|
igor@402
|
695 \end{codesample2}
|
igor@402
|
696
|
igor@436
|
697 \subsubsection{¿Qué \emph{podría} resultar mal?}
|
igor@402
|
698 \label{sec:collab:wtf}
|
igor@402
|
699
|
igor@436
|
700 Cuando haya ubicado el CGI en el sitio correspondiente con un navegador
|
igor@436
|
701 intente visitar el URL \url{http://myhostname/~myuser/hgweb.cgi},
|
igor@436
|
702 \emph{sin} dejarse abatir por un error. Hay una alta probabilidad de
|
igor@436
|
703 que esta primera visita al URL sea fallida, y hay muchas razones posibles
|
igor@436
|
704 para este comportamiento. De hecho, podría toparse con cada uno de los
|
igor@436
|
705 errores que describimos a continuación, así que no deje de leerlos
|
igor@436
|
706 cuidadosamente. A continuación presento los problemas que yo tuve en
|
igor@436
|
707 un sistema con Fedora~7, con una instalación nueva de Apache, y una
|
igor@436
|
708 cuenta de usuario que creé específicamente para desarrollar este
|
igor@436
|
709 ejercicio.
|
igor@436
|
710
|
igor@436
|
711 Su servidor web puede tener directorios por usuario deshabilitados. Si
|
igor@436
|
712 usa Apache, busque el fichero de configuración que contenga la
|
igor@436
|
713 directiva \texttt{UserDir}. Si no está presente en sitio alguno, los
|
igor@436
|
714 directorios por usuario están deshabilitados. Si la hay, pero su
|
igor@436
|
715 valor es \texttt{disabled}, los directorios por usuario estarán
|
igor@436
|
716 deshabilitados. La directiva \texttt{UserDir} en caso contrario tendrá
|
igor@436
|
717 el nombre del subdirectorio bajo el cual Apache mirará en el
|
igor@436
|
718 directorio de cada usuario, por ejemplo \dirname{public\_html}.
|
igor@436
|
719
|
igor@436
|
720 Los permisos de sus ficheros pueden ser demasiado restrictivos. El
|
igor@436
|
721 servidor web debe poder recorrer su directorio personal y los
|
igor@436
|
722 directorios que estén bajo \dirname{public\_html}, además de tener
|
jerojasro@542
|
723 permiso para leer aquellos que estén adentro. A continuación una
|
igor@436
|
724 receta rápida para hacer que sus permisos estén acordes con las
|
igor@436
|
725 necesidades básicas.
|
igor@402
|
726 \begin{codesample2}
|
igor@402
|
727 chmod 755 ~
|
igor@402
|
728 find ~/public_html -type d -print0 | xargs -0r chmod 755
|
igor@402
|
729 find ~/public_html -type f -print0 | xargs -0r chmod 644
|
igor@402
|
730 \end{codesample2}
|
igor@402
|
731
|
igor@436
|
732 Otra posibilidad con los permisos es que obtenga una ventana
|
jerojasro@542
|
733 completamente en blanco cuando trata de cargar el guión. En cuyo
|
igor@436
|
734 caso, es posible que los permisos que tiene son \emph{demasiado
|
igor@436
|
735 permisivos}. El subsistema \texttt{suexec} de Apache no ejecutará un
|
jerojasro@542
|
736 guión que tenga permisos de escritura para el grupo o el planeta, por
|
igor@436
|
737 ejemplo.
|
igor@436
|
738
|
igor@436
|
739 Su servidor web puede estar configurado para evitar la ejecución de
|
igor@436
|
740 programas CGI en los directorios de usuario. A continuación presento
|
igor@436
|
741 una configuración predeterminada por usuario en mi sistema Fedora.
|
igor@436
|
742
|
igor@402
|
743 \begin{codesample2}
|
igor@402
|
744 <Directory /home/*/public_html>
|
igor@402
|
745 AllowOverride FileInfo AuthConfig Limit
|
igor@402
|
746 Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
|
igor@402
|
747 <Limit GET POST OPTIONS>
|
igor@402
|
748 Order allow,deny
|
igor@402
|
749 Allow from all
|
igor@402
|
750 </Limit>
|
igor@402
|
751 <LimitExcept GET POST OPTIONS>
|
igor@402
|
752 Order deny,allow
|
igor@402
|
753 Deny from all
|
igor@402
|
754 </LimitExcept>
|
igor@402
|
755 </Directory>
|
igor@402
|
756 \end{codesample2}
|
igor@436
|
757 Si encuentra un grupo de instrucciones de \texttt{Directory} similares
|
igor@436
|
758 en su configuración de Apache, la directiva a revisar es \texttt{Options}.
|
igor@436
|
759 Adicione \texttt{ExecCGI} al final de esta lista en caso de que haga
|
igor@436
|
760 falta y reinicie su servidor web.
|
igor@436
|
761
|
jerojasro@542
|
762 Si resulta que Apache le muestra el texto del guión CGI en lugar de
|
jerojasro@520
|
763 ejecutarlo, necesitará o bien descomentar (si se encuentra presente) o
|
igor@436
|
764 adicionar una directiva como la siguiente:
|
igor@402
|
765 \begin{codesample2}
|
igor@402
|
766 AddHandler cgi-script .cgi
|
igor@402
|
767 \end{codesample2}
|
igor@402
|
768
|
igor@436
|
769 Otra posibilidad es que observe una traza de Python en colores
|
igor@436
|
770 informando que no puede importar un módulo relacionado con
|
igor@436
|
771 \texttt{mercurial}. Esto es un gran progreso! El servidor es capaz
|
jerojasro@542
|
772 de ejecutar su guión CGI. Este error solamente ocurrirá si está
|
igor@436
|
773 ejecutando una instalación privada de Mercurial en lugar de una
|
igor@436
|
774 instalación para todo el sistema. Recuerde que el servidor que
|
igor@436
|
775 ejecuta el programa CGI no cuenta con variables de ambiente de las
|
igor@436
|
776 cuales usted si dispone en una sesión interactiva. Si este error le
|
igor@436
|
777 ocurre, edite su copia de \sfilename{hgweb.cgi} y siga las indicaciones
|
igor@436
|
778 dentro del mismo para establecer de forma adecuada su variable de
|
igor@436
|
779 ambiente \envar{PYTHONPATH}.
|
igor@436
|
780
|
igor@436
|
781 Finalmente, si encuentra \emph{otra} traza a todo color de Python al visitar
|
igor@436
|
782 el URL: Esta seguramente se referirá a que no puede encontrar
|
igor@436
|
783 \dirname{/path/to/repository}. Edite su script \sfilename{hgweb.cgi}
|
jerojasro@542
|
784 y reemplace la cadena \dirname{/path/to/repository} con la ruta
|
igor@436
|
785 completa al repositorio que desea servir.
|
igor@436
|
786
|
igor@436
|
787 En este punto, cuando trate de recargar la página, deberá visualizar
|
jerojasro@517
|
788 una linda vista HTML del historial de su repositorio. Uff!
|
igor@402
|
789
|
igor@438
|
790 \subsubsection{Configuración de lighttpd}
|
igor@438
|
791
|
igor@438
|
792 En mi intención de ser exhaustivo, intenté configurar
|
igor@438
|
793 \texttt{lighttpd}, un servidor web con creciente aceptación, para
|
igor@438
|
794 servir los repositorios de la misma forma como lo describí
|
igor@438
|
795 anteriormente con Apache. Después de superar los problemas que mostré
|
igor@438
|
796 con Apache, muchos de los cuáles no son específicos del servidor. Por
|
igor@438
|
797 lo tanto estaba seguro de que mis permisos para directorios y ficheros
|
igor@438
|
798 eran correctos y que mi guión \sfilename{hgweb.cgi} también lo era.
|
igor@438
|
799
|
igor@438
|
800 Dado que ya Apache estaba en ejecución correctamente, lograr que
|
jerojasro@520
|
801 \texttt{lighttpd} sirviera mi repositorio fue rápido (en otras
|
igor@438
|
802 palabras, si está tratando de usar \texttt{lighttpd}, debe leer la
|
igor@438
|
803 sección de Apache). Primero tuve que editar la sección
|
igor@438
|
804 \texttt{mod\_access} para habilitar \texttt{mod\_cgi} y
|
igor@438
|
805 \texttt{mod\_userdir}, los cuales estaban inhabilitados en mi
|
igor@438
|
806 instalación predeterminada. Añadí posteriormente unas líneas al final
|
igor@438
|
807 del fichero de configuración, para hacer lo propio con los módulos.
|
igor@402
|
808 \begin{codesample2}
|
igor@402
|
809 userdir.path = "public_html"
|
igor@402
|
810 cgi.assign = ( ".cgi" => "" )
|
igor@402
|
811 \end{codesample2}
|
igor@438
|
812 Hecho esto, \texttt{lighttpd} funcionó inmediatamente para
|
igor@438
|
813 mí. Configuré \texttt{lighttpd} antes que Apache, tuve casi los mismos
|
igor@438
|
814 reparos a nivel de configuración del sistema que con Apache. De todas
|
igor@438
|
815 maneras, considero que \texttt{lighttpd} es bastante más sencillo de
|
igor@438
|
816 configurar que Apache, a pesar de haber usado Apache por lo menos por
|
igor@438
|
817 una década, y esta fue mi primera experiencia con \texttt{lighttpd}.
|
igor@438
|
818
|
jerojasro@542
|
819 \subsection{Compartir varios repositorios con un guión CGI}
|
igor@438
|
820
|
igor@438
|
821 El guión \sfilename{hgweb.cgi} permite publicar únicamente un
|
igor@438
|
822 repositorio, una restricción frustrante. Si desea publicar más de uno
|
igor@438
|
823 sin complicarse con varias copias del mismo guión, cada una con un
|
igor@438
|
824 nombre distinto, resulta mucho mejor usar el guión
|
igor@438
|
825 \sfilename{hgwebdir.cgi}.
|
igor@438
|
826
|
igor@438
|
827 El procedimiento para configurar \sfilename{hgwebdir.cgi} tiene una
|
igor@438
|
828 porción adicional frente al trabajo requerido con
|
igor@438
|
829 \sfilename{hgweb.cgi}. Primero se debe obtener una copia del
|
igor@438
|
830 guión. Si no tiene una a mano, puede descargar una copia del ftp
|
igor@438
|
831 principal del repositorio de Mercurial en
|
igor@402
|
832 \url{http://www.selenic.com/repo/hg/raw-file/tip/hgwebdir.cgi}.
|
igor@402
|
833
|
igor@438
|
834 Necesitará una copia del guión en su directorio \dirname{public\_html},
|
igor@438
|
835 y asegurarse de que sea ejecutable.
|
igor@402
|
836 \begin{codesample2}
|
igor@402
|
837 cp .../hgwebdir.cgi ~/public_html
|
igor@402
|
838 chmod 755 ~/public_html ~/public_html/hgwebdir.cgi
|
igor@402
|
839 \end{codesample2}
|
igor@438
|
840 Con la configuración básica, intente visitar en su navegador
|
jerojasro@524
|
841 \url{http://myhostname/~myuser/hgwebdir.cgi}. Debería mostrar una
|
igor@438
|
842 lista vacía de repositorios. Si obtiene una ventana en blanco o un
|
igor@438
|
843 mensaje de error, verifique la lista de problemas potenciales en la
|
igor@438
|
844 sección~\ref{sec:collab:wtf}.
|
igor@438
|
845
|
igor@438
|
846 El guión \sfilename{hgwebdir.cgi} se apoya en un fichero externo de
|
igor@438
|
847 configuración. En principio, busca un fichero llamado
|
igor@438
|
848 \sfilename{hgweb.config} en el mismo directorio. Tendrá que crear el
|
igor@438
|
849 fichero, y permitir lectura de todo el mundo. El formato del fichero
|
igor@438
|
850 es similar a un fichero ``ini'' de Windows, que puede interpretar el módulo
|
igor@438
|
851 \texttt{ConfigParser}~\cite{web:configparser} de Python.
|
igor@438
|
852
|
igor@438
|
853 La forma más sencilla de configurar \sfilename{hgwebdir.cgi} es con
|
igor@438
|
854 una sección llamada \texttt{collections}. Esta publicará automáticamente
|
igor@438
|
855 \emph{todos} los repositorios en los directorios que usted
|
igor@438
|
856 especifique. La sección debería lucir así:
|
igor@402
|
857 \begin{codesample2}
|
igor@402
|
858 [collections]
|
igor@438
|
859 /mi/ruta = /mi/ruta
|
igor@438
|
860 \end{codesample2}
|
igor@438
|
861 Mercurial lo interpreta buscando el nombre del directorio que esté a la
|
igor@438
|
862 \emph{derecha} del símbolo ``\texttt{=}''; encontrando repositorios en
|
igor@438
|
863 la jerarquía de directorios; y usando el texto a la \emph{izquierda}
|
igor@438
|
864 para eliminar el texto de los nombres que mostrará en la interfaz
|
igor@438
|
865 web. El componente restante de la ruta después de esta eliminación
|
igor@438
|
866 usualmente se llama ``ruta virtual''.
|
igor@438
|
867
|
igor@438
|
868 Dado el ejemplo de arriba, si tenemos un repositorio cuya ruta local es
|
igor@438
|
869 \dirname{/mi/ruta/este/repo}, el guión CGI eliminará la porción inicial
|
igor@438
|
870 \dirname{/mi/ruta} del nombre y publicará el repositorio con una ruta
|
igor@438
|
871 virtual \dirname{este/repo}. Si el URL base de nuestro guión CGI es
|
igor@438
|
872 \url{http://myhostname/~myuser/hgwebdir.cgi}, el URL completo al
|
igor@438
|
873 repositorio será
|
igor@402
|
874 \url{http://myhostname/~myuser/hgwebdir.cgi/this/repo}.
|
igor@402
|
875
|
igor@438
|
876 Si reemplazamos \dirname{/mi/ruta} en el lado izquierdo de este
|
igor@438
|
877 ejemplo con \dirname{/mi}, \sfilename{hgwebdir.cgi} eliminará solamente
|
igor@438
|
878 \dirname{/mi} del nombre del repositorio, y nos ofrecerá la ruta
|
igor@438
|
879 virtual \dirname{ruta/este/repo} en lugar de \dirname{este/repo}.
|
igor@438
|
880
|
igor@438
|
881 El guión \sfilename{hgwebdir.cgi} buscará recursivamente en cada
|
jerojasro@516
|
882 directorio listado en la sección \texttt{collections} de su fichero de
|
igor@438
|
883 configuración, pero \texttt{no} hará el recorrido recursivo dentro de
|
igor@438
|
884 los repositorios que encuentre.
|
igor@438
|
885
|
igor@438
|
886 El mecanismo de \texttt{collections} permite publicar fácilmente
|
igor@438
|
887 repositorios de una forma ``hacer y olvidar''. Solamente requiere
|
jerojasro@516
|
888 configurar el guión CGI y el fichero de configuración una vez.
|
igor@438
|
889 Después de eso puede publicar y sacar de publicación un repositorio en
|
igor@438
|
890 cualquier momento incluyéndolo o excluyéndolo de la jerarquía de
|
igor@438
|
891 directorios en la cual le haya indicado a \sfilename{hgwebdir.cgi} que
|
igor@438
|
892 mirase.
|
igor@438
|
893
|
igor@438
|
894 \subsubsection{Especificación explícita de los repositorios a publicar}
|
igor@438
|
895
|
igor@438
|
896 Además del mecanismo \texttt{collections}, el guión
|
igor@438
|
897 \sfilename{hgwebdir.cgi} le permite publicar una lista específica de
|
igor@438
|
898 repositorios. Para hacerlo, cree una sección \texttt{paths}, con los
|
igor@438
|
899 contenidos de la siguiente forma:
|
igor@402
|
900 \begin{codesample2}
|
igor@402
|
901 [paths]
|
igor@438
|
902 repo1 = /mi/ruta/a/un/repo
|
igor@438
|
903 repo2 = /ruta/a/otro/repo
|
igor@438
|
904 \end{codesample2}
|
igor@438
|
905 En este caso, la ruta virtual (el componente que aparecerá en el URL)
|
igor@438
|
906 está en el lado derecho de cada definición, mientras que la ruta al
|
igor@438
|
907 repositorio está a la derecha. Note que no tiene que haber relación
|
igor@438
|
908 alguna entre la ruta virtual que elija y el lugar del repositorio en
|
jerojasro@516
|
909 su sistema de ficheros.
|
igor@438
|
910
|
igor@438
|
911 Si lo desea, puede usar los dos mecanismos \texttt{collections} y
|
jerojasro@516
|
912 \texttt{paths} simultáneamente en un sólo fichero de configuración.
|
igor@402
|
913
|
igor@402
|
914 \begin{note}
|
igor@438
|
915 Si varios repositorios tienen la misma ruta virtual,
|
igor@438
|
916 \sfilename{hgwebdir.cgi} no reportará error. Pero se comportará
|
igor@438
|
917 impredeciblemente.
|
igor@402
|
918 \end{note}
|
igor@402
|
919
|
igor@438
|
920 \subsection{Descarga de ficheros fuente}
|
igor@438
|
921
|
jerojasro@542
|
922 La interfaz web de Mercurial permite a los usuarios descargar
|
igor@438
|
923 un conjunto de cualquier revisión. Este fichero contendrá una réplica
|
igor@438
|
924 del directorio de trabajo en la revisión en cuestión, pero no
|
igor@438
|
925 contendrá una copia de los datos del repositorio.
|
igor@438
|
926
|
igor@438
|
927 De forma predeterminada esta característica no está habilitada. Para
|
igor@438
|
928 lograrlo adicione un \rcitem{web}{allow\_archive} a la sección \rcsection{web}
|
igor@438
|
929 de su fichero \hgrc.
|
igor@438
|
930
|
igor@438
|
931 \subsection{Opciones de configuración en Web}
|
igor@438
|
932
|
jerojasro@520
|
933 Las interfaces web de Mercurial (la orden \hgcmd{serve}, y los guiones
|
igor@438
|
934 \sfilename{hgweb.cgi} y \sfilename{hgwebdir.cgi}) tienen varias
|
igor@438
|
935 opciones de configuración para establecer. Todas ellas en la sección
|
igor@438
|
936 \rcsection{web}.
|
igor@402
|
937 \begin{itemize}
|
jerojasro@516
|
938 \item[\rcitem{web}{allow\_archive}] Determina cuáles tipos de ficheros
|
igor@438
|
939 de descarga soportará Mercurial. Si habilita esta característica,
|
igor@438
|
940 los usuarios de la interfaz web podrán descargar una copia de la
|
igor@438
|
941 revisión del repositorio que estén viendo. Para activar la
|
igor@438
|
942 característica de descarga de fichero, el valor tendrá una secuencia
|
igor@438
|
943 de palabras extraídas de la lista de abajo.
|
igor@402
|
944 \begin{itemize}
|
igor@438
|
945 \item[\texttt{bz2}] Un fichero \command{tar} con el método de
|
jerojasro@542
|
946 compresión \texttt{bzip2}. Tiene la mejor tasa de compresión,
|
igor@438
|
947 pero usa más tiempo de procesamiento en el servidor.
|
igor@438
|
948 \item[\texttt{gz}] Un fichero \command{tar}, comprimido con
|
igor@438
|
949 \texttt{gzip}.
|
igor@438
|
950 \item[\texttt{zip}] Un fichero \command{zip}, comprimido con LZW.
|
jerojasro@542
|
951 Este formato posee la peor tasa de compresión, pero es muy usado en
|
igor@438
|
952 el mundo Windows.
|
igor@402
|
953 \end{itemize}
|
igor@438
|
954 Si da una lista vacía o no tiene la entrada
|
igor@438
|
955 \rcitem{web}{allow\_archive}, esta característica se deshabilitará.
|
igor@438
|
956 A continuación un ejemplo de cómo habilitar los tres formatos soportados.
|
igor@402
|
957 \begin{codesample4}
|
igor@402
|
958 [web]
|
igor@402
|
959 allow_archive = bz2 gz zip
|
igor@402
|
960 \end{codesample4}
|
igor@438
|
961 \item[\rcitem{web}{allowpull}] Booleano. Determina si la interfaz web
|
igor@438
|
962 permite a los usuarios remotos emplear \hgcmd{pull} y \hgcmd{clone}
|
igor@438
|
963 sobre el repositorio~HTTP. Si se coloca \texttt{no} o
|
igor@438
|
964 \texttt{false}, solamente la porción de los procesos
|
igor@440
|
965 ``orientados-a-humanos'' se habilita de la interfaz web.
|
jerojasro@520
|
966 \item[\rcitem{web}{contact}] Cadena. Una cadena en forma libre (pero
|
igor@440
|
967 preferiblemente corta) que identifica a la persona o grupo a cargo
|
igor@440
|
968 del repositorio. Usualmente contiene el nombre y la dirección de
|
igor@440
|
969 correo electrónico de una persona o de una lista de correo. Aveces
|
igor@440
|
970 tiene sentido colocar esta opción en el fichero \sfilename{.hg/hgrc}
|
igor@440
|
971 del repositorio, pero en otras oportunidades en el \hgrc\ global si
|
igor@440
|
972 todos los repositorios tienen un único mantenedor.
|
igor@440
|
973 \item[\rcitem{web}{maxchanges}] Entero. La cantidad máxima de
|
igor@440
|
974 conjuntos de cambios a mostrar de forma predeterminada en cada página.
|
igor@440
|
975 \item[\rcitem{web}{maxfiles}] Entero. La cantidad máxima
|
igor@440
|
976 predeterminada de ficheros modificados a desplegar en una página.
|
igor@440
|
977 \item[\rcitem{web}{stripes}] Entero. Si la interfaz web despliega
|
igor@440
|
978 ``franjas'' para facilitar la visualización alineada de filas cuando
|
igor@440
|
979 se ve una tabla, este valor controla la cantidad de filas en cada
|
igor@440
|
980 franja.
|
igor@440
|
981 \item[\rcitem{web}{style}] Controla la plantilla que Mercurial usa para
|
igor@440
|
982 desplegar la interfaz web. Mercurial viene con dos plantillas web,
|
igor@440
|
983 llamadas \texttt{default} y \texttt{gitweb} (La primera es
|
igor@440
|
984 visualmente más atractiva). Puede especificar una plantilla propia;
|
igor@440
|
985 consulte el capítulo~\ref{chap:template}. A continuación mostramos
|
igor@440
|
986 cómo habilitar el estilo \texttt{gitweb}.
|
igor@402
|
987 \begin{codesample4}
|
igor@402
|
988 [web]
|
igor@402
|
989 style = gitweb
|
igor@402
|
990 \end{codesample4}
|
igor@440
|
991 \item[\rcitem{web}{templates}] Ruta. Directorio en el que se buscarán
|
jerojasro@516
|
992 los ficheros plantilla. De forma predeterminada, busca en el
|
igor@440
|
993 directorio en el cual fue instalado.
|
igor@402
|
994 \end{itemize}
|
igor@440
|
995 Si usa \sfilename{hgwebdir.cgi}, puede añadir otras opciones de
|
igor@440
|
996 configuración en una sección \section{web} del fichero
|
igor@440
|
997 \sfilename{hgweb.config} en lugar del fichero \hgrc\, si lo considera
|
igor@440
|
998 más conveniente. Estas opciones son \rcitem{web}{motd} y
|
igor@402
|
999 \rcitem{web}{style}.
|
igor@402
|
1000
|
igor@440
|
1001 \subsubsection{Opciones específicas para repositorios individuales}
|
igor@440
|
1002
|
igor@440
|
1003 Ciertas opciones de configuración de \rcsection{web} deben estar
|
igor@440
|
1004 ubicadas en el \sfilename{.hg/hgrc} de un repositorio en lugar del
|
igor@440
|
1005 fichero del usuario o el \hgrc global.
|
igor@402
|
1006 \begin{itemize}
|
igor@440
|
1007 \item[\rcitem{web}{description}] Cadena. Una cadena de forma
|
jerojasro@520
|
1008 libre (preferiblemente corta) que describa los contenidos o el
|
igor@440
|
1009 propósito del repositorio.
|
igor@440
|
1010 \item[\rcitem{web}{name}] Cadena. El nombre para visualizar en la
|
igor@440
|
1011 interfaz web del repositorio. Sustituye el nombre predeterminado, el
|
igor@440
|
1012 cual es el último componente de la ruta del repositorio.
|
igor@402
|
1013 \end{itemize}
|
igor@402
|
1014
|
igor@440
|
1015 \subsubsection{Opciones específicas a la orden \hgcmd{serve}}
|
igor@440
|
1016
|
igor@440
|
1017 Algunas opciones en la sección \rcsection{web} de un fichero \hgrc\
|
igor@440
|
1018 son de uso exclusivo para la orden \hgcmd{serve}.
|
igor@402
|
1019 \begin{itemize}
|
igor@440
|
1020 \item[\rcitem{web}{accesslog}] Ruta. El nombre del fichero en el cual
|
igor@440
|
1021 se escribe la bitácora de acceso. En principio, la orden
|
igor@440
|
1022 \hgcmd{serve} escribe esta información a la salida estándar, no a un
|
igor@440
|
1023 fichero. Las líneas de la bitácora se escriben en un formato de
|
igor@440
|
1024 fichero ``combinado'' estándar, usado por casi todos los servidores
|
igor@440
|
1025 web.
|
igor@440
|
1026 \item[\rcitem{web}{address}] Cadena. La dirección local en la cual el
|
igor@440
|
1027 servidor debe escuchar peticiones entrantes. En principio, el
|
igor@440
|
1028 servidor escucha en todas las direcciones.
|
igor@440
|
1029 \item[\rcitem{web}{errorlog}] Ruta. El nombre de un fichero en el
|
igor@440
|
1030 cual escribir la bitácora de error. En principio, la orden
|
igor@440
|
1031 \hgcmd{serve} escribe esta información en la salida de error
|
igor@440
|
1032 estándar, no a un fichero.
|
igor@440
|
1033 \item[\rcitem{web}{ipv6}] Booleano. Si se usa o no el protocolo
|
igor@440
|
1034 IPv6. En principio, IPv6 no se usa.
|
igor@440
|
1035 \item[\rcitem{web}{port}] Entero. El número del puerto~TCP en el cuál
|
igor@440
|
1036 el servidor escuchará. El puerto predeterminado es el~8000.
|
igor@402
|
1037 \end{itemize}
|
igor@402
|
1038
|
igor@440
|
1039 \subsubsection{Elegir el fichero \hgrc\ correcto para las
|
igor@440
|
1040 configuraciones de \rcsection{web}}
|
igor@440
|
1041
|
igor@440
|
1042 Es importante recordar que un servidor web como Apache o
|
igor@440
|
1043 \texttt{lighttpd} se ejecutarán bajo el usuario~ID que generalmente no
|
igor@440
|
1044 es el suyo Los guiones CGI ejecutados por su servidor, tales como
|
igor@440
|
1045 \sfilename{hgweb.cgi}, se ejecutarán también con el usuario~ID.
|
igor@440
|
1046
|
igor@440
|
1047 Si añade opciones \rcsection{web} a su fichero personal \hgrc\, Los
|
igor@440
|
1048 guiones CGI no leerán tal fichero \hgrc\. Tales configuraciones
|
igor@440
|
1049 solamente afectarán el comportamiento de la orden \hgcmd{serve} cuando
|
igor@440
|
1050 usted lo ejecuta. Para logar que los guiones CGI vean sus
|
igor@440
|
1051 configuraciones, o bien cree un fichero \hgrc\ en el directorio hogar
|
igor@440
|
1052 del usuario ID que ejecuta su servidor web, o añada tales
|
jerojasro@457
|
1053 configuraciones al fichero global \hgrc.
|
igor@402
|
1054
|
igor@402
|
1055
|
igor@402
|
1056 %%% Local Variables:
|
igor@402
|
1057 %%% mode: latex
|
igor@402
|
1058 %%% TeX-master: "00book"
|
igor@402
|
1059 %%% End:
|