hgbook

annotate es/collab.tex @ 644:3b864df20e3b

Update Chinese translation
author Dongsheng Song <dongsheng.song@gmail.com>
date Wed Mar 18 18:13:05 2009 +0800 (2009-03-18)
parents 801442e58e6d
children
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: