miércoles, mayo 10, 2006

Control de versiones para documentos II: Usando un programa WYSIWYG

Ingredientes necesarios:
  • Procesador de textos que soporte el formato Oasis (por ejemplo OpenOffice.org).

  • Un script para convertir un .odt en un sistema de directorios.

  • Un script para convertir un sistema de directorios en un .odt

  • Si tienes más de un documento puede ser recomendable (no es necesario) un Makefile o archivo de procesamiento por lotes.
Como ya adelanté en este artículo, se pueden combinar las ventajas de usar un procesador de textos WYSIWYG con las de un CVS.

El truco consista en elegir el formato del documento juiciosamente. En mi caso me decante por el estandar Oasis, que consiste en un conjunto de ficheros en XML. Lamentablemente el estándar solo obliga a implementar soporte para la versión comprimida que es el fichero resultado de comprimir los diferentes archivos que componen el documento. De hecho la mayoría solo soporta este modo de almacenarlo y entre estos se encuentra el Openoffice.org, que es el procesador de textos que yo uso.

Razonable. Resulta incomodo que para copiar un documento de una localización a otra tener que copiar varios archivos. Pero lo que es una ventaja para el uso normal es una desventaja para realizar un control de versiones correcto ya que el fichero comprimido deja de ser texto plano, con lo cual volvemos al principio.

Bueno, según la documentación un fichero .odt no es más que un archivo de tipo zip que contiene los ficheros que componen el documento. Por tanto, basta con descomprimir el .odt y subirlo al CVS para almacenarlo y comprimir los ficheros que se descargan. Cierto, pero hay que tener cuidado con los directorios para que no haya pegas. Si se usa Ark, winzip o algún programa del estilo para descomprimir y volver a comprimir lo más probable es que se acabe con un fichero corrupto que no sirve para nada.

La solución vino de la mano de Edward Holness quien en este artículo indicaba (de forma indirecta) como realizar la descompresión y posterior compresión del fichero de tal modo que no se corrompiera. A partir de ese artículo he creado dos scripts de shell para realizar esta tarea. Se podría realizar igualmente mediante archivos de proceso por lotes de DOS pero actualmente no tengo mucho interés en ello. Si a alguien le apetece pegarse con ello puede ponerlos en los comentarios.


Recapitulando,
  1. Se crea, configura, etc un repositorio CVS.

  2. Se crea un fichero opendocument.

  3. El documento se añade al cvsignore.

  4. Se aplica el script Oasis2Dir.

  5. La estructura resultante se añade al control de versiones.
A partir de este punto, nuestro documento esta disponible para compartir con el resto del equipo. Los conflictos en el contenido se deben poder resolver facilmente, pero cuidado con los conflictos en las definiciones de estilos.

Para obtener la versión más actual se realiza un update y luego aplicar Dir2Oasis.

Para actualizar el repositorio se aplica el script Oasis2Dir seguido de un commit.

Por cierto, que el método aquí descrito vale para cualquier fichero de la familia Opendocument. Eso incluye textos, gráficos, presentaciones, hojas de calculo y bases de datos. Solo que resolver conflictos a mano de estos tipos de fichero puede ser más duro.

Los scripts los pongo a continuación:


Oasis2Dir
#!/bin/bash 

# Este script transforma un documento oasis representado por una estructura
# de directorios en el mismo documento en forma de un único fichero
# comprimido.
# Se puede repartir, modificar y hacer lo que se quiera con este script siempre
# y cuando no cobreis por ello.

# Se obtienen el fichero origen y el directorio destino de los parámetros
if [ $# -ne 2 ]
then
echo "Uso: $0 <fichero oasis> <directorio>"
exit
else
dir=$2
fich=$1
fi

# El fichero origen tiene que existir
if [ ! -f $fich ]
then
echo "No existe el fichero $fich"
exit
fi

# Si el directorio ya existe se elimina para evitar posibles problemas
if [ -d $dir ]
then
rm -rf $dir
fi

# Se descomprime el fichero en el directorio especificado
unzip -oq $fich -d $dir

Dir2Oasis
#!/bin/bash 

# Este script transforma un documento oasis representado por una estructura
# de directorios en el mismo documento en forma de un único fichero
# comprimido.
# Se puede repartir, modificar y hacer lo que se quiera con este script siempre
# y cuando no cobreis por ello.

# Se guarda el directorio actual para poder volver a él.
base=$PWD
# Crear un fichero temporal es una chapuza que espero eliminar pronto.
temp='/tmp/tmp.dir2odt.$$'

# Se obtienen el directorio origen y el fichero destino de los parámetros
if [ $# -ne 2 ]
then
echo "Uso: $0 <directorio> <fichero oasis>"
exit
else
dir=$1
fich=$2
fi

# El directorio tiene que existir
if [ ! -d $dir ]
then
echo "No se encuentra el directorio $dir"
exit
fi

# Si el fichero ya existe se elimina para evitar posibles problemas
if [ -f $fich ]
then rm $fich
fi

# Se crea el fichero en una ubicación temporal
cd $dir
zip -rq9 $temp *

# Se vuelve al directorio de partida
cd $base

# El fichero temporal se mueve a donde corresponde
mv $temp $fich

No hay comentarios: