Propiedades

Ya hemos cubierto en detalle cómo Subversion almacena y recupera varias versiones de ficheros y directorios en sus repositorios. Capítulos enteros han sido dedicados a este trozo fundamental de funcionalidad proporcionada por la herramienta. Y si el soporte de versionado acabase aquí, Subversion seguiría estando completo desde una perspectiva de control de versiones. Pero no acaba aquí.

Además de versionar sus directorios y ficheros, Subversion proporciona una interfaz para añadir, modificar y eliminar meta datos versionados en cada uno de sus directorios y ficheros versionados. Nos referimos a estos meta datos como propiedades, y puede pensar en ellas como tablas de dos columnas que relacionan nombres de propiedades con valores arbitrarios anexos a cada elemento en su copia de trabajo local. En general, los nombres y valores de las propiedades pueden ser cualquier cosa que usted desee, con la restricción de que los nombres sean texto legible por humanos. Y la mejor parte de estas propiedades es que también son versionadas, igual que el contenido textual de sus ficheros. Puede modificar, enviar cambios al repositorio y revertir cambios sobre propiedades tan fácilmente como realiza cambios textuales. Y recibirá las modificaciones de propiedades que otras personas realicen cuando actualice su copia local de trabajo.

En esta sección, examinaremos la utilidad—tanto para usuarios de Subversion como para sí mismo—del soporte de propiedades. Aprenderá los subcomandos svn relacionados con propiedades, y cómo las modificaciones de propiedades pueden afectar a su flujo de trabajo normal con Subversion. Esperamos convencerle de que las propiedades de Subversion pueden mejorar su satisfacción con el control de versiones.

¿Por qué propiedades?

Las propiedades pueden ser adiciones muy útiles a copia de trabajo local. De hecho, Subversion usa para sí mismo propiedades para almacenar información especial, y como modo para indicar que puede ser necesario cierto procesamiento especial. Igualmente, puede usar propiedades para sus propósitos. Por supuesto, cualquier cosa que haga con propiedades puede ser realizada también usando ficheros versionados regulares, pero considere el siguiente ejemplo de uso de propiedades de Subversion.

Digamos que desea diseñar una página web que almacene muchas fotos digitales, y las muestra con descripciones y una marca de fecha. Ahora, su conjunto de fotos cambia constantemente, así que le gustaría tener la mayor parte posible de la web automatizada. Estas fotos pueden ser bastante grandes, así que como es habitual en páginas web de esta naturaleza, desea proporcionar miniaturas de las imágenes a los visitantes de su web. Puede hacer esto con ficheros tradicionales. Es decir, puede tener su imagen123.jpg y imagen123-miniatura.jpg uno al lado del otro en un directorio. O si prefiere tener los mismos nombres, puede tener las miniaturas en un directorio diferente, como miniaturas/imagen123.jpg. También puede almacenar sus descripciones y marcas de fechas del mismo modo, de nuevo separados del fichero original de la imagen. Pronto, su árbol de ficheros será un desorden, y crecerá en múltiplos con cada nueva foto que añada a la página web.

Ahora considere la misma situación usando las propiedades de ficheros de Subversion. Imagine tener un único fichero, imagen123.jpg, y varias propiedades anexas llamadas descripcion, marcadetiempo, e incluso miniatura. Ahora el directorio de su copia local de trabajo parece más fácil de gestionar—de hecho, parece que no hay más que ficheros de imágenes. Pero sus scripts automáticos están preparados. Saben que pueden usar svn (o incluso mejor, pueden usar un lenguaje de enlace con Subverion— vea “Usando lenguajes distintos de C y C++”) para extraer la información adicional que su página web necesita mostrar sin tener que leer un fichero índice o jugar manipulando las rutas de ficheros.

Cómo usar las propiedades de Subversion (si decide usarlas) está en sus manos. Tal y como hemos mencionados, Subversion usa las propiedades para sus propios fines, que discutiremos más tarde en este capítulo. Pero antes, veamos cómo manipular opciones usando el programa svn.

