<chapt id="s-cvs">CVS
 <p>
Este capítulo explica os requerimentos, instalação, configuração, segurança e 
diversos modelos de configuração de acesso para trabalho em grupo utilizados 
pelo <prgn>CVS</prgn>.
 <p>
Não tome-o como uma referência completa ao uso e configuração do cvs, a 
pesquisa de sua info page é muito importante. 


<sect id="s-cvs-intro">Introdução ao CVS
 <p>
O CVS (<em>Concurrent Version Software</em>) 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. 
 <p>
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. 
 <p>
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. 
 <p>
Uma seção de <prgn>cvs</prgn> é feita de modo interativo através do comando
<prgn>cvs</prgn>. Por exemplo:
<list compact>
 <item><tt>logar no sistema</tt> - cvs login
 <item><tt>baixar um projeto</tt> - cvs checkout projeto
</list>
Cada comando do <prgn>cvs</prgn> será explicado em detalhes no decorrer deste 
capítulo.

<sect1 id="s-cvs-versao">Versão
 <p>
A versão do <prgn>CVS</prgn> documentada no guia é a <em>1.11.1</em>. As 
explicações aqui certamente serão compatíveis com versões posteriores 
deste programa. 


<sect1 id="s-cvs-historia">História
 <p>
O <prgn>CVS</prgn> é uma substituição do sistema RCS (Revision Control System) 
ele possui mais recursos e foi criado sendo compatível com o RCS.
 <p>
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 
<em>Dick Grune</em> que foram postados ao grupo de notícias 
<tt>comp.sources.unix</tt> 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.
 <p>
Em Abril de 1989, <em>Brian Berliner</em> fez o design e programou 
o CVS. Mais tarde, Jeff Polk ajudou Brian com o design do módulo 
CVS.



<sect1 id="s-cvs-contribuindo">Contribuindo com o CVS
 <p>
Através da lista de discussão <tt>info-cvs</tt>. Para se inscrever envie uma
mensagem com o subject "subscribe" para <tt>info-cvs-request@gnu.org</tt>. 
Outra alternativa é através do grupo de noticias (newsgroup) da Usenet 
<tt>comp.software.config-mgm</tt>.


<sect1 id="s-cvs-caracteristicas">Características
 <p>
Abaixo uma lista de características que tornam o CVS útil no gerenciamento
de trabalhos em grupo:
<list>
 <item>Gerenciamento de projeto em equipe
 <item>Log de todas as alterações realizadas
 <item>Lock de arquivos, permitindo que somente uma determinada pessoa modifique
o arquivo durante o desenvolvimento do projeto.
 <item>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.
 <item>Os projetos podem ser hospedados em repositórios.
 <item>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 <tt>gleydson</tt>, por exemplo, podem ter acesso ao projeto
<tt>x_beta</tt> e não ter acesso a projeto <tt>secret_y</tt>.
 <item>Permissões de acesso individuais de leitura/gravação.
 <item>É possível criar um usuário com acesso anônimo sem dar uma conta no sistema.
 <item>Pode tanto utilizar o banco de dados de contas/senhas do sistema como 
 um banco de dados de autenticação do próprio CVS.
 <item>Permite utilizar diversos "métodos" de acesso ao servidor: <em>local</em>, 
 <em>pserver</em>, <em>ext</em>, etc. Cada um destes métodos será descrito 
  a seguir.
 <item>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 
 <![ %CAPJUNTOS [ (veja <ref id="d-cripto-sniffer"> para detalhes)]]>.
 <item>Permite visualizar facilmente o que foi modificado entre duas versões de um 
 arquivo.
</list>

<![ %OBS [
 <p>
<strong>OBS</strong>: 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.
]]>


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



<sect1 id="s-cvs-hwreq">Requerimentos de Hardware
 <p>
Para executar o <prgn>CVS</prgn> é 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. 
 <p>
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.



<sect1 id="s-cvs-logs">Arquivos de log criados pelo CVS
 <p>
