4. Trabajando con CVS

Es momento de colaborar activamente en el proyecto, para ello necesitaremos tener cuenta de desarrollador en el servidor CVS ya que la cuenta anoncvs no suele tener privilegios para mandar código al repositorio.

4.1. Subiendo nuestras modificaciones

Una vez que hemos realizado las modificaciones adecuadas a nuestros ficheros locales procederemos a actualizar el repositorio y añadiremos un pequeño comentario sobre el motivo del cambio. Para eso utilizaremos el comando commit con el modificador -m "Comentario sobre el cambio realizado".

Como no tengo cuenta en el proyecto vimes voy a cambiar a otro proyecto local ;-) . En este caso he modificado unas cosas en el fichero shell.sgml y voy a actualizar el repositorio. Para ello primero actualizo mi copia con update (lo que me permite saber si alguien más ha modificado el mismo archivo y puede surgir conflicto) y después lo subo al repositorio.

charlie$ pwd
/home/charlie/cvs
 
charlie$ cvs update doc-general
# ...
M doc-general/shell.sgml
# Me notifica que poseo una versión local modificada respecto al
#  repositorio

# Voy a subir mis modificaciones
charlie$ cvs commit -m "Actualizada seccion 2" doc-general/shell.sgml
Checking in shell.sgml;
/home/cvs/doc-general/shell.sgml,v  <--  shell.sgml
new revision: 1.4; previous revision: 1.3
done
# La actualización ha sido correcta
    

4.1.1. Problemas al actualizar archivos

Cuando dos desarrolladores están trabajando sobre el mismo archivo es posible que que en algún momento las modificaciones que realiza cada uno de ellos coincida. Por lo que cuando el segundo actualice el archivo CVS le devuelva una linea de error mostrando lo que tiene la versión local y lo que tiene la versión del CVS.

Después de trabajar en unos cambios en el fichero menu.php quiero subir mi versión al servidor, lo que no sé es que otro desarrollador ya ha realizado cambios en la misma sección del fichero. Al intentar actualizar el fichero cvs nos devolverá un error diciéndonos que es no es capaz de fusionar la versión local con la que hay en el repositorio. Este es el caso:

charlie$ cvs update
cvs update: Updating .
RCS file: /var/cvs/web/menu.php,v
retrieving revision 1.5
retrieving revision 1.6
Merging differences between 1.5 and 1.6 into menu.php
rcsmerge: warning: conflicts during merge
cvs update: conflicts found in menu.php
C menu.php
 
charlie$
     

Si ahora edito el fichero menu.php veo que cvs ha realizado unos cambios en el fichero que son los que están dando problemas:

<<<<<<< menu.php
<a href="foro.cgi">Foro</a>
=======
<a href="libro.cgi">Libro de visitas</a>
>>>>>>> 1.6
     

Al realizar la actualización se ha remarcado que problema hay en el fichero, en este caso la versión disponible en servidor es la 1.6 pero la copia sobre la que realice los cambios era la 1.5. Se puede ver que el otro desarrollador y yo hemos modificado la misma línea del fichero (el otro desarrollador fue más rápido y actualizó antes) y CVS no sabe elegir entre las dos.

Simplemente se editan las líneas que dan problemas y se eliminan las marcas. Una vez el fichero sea correcto lo subimos al repositorio.

charlie$ cvs commit -m "Enlace al libro de visitas arreglado" menu.php
Checking in menu.php;
/var/cvs/web/menu.php,v  <-- menu.php
new revision: 1.7; previous revision: 1.6
done
     

4.1.2. Recuperando una versión anterior

En algún momento un desarrollador subirá al repositorio unas modificaciones que no sean muy acertadas o que podrían causar problemas con los otros archivos y tal vez nos interesase volver a una versión anterior del proyecto y hacer como si nunca se hubiese modificado.

Desarrollando menu.php otro desarrollador ha introducido una nueva función, sin embargo esa función ni es necesaria ni es segura por lo que es conveniente recuperar la versión anterior y olvidar esos cambios:

charlie$ cvs update -j 1.8 -j 1.7 menu.php
RCS file: /var/cvs/web/menu.php,v
retrieving revision 1.8
retrieving revision 1.7
Merging differences between 1.8 and 1.7 into menu.php
 
charlie$ cvs update
cvs update: Updating .
M menu.php
    
charlie$ cvs commit -m "Regreso a la version 1.7" menu.php
Checking in menu.php;
/var/cvs/web/menu.php,v  <--  menu.php
new revision: 1.9; previous revision: 1.8
done
     

4.2. Añadir archivos al repositorio

Durante el desarrollo de un proyecto es casi seguro que necesitaremos incluir más ficheros de los que estaban previstos al comienzo del mismo. Para incluir un fichero nuevo solamente será necesario utilizar el comando add y el fichero a añadir al repositorio. Para añadir un nuevo directorio se sigue el mismo método.

