Hi,
Depois que começamos a programar “de verdade” (corporativamente ou não… rsrs!), percebemos a necessidade de controlar “as versões” do software em questão. Não simplesmente editando e salvando seus ultimos “codes”. É ai que entra o CVS (Concurrent Versions System).
Imagine você terminar aquele projeto/software e no momento da entrega precisar modificar o código, implementar mais alguma função. Tranquilo! Mas depois, percebe que não era bem aquilo que você queria, era melhor deixar do jeito que estava… iii… Neste caso o CVS controla as versões editadas do seu projeto/software permitindo que você possa acessar os antigos códigos. Ótimo!
Outra situação é você desenvolver um software em conjunto com amigos da faculdade e seu “brother” adicionar alguns trechos de códigos “bugados” e ir passear… o que fazer? Ir no CVS e buscar as versões do código antes de seu “brother” ter feito a m*rda! ;)
O que veremos neste post?
- Instalar e configurar o CVS servidor.
- Alguns comando básicos do CVS cliente no próprio linux.
*** Instalando e configurando o CVS
Para este post usei o Debian Lenny. Let´s go…
~$
~$ sudo apt-get install cvs
Depois de instalado o CVS (neste caso ele instala o servidor e cliente), na versão em questão é a 1.12.13 ele cria um repositório padrão em /srv/cvs.
No nosso exemplo vamos apagar o repositório padrão e criar um novo em /home/cvs.
~$
~$ sudo rm -rf /srv
Agora vamos editar o arquivo de configuração principal do cvs: /etc/cvs-pserver.conf
~$
~$ sudo vi /etc/cvs-pserver.conf
CVS_PSERV_REPOS=”/home/cvs”
CVS_PSERV_LIMIT_MEM=hard
CVS_PSERV_LIMIT_DATA=hard
CVS_PSERV_LIMIT_CORE=0
CVS_PSERV_LIMIT_CPU=hard
Neste arquivo modifique a linha CVS_PSERV_REPOS com o diretório do seu repositório de projetos.
Você pode criar mais de um repositório, usando , (vírgula) entre os diretórios:
CVS_PSERV_REPOS=”/home/cvs,/home/meusprojetos”
Neste caso temos 2 repositórios! ;)
Depois de criado o repositório, vamos criar o diretório e efetuar as devidas permissões.
~$
~$ sudo mkdir /home/cvs
~$ sudo chmod -R 775 /home/cvs
~$ sudo chown root:src -R /home/cvs
~$ sudo chmod g+s /home/cvs
1. Criamos o diretório /home/cvs
2. Damos permissão 775 ao diretório do nosso repositório.
3. Setamos o dono root e grupo src para o diretório.
4. Usando o gid bit para o grupo src, assim, todo o usuário do sistema (/etc/passwd) que estiver no grupo src poderão escrever no diretório.
Pronto! Com estas configurações básicas já podemos executar nosso servidor CVS. Mas… o CVS é um serviço que não roda em standalone, assim, ele usa o inetd para executar o serviço. Vamos, então, adicionar as configs do CVS no inetd:
~$
~$ sudo vi /etc/inetd.conf
Adicione a linha abaixo:
cvspserver stream tcp nowait root /usr/sbin/tcpd /usr/sbin/cvs-pserver
~$ sudo /etc/init.d/openbsd-inetd start
Ok! O CVS já está executando via inetd. O CVS usa as portas 2401/tcp e 2401/udp, então – caso necessário -, libere estas portas no seu firewall.
Com o CVS funcionando, vamos criar o base de diretórios e arquivos do nosso repositório em /home/cvs.
~$
~$ cvs -d /home/cvs init
Assim, ele cria o diretório CVSROOT no nosso repositório, contendo as conf necessárias para o mesmo. Vamos ver alguns comandos básicos e como proceder em situações do dia a dia.
Adicionar permissão a um usuário para escrever no repositório:
~$
~$ sudo addgroup usuario src
Conectando remotamente via cvs (no linux/debian):
~$
~$ export CVSROOT=:pserver:usuario@ipdoservidorCVS:/home/cvs
~$ cvs login
Sim, parece estranho. Mas o cliente cvs no linux necessida de uma variável CVSROOT para conectar a um determinado host/servidor. Para simplificar o processo você pode criar a variável CVSROOT no .profile do seu usuário.
Importando um projeto e versionando:
~$
~$ cd /home/bleno/projetos/ListaEncadeada
~$ cvs import ListaEncadeada ProjetoListaEncadeada v1 start
Neste caso, importei o diretório ListaEncadeada usando o nome ProjetoListaEncadeada chamando de versão “v1″. Assim, o diretório local ListaEncadeada foi importado em /home/cvs/ProjetoListaEncadeada no servidor CVS.
O CVS cliente pedirá uma mansagem descritiva sobre seu “import”, você informa a descrição e sai com o um simples :x (by vi editor!).
Vamos supor que depois de 2 dias de trabalho árduo saio a versão “v2″ deste projeto. Para importar a nova versão, conectamos ao servidor CVS como descrito acima e importando a nova versão:
~$
~$ cvs import ListaEncadeada ProjetoListaEncadeada v2
Trabalhando com arquivos no CVS cliente no Linux!
Vamos supor que você está em uma outra máquina e queira um cópia do ProjetoListaEncadeada, simples: conecte-se ao servidor CVS como descrito acima e:
~$
~$ cd /home/outramaquina/projetos
~$ cvs checkout ProjetoListaEncadeada
Assim você tem uma cópia da ultima versão do ProjetoListaEncadeada. Depois de editar o projeto você deseja fazer o upload dos arquivos novos, então:
~$
~$ cvs update
O update faz com que o cvs marque os arquivos locais modificados para depois enviar para o servidor. Depois de marcados com o update:
~$
~$ cvs commit
Pronto, os novos arquivos modificados são enviados para o servidor! Lembre-se que todo o processo usando o CVS cliente deve-se está conectado o CVS servidor.
Suponto que há um novo arquivo “classeNos.java” criado no ProjetoListaEncadeada que você quer adicionar, fazemos:
~$
~$ cvs add classeNos.java
Ah, você lembrou que este novo arquivo não é mais necessário no ProjetoListaEncadeada, fazemos:
~$
~$ rm classeNos.java
~$ cvs remove classeNos.java
~$ cvs commit
Pronto! Desta forma quando alguem que faz parte do ProjetoListaEncadeada der um “checkout” as novas modificações serão replicadas para ele! Rulez!!!
Verificando logs
Conectado ao CVS server via CVS cliente no linux, você pode verificar os logs as versões de um determinado projeto:
~$
~$ cvs log | less
Ele vai mostar o log das ultimas modificações do projeto em questão. O less é para a amostragem ficar mais amigável =)
~$
~$ cvs annotate | less
Mostra as anotações, linha a linha, com detalhes sobre o usuário e data das modificações. Por exemplo, você quer saber quem modificou codificou em 26 de agosto na versão v2 do ProjetoListaEncadeada:
~$
~$ cvs annotade | grep v1 | grep “26-Aug-09″
Ai vai a sua criatividade para filtrar a pesquisa do log.
Para mais comandos do CVS cliente no linux:
~$
~$ cvs –help-commands
Realmente o CVS é show de bola. Atualmente existe o SVN que o Dr. Google utiliza no code.google.com, mas sinceramente, não me adaptei bem (rsrs!). Em breve um post sobre SVN! ;)