Problemas na inicialização do <prgn>CVS</prgn> são registrados no 
arquivo <file>/var/log/daemon.log</file>. Os logs de modificações 
feitas nos arquivos de um projeto no CVS são armazenadas no formato
<file>arquivo.extensão,v</file> (é adicionado o ",v" ao final do arquivo
para indicar que é um arquivo de controle de modificações do CVS).


<sect1 id="s-cvs-install">Instalação
 <p>
O <prgn>CVS</prgn> pode ser baixado de <url id="&url-cvs-down;">. 
 <p>
Para pacotes <prgn>Debian</prgn> basta apenas executar o comando:
<tt>apt-get install cvs</tt>
e seguir as telas de configuração para ter o pacote <prgn>CVS</prgn> 
instalado e (opcionalmente) com o servidor sendo executado. 
Você poderá a qualquer momento reconfigurar o <prgn>CVS</prgn> executando:
<tt>dpkg-reconfigure cvs</tt>.
 <p>
Uma boa documentação de referência é encontrada no pacote 
<package>cvs-doc</package>. 


<sect1 id="s-cvs-rodando">Iniciando o servidor/reiniciando/recarregando a 
configuração
 <p>
A única configuração requerida é quando o <prgn>CVS</prgn> é executado via 
<tt>pserver</tt>. Para isto, é necessária a seguinte linha no arquivo
<file>/etc/inetd.conf</file>
<example>
cvspserver      stream  tcp     nowait.200      root    /usr/sbin/tcpd /usr/sbin/cvs-pserver

</example>
Note que o parâmetro "200" indica quantas vezes o processo <prgn>CVS</prgn> 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 <prgn>inetd</prgn> com 
o comando <tt>killall -HUP inetd</tt> para reativar o servidor CVS pserver 
<![ %CAPJUNTOS [ (veja <ref id="rede-servicos-inetd-c"> capítulo do 
<prgn>inetd</prgn> para detalhes)]]>. Ajuste este valor de forma adequada ao seu servidor!
 <p>
Veja o script <file>cvs-pserver</file> sendo executado no final da linha. Ele 
foi desenvolvido para lidar de forma mais inteligente com a configuração do 
servidor CVS pserver.


<sect1 id="s-cvs-opcoescmd">Opções de linha de comando
 <p>
As seguintes opções são aceitas pelo CVS.
<taglist compact>
 <tag>-z [num]</tag>
  <item>
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. 
 <p>
Exemplo: <tt>cvs -z 3 checkout teste</tt>

 <tag>-q</tag>
  <item>
Oculta mensagens sobre recursão de diretório durante os comandos do 
CVS.

 <tag>-d [repositório]</tag>
  <item>
Permite especificar o repositório através da linha de comando. 

 <tag>-e [editor]</tag>
  <item>
Define qual é o editor de textos usado para registrar o texto de commits. 

 <tag>-n</tag>
  <item>
Executa o cvs em modo "simulação" não modificando qualquer arquivo 
do repositório.

 <tag>-t</tag>
  <item>
Mostra mensagens mostrando o processo de execução de comandos do CVS. É 
bastante útil para aprendizado do cvs usado junto com a opção <em>-n</em>.

 <tag>-r</tag>
  <item>
Torna os novos arquivos criados somente para leitura. É a mesma coisa que 
especificar a variável <var>CVSREAD</var>.

 <tag>-w</tag> 
  <item>
Torna os novos arquivos criados leitura/gravação que é o padrão.

 <tag>-x</tag>
  <item>
Utiliza criptografia para a transferência dos arquivos quando é 
utilizado em conjunto com o <prgn>Kerberos</prgn>.

</taglist>
Você pode obter detalhes sobre opções sobre um comando em especial do CVS 
(<em>commit</em>, <em>checkout</em>, etc) digitando: <tt>cvs comando --help</tt>. 
Veja <ref id="s-cvs-p"> para exemplos sobre cada uma delas. 

