
jerojasro@528: \chapter{Nombres de ficheros y asociación de patrones}
igor@402: \label{chap:names}
igor@402: 
jerojasro@430: Mercurial provee mecanismos que le permiten trabajar con nombres de
jerojasro@430: ficheros en una manera consistente y expresiva.
jerojasro@430: 
jerojasro@430: \section{Nombrado de ficheros simple}
jerojasro@430: 
jerojasro@430: % TODO traducción literal de "under the hood". revisar
jerojasro@430: Mercurial usa un mecanismo unificado ``bajo el capó'' para manejar
jerojasro@430: nombres de ficheros. Cada comando se comporta de manera uniforme con
jerojasro@430: respecto a los nombres de fichero. La manera en que los comandos
jerojasro@430: operan con nombres de fichero es la siguiente.
jerojasro@430: 
jerojasro@430: Si usted especifica explícitamente nombres reales de ficheros en la
jerojasro@430: línea de comandos, Mercurial opera únicamente sobre dichos ficheros,
jerojasro@430: como usted esperaría.
igor@402: \interaction{filenames.files}
igor@402: 
jerojasro@430: Cuando usted provee el nombre de un directorio, Mercurial interpreta
jerojasro@430: eso como ``opere en cada fichero en este directorio y sus
jerojasro@430: subdirectorios''. Mercurial va por todos los ficheros y subdirectorios
jerojasro@430: de un directorio en orden alfabético. Cuando encuentra un
jerojasro@430: subdirectorio, lo recorrerá antes de continuar con el directorio
jerojasro@430: actual.
igor@402: \interaction{filenames.dirs}
igor@402: 
jerojasro@430: \section{Ejecución de comandos sin ningún nombre de fichero}
jerojasro@430: 
jerojasro@430: Los comandos de Mercurial que trabajan con nombres de fichero tienen
jerojasro@430: comportamientos por defecto adecuados cuando son utilizados sin pasar
jerojasro@430: ningún patrón o nombre de fichero. El tipo de comportamiento depende
jerojasro@431: de lo que haga el comando. Aquí presento unas cuantas reglas generales
jerojasro@431: que usted puede usar para que es lo que probablemente hará un comando
jerojasro@431: si usted no le pasa ningún nombre de fichero con el cual trabajar.
igor@402: \begin{itemize}
jerojasro@431: \item Muchos comandos operarán sobre el directorio de trabajo
jerojasro@431:     completo. Por ejemplo, esto es lo que hace el comando
jerojasro@431:     \hgcmd{add},
jerojasro@431: \item Si el comando tiene efectos difíciles o incluso imposibles de
jerojasro@431:     revertir, se le obligará a usted a proveer explícitamente al menos
jerojasro@431:     % TODO revisar ese "lo proteje a usted"
jerojasro@431:     un nombre o patrón (ver más abajo). Esto lo proteje a usted de,
jerojasro@431:     por ejemplo, borrar ficheros accidentalmente al ejecutar
jerojasro@431:     \hgcmd{remove} sin ningún argumento.
igor@402: \end{itemize}
igor@402: 
jerojasro@431: 
jerojasro@431: Es fácil evitar este comportamiento por defecto, si no es el adecuado
jerojasro@431: para usted. Si un comando opera normalmente en todo el directorio de
jerojasro@431: trabajo, usted puede llamarlo para que trabaje sólo en el directorio
jerojasro@431: actual y sus subdirectorio pasándole el nombre ``\dirname{.}''.
igor@402: \interaction{filenames.wdir-subdir}
igor@402: 
jerojasro@431: Siguiendo la misma línea, algunos comandos normalmente imprimen las
jerojasro@431: rutas de ficheros con respecto a la raíz del repositorio, aún si usted
jerojasro@431: los llama dentro de un subdirectorio. Dichos comandos imprimirán las
jerojasro@431: rutas de los ficheros respecto al directorio en que usted se encuentra
jerojasro@431: si se les pasan nombres explícitos. Vamos a ejecutar el comando
jerojasro@431: \hgcmd{status} desde un subdirectorio, y a hacer que opere en el
jerojasro@431: directorio de trabajo completo, a la vez que todas las rutas de
jerojasro@431: ficheros se imprimen respecto a nuestro subdirectorio, pasándole la
jerojasro@431: salida del comando \hgcmd{root}.
igor@402: \interaction{filenames.wdir-relname}
igor@402: 
jerojasro@431: \section{Reportar que está pasando}
jerojasro@431: 
jerojasro@431: El ejemplo con el comando \hgcmd{add} en la sección anterior ilustra
jerojasro@431: algo más que es útil acerca de los comandos de Mercurial. Si un
jerojasro@431: comando opera en un fichero que usted no pasó explícitamente en la
jerojasro@431: línea de comandos, usualmente se imprimirá el nombre del fichero, para
jerojasro@431: que usted no sea sorprendido por lo que sucede.
jerojasro@431: 
jerojasro@431: Esto es el principio de \emph{mínima sorpresa}. Si usted se ha
jerojasro@431: referido explícitamente a un fichero en la línea de comandos, no tiene
jerojasro@431: mucho sentido repetir esto de vuelta a usted. Si Mercurial está
jerojasro@431: actuando en un fichero \emph{implícitamente}, porque usted no pasó
jerojasro@431: nombres, ni directorios, ni patrones (ver más abajo), lo más seguro es
jerojasro@431: decirle a usted qué se está haciendo.
jerojasro@431: 
jerojasro@431: Usted puede silenciar a los comandos que se comportan de esta manera
jerojasro@431: usando la opción \hggopt{-q}.  También puede hacer que impriman el
jerojasro@431: nombre de cada fichero, aún aquellos que usted indicó explícitamente,
jerojasro@431: usando la opción \hggopt{-v}.
jerojasro@431: 
jerojasro@431: \section{Uso de patrones para identificar ficheros}
jerojasro@431: 
jerojasro@431: Además de trabajar con nombres de ficheros y directorios, Mercurial le
jerojasro@431: permite usar \emph{patrones} para identificar ficheros. El manejo de
jerojasro@431: patrones de Mercurial es expresivo.
jerojasro@431: 
jerojasro@431: En sistemas tipo Unix (Linux, MacOS, etc.), el trabajo de asociar
jerojasro@431: patrones con nombres de ficheros recae sobre el intérprete de comandos.
jerojasro@431: En estos sistemas, usted debe indicarle explícitamente a Mercurial que
jerojasro@431: el nombre que se le pasa es un patrón. En Windows, el intérprete no
jerojasro@431: expande los patrones, así que Mercurial identificará automáticamente
jerojasro@431: los nombres que son patrones, y hará la expansión necesaria.
jerojasro@431: 
jerojasro@431: Para pasar un patrón en vez de un nombre normal en la línea de
jerojasro@431: comandos, el mecanismo es simple:
igor@402: \begin{codesample2}
igor@402:   syntax:patternbody
igor@402: \end{codesample2}
jerojasro@431: Un patrón es identificado por una cadena de texto corta que indica qué
jerojasro@431: tipo de patrón es, seguido por un dos puntos, seguido por el patrón en
jerojasro@431: sí.
jerojasro@431: 
jerojasro@431: Mercurial soporta dos tipos de sintaxis para patrones. La que se usa
jerojasro@431: con más frecuencia  se denomina \texttt{glob}\ndt{Grupo, colección,
jerojasro@431: aglomeración.}; es el mismo tipo de asociación de patrones usado por
jerojasro@431: el intérprete de Unix, y también debería ser familiar para los
jerojasro@431: usuarios de la línea de comandos de Windows.
jerojasro@431: 
jerojasro@431: Cuando Mercurial hace asociación automática de patrones en Windows,
jerojasro@431: usa la sintaxis \texttt{glob}.  Por esto, usted puede omitir el
jerojasro@431: prefijo ``\texttt{glob:}'' en Windows, pero también es seguro usarlo.
jerojasro@431: 
jerojasro@431: La sintaxis \texttt{re}\ndt{Expresiones regulares.} es más poderosa;
jerojasro@431: le permite especificar patrones usando expresiones regulares, también
jerojasro@431: conocidas como regexps.
jerojasro@431: 
jerojasro@431: A propósito, en los ejemplos siguientes, por favor note que yo tengo
jerojasro@431: el cuidado de rodear todos mis patrones con comillas sencillas, para
jerojasro@431: que no sean expandidos por el intérprete antes de que Mercurial pueda
jerojasro@431: verlos.
jerojasro@431: 
jerojasro@431: \subsection{Patrones \texttt{glob} estilo intérprete}
jerojasro@431: 
jerojasro@431: Este es un vistazo general de los tipos de patrones que usted puede
jerojasro@431: usar cuando está usando asociación con patrone glob.
jerojasro@431: 
jerojasro@431: La secuencia ``\texttt{*}'' se asocia con cualquier cadena, dentro de
jerojasro@431: un único directorio.
igor@402: \interaction{filenames.glob.star}
igor@402: 
jerojasro@431: La secuencia ``\texttt{**}'' se asocia con cualquier cadena, y cruza los
jerojasro@431: % TODO token
jerojasro@431: límites de los directorios. No es una elemento estándar de los tokens
jerojasro@431: de glob de Unix, pero es aceptado por varios intérpretes Unix
jerojasro@431: populares, y es muy útil.
igor@402: \interaction{filenames.glob.starstar}
igor@402: 
jerojasro@431: La secuencia ``\texttt{?}'' se asocia con cualquier caracter sencillo.
igor@402: \interaction{filenames.glob.question}
igor@402: 
jerojasro@431: El caracter ``\texttt{[}'' marca el inicio de una \emph{clase de
jerojasro@431: caracteres}.  Ella se asocia con cualquier caracter sencillo dentro de
jerojasro@431: la clase. La clase se finaliza con un caracter ``\texttt{]}''. Una
jerojasro@431: clase puede contener múltiples \emph{rango}s de la forma
jerojasro@431: ``\texttt{a-f}'', que en este caso es una abreviación para
igor@402: ``\texttt{abcdef}''.
igor@402: \interaction{filenames.glob.range}
jerojasro@431: Si el primer caracter en aparecer después de ``\texttt{[}'' en la
jerojasro@431: clase de caracteres es un ``\texttt{!}'', se \emph{niega} la clase,
jerojasro@431: haciendo que se asocie con cualquier caracter sencillo que no se
jerojasro@431: encuentre en la clase.
igor@402: 
jerojasro@432: Un ``\texttt{\{}'' marca el inicio de un grupo de subpatrones, en
jerojasro@432: donde todo el grupo es asociado si cualquier subpatrón en el grupo
jerojasro@432: puede ser asociado. El caracter ``\texttt{,}'' separa los subpatrones,
jerojasro@432: y el ``\texttt{\}}'' finaliza el grupo.
igor@402: \interaction{filenames.glob.group}
igor@402: 
jerojasro@432: \subsubsection{Cuidado!}
jerojasro@432: 
jerojasro@432: No olvide que si usted desea asocia un patrón con cualquier
jerojasro@432: directorio, no debería usar el elemento para asociar con cualquier
jerojasro@432: cadena ``\texttt{*}'', ya que éste sólo generará asociaciones dentro
jerojasro@432: de un solo directorio. En vez de eso, use el caracter para asociar con
jerojasro@432: cualquier cadena ``\texttt{**}''. Este pequeño ejemplo ilustra la
jerojasro@432: diferencia entre los dos.
igor@402: \interaction{filenames.glob.star-starstar}
igor@402: 
jerojasro@432: \subsection{Asociación con patrones de expresiones regulares \texttt{re}}
igor@402: 
jerojasro@433: Mercurial acepta la misma sintaxis para expresiones regulares del
jerojasro@433: lenguaje de programación Python (internamente se usa el motor de
jerojasro@433: expresiones regulares de Python). Esta sintaxis está basada en la
jerojasro@433: misma del lenguaje Perl, que es el dialecto más popular en uso
jerojasro@433: (por ejemplo, también se usa en Java).
jerojasro@433: 
jerojasro@433: No discutiré el dialecto de expresiones regulares de Mercurial en
jerojasro@433: detalle aquí, ya que las mismas no son usadas frecuentemente. Las
jerojasro@433: expresiones regulares al estilo Perl se encuentran documentadas
jerojasro@433: exhaustivamente en una multitud de sitios web, y en muchos libros.
jerojasro@433: En vez de eso, me enfocaré en unas cuantas cosas que usted debería
jerojasro@433: conocer si tiene la necesidad de usar expresiones regulares en
jerojasro@433: Mercurial.
jerojasro@433: 
jerojasro@433: Una expresión regular es comparada contra un nombre de fichero
jerojasro@433: completo, relativo a la raíz del repositorio. En otras palabras, aún
jerojasro@433: si usted se encuentra en un subdirectorio \dirname{foo}, si desea
jerojasro@433: asociar ficheros en este directorio, su patrón debe empezar con
jerojasro@433: ``\texttt{foo/}''.
igor@402: 
jerojasro@434: Un detalle a tener en cuenta es que, si le son familiares las
jerojasro@434: expresiones regulares al estilo Perl, las de Mercurial están
jerojasro@434: \emph{enraízadas}. Esto es, que la asociación de una expresión se hace
jerojasro@434: desde el inicio de la cadena; no se buscan coincidencias dentro de la
jerojasro@434: cadena. Para buscar coincidencias en cualquier sitio dentro de una
jerojasro@434: cadena, empiece su patrón con un ``\texttt{.*}''.
jerojasro@434: 
jerojasro@516: \section{Filtrado de ficheros}
jerojasro@434: 
jerojasro@434: Mercurial no sólo le provee una variedad de formas para especificar
jerojasro@434: ficheros; le permite limitar aún más dichos ficheros mediante el uso
jerojasro@434: de \emph{filtros}. Los comandos que operan con nombres de fichero
jerojasro@434: aceptan dos opciones de filtrado.
igor@402: \begin{itemize}
jerojasro@434: \item \hggopt{-I}, o \hggopt{--include}, le permite especificar un
jerojasro@434:     patrón con el que deben coincidir los ficheros para ser
jerojasro@434:     procesados.
jerojasro@434: \item \hggopt{-X}, o \hggopt{--exclude}, le brinda una manera de 
jerojasro@434:   \emph{evitar} procesar ficheros, si coinciden con este patrón.
igor@402: \end{itemize}
jerojasro@434: Usted puede pasar múltiples veces las opciones \hggopt{-I} y
jerojasro@434: \hggopt{-X} en la línea de comandos, e intercalarlos como desee.
jerojasro@434: Por defecto, Mercurial interpreta los patrones que usted pase usando
jerojasro@434: la sintaxis glob (pero usted puede usar expresiones regulares si lo
jerojasro@434: necesita).
jerojasro@434: 
jerojasro@434: El filtro \hggopt{-I} puede verse como un ``procese todos los ficheros
jerojasro@434: que coincidan con este filtro''.
igor@402: \interaction{filenames.filter.include}
jerojasro@434: El filtro \hggopt{-X} puede verse como ``procese únicamente los
jerojasro@434: ficheros que no coincidan con este patrón''.
igor@402: \interaction{filenames.filter.exclude}
igor@402: 
jerojasro@434: \section{Ignorar ficheros y directorios no deseados}
igor@402: 
igor@402: XXX.
igor@402: 
jerojasro@504: \section{Sensibilidad a mayúsculas}
igor@402: \label{sec:names:case}
igor@402: 
jerojasro@434: Si usted está trabajando en un ambiente de desarrollo mixto que
jerojasro@434: contiene tanto sistemas Linux (u otro Unix) y sistemas Mac o Windows,
jerojasro@434: debería tener en mente el hecho de que ellos tratan 
jerojasro@434: %TODO FIXME seguir desde aqui, no tengo idea de como traducir case
jerojasro@434: %sensitivity
igor@402: case (``N'' versus ``n'') of file names in incompatible ways.  This is
igor@402: not very likely to affect you, and it's easy to deal with if it does,
igor@402: but it could surprise you if you don't know about it.
igor@402: 
igor@402: Operating systems and filesystems differ in the way they handle the
igor@402: \emph{case} of characters in file and directory names.  There are
igor@402: three common ways to handle case in names.
igor@402: \begin{itemize}
igor@402: \item Completely case insensitive.  Uppercase and lowercase versions
igor@402:   of a letter are treated as identical, both when creating a file and
igor@402:   during subsequent accesses.  This is common on older DOS-based
igor@402:   systems.
igor@402: \item Case preserving, but insensitive.  When a file or directory is
igor@402:   created, the case of its name is stored, and can be retrieved and
igor@402:   displayed by the operating system.  When an existing file is being
igor@402:   looked up, its case is ignored.  This is the standard arrangement on
igor@402:   Windows and MacOS.  The names \filename{foo} and \filename{FoO}
igor@402:   identify the same file.  This treatment of uppercase and lowercase
igor@402:   letters as interchangeable is also referred to as \emph{case
igor@402:     folding}.
igor@402: \item Case sensitive.  The case of a name is significant at all times.
igor@402:   The names \filename{foo} and {FoO} identify different files.  This
igor@402:   is the way Linux and Unix systems normally work.
igor@402: \end{itemize}
igor@402: 
igor@402: On Unix-like systems, it is possible to have any or all of the above
igor@402: ways of handling case in action at once.  For example, if you use a
igor@402: USB thumb drive formatted with a FAT32 filesystem on a Linux system,
igor@402: Linux will handle names on that filesystem in a case preserving, but
igor@402: insensitive, way.
igor@402: 
jerojasro@434: \subsection{Almacenamiento portable y seguro de repositorios}
jerojasro@434: 
jerojasro@434: El mecanismo de almacenamiento de los repositorios en Mercurial es
jerojasro@504: \emph{robusto frente a sensibilidad/insensibilidad a mayúsculas}. Los nombres de
jerojasro@434: fichero son traducidos para que puedan ser almacenados de manera
jerojasro@504: segura tanto en sistemas sensibles como insensibles a mayúsculas. Esto
jerojasro@434: significa que usted puede usar herramientas normales de copia de
jerojasro@434: ficheros para transferir un repositorio Mercurial a, por ejemplo, una
jerojasro@434: memoria USB, y trasladar de manera segura la memoria y el repositorio
jerojasro@434: de ida y vuelta entre un Mac, un PC ejecutando Windows, y un sistema
jerojasro@434: Linux
jerojasro@434: 
jerojasro@434: \subsection{Detección de conflictos de mayúsculas/minúsculas}
jerojasro@504: 
jerojasro@504: Al operar en el directorio de trabajo, Mercurial respeta la política
jerojasro@516: de nombrado del sistema de ficheros en que se encuentre el directorio
jerojasro@504: de trabajo. Si el sistema de ficheros conserva las diferencias entre
jerojasro@504: mayúsculas, pero no es sensible a ellas, Mercurial tratará los nombres
jerojasro@504: que sólo difieren en mayúsculas como uno solo y el mismo.
jerojasro@504: 
jerojasro@504: Un aspecto importante de este enfoque es que es posible consignar un
jerojasro@504: conjunto de cambios en un sistema de ficheros sensible a mayúsculas
jerojasro@504: (típicamente Linux o Unix) que terminará causando problemas para
jerojasro@504: usuarios en sistemas insensibles a mayúsculas (usualmente en Windows o
jerojasro@504: MacOS). Si un usuario de Linux consigna cambios a dos ficheros, uno de
jerojasro@504: ellos llamado \filename{myfile.c} y el otro llamado \filename{MyFile.C},
jerojasro@504: ambos serán almacenados correctamente en el repositorio. Y serán
jerojasro@504: representados correctamente como ficheros separados, en los
jerojasro@504: directorios de trabajo de otros usuarios de Linux.
jerojasro@504: 
jerojasro@504: Si un usuario de Windows o Mac jalan este cambio, no tendrán problemas
jerojasro@504: inicialmente, porque el mecanismo de almacenamiento de Mercurial es
jerojasro@504: seguro frente a sensibilidad/insensibilidad a mayúsculas. Sin embargo,
jerojasro@504: una vez que ellos traten de actualizar (\hgcmd{update}) el directorio
jerojasro@504: de trabajo con ese conjunto de cambios, o hagan fusión (\hgcmd{merge})
jerojasro@504: con ese conjunto de cambios, Mercurial verá el conflicto entre los dos
jerojasro@504: nombres de fichero que el sistema de ficheros trataría como el mismo,
jerojasro@504: e impedirá que ocurra la actualización o fusión.
jerojasro@504: 
jerojasro@504: \subsection{Arreglar un conflicto de mayúsculas/minúsculas}
jerojasro@504: 
jerojasro@504: Si usted está usando Windows o Mac en un entorno mixto donde algunos
jerojasro@504: de sus colaboradores están usando Linux o Unix, y Mercurial reporta un
jerojasro@504: conflicto de mayúsculas/minúsculas cuando usted trata de actualizar
jerojasro@504: (\hgcmd{update}) o fusionar (\hgcmd{merge}), el procedimiento para
jerojasro@504: arreglar el problema es simple.
jerojasro@504: 
jerojasro@504: Sólo busque un sistema Linux o Unix cercano, clone el repositorio
jerojasro@504: problema allí, y use el comando \hgcmd{rename} de Mercurial para
jerojasro@504: cambiar los nombres de cualquiera de los ficheros o directorios
jerojasro@504: problemáticos para que no causen más conflictos. Consigne este cambio,
jerojasro@504: y jálelo (\hgcmd{pull}) o empújelo (\hgcmd{push}) a su sistema Windows
jerojasro@504: o MacOS, y actualícelo (\hgcmd{update}) a la revisión con los nombres
jerojasro@504: que ya no generan conflictos.
jerojasro@504: 
jerojasro@504: El conjunto de cambios con los nombres con conflictos de
jerojasro@504: mayúsculas/minúsculas permanecerá en el historial de su proyecto, y
jerojasro@504: usted no podrá actualizar (\hgcmd{update}) su directorio de trabajo a
jerojasro@504: dicho conjunto de cambios en un sistema Windows o MacOS, pero puede
jerojasro@504: continuar el desarrollo sin impedimentos.
igor@402: 
igor@402: \begin{note}
jerojasro@504:   Antes de la versión~0.9.3, Mercurial no usaba un mecanismos seguro
jerojasro@504:   frente a sensibilidad/insensibilidad a mayúsculas o minúsculas, y no
jerojasro@504:   detectaba los conflictos con nombres de ficheros. Si usted está
jerojasro@504:   usando una versión más antigua de Mercurial en Windows o MacOS, le
jerojasro@504:   recomiendo enérgicamente que se actualice.
igor@402: \end{note}
igor@402: 
igor@402: %%% Local Variables: 
igor@402: %%% mode: latex
igor@402: %%% TeX-master: "00book"
igor@402: %%% End: 




