Guia do Linux/Avançado/CVS/Criando projetos para serem usados no CVS
Criando projetos para serem usados no CVS
[editar | editar código-fonte]Esta seção descreve todos os passos necessários para colocação de um projeto para ser desenvolvido através do CVS, os comandos do cvs, considerações a respeito dos comandos e sua utilização através de exemplos didáticos.
Repositório
[editar | editar código-fonte]Um repositório CVS é o local que armazena módulos e também os arquivos administrativos (que contém permissões, etc) são armazenados em um subdiretório chamado CVSROOT
.
O acesso a um repositório é feito através de parâmetros especificados na variável CVSROOT ou pela opção -d repositório do cvs. Veja [#s-s-cvs-d Servidor de CVS - configurando métodos de acesso ao repositório, Seção 17.2] para ver exemplos de métodos de acesso.
O Repositório pode conter um ou mais módulos, cada módulo representa um projeto no servidor, criado após o uso do comando import. Segue um exemplo da estrutura de um repositório CVS:
var/lib | - cvs |- CVSROOT |- projeto1 - projeto2
O subdiretório cvs
é o repositório (veja o subdiretório CVSROOT
dentro dele) e os diretórios dentro dele projeto1
e projeto2
são os módulos criados através do comando cvs import ...(veja [#s-s-cvs-p-import Adicionando um novo projeto, Seção 17.3.6]).
Para acessar o projeto do CVS, então é definido o repositório que tem permissões de acesso na variável CVSROOT e então é executado um comando (checkout, update, commit, etc) no módulo que desejamos utilizar:
export CVSROOT=:ext:anonymous@servidor.org.br:/var/lib/cvs (<- Repositório "cvs") cvs checkout projeto1 (<- módulo que desejamos pegar do servidor)
Nas seções seguintes serão explicados cada um dos comandos usados para trabalhar com um projeto no cvs
.
Criando um repositório
[editar | editar código-fonte]Para adicionar um novo repositório no sistema, edite o arquivo /etc/cvs-pserver.conf
e defina o nome de cada repositório na variável CVS_PSERV_REPOS separados por ":" (exemplo: CVS_PSERV_REPOS="/var/lib/cvs:/var/lib/cvs2").
Feito isso execute o comando cvs-makerepos
para que os diretórios especificados no arquivo /etc/cvs-pserver.conf
sejam criados com as devidas permissões.
Para adicionar manualmente um repositório (/var/lib/cvs), execute os seguintes passos:
- Execute o comando cvs -d /var/lib/cvs init (para criar o repositório e os arquivos administrativos que ficam armazenados dentro de
CVSROOT
. - Mude as permissões do diretório para sgid com: chmod 2775 /var/lib/cvs.
- Mude o dono/grupo com o comando: chown root.src /var/lib/cvs
- Opcional: caso utilize o método de acesso pserver será necessário adicionar a opção --allow-root=/var/lib/cvs na linha que inicia o servidor pserver. Este parâmetro deve ser usada para cada repositório adicionado no servidor.
A partir de agora, seu repositório já está pronto para ser utilizado.
Logando no servidor de CVS via pserver
[editar | editar código-fonte]Quando é usado o método de acesso pserver ([#s-s-cvs-d-metodos-pserver pserver (password server), Seção 17.2.4]), é necessário fazer para ter acesso ao repositório. Por exemplo, para acessar o repositório /var/lib/cvs
no servidor servidor.org.br
:
export CVSROOT=:pserver:anonymous@servidor.org.br:/var/lib/cvs cvs login ou cvs -d :pserver:anonymous@servidor.org.br:/var/lib/cvs login
Então será solicitada a senha para ter acesso ao sistema. Note que toda a seção de cvs
ocorre por comandos interativos que logo após concluídos retornam para o interpretador de comandos. O restante desta seção descreverá estes comandos e como utiliza-los de maneira eficiente.
OBS: O uso da variável CVSROOT torna a utilização bastante prática, assim não precisamos especificar o repositório, método de acesso, etc. toda vez que usar um comando do cvs
.
Encerrando uma seção de CVS
[editar | editar código-fonte]Embora que não seja necessário, após o uso do cvs é recomendável executar o logout do servidor para encerrar sua conexão com a máquina remota.
# (assumindo que a variável CVSROOT está definida) cvs logout ou cvs -d :pserver:anonymous@servidor.org.br:/var/lib/cvs logout
OBS: Para os paranóicos é importante encerrar uma seção de CVS, pois ele possui alguns bugs e um spoofing pode tornar possível o uso de uma seção deixada aberta.
Baixando arquivos
[editar | editar código-fonte]O comando checkout (ou "co") é usado para fazer isto. Para utilizá-lo seguindo os exemplos anteriores:
mkdir /tmp/cvs cd /tmp/cvs cvs checkout modulo cvs -d :pserver:anonymous@servidor.org.br:/var/lib/cvs
Será criado um subdiretório chamado modulo
que contém todos os arquivos do servidor de CVS remoto. É necessário apenas que tenha acesso de leitura ao servidor de CVS para executar este comando. Você pode usar a opção -z [num] para ativar a compactação na transferência dos arquivos, isso acelera bastante a transferência em conexões lentas: cvs -z 3 checkout modulo.
Também é possível especificar apenas subdiretórios de um módulo para baixa-lo via CVS e a estrutura de diretórios criada localmente será idêntica ao do servidor remoto.
Adicionando um novo projeto
[editar | editar código-fonte]Use o comando cvs import para adicionar um novo projeto ao CVS. As entradas nos arquivos administrativos serão criadas e o projeto estará disponível para utilização dos usuários. A sintaxe básica do comando import é a seguinte:
cvs import [opções] [dir_modulo] [tag] start
Para adicionar o projeto focalinux que reside em /usr/src/focalinux
ao cvs:
# Primeiro exportamos o CVSROOT para dizer onde e qual repositório acessar export CVSROOT=:ext:usuario@servidor.com.br:2401/var/lib/cvs cd /usr/src/focalinux cvs import documentos/focalinux tag_modulo start
Por padrão o import
sempre utiliza a máscara * para fazer a importação dos arquivos do diretório atual. O projeto focalinux será acessado através de $CVSROOT/documentos/focalinux (cvs checkout documentos/focalinux), ou seja, /var/lib/cvs/documentos/focalinux
no servidor CVS terá a cópia do focalinux. tag_modulo define o nome que será usado como identificador nas operações com os arquivos do CVS (pode ser usado "focalinux" em nosso exemplo). O parâmetro "start" diz para criar o módulo.
OBS: Por segurança, o diretório que contém os arquivos deverá ser sempre um caminho relativo na estrutura de diretórios, ou seja, você precisará entrar no diretório pai (como /usr/src/projeto
) para executar o cvs import. Não é permitido usar / ou .., isto proíbe a descida em diretórios de nível mais altos e sérios incidentes de segurança em servidores CVS mal configurados pelo Administrador.
Sincronizando a cópia remota com a cópia local
[editar | editar código-fonte]Este comando sincroniza a cópia remota do CVS (ou arquivo) com a cópia local que está trabalhando em sua máquina. Quando se trabalha nativamente no CVS em equipe é recomendado a utilização deste comando pois alguém pode ter modificado o arquivo antes de você, então uma incompatibilidade entre sua versão e a nova poderia causar problemas.
Supondo que tenha acabado de modificar o arquivo main.c
do módulo cvsproj
, então antes de fazer o commit ([#s-s-cvs-p-commit Enviando as mudanças para o servidor remoto, Seção 17.3.8]) use o update:
cvs update main.c ou cvs -d :ext:usuario@servidor.com.br:2401/var/lib/cvs update main.c
Após alguns segundos, sua cópia local ficará sincronizada com a cópia remota. Caso ele mostre alguma mensagem de saída, verifique o arquivo para solucionar qualquer conflito e então envie o arquivo para o servidor remoto ([#s-s-cvs-p-commit Enviando as mudanças para o servidor remoto, Seção 17.3.8]). Você pode fazer o update de mais arquivos usando referências globais (*, ? ou []).
Enviando as mudanças para o servidor remoto
[editar | editar código-fonte]O comando "commit" (ou "ci"), envia as mudanças feitas nos arquivos locais para o servidor remoto. Um exemplo de commit no arquivo main.c
:
cvs commit main.c cvs commit main.? cvs commit *
O editor padrão do sistema será aberto e pedirá uma descrição das modificações para o commit. Esta descrição será usada como referência sobre as atualizações feitas em cada etapa do desenvolvimento. A mensagem também pode ser especificada usando a opção "-m mensagem", principalmente quando o texto explicando as alterações é pequeno.
Para mudar o editor de texto padrão que será usado pelo cvs
, altere a variável de ambiente EDITOR ou especifique o editor que deseja usar na linha de comando com a opção "-e editor":
cvs commit -e vi main.c
Adicionando um arquivo ao módulo CVS do servidor
[editar | editar código-fonte]Após criar/copiar o arquivo para seu diretório de trabalho, use o comando add para fazer isto. O arquivo será enviado ao servidor, bastando apenas executa o commit para salvar o arquivo:
cvs add main.h cvs commit main.h
Adicionando um diretório ao módulo CVS do servidor
[editar | editar código-fonte]O método para adicionar um diretório com arquivos é semelhante ao de adicionar apenas arquivos ao cvs. O único ponto que deve se seguido é que primeiro deve ser adicionado o diretório (com o "cvs add") salvar no servidor remoto ("cvs commit") e depois adicionar os arquivos existentes dentro dele (assim como descrito em [#s-s-cvs-p-add Adicionando um arquivo ao módulo CVS do servidor, Seção 17.3.9]). Para adicionar o diretório teste
e seus arquivos no servidor cvs
remoto:
cvs add teste cvs commit -m "Adicionado" teste cvs add teste/* cd teste cvs commit -m "Adicionados" .
Os dois primeiros comandos agendam o diretório teste
e fazem o commit no diretório remoto. Os dois últimos, enviam os arquivos existentes dentro deste diretório para o servidor remoto.
Removendo um arquivo do módulo CVS remoto
[editar | editar código-fonte]O comando para fazer isto é o "remove". Primeiro use o rm
para remover o arquivo/diretório de sua cópia local, depois execute o remove seguido de commit para confirmar a remoção do arquivo:
cvs remove main.h cvs commit main.h
Removendo um diretório do módulo CVS remoto
[editar | editar código-fonte]Para remover um diretório, primeiro remova todos os arquivos existentes dentro dele com o comando rm
e salve para o servidor (seguindo os métodos descritos em [#s-s-cvs-p-remove Removendo um arquivo do módulo CVS remoto, Seção 17.3.11]). O CVS não remove diretamente diretórios vazios, uma maneira de contornar isto é usar o update ou commit seguido da opção -P para ignorar diretórios vazios. Então a cópia remota do diretório será removida do servidor:
rm -f teste/* cvs remove teste/. cvs commit teste/. cd .. cvs checkout modulo
Depois do checkout, o subdiretório teste terá sido removido.
Dizendo que o módulo atual não está mais em uso
[editar | editar código-fonte]O comando "release" faz esta função. Ele não é requerido, mas caso você tenha feito modificações que ainda não foram salvas no servidor de cvs (commit), ele alertará de arquivos modificados e perguntará se deseja continuar. Registrando também o abandono das modificações no histórico do cvs
. O comando pode ser acompanhado de "-d" para remover o módulo anteriormente baixado com o "commit":
cvs release modulo cvs release -d modulo
O release retorna os seguintes códigos quando verifica que as duas cópias (local e remota) não estão sincronizadas:
- U ou P
- Existe uma versão nova do arquivo no repositório. Para corrigir isso, execute o comando "update".
- A
- O arquivo não foi adicionado ainda ao repositório remoto. Se apagar o repositório local, este arquivo não será adicionado. Para corrigir isto, executa o comando "add" do cvs.
- R
- O arquivo foi removido localmente, mas não foi removido do servidor remoto. Use os procedimentos em [#s-s-cvs-p-remove Removendo um arquivo do módulo CVS remoto, Seção 17.3.11] para corrigir a situação.
- M
- O arquivo está modificado localmente e não foi salvo ainda no servidor. Use os procedimentos em [#s-s-cvs-p-update Sincronizando a cópia remota com a cópia local, Seção 17.3.7] e [#s-s-cvs-p-commit Enviando as mudanças para o servidor remoto, Seção 17.3.8] para salvar o arquivo.
- ?
- O arquivo está em seu diretório de trabalho mas não tem referências no repositório remoto e também não está na lista de arquivos ignorados do CVS.
Visualizando diferenças entre versões de um arquivo
[editar | editar código-fonte]Com o comando "diff" é possível visualizar que diferenças o arquivo que está sendo editado possui em relação ao arquivo do repositório remoto. Outra funcionalidade útil do "diff" é comparar 2 versões de arquivos do mesmo repositório CVS. Exemplos:
- cvs diff main.c
- Verifica as diferenças entre o arquivo
main.c
local e remoto. - cvs diff -u -r 1.1 -r 1.2 main.c
- Mostra as diferenças em formato unificado para mostrar as diferenças entre as versões 1.1 e 1.2 do arquivo
main.c
.
Visualizando o status de versão de arquivos
[editar | editar código-fonte]O comando "status" permite verificar que versões do arquivo especificado está disponível localmente, remotamente, qual a versão inicial do arquivo no repositório, sticky tag. Exemplos:
- cvs status main.c
- Verifica o status do arquivo
main.c
. - cvs status -v main.c
- Mostra o status do arquivo
main.c
, adicionalmente mostra também as tags existentes no arquivo (versão inicial, versão do repositório).
Outros utilitários para trabalho no repositório
[editar | editar código-fonte]Além dos comandos do cvs
descritos aqui, existem comandos no pacote cvsutils
que auxiliam desde quem está aprendendo a utilizar o CVS (com o comando cvsdo
para simular algumas operações de adição/remoção de arquivos) até profissionais que usam o programa no dia a dia (cvsu
, cvsco
, cvschroot
).