# Guia do Linux/Avançado/CVS/Introdução ao CVS
## Introdução ao CVS

O CVS (Concurrent Version Software) permite que se organizem grupos de trabalho para desenvolvimento de projetos colaborativos. Um projeto pode ser desde um programa em C, documentação em equipe, etc. O uso do CVS é recomendado para qualquer desenvolvimento de projeto que tenha vários envolvidos trabalhando ao mesmo tempo.
Para cada mudança feita no programa, é pedido uma descrição dos trabalhos realizados e o sistema registra todas as modificações realizadas ao longo do desenvolvimento, permitindo voltar a uma versão anterior ou ver as mudanças entre elas facilmente.
Imagine uma situação onde você está desenvolvendo um programa de computador e após a última modificação ele para de funcionar. Com o CVS é possível ver o que foi modificado e voltar até a versão que estava funcionando para consertar o problema. No desenvolvimento de documentação e tradução o CVS também desempenha um papel importante, pois com ele o tradutor pode ver o que foi modificado entre a versão do documento original que ele usou para tradução e uma versão recente, traduzindo apenas as diferenças.
Uma seção de cvs é feita de modo interativo através do comando cvs. Por exemplo:
* logar no sistema - cvs login
* baixar um projeto - cvs checkout projeto
Cada comando do cvs será explicado em detalhes no decorrer deste capítulo.

### Versão

A versão do CVS documentada no guia é a 1.11.1. As explicações aqui certamente serão compatíveis com versões posteriores deste programa.

### História

O CVS é uma substituição do sistema RCS (Revision Control System) ele possui mais recursos e foi criado sendo compatível com o RCS.
A história do CVS (extraída de sua info page) é que ele foi iniciado a partir de um conjunto de scripts shell escritos por Dick Grune que foram postados ao grupo de notícias comp.sources.unix no volume 6 de Dezembro de 1986. Na versão atual não estão mais presentes shell scripts porque muitos dos conflitos de resolução de algorítmos vem deles.
Em Abril de 1989, Brian Berliner fez o design e programou o CVS. Mais tarde, Jeff Polk ajudou Brian com o design do módulo CVS.

### Contribuindo com o CVS

Através da lista de discussão info-cvs. Para se inscrever envie uma mensagem com o subject "subscribe" para info-cvs-request@gnu.org. Outra alternativa é através do grupo de noticias (newsgroup) da Usenet comp.software.config-mgm.

### Características