Manipulando propiedades

El comando svn tiene la libertad de añadir o modificar propiedades de ficheros y directorios de varias maneras. Para propiedades con valores cortos, legibles por humanos, quizás la forma más simple de añadir una nueva propiedad es especificar el nombre de la propiedad y su valor en la línea de comando con el subcomando propset.

$ svn propset copyright '(c) 2003 Red-Bean Software' calc/button.c
property 'copyright' set on 'calc/button.c'
$

Pero hemos estado alabando la flexibilidad que Subversion ofrece para los valores de sus propiedades. Y si está planeando tener un valor de propiedad textual multi línea, o incluso binario, probablemente no quiera proporcionarlo en la línea de comando. Así que el subcomando propset acepta el parámetro --file (-F) para especificar el nombre de un fichero que contiene el nuevo valor de una propiedad.

$ svn propset license -F /path/to/LICENSE calc/button.c
property 'license' set on 'calc/button.c'
$

Además del comando propset, el programa svn proporciona el comando propedit. Este comando usa el programa de edición configurado (vea “Config”) para añadir o modificar propiedades. Cuando ejecuta el comando, svn invoca su programa de edición sobre un fichero temporal que contiene el valor actual de la propiedad (o un fichero vacío, si está añadiendo una nueva propiedad). Entonces, simplemente modifique el valor en su programa de edición hasta que represente el nuevo valor que desea almacenar para la propiedad, guarde el fichero temporal, y salga del programa de edición. Si Subversion detecta que realmente ha modificado el fichero, aceptará esta versión como nuevo valor de la propiedad. Si sale de su programa de edición sin realizar cambios, la propiedad no será modificada.

$ svn propedit copyright calc/button.c  ### exit the editor without changes
No changes to property 'copyright' on 'calc/button.c'
$

Debemos advertirle de que al igual que con otros subcomandos de svn, aquellos relacionados con propiedades pueden actuar sobre varias rutas a la vez. Esto le permite modificar propiedades sobre un conjunto de ficheros con un único comando. Por ejemplo, podríamos haber hecho:

