Using CVS together with Debian packages

Esse pequeno documento é apenas para dar uma pequena ajuda a converter pacotes para gerenciamento CVS. É provavelmente apenas interessante para umas poucas pessoas que não são muito familiarizadas com o CVS e gerenciamento de versões. Também, há um script em /usr/share/doc/cvs-buildpackage chamado cvs-pkginit (ambos o script e a página de manual estão gzipados), que irá imprimir uma sinopse desse documento HOWTO.

Por exemplo, para converter um pacote foo, versão bar1, revisão Debian 3, tente:

% cvs-pkginit foo bar1 3
e olhe a sinopse.
Oldenburg, 6/2/97                           Joey (joey@debian.org)
                                            / Martin Schulze   /
Mobile,                                     Manoj Srivastava
                                            srivasta@debian.org

Nota: na discussão a seguir, as entidades dentro de sinais de menor e maior <> serão mudados para cada caso, todo o resto deve ser tomado literalmente. Por exemplo, se você está falando sobre um pacote com versão externa 2.1.82, então <$versão> significa 2.1.82, e upstream_version_<$versão | tr . _> significa upstream_version_2_1_82.

  1. Configurar o CVS
       $ CVSROOT=/onde/seu/repositório/estará
       $ export CVSROOT
       $ cvs init
       $ mkdir $CVSROOT/debian
    

    Isso permite que você separe seus pacotes Debian de qualquer outra coisa no seu repositório, atualmente ou no futuro. Mesmo se você pensa que não precisa do CVS para nada mais, é mais fácil classificar seu repositório agora do que sentir muito depois (é uma bagunça mover as coisas no repositório depois).

    Se mais de uma pessa irá usar o CVS, você deve ter certeza de que elas possam modificar o repositório usando o CVS. Escolha um grupo (ou um conjunto de grupos) que tem acesso à parte do repositório e defina as permissões:

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

    Isso assegura que os membros do grupo arquivo estarão permitidos a configurar o repositório. Agora que você deve se assegurar de que os grupos corretos de pessoas estão aptos a modificar partes do repositório.

       # mkdir $CVSROOT/debian/<package1>
       # chgrp <grupo1> $CVSROOT/debian/<pacote1>
       # chmod g+ws     $CVSROOT/debian/<pacote1>
       # mkdir $CVSROOT/debian/<pacote2>
       # chgrp <grupo2> $CVSROOT/debian/<pacote2>
       # chmod g+ws     $CVSROOT/debian/<pacote2>
    

    Como usuário normal você deve tornar seu repositório CVS público ou usando "-d /onde/seu/repositório/estará" ou colocando um fragmento como esse no seu profile.

       $ CVSROOT=/where/your/repository/will/be
       $ export CVSROOT
    
  2. Use Módulos
       # cvs checkout CVSROOT
       # cd CVSROOT
       # vi modules
    

    No seguinte, <pacote> deve ser o nome do pacote como está no arquivo debian/changelog.

    Adicione as linhas a seguir, a primeira é essencial, a segunda pode ser duplicada e é auto-explicativa:

       modules   CVSROOT modules
       <pacote> debian/<pacote>
    
       # cvs commit -m 'Definidos primeiros módulos'
    
  3. Prepare para usar o CVS

    Insira sua árvore de fonte com os comandos a seguir (assumindo que você já a tenha debianizado e que haja arquivo orig.tar.gz). Note que os fontes externos são importados com um -ko (tome cuidado com os arquivos binários), mas não mudanças locais que fazemos. Por favor note que números de época são ignorados enquanto determinando o nome da tag CVS (eles são normalmente usados para mudar a opnião do dpkg sobre ordem dos pacotes, e não são relevantes para as tags CVS normalmente).

    Mude para o diretório para onde você tem sua árvore fonte de desenvolvimento debianizada fora do cvs, que é o que estamos tentando injetar no CVS (isso não está no CVSROOT, normalmente).

    Eu REPITO: A seguir, <pacote> deve ser o nome do pacote assim como no arquivo debian/changelog.

       $ cd /onde/sua/árvore/fonte/reside/
       $ tar zvfx <pacote>_<versão>.orig.tar.gz
       $ cd <pacote>_<versão>.orig
       $ cvs import -ko -m 'Importação de código' debian/<pacote> source-dist upstream_version_<versão|tr . _>
    

    Você pode mudar a tag do galho source-dist para qualquer coisa que quiser. (O mantenedor do cvs-buildpackage usa habitualmente a tag upstream (que é um estudo em redundância ;-))).

    Se você configurou o CVS como root, e não configurou a escribilidade do grupo, você precisa criar $CVSROOT/debian/<pacote> como root e mudar o usuário e grupo dono no repositório para o usuário ou grupo respectivamente. A importação do CVS irá imprimir um aviso que não pode criar o diretório debian/<pacote>, mas está tudo bem.

    O próximo passo é checar a árvore inteira e incorporar todas as suas mudanças.

       $ cd /onde/sua/árvore/fonte/reside
       $ cvs checkout <pacote>
    

    Se você já criou uma versão debianizada mas não usou o CVS antes você deve querer rodar os comandos a seguir para mudar suas mudanças. Depois disso você deve definir esse lançamento para estar apto a checá-lo algum tempo depois.

       $ cd /onde/sua/árvore/fonte/reside/<pacote>-<versão>
       $ diff -qrBbw . /onde/sua/árvore/fonte/reside/<pacote>/ | grep -v CVS
       $ FILES_CHANGED_LOCALLY="<saída do acima>"
       $ tar cf - $FILES_CHANGED_LOCALLY | tar -C /onde/sua/árvore/fonte/reside/<pacote> -xvpf -
       $ cd /onde/sua/árvore/fonte/reside/<pacote>
    

    Por favor assegure-se de que o arquivo debian/rules esteja executável, já que desse jeito ele deve estar executável quando exportado e não haverá problemas rodando dpkg-buildpackage nos fontes exportados. Em geral, assegure-se de que todos os arquivos têm as permissões certas antes de adicioná-las ao repositório CVS.

       $ cd /onde/sua/árvore/fonte/reside/<pacote>
       $ cvs add debian <qualquer outro arquivo adicionado também>
    

    Também, por favor note que você tem de adicionar todos os arquivos adicionais que devem ser colocados no repositório, especialmente todos os arquivos no subdiretório debian. Também, por favor note que o comando cvs add não funciona recursivamente, então você deve ter de adicionar manualmente quaisquer subdiretórios que você tenha. (cd debian ; cvs add *)

    Uma boa coisa é que rodar cvs update irá mostrar o estado de todos os arquivos no diretório.

       $ cd /onde/sua/árvore/fonte/reside/<pacote>
       $ cvs update
    

    A saída se parece com:

           cvs update: Updating .
           M Makefile
           cvs update: Updating debian
           A rules
           ? example1
    
    M significa modificado (foi enviado), A significa Adicionado (tem de ser enviado), ? significa que o CVS não sabe nada do arquivos (precisa ser adicionado, talvez?). Quando você está satisfeito que nada está faltando e todos os arquivos têm as permissões requeridas, você está pronto para enviar (commitir).
       $ cd /onde/sua/árvore/fonte/reside/<pacote>
       $ cvs commit -m 'Fiz todas as mudanças debian'
       $ cvs tag debian_version_<versão|tr . _>-<revisão-debian|tr . _> .
    

    A nova árvore fonte residirá num diretório que não contém o número de versão. Não é esse o problema como veremos depois.

    Se ao invés de criar o diretório debian do início (pode ser mais simples, apesar de menos automatizado):

       $ mkdir debian
    

    Crie todos os arquivos debian e adicione todos eles no controle de fonte.

       $ cvs add debian
       $ cd debian
       $ cvs add *
    

    Depois disso o próximo envio incluirá todos os arquivos.

       $ cd /onde/sua/árvore/fonte/reside/<pacote>
       $ cvs commit -m <alguma mensagem>
    
  4. Preparar uma release

    Antes você pode rodar alguns dos comandos Debian que construirão um pacote, você tem de buscar o módulo sem todos os subdiretórios do CVS. Isso é feito com o comando `export'. Mas antes de tudo você precisa enviar todas as suas modificações e marcá-las com um número de release.

       $ cvs commit -m <mensagem>
       $ cvs tag debian_version_<versão|tr . _>-<revisão-debian|tr . _>
    
  5. Faça uma release

    Você pode ou usar o mecanismo do cvs-buildpackage (preferido) ou um export manual. Primeiro teste o do cvs-buildpackage com uma execução limpa (assegure0se de que as tags batem) assim (Deve-se ter configurado o /etc/cvsdeb.conf):

       $ cvs-buildpackage -d -n -rsudo
    

    Então faça a execução real com, esperando que o sudo seja um programa com o qual você possa ganhar acesso root.

       $ cvs-buildpackage -rsudo
    

    Ou para fazer isso manualmente:

    Baixe o pacote.

       $ cvs export -d <pacote>-<versão> -r debian_version_<versão|tr . _>-<revisão-debian|tr . _> <package>
    

    Agora você pode ir em frente com o mecanismo normal de export de release.


    Pronto! Parabéns! Aqui estão algumas tarefas que você pode executar em sua árvore fonte:


  6. Remover ou renomear um arquivo

    O jeito normal de mover um arquivo é copiar VELHO para NOVO e então executar os comandos normais de CVS para remover VELHO do repositório e adicionar NOVO a ele. (Ambos VELHO e NOVO poderiam conter caminhos relativos, por exemplo `foo/bar.c').

       $ mv VELHO NOVO
       $ cvs remove VELHO
       $ cvs add NOVO
       $ cvs commit -m "Renomeei VELHO para NOVO" VELHO NOVO
    

    Esse é o modo mais simples de se mover um arquivo, não é passível de erros e preserva a história do que foi feito. Note que para acessar a história do arquivo você deve especificar o novo nome ou o velho nome, dependendo de qual porção da história vai acessar. Por exemplo `cvs log VELHO' dará o log até a hora da renomeação.

  7. Atualizando um módulo com o comando import

    Quando uma nova release do fonte chega, você o importa para o repositório com o mesmo comando `import' que você usou para configurar o repositório em primeiro. A única diferença é que você especifica uma tag diferente de release dessa vez, e uma mensagem diferente.

       $ cd /onde/sua/árvore/fonte/reside/<novo diretório fonte>
       $ cvs import -m 'importa nova release' debian/<pacote> source-dist upstream_version_<versão|tr . _>
    

    Agora, nós temos que incorporar as mudanças que fizemos à nova revisão. O melhor jeito de fazer isso é mover nossa cópia para outro local (baseado no velho fonte externo) e buscar uma nova cópia do pacote incorporando as mudanças feitas no fonte externo. Isso é como fazê-lo:

       $ cd /onde/sua/árvore/fonte/reside
       $ mv <pacote> <pacote>.old
       $ cvs checkout -jsource-dist:yesterday -jsource-dist <pacote>
       $ cd /onde/sua/árvore/fonte/reside/<pacote>
    

    O comando acima irá enviar a última revisão do <pacote>, juntando as mudanças feitas no galho do distribuidor `source-dist' desde ontem em uma nova cópia. Se quaisquer conflitos aparecerem durante a junção eles devem ser resolvidos do modo normal. Então os arquivos modificados podem ser commitidos.

    Usar uma data, como sugerido acima, assume que você não importe mais que uma release de um produto por dia. Se você fizer, você pode sempre usar algo como isso:

       $ cvs checkout -jupstream_version_<versão_antiga|tr . _> -jupstream_version_<versão_nova|tr . _> <pacote>
    

    Nesse caso, os dois comandos acima são equivalentes.

    Para arquivos que não foram modificados localmente, a revisão criada torna-se a revisão "cabeça".

    Então, cheque e veja se todos os arquios foram atualizados corretamente. Especialmente lembre-se de mudar o arquivo debian/changelog.

    Quando estiver satisfeito, você pode remover a versão velha do diretório de trabalho. Esteja bem certo de remover o diretório correto.

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

    Agora você está pronto para preparar um lançamento.

  8. Remova a árvore fonte para conservar espaço de disco

    Para remover o diretório atual da árvore fonte você não deve usar rm -rf mas usar o comando CVS que também testa se você fez alguma mudança local que não foi enviada ainda.

       $ cd /onde/sua/árvore/fonte/reside
       $ cvs release -d <pacote>
    
  9. Glossário
       Tags		nomes simbólicos para revisões
       Repositório	Arquivo de arquivos fonte
    
  10. Apêndice:

    A: CONVENÇÕES DE TAG CVS

     |======================================================================|
     |Versão Externa      | <versão>                                        |
     |Revisão Debian      | <revisão>                                       |
     |Nome de arquivo Orig| package_<versão>.orig.tar.gz                   |
     |Nome do pacote      | package_<versão>-<revisão>_<arch>.deb         |
     |Tag de Distribuidor | upstream_version_<versão  | tr . _>            |
     |Tag atual do CVS    | debian_version_<revisão | tr . _>              |
     |======================================================================|
    

    Exemplos:

     |======================================================================|
     |                    | fontes externos        | pacote Debian apenas   |
     |======================================================================|
     |Versão Externa      | 2.76                   | 3.38                   |
     |Revisão Debian      | 1.2                    |                        |
     |Nome de arquivo Orig| make_2.76.orig.tar.gz  |                        |
     |Nome do pacote      | make_2.76-1.2_i386.deb | kpkg_3.38_i386.deb     |
     |Tag de Distribuidor | upstream_version_2_76  | upstream_version_3_38  |
     |Tag atual do CVS    | debian_version_2_76-1_2| debian_version_3_38    |
     |======================================================================|
    

    Note que números de época são ignorados enquanto determinando o nome da tag CVS (eles são geralmente usados para mudar a opinião do dpkg sobre ordem de paoctes e não são relevantes às tags CVS normalmente).