2. Introducción a CVS

CVS, Concurrent Versions System, es una aplicación cliente/servidor que se encarga de mantener un repositorio de software centralizado que es actualizado y distribuido desde y hacia las copias locales de los desarrolladores. Es una utilidad muy sencilla de usar ;-)

2.1. ¿Cómo funciona?

El funcionamiento es muy simple: el desarrollador se conecta con el servidor CVS y le pide la última versión disponible del proyecto, en este paso el desarrollador puede ver que cambios se han realizado respecto a su versión local y los conflictos que pudiera ocasionar el código que el desarrollador ha realizado en su copia local con el código que ya está disponible en el servidor. En caso de que el código no sea problemático se modifican los ficheros locales respentando los cambios del desarrollador.

El servidor CVS se encarga de manejar el histórico de lo que ocurre, mantener un registro de los cambios realizados a cada fichero y de servirlos según las necesidades del desarrollador. Además gestiona diversas utilidades para controlar en que ficheros se esta trabajando, notificar a los autores de los ficheros de los cambios... y muchas más cosas pues es posible añadir scripts al funcionamiento a su configuración.

El cliente CVS del desarrollador se encarga de obtener las últimas versiones disponibles (o las que necesite), de confrontarlas con las copias locales y de crear una copia local de los ficheros del proyecto que sean editables por el desarrollador. Y por supuesto de añadir el código del desarrollador al proyecto.

2.2. ¿Qué estructura tiene el servidor?

El servidor de CVS se encarga de mantener los ficheros que conforman nuestro proyecto de tal forma que se mantienen los cambios realizados hasta el momento, esto nos permite consultar versiones anteriores de un mismo fichero de una forma rápida y sencilla.

En la raíz del servidor se encuentran los módulos que están disponibles, normalmente cada módulo corresponde a un directorio en el raíz. Los directorios que cuelgan de un directorio del raíz se consideran submódulos, es decir, la estructura es así:

/Raíz_CVS
|
|---/Módulo_1
|   |
|   |---/Submódulo_1 del Módulo_1
|   |---/Submódulo_2 del Módulo_1
|
|---/Módulo_2
|---/CVSROOT[1]
    

Los ficheros que el servidor almacena son del tipo fichero.ext,v. En estos ficheros se encuentra nuestro fichero original, los cambios realizados en las versiones anteriores y más información. Al manejarse en un formato especial debemos tener cuidado al enviar ficheros especiales como binarios y formatos de texto estricto ya que es posible que alguna combinación pueda ser interpretada por el servidor, veremos más adelante la manera de marcar estos ficheros especiales.

2.3. ¿Qué estructura tiene el cliente?

La copia local que realiza el cliente de CVS solamente incluye el fichero, que es lo que el desarrollador necesita pues es el código con el que trabaja. Una peculiaridad de la copia local es que todos los directorios tienen un subdirectorio CVS, en él se guardan tres archivos: Entries, Repository, Root. En estos tres archivos se guarda información relacionada al repositorio de dónde se obtuvo el proyecto. Es decir, cada directorio se puede manejar de forma completamente independiente y sin necesidad de especificar el repositorio de origen.

/Directorio_Local
|
|---/Módulo_1
    |
    |---/Submódulo_1 del Módulo_1
    |   |---/CVS
    |
    |---/Submódulo_2 del Módulo_1
    |   |---/CVS
    |
    |---/CVS
    

2.4. ¿Para qué se usa CVS?

CVS se puede utilizar en casi todo proyecto que implique una colaboración entre desarrolladores (aunque solamente haya uno) simplemente darle un vistazo a SourceForge para descubrir la gran cantidad de proyectos que lo están usando.

Sin embargo no se utiliza solamente para desarrollo de software y manejo de código fuente. CVS está siendo utilizado para mantener sitios web, como GNOME Hispano, o para mantener documentación, como Debian Documentation Proyect y para grandes proyectos como los ports que forman parte de FreeBSD. Incluso se puede utilizar para mantener copias de trabajo en la máquina de casa, en la del trabajo, en el notebook, éct...

2.5. Instalación de CVS

Solamente es necesario instalar el paquete cvs: apt-get install cvs, Debian rulez! ;-). En otras distribuciones existen los correspondientes paquetes RPM o los tgz cuya instalación es muy sencilla. El cliente y el servidor vienen en el mismo paquete por lo que nos preguntará en que directorio se situará el raíz del servidor CVS, recomendado en /var/cvs, /var/lib/cvs o en /home/cvs.

Para iniciar un repositorio en nuestra maquina será necesario ejecutar: cvs -d $CVSROOT init, siendo $CVSROOT la variable que contiene el directorio de nuestro respositorio. Después de ejecutarlo se creará el directorio CVSROOT en la raíz del CVS, no confundir el directorio raíz del CVS, $CVSROOT, con el directorio CVSROOT que hay en la raíz (Esto último puede hacerse automáticamente en la instalación del paquete cvs).

2.6. El comando cvs

Antes de entrar en materia un par de notas sobre el uso del commando cvs:

cvs [opcion_globales] operación [opcion_operación | fichero | módulo]

En opciones globales normalmente utilizaremos -q para limitar la salida, -Q para que la salida se reduza a lo mínimo, -d $CVSROOT para indicar la localización del repositorio y por último -z N siendo N el nivel de compresion al que queremos someter a los datos que se van a intercambiar, normalmente de 3 a 5.

Las operaciones y sus opciones las veremos a lo largo de este documento. Las más comunes son: update, checkout, commit.

A lo largo de esta documentación en algunos ejemplos después de la operación viene la ruta hasta un fichero o no hay nada. Si al comando cvs se indica una ruta solamente actuará en ese directorio o fichero, por el contrario si se le ejecuta sin especificar ninguna ruta actuará sobre el directorio de trabajo actual y de forma recursiva en sus subdirectorios.

Notas

[1]

El directorio CVSROOT contiene la configuración y ficheros de información del servidor CVS.