En este caso voy añadir un nuevo directorio y el archivo que cuelga de él. La única diferencia es que el directorio se añade automáticamente y para el fichero es necesario realizar cvs commit -m "Comentario".

# Añadir un nuevo directorio: kde-gnome
charlie$ cvs add kde-gnome/
Directory /home/cvs/lpractico/kde-gnome added to the repository
# El directorio ya forma parte del repositorio.
 
# Añado el fichero kde.tex en el directorio kde-gnome
charlie$ cd kde-gnome
charlie$ cvs add kde.tex
cvs add: scheduling 'kde.tex' for addtion
cvs add: use 'cvs commit' to add this file permanently
# El fichero kde.tex ha sido programado para ser añadido al repositorio
 
# Confirmo la adición del fichero kde.tex
charlie$ cvs ci -m "Adicion: Texto de la comparativa de KDE-GNOME"
cvs commit: Examining .
RCS file: /home/cvs/lpractico/kde-gnome/kde.tex,v
done
Checking in kde.tex;
/home/cvs/lpractico/kde-gnome/kde.tex,v  <--  kde.tex
initial revision: 1.1
done
# La adicción del nuevo fichero ha sido correcta.
    

4.2.1. Ficheros especiales

En la introducción se mencionaba que CVS maneja los ficheros en un formato especial y que en algún caso era posible que nuestro fichero pudiera ser malinterpretado por el servidor al guardarlo (con lo que seguramente perderíamos el fichero). Este caso es muy común cuando se maneja binarios y algunos ficheros de texto (aunque esto es menos normal).

Trabajando en la documentación he decidido añadir una imágen de una captura del escritorio en formato eps. Para evitar problemas voy a añadirla marcando como binario el fichero:

charlie$ cvs add -k 'b' captura.eps
cvs add: scheduling file `captura.eps' for addition
cvs add: use 'cvs commit' to add this file permanently
charlie$ cvs commit -m "Nueva captura de escritorio" captura.eps 
RCS file: /home/cvs/lpractico/consola/captura.eps,v
done
Checking in captura.eps;
/home/cvs/lpractico/consola/captura.eps,v  <--  captura.eps
initial revision: 1.1
done
     

La opción -k 'b' marca el fichero como binario, es decir el servidor CVS lo guardará exactamente igual sin añadirle nada. Sin embargo no se nos informa de que el fichero ha sido marcado como binario.

4.3. Eliminar ficheros del repositorio

Los pasos a seguir para eliminar ficheros del repositorio son idénticos al caso de añadir ficheros con una sola peculiaridad, primero deberemos borrar localmentel fichero que queremos eliminar:

charlie$ rm variance.sgml
 
charlie$ cvs remove variance.sgml
cvs remove: scheduling `variance.sgml' for removal
cvs remove: use 'cvs commit' to remove this file permanently
 
charlie$ cvs commit -m "Fichero obsoleto" variance.sgml
cvs commit: Examining .
Removing variance.sgml;
/home/cvs/doc-general/variance.sgml,v  <--  variance.sgml
new revision: delete; previous revision: 1.1.1.1
done
    

En el caso de los directorios tendremos que ser más cuidadosos, primero deberemos comprobar que no haya ficheros en él:

charlie$ cvs remove parte2/
cvs remove: Removing parte2/
cvs remove: file `parte2//index.html' still in working directory
cvs remove: 1 file exists; remove it first
  
charlie$ rm parte2/index.html
 
charlie$ cvs remove parte2/
cvs remove: Removing parte2/
cvs remove: scheduling `parte2//index.html' for removal
cvs remove: use 'cvs commit' to remove this file permanently
 
charlie$ cvs commit -m "Parte asimilada ;)" parte2
cvs commit: Examining parte2
Removing parte2/index.html;
/home/cvs/lpractico/consola/parte2/index.html,v  <--  index.html
new revision: delete; previous revision: 1.1
done
    

Primero nos dice que todavía hay archivos en el directorio que queremos eliminar. Una vez borrados los ficheros que hay el directorio procedemos a su eliminación: el directorio parte2 es eliminado inmediatamente mientras que el fichero index.html queda pendiente de confirmación con la operación commit.

4.3.1. CVS y los ficheros eliminados

CVS se encarga de mantener un histórico y todas las versiones de los arhivos que hay en los proyectos. Si esto es cierto no se pueden borrar los ficheros pues aunque no sean necesarios en las versiones actuales del proyecto si que lo fueron en etapas anteriores.

En realidad CVS no borra ningún fichero de repositorio simplemente lo mueve a un directorio llamado Attic y lo marca como "muerto" estando disponible en caso de tener que "revivirlo".

charlie$ pwd
/home/cvs/doc-general/Attic
 
charlie$ ls
variance.sgml,v