Abaixo uma lista de características que tornam o CVS útil no gerenciamento de trabalhos em grupo:
* Gerenciamento de projeto em equipe
* Log de todas as alterações realizadas
* Lock de arquivos, permitindo que somente uma determinada pessoa modifique o arquivo durante o desenvolvimento do projeto.
* Histórico de todas as mudanças feitas, isto permite voltar a uma versão anterior em caso de problemas, e ver o que houve de errado com o código.
* Os projetos podem ser hospedados em repositórios.
* Podem ser criados diversas equipes de trabalho para cada repositórios, e definidos quem terá ou não acesso ao repositório individualmente. O desenvolvedor gleydson, por exemplo, podem ter acesso ao projeto x_beta e não ter acesso a projeto secret_y.
* Permissões de acesso individuais de leitura/gravação.
* É possível criar um usuário com acesso anônimo sem dar uma conta no sistema.
* Pode tanto utilizar o banco de dados de contas/senhas do sistema como um banco de dados de autenticação do próprio CVS.
* Permite utilizar diversos "métodos" de acesso ao servidor: local, pserver, ext, etc. Cada um destes métodos será descrito a seguir.
* Permite o acesso via ssh para usuários que já possuam conta na máquina servidora. Este método garante segurança no envio da senha criptografada (veja [ch-d-cripto.html#s-d-cripto-sniffer Sniffer, Seção 20.2] para detalhes).
* Permite visualizar facilmente o que foi modificado entre duas versões de um arquivo.
OBS: O CVS possui algumas limitações e falhas, uma delas que mais me faz falta é um suporte a protocolo pserver via ssh que resolveria o problema de tráfego em texto plano e gerenciamento de grupos com permissões diferenciadas.

### Ficha técnica

Pacote: cvs
Utilitários:
* cvs - Servidor/ferramenta cliente.
* cvsbug - Envia um bug sobre o CVS para a equipe de suporte.
* rcs2log - Converte arquivos de log do formato usado pelo RCS para o CVS. Utilizado na migração desta ferramenta para o CVS.
* cvsconfig - Usado pela Debian para ativar/desativar o servidor pserver. Pode também ser usado o dpkg-reconfigure cvs para desativar o servidor pserver e suas características.
* cvs-makerepos - Script da Debian que lê a lista de repositórios de /etc/cvs-pserver.conf, cria os repositórios no local apropriado, corrige as permissões do diretório e adiciona os repositórios no servidor pserver.
* cvs-pserver - Script da Debian responsável por fazer uma inicialização mais inteligente do servidor de CVS via pserver, leitura e processamento de repositórios, etc. Normalmente ele é chamado a partir do arquivo /etc/inetd.conf.

### Requerimentos de Hardware

Para executar o CVS é requerido pelo menos 3 vezes mais memória que o tamanho do maior arquivo usado pelo projeto (para realização de diffs entre as atualizações) e uma boa quantidade de espaço em disco.
Na realidade os requerimentos sobre o CVS dependem muito da aplicação que será desenvolvida. É recomendável que a máquina tenha memória suficiente para evitar o uso de swap, que degrada bastante a performance do sistema.

### Arquivos de log criados pelo CVS

Problemas na inicialização do CVS são registrados no arquivo /var/log/daemon.log. Os logs de modificações feitas nos arquivos de um projeto no CVS são armazenadas no formato arquivo.extensão,v (é adicionado o ",v" ao final do arquivo para indicar que é um arquivo de controle de modificações do CVS).

### Instalação

O CVS pode ser baixado de http://www.cvshome.org/.
Para pacotes Debian basta apenas executar o comando: apt-get install cvs e seguir as telas de configuração para ter o pacote CVS instalado e (opcionalmente) com o servidor sendo executado. Você poderá a qualquer momento reconfigurar o CVS executando: dpkg-reconfigure cvs.
Uma boa documentação de referência é encontrada no pacote cvs-doc.

### Iniciando o servidor/reiniciando/recarregando a configuração

A única configuração requerida é quando o CVS é executado via pserver. Para isto, é necessária a seguinte linha no arquivo /etc/inetd.conf
Note que o parâmetro "200" indica quantas vezes o processo CVS poderá ser executado por minuto no sistema. Caso esse número seja excedido, o serviço será desabilitado e será necessário reiniciar o servidor inetd com o comando killall -HUP inetd para reativar o servidor CVS pserver (veja [ch-rede.html#s-rede-servicos-inetd-c /etc/inetd.conf, Seção 4.7.2.1] capítulo do inetd para detalhes). Ajuste este valor de forma adequada ao seu servidor!
Veja o script cvs-pserver sendo executado no final da linha. Ele foi desenvolvido para lidar de forma mais inteligente com a configuração do servidor CVS pserver.

### Opções de linha de comando

As seguintes opções são aceitas pelo CVS.

#### -z [num]

    Utiliza o gzip para fazer a transferência compactada dos arquivos. O valor especificado pode ser de 0 a 9, quanto maior o número maior o nível de compactação e uso da CPU.
Exemplo: cvs -z 3 checkout teste

#### -q

    Oculta mensagens sobre recursão de diretório durante os comandos do CVS.

#### -d [repositório]

    Permite especificar o repositório através da linha de comando.

#### -e [editor]

    Define qual é o editor de textos usado para registrar o texto de commits.

#### -n

    Executa o cvs em modo "simulação" não modificando qualquer arquivo do repositório.

#### -t

    Mostra mensagens mostrando o processo de execução de comandos do CVS. É bastante útil para aprendizado do cvs usado junto com a opção -n.

#### -r

    Torna os novos arquivos criados somente para leitura. É a mesma coisa que especificar a variável CVSREAD.

#### -w

    Torna os novos arquivos criados leitura/gravação que é o padrão.

#### -x

    Utiliza criptografia para a transferência dos arquivos quando é utilizado em conjunto com o Kerberos.
Você pode obter detalhes sobre opções sobre um comando em especial do CVS (commit, checkout, etc) digitando: cvs comando --help. Veja [#s-s-cvs-p Criando projetos para serem usados no CVS, Seção 17.3] para exemplos sobre cada uma delas.