$ svn propset copyright '(c) 2002 Red-Bean Software' calc/*
property 'copyright' set on 'calc/Makefile'
property 'copyright' set on 'calc/button.c'
property 'copyright' set on 'calc/integer.c'
…
$

Todas estas adiciones y ediciones de propiedades no son realmente muy útiles si no puede recuperar fácilmente el valor almacenado en la propiedad. Así que el programasvn proporciona dos subcomandos para mostrar los nombres y valores de propiedades anexas a ficheros y directorios. El comando svn proplist mostrará un listado de los nombres de las propiedades que existen en una ruta. Una vez conozca el nombre de las propiedades de un nodo, puede solicitar sus valores individualmente usando svn propget. Este comando, dada una ruta (o grupo de rutas) y un nombre de propiedad, imprimirá el valor de la propiedad al flujo estándar de salida.

$ svn proplist calc/button.c
Properties on 'calc/button.c':
  copyright
  license
$ svn propget copyright calc/button.c
(c) 2003 Red-Bean Software

Incluso existe una variación del comando proplist que mostrará tanto el nombre de todas las propiedad como su valor command. Simplemente use la opción --verbose (-v).

$ svn proplist --verbose calc/button.c
Properties on 'calc/button.c':
  copyright : (c) 2003 Red-Bean Software
  license : ================================================================
Copyright (c) 2003 Red-Bean Software.  All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions 
are met:

1. Redistributions of source code must retain the above copyright
notice, this list of conditions, and the recipe for Fitz's famous
red-beans-and-rice.
…

El último subcomando que trata con propiedades es propdel. Dado que Subversion le permite almacenar propiedades con valores vacíos, no puede eliminar una propiedad usando propedit o propset. Por ejemplo, este comando no le proporcionará el efecto deseado:

$ svn propset license '' calc/button.c
property 'license' set on 'calc/button.c'
$ svn proplist --verbose calc/button.c
Properties on 'calc/button.c':
  copyright : (c) 2003 Red-Bean Software
  license : 
$

Debe usar el comando propdel para eliminar las propiedades por completo. La sintaxis es similar a la de otros comandos de propiedades:

$ svn propdel license calc/button.c
property 'license' deleted from ''.
$ svn proplist --verbose calc/button.c
Properties on 'calc/button.c':
  copyright : (c) 2003 Red-Bean Software
$

Ahora que está familiarizado con todos los subcomandos de svn relacionados con propiedades, veamos cómo las modificaciones de propiedades afectan al flujo de trabajo habitual de Subversion. Tal y como mencionamos anteriormente, las propiedades de ficheros y directorios están versionadas, igual que los contenidos de los ficheros. Como resultado, Subversion proporciona las mismas oportunidades de fusionar—ya sea de manera limpia o resolviendo conflictos—las modificaciones sobre propiedades de otra persona con las suyas.

Al igual que con los contenidos de sus ficheros, sus cambios sobre propiedades son modificaciones locales, únicamente convertidas en permanentes cuando las envía al repositorio con svn commit. También puede deshacer fácilmente sus cambios—el comando svn revert recuperará sus ficheros y directorios a su estado no modificado, contenido, propiedades, y todo lo demás. Además, puede recibir información interesante sobre el estado de las propiedades de sus ficheros y directorios usando los comandos svn status y svn diff.

$ svn status calc/button.c
 M     calc/button.c
$ svn diff calc/button.c
Property changes on: calc/button.c
___________________________________________________________________
Name: copyright
   + (c) 2003 Red-Bean Software

$

Fíjese cómo el subcomando status muestra una M en la segunda columna en lugar de la primera. Esto es porque hemos modificado propiedades de calc/button.c, pero no hemos modificado su contenido. De haber cambiado ambos, habríamos visto también una M en la primera columna (vea svn status).

Quizás también se haya dado cuenta del modo no estándar usado por Subversion para mostrar las diferencias entre propiedades. Todavía puede ejecutar svn diff y redirigir la salida para crear un fichero parche usable. El programa patch ignorará los parches de propiedades—como regla general, ignora cualquier ruido que no es capaz de entender. Esto significa desafortunadamente que para aplicar completamente un parche generado por svn diff, cualquier modificación de propiedades deberá ser aplicada a mano.

Como puede ver, la presencia de modificaciones de propiedades no tiene efectos significativos en el flujo de trabajo típico con Subversion. Sus patrones generales de actualizar su copia local, verificar el estado de sus ficheros y directorios, obtener informes sobre las modificaciones realizadas, y enviar éstas al repositorio son completamente inmunes a la presencia o ausencia de propiedades. El programa svn tiene algunos subcomandos adicionales para efectuar cambios de propiedades, pero esto es la única asimetría notable.

Propiedades especiales

Subversion no tiene reglas particulares sobre propiedades—puede usarlas para cualquier fin. Subversion sólo le pide que no use nombres de propiedades que comiencen con el prefijo svn:. Ese es el espacio de nombres que reserva para uso propio. De hecho, Subversion define ciertas propiedades que tienen efectos mágicos sobre ficheros y directorios. En esta sección, desvelaremos el misterio, y describiremos cómo estas propiedades especiales pueden hacerle la vida un poco más fácil.

svn:executable

La propiedad svn:executable se usa para controlar de un modo semi automático el bit de permiso de ejecución de un fichero versionado. Esta propiedad no tiene valor definido—su mera presencia indica el deseo de que el bit de permiso de ejecución se mantenga activado por Subversion. Eliminar esta propiedad devolverá el control total del bit de ejecución al sistema operativo.

En muchos sistemas operativos, la capacidad de ejecutar un fichero o comando es gobernada por la presencia de un bit de permiso de ejecución. Éste suele estar desactivado por defecto, y debe ser activado de forma explícita por el usuario para cada fichero que lo requiera. En una copia de trabajo local, se crean nuevos ficheros constantemente a medida que nuevas versiones de ficheros existentes son recibidas durante una actualización. Esto significa que quizás active el bit de ejecución en un fichero, entonces actualice su copia de trabajo, y si ese fichero fue modificado como parte de la actualización, su bit de ejecución puede haber sido desactivado. Así que Subversion proporciona la propiedad svn:executable para mantener el bit de ejecución activado.

Esta propiedad no tiene efecto en sistemas de ficheros que no tienen concepto de bits de permiso de ejecución, como FAT32 y NTFS. [36] Además, aunque no tenga valores definidos, Subversion forzará el valor a * cuando ajuste esta propiedad. Finalmente, esta propiedad es únicamente válida en ficheros, no en directorios.

svn:mime-type

La propiedad svn:mime-type tiene varios propósitos en Subversion. Aparte de ser el lugar genérico para almacenar la clasificación de extensión polivalente de correo por Internet (MIME[37]), el valor de esta propiedad determina algunas características del comportamiento de Subversion.

Por ejemplo, si la propiedad svn:mime-type de un fichero tiene un valor de tipo MIME no textual (generalmente, algo que no comienza con text/, aunque hay algunas excepciones), Subversion asumirá que el fichero contiene datos binarios—es decir, no legibles por un ser humano. Uno de los beneficios habitualmente proporcionado por Subversion es el fusionado contextual, basado en líneas, de los cambios recibidos del servidor durante una actualización de su fichero de la copia local. Pero para los ficheros que se considera contienen datos binarios, no existe el concepto de una línea. Así que para esos ficheros, Subversion no intenta realizar un fusionado contextual durante la actualización. En su lugar, siempre que tenga un fichero binario en su copia local que esté siendo actualizado, su fichero es renombrado con la extensión .orig, y entonces Subversion almacena un nuevo fichero que contiene los cambios recibidos durante la actualización, pero sin sus modificaciones locales, con el nombre de fichero original. Este comportamiento es realmente una protección para el usuario contra intentos fallidos de realizar fusionados contextuales sobre ficheros que simplemente no pueden ser fusionados contextualmente.

Además, si la propiedad svn:mime-type está ajustada, entonces el módulo Subversion de Apache usará su valor para rellenar la cabecera HTTP Content-type: cuando responda peticiones GET. Esto proporciona una pista vital sobre cómo mostrar un fichero cuando examina su repositorio con un navegador web.

svn:ignore

La propiedad svn:ignore contiene una lista de patrones de ficheros que serán excluidos por ciertas operaciones de Subversion. Quizás la propiedad especial usada con mayor frecuencia, funciona junto con el parámetro de ejecución global-ignores (vea “Config”) para filtrar ficheros y directorios no versionados con los comandos svn status, svn add, y svn import.

La razón tras la propiedad svn:ignore es fácil de explicar. Subversion no asume que todo fichero o subdirectorio de una copia de trabajo local está destinado a ser puesto bajo control de versiones. Los recursos deben ser asignados explícitamente bajo la gestión de Subversion usando los comandos svn add o svn import. Como resultado, con frecuencia muchos recursos en una copia local de trabajo no están versionados.

Ahora, el comando svn status muestra como parte de su salida cada fichero o subdirectorio en la copia local de trabajo que no está filtrado por la opción global-ignores (o su valor por defecto). Esto se hace así para que los usuarios puedan ver si quizás han olvidado poner un recurso bajo control de versiones.

Pero Subversion es incapaz de adivinar los nombres de cada recurso que debe ser ignorado. Además, a menudo hay cosas que deberían ser ignoradas en cada copia local de trabajo de un repositorio particular. Obligar a cada usuario del repositorio a que añada patrones para estos recursos a sus áreas de configuración de parámetros de ejecución no sólo sería un incordio, sino que podría entrar en conflicto con las necesidades de configuración de otras copias locales de trabajo que el usuario ha obtenido.

La solución es almacenar los patrones de exclusión que son únicos del directorio donde deben ser aplicados junto con el propio directorio. Ejemplos habituales de recursos no versionados que son básicamente únicos de cada directorio, y propensos a aparecer ahí, son ficheros generados por la compilación de programas. O—para usar un ejemplo más apropiado para este libro—los ficheros HTML, PDF o PostScript generados como resultado de la conversión de los ficheros fuente XML DocBook a un formato de salida más legible.

Para este propósito, la propiedad svn:ignore es la solución. Su valor es un conjunto multi línea de patrones de ficheros, un patrón por línea. La propiedad se activa en el directorio donde quiere que los patrones sean aplicados. [38] Por ejemplo, digamos que obtiene la siguiente salida svn status:

$ svn status calc
 M     calc/button.c
?      calc/calculator
?      calc/data.c
?      calc/debug_log
?      calc/debug_log.1
?      calc/debug_log.2.gz
?      calc/debug_log.3.gz

En este ejemplo, ha realizado algunas modificaciones de propiedades sobre button.c, pero en su copia local de trabajo también tiene algunos ficheros sin versionar: la última versión del programa calculator que ha compilado del código fuente, un fichero de código fuente llamado data.c, y un conjunto de ficheros de depuración. Ahora, ya sabe que su sistema de compilado siempre acaba generando el programa calculator. [39] Y sabe que el conjunto de sus unidades de verificación siempre acaban dejando ficheros de depuración en el directorio. Estos hechos son ciertos para todas las copias de trabajo, no sólo la suya. Y sabe que no está interesado en ver estas cosas cada vez que ejecute svn status. Así que use svn propedit svn:ignore calc para añadir algunos patrones de exclusión al directorio calc. Por ejemplo, podría añadir lo siguiente como nuevo valor de la propiedad svn:ignore:

calculator
debug_log*

Tras añadir esta propiedad, ahora tendrá una modificación local de propiedad en el directorio calc. Pero advierta qué otras cosas son diferentes sobre la salida del comando svn status:

$ svn status
 M     calc
 M     calc/button.c
?      calc/data.c

¡Ahora, los despojos no entorpecen el listado! Por supuesto, esos ficheros aun están en su copia local de trabajo. Subversion únicamente no le está recordando que están presentes y no versionados. Y ahora tras haber eliminado todo el ruido trivial del listado, se encuentra con elementos más interesantes—como por ejemplo el fichero de código fuente que probablemente olvidó poner bajo control de versiones.

Si quiere ver los ficheros ignorados, puede pasar el parámetro --no-ignore a subversion:

$ svn status --no-ignore
 M     calc/button.c
I      calc/calculator
?      calc/data.c
I      calc/debug_log
I      calc/debug_log.1
I      calc/debug_log.2.gz
I      calc/debug_log.3.gz

La lista de patrones a excluir también es usada por svn add y svn import. Ambas de estas operaciones conllevan preguntar a Subversion que comience a gestionar algún conjunto de ficheros y directorios. En lugar de forzar al usuario que escoja qué ficheros de un árbol desea comenzar a versionar, Subversion usa los patrones de exclusión para determinar qué ficheros no deberían ser arrastrados bajo control de versiones durante grandes adiciones recursivas u operaciones de importación.

svn:keywords

Subversion tiene la capacidad de sustituir palabras clave—trozos dinámicos de información útil sobre un fichero versionado—en el contenido de los propios ficheros. Las palabras clave generalmente describen información sobre la última vez que el fichero fue modificado. Dado que esta información cambia cada vez que el fichero es modificado, y más importante aun, justo después de la modificación, es tarea difícil para todo proceso excepto el sistema de control de versiones, mantener los datos completamente actualizados. Si esta tarea fuese delegada en los autores humanos, la información inevitablemente quedaría desfasada.

Por ejemplo, digamos que posee un documento en el cual le gustaría mostrar la última fecha en la que fue modificado. Podría obligar a cada autor de ese documento a que, justo antes de enviar sus cambios al repositorio, también modifiquen la parte del documento que describe la última fecha de modificación. Pero tarde o temprano, alguien se olvidará de hacer eso. En su lugar, indique a Subversion que realice la sustitución de la palabra clave LastChangedDate. Puede controlar el lugar donde figura esta palabra clave colocando una marca de palabra clave en el lugar apropiado del fichero. Esta marca no es más que una cadena de texto formateada como $PalabraClave$.

Subversion una lista de palabras clave disponibles para ser sustituidas. Esta lista contiene las cinco siguientes palabras clave, algunas de las cuales tienen sinónimos más cortos que también puede usar:

LastChangedDate

Esta palabra clave describe el último momento en que el fichero fue modificado en el repositorio, y tiene el aspecto $LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $. Puede ser abreviada como Date.

LastChangedRevision

Esta palabra clave describe la última revisión conocida en la que este fichero fue modificado en el repositorio, y tiene el aspecto $LastChangedRevision: 144 $. Puede ser abreviada como Revision o Rev.

LastChangedBy

Esta palabra clave describe el último usuario conocido que modificó este fichero en el repositorio, y tiene el aspecto $LastChangedBy: juan $. Puede ser abreviada como Author.

HeadURL

Esta palabra clave describe la URL completa a la última versión de este fichero en el repositorio, y tiene el aspecto $HeadURL: http://svn.collab.net/repos/trunk/README $. Puede ser abreviada como URL.

Id

Esta palabra clave es una combinación comprimida de las otras palabras clave. Su sustitución tiene el aspecto $Id: calc.c 148 2002-07-28 21:30:43Z carmen $, y su interpretación indica que el fichero calc.c fue modificado por última vez en la revisión 148 de la tarde del 28 de Julio del 2002 por el usuario carmen.

Añadir únicamente la marca con la palabra clave a su fichero no hace nada especial. Subversion nunca intentará realizar sustituciones textuales en sus ficheros a no ser que usted lo pida explícitamente. Después de todo, quizás esté escribiendo un documento [40] sobre cómo usar palabras clave, ¡y no desea que Subversion sustituya sus bonitos ejemplos de marcas de palabras claves no sustituidas!

Para indicar a Subversion si desea o no sustituir palabras clave en un fichero particular, de nuevo volvemos a usar los subcomandos relacionados con propiedades. La propiedad svn:keywords, una vez activada en un fichero versionado, controla qué palabras clave serán sustituidas. El valor es una lista delimitada por espacios con las palabras clave o sinónimos de la tabla anterior.

Por ejemplo, digamos que tiene un fichero llamado weather.txt que tiene el siguiente aspecto:

Here is the latest report from the front lines.
$LastChangedDate$
$Rev$
Cumulus clouds are appearing more frequently as summer approaches.

Sin haber activado la propiedad svn:keywords en ese fichero, Subversion no hará nada especial. Ahora, activemos la sustitución de la palabra clave LastChangedDate.

$ svn propset svn:keywords "LastChangedDate Author" weather.txt
property 'svn:keywords' set on 'weather.txt'
$

Ahora acaba de realizar una modificación local de propiedad sobre el fichero weather.txt. No verá cambios en el contenido del fichero (a no ser que haya realizado algunos antes de activar la propiedad). Fíjese que el fichero contenía la marca de la palabra clave Rev, y no obstante no incluimos esta palabra clave en el valor de la propiedad. Subversion ignorará felizmente peticiones para sustituir palabras clave que no están presentes en el fichero, y no sustituirá palabras clave que no están presentes en el valor de la propiedad svn:keywords.

Inmediatamente después de que envíe al repositorio la modificación de esta propiedad, Subversion actualizará la copia local de su fichero con el nuevo texto sustituido. En lugar de ver su marca de palabra clave $LastChangedDate$, verá el resultado de su sustitución. El resultado también contendrá el nombre de la palabra clave, y continuará estando rodeado por caracteres de dólar ($). Y tal y como predijimos, la palabra clave Rev no fue sustituida porque no solicitamos hacerlo.

Here is the latest report from the front lines.
$LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $
$Rev$
Cumulus clouds are appearing more frequently as summer approaches.

Si alguna otra persona envía al repositorio cambios sobre el fichero weather.txt, su copia de ese fichero continuará mostrando el mismo valor de la sustitución de la palabra clave—hasta que actualice su copia de trabajo local. Durante ese instante las palabras clave de su fichero weather.txt serán re-sustituidas para reflejar la información más reciente de ese fichero enviada al repositorio.

svn:eol-style

Mientras la propiedad svn:mime-type de un fichero versionado no indique lo contrario, Subversion asume que el fichero contiene datos legibles por seres humanos. En general, Subversion sólo usa este conocimiento para determinar si se pueden realizar ficheros diferenciales contextuales sobre el fichero. En caso contrario, para Subversion, los bytes son bytes.

Esto significa que por defecto, Subversion no presta atención al tipo de marcas de fin de línea (EOL) que use en sus ficheros. Desafortunadamente, diferentes sistemas operativos usan caracteres diferentes para representar los fines de línea en un fichero de texto. Por ejemplo, el carácter de fin de línea habitual usado por software en la plataforma Windows es una pareja de caracteres de control ASCII —retorno de carro (CR) y nueva línea (LF). En su lugar, el software Unix usa simplemente el carácter LF para indicar nueva línea.

No todas las herramientas en estos sistemas operativos están preparadas para entender ficheros en formatos que difieran del estilo de fin de línea nativo del sistema operativo sobre el cual están corriendo. Los resultados habituales son que los programas Unix tratan el carácter CR presente en ficheros Windows como caracteres regulares (normalmente mostrados como ^M), y los programas Windows combinan todas las líneas de un fichero Unix en una línea gigante porque no encuentran la combinación de retorno de carro y nueva línea (o CRLF) que marca el fin de línea.

Esta sensibilidad a marcas EOL extrañas puede resultar frustrante para quienes comparten un fichero en múltiples sistemas operativos diferentes. Por ejemplo, considere un fichero de código fuente y desarrolladores que modifiquen este fichero tanto en Windows como en Unix. Si todos los desarrolladores usan herramientas que preservan el estilo de fin de línea del fichero, no ocurrirán problemas.

Pero en la práctica, muchas herramientas comunes o bien fallan al leer un fichero con marcas EOL extrañas, o bien convierten los finales de línea al estilo nativo cuando el fichero es guardado. Si lo primero es cierto para un desarrollador, tendrá que usar una utilidad de conversión externa (como por ejemplo dos2unix o su compañera, unix2dos) para preparar el fichero antes de modificarlo. En el segundo caso no hace falta preparación adicional. ¡Pero en ambos casos el resultado es un fichero que difiere del origen al en todas y cada una de las líneas! Antes de enviar sus cambios al repositorio, el usuario tiene dos opciones. O bien usa una utilidad de conversión para recuperar el estilo de línea que tenía el fichero antes de ser modificado. O, simplemente puede enviar sus cambios—con nuevas marcas EOL y todo.

El resultado de este tipo de escenarios incluyen tiempo perdido en modificaciones innecesarias sobre ficheros enviados al repositorio. Perder tiempo ya es doloroso. Pero cuando un cambio modifica toda línea del fichero, esto complica el trabajo de determinar qué lineas realmente cambiaron de un modo poco trivial . ¿Fue el fallo realmente corregido? ¿En qué línea se introdujo un error de sintaxis?

La solución a este problema es la propiedad svn:eol-style. Cuando se ajusta esta propiedad a un valor válido, Subversion la usa para determinar si tiene que realizar un proceso especial sobre el fichero para que los finales de línea del fichero no bailen como un flip-flop con cada cambio enviado al repositorio proveniente de un sistema operativo diferente. Los valores válidos son:

native

Esto provoca que el fichero contenta marcas EOL nativas del sistema operativo en que fue ejecutado Subversion. En otras palabras. si un usuario de Windows obtiene una copia local de un fichero cuya propiedad svn:eol-style contenga el valor native, ese fichero contendrá marcas EOL CRLF. Un usuario de Unix que obtenga una copia local del mismo fichero verá marcas EOL LF.

Tenga en cuenta que Subversion en realidad almacenará el fichero en el repositorio usando marcas EOL LF normalizadas sin importar el sistema operativo. No obstante, esto es básicamente transparente para el usuario.

CRLF

Esto provoca que el fichero contenga la secuencia CRLF como marcas EOL, sin importar el sistema operativo usado.

LF

Esto provoca que el fichero contenga el carácter LF como marca EOL, sin importar el sistema operativo usado.

CR

Esto provoca que el fichero contenga el carácter CR como marca EOL, sin importar el sistema operativo usado. Este estilo de fin de línea no es muy habitual. Fue usado en plataformas Macintosh antiguas (en las cuales Subversion ni si quiera funciona).

svn:externals

La propiedad svn:externals contiene instrucciones para Subversion de poblar el directorio con una o más copias locales de trabajo de Subversion. Para más información sobre esta propiedad y sus usos, vea “Repositorios externos”.

Ajuste automático de propiedades

Las propiedades son una poderosa característica de Subversion, actuando como componentes clave de muchas características de Subversion descritas en este y otros capítulos—soporte de diferenciado de ficheros y fusión textual, sustitución de palabras clave, traducción de fines de línea, etc. Pero para obtener por completo sus beneficios, debe ajustarlas en los ficheros y directorios adecuados. Desafortunadamente, este paso puede ser fácilmente olvidado en la rutina, especialmente dado que olvidar ajustar una propiedad normalmente no se traduce en una condición de error obvia (al menos si la compara, con digamos, olvidar añadir un fichero al repositorio). Para ayudar a sus propiedades a que sean aplicadas en los lugares necesarios, Subversion proporciona un par de características simples pero útiles.

Siempre que pone un fichero bajo control de revisiones usando los comandos svn add o svn import, Subversion ejecuta una heurística básica para determinar si el fichero se compone de contenido legible o no legible por un ser humano. Si decide lo último, Subversion ajustará automáticamente la propiedad svn:mime-type de ese fichero a application/octet-stream (el tipo MIME genérico esto es un grupo de bytes). Por supuesto, si Subversion no acierta, puede ajustar la propiedad svn:mime-type a otro valor más concreto—quizás image/png o application/x-shockwave-flash—siempre puede eliminar o modificar esta propiedad.

Subversion también proporciona la característica de auto propiedades, las cuales le permiten crear una relación de patrones de ficheros a nombres y valores de propiedades. Estas relaciones son creadas en su área de parámetros de ejecución. De nuevo, éstos afectan a adiciones e importaciones, y no sólo pueden sobreescribir cualquier tipo de decisión MIME por defecto tomada por Subversion, también pueden ajustar otras propiedades propias o de Subversion. Por ejemplo, podría crear una relación que dice que cada vez que añada ficheros JPEG—aquellos que coincidan con el patrón *.jpg—Subversion debería ajustar automáticamente la propiedad svn:mime-type de esos ficheros a image/jpeg. O quizás cualquier fichero que coincida con *.cpp debería tener la propiedad svn:eol-style ajustada a native, y svn:keywords ajustada a Id. El soporte de propiedades automáticas es quizás la herramienta de Subversion más útil en cuanto a propiedades. Vea “Config” para más información sobre cómo configurar esta característica.



[35] Corregir faltas ortográficas, errores gramaticales, y simplemente-cosas-incorrectas en el mensaje del informe de cambios es quizás el caso de uso más habitual para la opción --revprop.

[36] El sistema de ficheros de Windows usa extensiones de ficheros (como .EXE, .BAT, y .COM) para indicar que un fichero es ejecutable.

[37] N.T.: Multipurpose Internet Mail Extension en inglés.

[38] Los patrones únicamente funcionarán en ese directorio—no serán aplicados de forma recursiva en subdirectorios.

[39] ¿No es este acaso el propósito de un sistema de compilación?

[40] … o quizás incluso una sección de un libro …