Uso de CVS junto con paquetes de Debian

Con este pequeño documento sólo intentamos dar unos pocos consejos para pasar a gestionar paquetes con CVS. Probablemente sólo le interese a unas pocas personas poco familiarizadas con CVS y el control de versión. Además, hay un script en /usr/share/doc/cvs-buildpackage llamado cvs-pkginit (tanto el script como su página man están comprimidos con gzip), que mostrará un resumen de este documento COMO.

Por ejemplo, para convertir el paquete foo, versión bar1, revisión 3 de Debian, pruebe:

% cvs-pkginit foo bar1 3
y lea el resumen.
Oldenburg, 6/2/97                           Joey (joey@debian.org)
                                            / Martin Schulze   /
Mobile,                                     Manoj Srivastava
                                            srivasta@debian.org

Nota: en la siguiente discusión, las entidades dentro de símbolos <> son variables en cada caso, todo lo demás es literal. Por ejemplo, si hablamos sobre un paquete cuyo autor ha versionado como 2.1.82, entonces <$version> significa 2.1.82, y versión_upstream_<$version | tr . _> significa versión_upstream_2_1_82.

N. del. T: Con «upstream» nos referimos al autor original, de manera que la «versión del upstream» es la que obtenemos de Internet, aún sin debianizar.

  1. Configurar CVS
       $ CVSROOT=/donde/esté/su/repositorio
       $ export CVSROOT
       $ cvs init
       $ mkdir $CVSROOT/debian
    

    Esto le permite separar sus paquetes de Debian de cualquier otra cosa que tenga ahora o en el futuro en su repositorio. Incluso si piensa que no va a usar CVS para nada más, es mejor clasificar su repositorio ahora que lamentarse después (es un follón estar cambiando cosas de sitio en el repositorio después).

    Si se supone que más de una persona va a usar el CVS, tendrá que asegurarse que realmente pueden modificar el repositorio usando CVS. Escoja un grupo (o un conjunto de grupos) que tengan acceso a partes del repositorio, y establezca permisos:

       # chgrp <archivo> $CVSROOT/debian
       # chmod g+ws    $CVSROOT/debian
    

    Esto asegura que los miembros del grupo archivo tienen permiso para configurar el repositorio. Ahora tiene que asegurarse de que los grupos adecuados pueden modificar partes del repositorio.

       # mkdir $CVSROOT/debian/<paquete1>
       # chgrp <grupo1> $CVSROOT/debian/<paquete1>
       # chmod g+ws     $CVSROOT/debian/<paquete1>
       # mkdir $CVSROOT/debian/<paquete2>
       # chgrp <grupo2> $CVSROOT/debian/<paquete2>
       # chmod g+ws     $CVSROOT/debian/<paquete2>
    

    Como usuario normal, debería hacer público su repositorio CVS, bien usando "-d /where/your/repository/will/be" o escribiendo en su fichero de perfil un fragmento como el que sigue.

       $ CVSROOT=/donde/esté/su/repositorio
       $ export CVSROOT
    
  2. Uso de módulos
       # cvs checkout CVSROOT
       # cd CVSROOT
       # vi modules
    

    De aquí en adelante, <paquete> debería ser el nombre del paquete tal como aparece en el fichero debian/changelog.

    Añada las siguientes líneas, la primera es esencial, la segunda puede ir duplicada y es autoexplicativa.

       modules   CVSROOT modules
       <paquete> debian/<paquete>
    
       # cvs commit -m 'Definir los primeros módulos'
    
  3. Prepárese para usar CVS

    Inserte su árbol de fuentes con las siguientes órdenes (asumiendo que ya las haya debianizado, y que existe un fichero orig.tar.gz). Tenga en cuenta que los fuentes del autor original se importan con -ko (porque es un binario), pero no los cambios locales que hagamos. Tenga en cuenta que los números de época (epoch) se ignora a efectos de determinar el nombre de la etiqueta (tag) de CV (normalmente se usan para cambiar la opinión de dpkg al respecto del orden de los paquetes, y no son relevantes para las etiquetas de CVS).

    Pase al directorio donde tenga desempaquetado su árbol de desarrollo debianizado aún sin introducir en el CVS, que es lo que intentamos inyectar en CVS (no está en CVSROOT, generalmente).

    REPITO: En lo que sigue, <paquete> debería ser el nombre del paquete tal como aparece en el fichero debian/changelog.

       $ cd /donde/esté/su/árbol/de/fuentes
       $ tar zvfx <paquete>_<versión>.orig.tar.gz
       $ cd <paquete>_<versión>.orig
       $ cvs import -ko -m 'Importamos las fuentes peladas' debian/<paquete> source-dist versión_upstream_<versión|tr . _>
    

    Puede cambiar la etiqueta de rama (branch) source-dist por cualquier otra cosa que le guste. (El mantenedor de cvs-buildpackage suele usar la etiqueta upstream - lo cual es un estudio en redundancia ;-)).

    Si ha instalado y configurado el CVS siendo root, y no ha preparado permisos de grupo para poder escribir, necesitará crear $CVSROOT/debian/<paquete> como root y cambiar la pertenencia a grupo y usuario en el repositorio al grupo/usuario particulares respectivamente. La orden import de CVS mostrará un aviso indicando que no puede crear el directorio debian/<paquete>, pero no importa.

    El siguiente paso es descargar una copia de trabajo del árbol completo e incorporar los cambios.

       $ cd /donde/esté/su/árbol/de/fuentes
       $ cvs checkout <paquete>
    

    Si ya ha creado una versión debianizada pero no usó CVS antes, puede que quiera ejecutar las siguientes órdenes para incorporar los cambios. Después de eso, debería etiquetar esa versión para poder descargarla más tarde.

       $ cd /donde/esté/su/árbol/de/fuentes/<paquete>-<versión>
       $ diff -qrBbw . /donde/esté/el/árbol/de/trabajo/<paquete>/ | grep -v CVS
       $ FILES_CHANGED_LOCALLY="<la salida de lo anterior>"
       $ tar cf - $FILES_CHANGED_LOCALLY | tar -C /donde/esté/el/árbol/de/trabajo/<paquete> -xvpf -
       $ cd /donde/esté/el/árbol/de/trabajo/<paquete>
    

    Por favor, asegúrese de que el fichero debian/rules es ejecutable, ya que de esta manera lo será también al exportarlo, y no habrá problemas al ejecutar dpkg-buildpackage en las fuentes exportadas. Eng eneral, asegúrese de que todos los ficheros tienen los permisos correctos antes de añadirlos al repositorio CVS.

       $ cd /donde/esté/el/árbol/de/trabajo/<paquete>
       $ cvs add debian <cualquier otro fichero que haya que añadir>
    

    Además, tenga en cuenta que tiene que añadir de forma manual todos los ficheros adicionales que deberían ir en el repositorio, especialmente los del directorio debian. Más aún, observe que la orden cvs add no trabaja de forma recursiva, de manera que tendrá que añadir de forma manual cualquier subdirectorio que tenga. (cd debian; cvs add *)

    Una cosa interesante es que ejecutar cvs update le mostrará el estado de todos los ficheros del directorio.

       $ cd /donde/esté/el/árbol/de/trabajo/<paquete>
       $ cvs update
    

    La salida se paracerá a esto:

           cvs update: Updating .
           M Makefile
           cvs update: Updating debian
           A rules
           ? example1
    
    M significa modificado (aún tiene que enviar los cambios), A significa Añadido (pero sin enviar aún), ? significa que CVS no conoce ese fichero (¿quizá falta añadirlo?). Cuando esté satisfecho, y todos los ficheros tengan los permisos adecuados, está preparado para enviar los cambios.
       $ cd /donde/esté/el/árbol/de/trabajo/<paquete>
       $ cvs commit -m 'Todos los cambios para debian'
       $ cvs tag versión_debian_<versión|tr . _>-<revisión-debian|tr . _> .
    

    El nuevo árbol de fuentes residirá en un directorio que no contiene el número de versión. Esto no es un problema, como veremos más adelante.

    Si en lugar de esto va a crear el directorio debian desde cero (puede ser más sencillo, pero menos automatizado):

       $ mkdir debian
    

    Cree todos los ficheros necesarios en debian y añádalos al control de fuentes.

       $ cvs add debian
       $ cd debian
       $ cvs add *
    

    Después de esto, el siguiente envío incluirá todos los ficheros.

       $ cd /donde/esté/el/árbol/de/trabajo/<paquete>
       $ cvs commit -m <un mensaje>
    

    Prepararse para una nueva versión

    Antes de poder ejecutar algunas de las órdenes de Debian que crearán un paquete, tiene que descargar el módulo sin todos los subdirectorios CVS. Esto se hace con la orden «export». Pero lo primero que necesita es enviar todas las modificaciones y marcarlas con un número de versión.

       $ cvs commit -m <mensaje>
       $ cvs tag versión_debian_<versión|tr . _>-<revisión-debian|tr . _>
    
  4. Publique

    Puede usar tanto el mecanismo cvs-buildpackage (se prefiere) o un «export» manual. Haga algunas pruebas previas con cvs-buildpackage (asegúrese de que las etiquetas concuerdan) como por ejemplo (debe haber configurado /etc/cvsdeb.conf):

       $ cvs-buildpackage -d -n -rsudo
    

    Ejecute entonces la verdadera orden, siendo sudo el programa con el que ganar acceso de root.

       $ cvs-buildpackage -rsudo
    

    También lo puede hacer de forma manual:

    Descargue los cambios.

       $ cvs export -d <paquete>-<versión> -r versión_debian_<versión|tr . _>-<revisión-debian|tr . _> <paquete>
    

    Ahora puede usar el mecanismo normal para exportar.


    ¡Listo! ¡Felicidades! Aquí le cuento algunas cosas que puede hacer con su árbol de fuentes:


  5. Eliminar o renombrar un fichero

    La forma normal de cambiar un fichero es copiar VIEJO a NUEVO, ejecutar las órdenes normales de CVS para borrar VIEJO del repositorio, y añadir NUEVO (tanto VIEJO como NUEVO pueden contener path relativos, por ejemplo, «foo/bar.c»).

       $ mv VIEJO NUEVO
       $ cvs remove VIEJO
       $ cvs add NUEVO
       $ cvs commit -m "Renombramos VIEJO como NUEVO" VIEJO NUEVO
    

    Esta es la manera más sencilla de mover un fichero de sitio: evita errores y conserva un histórico de cambios. Fíjese que para acceder al histórico del fichero tiene que especificar el nombre viejo o el nuevo, dependiendo de qué parte quiera veer. Por ejemplo, «cvs log VIEJO» le dará un registro hasta el momento en que cambió de nombre.

  6. Actualizar un módulo con la orden import

    Cuando llega una nueva versión de los fuentes, lo puede importar en el repositorio son la misma orden «import» que usó para crear el repositorio la primera vez. La única diferencia es que esta vez especificará una etiqueta de versión y mensaje diferentes.

       $ cd /donde/esté/el/árbol/de/trabajo/<nuevo directorio fuente>
       $ cvs import -m 'Importamos nueva versión' debian/<paquete> source-dist versión_upstream_<versión|tr . _>
    

    Ahora, tenemos que incorporar los cambios que hemos hecho en la nueva revisión. La mejor manera de hacerlo es cambiar de sitio nuestra copia de trabajo (basada en los fuentes antiguos del upstream), y descargar una nueva copia del paquete incorporando los cambios hechos en el fuente de upstream. Así es como se hace:

       $ cd /donde/esté/el/árbol/de/trabajo
       $ mv <paquete> <paquete>.old
       $ cvs checkout -jsource-dist:yesterday -jsource-dist <paquete>
       $ cd /donde/esté/el/árbol/de/trabajo/<paquete>
    

    La orden anterior descargará la última revisión de <paquete>, integrando en la copia de trabajo los cambios hechos desde ayer en la rama «source-dist» del vendedor. Si surgen conflictos durante la integración, debería poder resolverlos a la manera normal. Entonces, ya puede enviar los cambios de los ficheros modificados.

    Usar una fecha, como se sugirió previamente, asume que no importa más de una versión de un producto al día. Si lo hace, siempre puede usar en su lugar algo como esto:

       $ cvs checkout -jversión_upstream_<versiónvieja|tr . _> -jversión_upstream_<versiónnueva|tr . _> <paquete>
    

    En este caso, las dos órdenes anteriores son equivalentes.

    Para los ficheros que no han sido modificados de forma local, la revisión recién creada se convierte en la «head revision».

    De manera que compruebe que todos los ficheros hayan sido actualizados correctamente. ¡Recuerde especialmente hacer cambios en el fichero debian/changelog!

    Cuando quede satisfecho, puede borrar la versión antigua del directorio de trabajo. ¡Asegúrese bien de que está eliminando el directorio correcto!

       $ rm -rf ../<paquete>.old
    

    Ahora está listo para publicar.

  7. Elimine el árbol de fuentes para conservar el espacio de disco

    Le aconsejamos no usar rm -rf para eliminar el árbol de fuentes de trabajo, sino la orden CVS, que también comprobará si ha hecho algún cambio local que no haya enviado aún.

       $ cd /donde/esté/el/árbol/de/trabajo
       $ cvs release -d <paquete>
    
  8. Glosario
       Etiquetas	nombres simbólicos para las revisiones
       Repositorio	Archivo de ficheros fuente
    
  9. Apéndice:

    A: CONVENCIONES PARA LAS ETIQUETAS DE CVS

    A: CVS TAG CONVENTIONS

     |======================================================================|
     |Versión Upstream    | <versión>                                       |
     |Revisión Debian     | <revisión>                                      |
     |Nomb. fich tar orig | paquete_<versión>.orig.tar.gz                   |
     |Nombre paqu. Debian | paquete_<versión>-<revisión>_<arqu>.deb         |
     |Etiq CVS «vendor»   | versión_upstream_<versión  | tr . _>            |
     |Etiq CVS «current»  | versión_debian_<revisión | tr . _>              |
     |======================================================================|
    

    Examples:

     |======================================================================|
     |                    | fuentes upstream       | Paquete nativo         |
     |======================================================================|
     |Versión upstream    | 2.76                   | 3.38                   |
     |Revisión Debian     | 1.2                    |                        |
     |Nomb. fich tar orig | make_2.76.orig.tar.gz  |                        |
     |Nombre paqu. Debian | make_2.76-1.2_i386.deb | kpkg_3.38_i386.deb     |
     |Etiq CVS «vendor»   | versión_upstream_2_76  | versión_upstream_3_38  |
     |Etiq CVS «current»  | versión_debian_2_76-1_2| versión_debian_3_38    |
     |======================================================================|
    

    Tenga en cuenta que se ignora los números de época al determinar los nombres de las etiquetas para CVS (generalmente se usan para cambiar la opinión de dpkg al respecto del orden de los paquetes, y no suelen ser relevantes para las etiquetas de CVS).