Resumo Este artigo apresenta um modelo de implementação em Linux para controle e versionamento de arquivos. Após explicar os conceitos envolvidos, é destacado o procedimento de instalação e alguns exemplos de uso. A idéia consiste em organizar um repositório central onde os usuários de uma rede local podem colocar arquivos e determinar as operações a serem feitas para o controle da versão. Este documento é um trabalho de aula do concentrado de Linux Avançado, sendo meu objetivo criar maior intimidade com o uso do sistema Linux. Este artigo pode ser uma idéia inicial para um trabalho mais completo, onde um portal em PHP poderia servir as páginas para os usuários controlarem seus documentos, tipo como faz o Share Point da M$. Introdução Controle de versão é a arte de gerenciar mudanças em informações. Ele tem sido uma ferramenta útil para programadores, que gastam seu tempo fazendo mudanças pequenas em software. Mas a utilidade do software de controle de versão se estende muito além dos limites do mundo do desenvolvimento de software. Em qualquer lugar que você encontrar pessoas usando computadores para gerenciar informações que mudam com freqüência, há espaço para utilizarmos controle de versão na coleção de arquivos. Portanto não é destinado apenas aos programadores de sistemas de computador, mas aos que utilizam arquivos em geral e necessitam de um controle adicional para as alterações realizadas. Para exemplificar, utilizaremos o sistema chamado Subversion neste artigo. O que é Subversion? Subversion é um sistema de controle de versão livre/open-source, com objetivo de gerenciar arquivos e diretórios ao longo do tempo. Esses arquivos ficam armazenados em um repositório central sob o cuidado desse sistema. Esse repositório se parece muito com um servidor genérico de arquivos, exceto que todas as mudanças feitas em seu conteúdo são devidamente registradas. Além de você ter sempre a versão mais atual disponível, o sistema permite recuperar versões antigas dos seus dados, examinar o histórico para saber que modificações foram feitas ou ainda, quem executou a alteração. Conceitos de compartilhamento de arquivos Todo sistema de controle de versão tem que resolver o mesmo problema fundamental em ambientes onde documentos devem ser compartilhados entre várias pessoas: Como permitir que os usuários tenham acesso às informações garantindo que não se atrapalhem mutuamente, sem impedir o trabalho ou sobrescrever acidentalmente as alterações enviadas por outros. Qualquer tentativa de controle em compartilhamentos depara basicamente com os dois modelos a seguir: A solução travar-modificar-destravar Muitos sistemas de controle de versão usam o modelo travar-modificar-destravar (lock-modify-unlock, em inglês) destinado a evitar o problema de autores terem seus trabalhos sobrescritos por terceiros. Nesse modelo, os arquivos no repositório podem ser consultados por todos, porem cada arquivo podem ser editado por uma pessoa de cada vez. Essa ação de exclusividade é conseguida através de travas, onde as demais pessoas só poderão alterar o arquivo quando primeiramente este for liberado pela pessoa que estava usando. A solução copiar-modificar-fundir Nesse modelo cada usuário contata o repositório e cria uma cópia de trabalho (working copy, em inglês) pessoal - uma réplica local dos arquivos e diretórios do repositório. Os usuários trabalham então em paralelo, modificando suas cópias particulares. Finalmente, as cópias particulares são enviadas ao repositório central e fundidas em uma nova versão final. O sistema de controle de versão frequentemente auxilia na fusão, mas o ser humano é o responsável de fazê-la funcionar corretamente. Quando utilizar um ou outro modelo Para arquivos binários (imagens, documentos em formato proprietário, áudio e banco de dados) o modelo mais indicado é o travar-modificar-destravar. O modelo copiar-modificar-fundir é indicado para arquivos em formato texto, como código fonte de programas e documentos com conteúdo aberto, como texto simples sem formação e arquivos XML e seus correlatos. Apesar do primeiro modelo parecer um entrave quando disponibilizado em um ambiente colaborativo (uma pessoa deveria esperar para que a outra terminasse a alteração para poder trabalhar na última versão), através de um simples processo pode-se resolver facilmente essa questão. Devemos lembrar que o objetivo é o controle de versionamento e não conferência onde é disputado o mesmo espaço de trabalho com os demais. Mesmo que o CVS e o Subversion, sendo os principais sistemas abertos para controle de versão, trabalhem principalmente no modelo copiar-modificar-fundir, ambos reconhecem a necessidade de se travar um arquivo ocasionalmente e também oferecem mecanismos para isso. Instalando o Subversion O Subversion foi construído sobre uma camada de portabilidade chamada APR - a biblioteca Apache Portable Runtime. A biblioteca APR provê todas as interfaces que o sistema necessita para funcionar em diferentes sistemas operacionais: acesso ao disco, acesso à rede, gerenciamento de memória e assim por diante. Mesmo sendo o Subversion capaz de usar o Apache como um de seus programas de servidor de rede, sua dependência sobre a APR não significa que o Apache seja um componente obrigatório. A APR é uma biblioteca standalone utilizável por qualquer aplicação. Isso significa, entretanto, que assim como o Apache, os clientes e servidores de Subversion rodam em qualquer sistema operacional onde o servidor Apache httpd é capaz de rodar: Windows, Linux, todos os sabores de BSD, Mac OS X, Netware, entre outros. O modo mais fácil de obter o Subversion é baixando um pacote binário construído para o seu sistema operacional. O website do Subversion freqüentemente tem esses pacotes disponíveis para download. O site geralmente contém pacotes de instaladores gráficos para usuários de sistemas operacionais Microsoft. Se você roda um clone do sistema operacional Unix, pode usar o seu sistema nativo de distribuição de pacotes (RPMs, DEBs, árvore de ports, etc.) para obter o Subversion mais atual. Tenho um ambiente Fedora e o pacote Subversion pode ser selecionado diretamente nos pacotes disponíveis no CD para instalação. Para algumas plataformas existe também um cliente gráfico (a exemplo o TortoiseSVN) que pode ser integrados ao shell, facilitando a manipulação dos arquivos e do repositório do Subversion. Mesmo o servidor sendo Linux, os clientes podem ser de várias plataformas, e seu acesso é garantido aos recursos do repositório. Conceitos e informações relevantes Repositório - Caminho da rede (ou do servidor local) que armazena os arquivos e garante o funcionamento do controle de versão sobre eles. Cópia de trabalho - É uma pasta local, contendo uma coleção de arquivos. Você pode realizar qualquer alteração, editar seu conteúdo como bem entender. Você estará trabalhando na sua própria cópia, sua área de trabalho pessoal. Nenhuma alteração realizada por outras pessoas no mesmo arquivo do repositório do Subversion é feita na sua pasta nem as alterações realizadas por você são disponíveis para as demais pessoas sem sua ordem expressa para isso. Para disponibilizar a versão do documento na qual você trabalhou para as demais pessoas ou simplesmente garantir a versão que você acabou de trabalhar esteja sob controle do Subversion, você deve comandar que o Subversion publique seu arquivo com as mudanças realizadas localmente por você para o repositório. Existe também um comando que disponibiliza a última versão do arquivo no repositório para que você possa trabalhar localmente. Preparação do repositório Para melhor organizar, preparamos uma pasta para hospedar o repositório no servidor (ou micro local) e em seguida, comandamos a criação escolhendo o nome que desejamos dar para o mesmo. Usamos o nome 'teste', conforme abaixo: # mkdir /svn # mkdir /svn/repos # mkdir /svn/users # mkdir /svn/permissions # svnadmin create /svn/repos/teste Preparação da cópia de trabalho (Workingcopy) Para a cópia de trabalho, devemos criar uma pasta e associar o repositório a ela, conforme abaixo: # mkdir /trabalho # cd /trabalho Para repositório local (se você esta usando no mesmo computador): # svn checkout file:///svn/repos/teste Para repositório remoto (se você esta usando acesso ao Subversion pelo Apache): # svn checkout http://servidor/repos/teste Após a criação da cópia de trabalho é criada uma pasta chamada 'teste' igual a que está no repositório, com todos os arquivos que existem lá. Apesar de não termos nada gravado no repositório ainda, uma pasta chamada .svn/ passa a existir dentro da cópia de trabalho. Essa pasta é necessária para controle do Subversion e não pode ser alterada ou apagada. Ela pode aparecer oculta em alguns sistemas, mas estará lá o tempo todo. Para trabalhar nos arquivos: # cd /trabalho/teste # ls -la Exemplos de uso Na pasta de trabalho temos a pasta 'teste' e você pode gravar o que bem entender nela, como uma pasta normal do seu computador, porém deve avisar ao Subversion o nome do arquivo que fará parte do repositório central ou indicar * caso deseje que todos os arquivos da cópia de trabalho sejam adicionados ao repositório usando o comando abaixo: # svn add arq1.txt # svn add arq2.txt ou # svn add * Você acaba de avisar quais arquivos deseja que o Subversion tenha controle de versão, ainda não estarão disponíveis para os demais usuários nem estarão seguros. Para verificar quais arquivos serão enviados, comande: # svn status Onde a situação do arquivo é apresentada na seguinte codificação: • A (novo para ser adicionado) • ? (ainda não versionado) • D (deletado) • M (modificado localmente) • C (conflito entre versões para ser resolvido) Para enviar para o repositório a versão atual dos arquivos locais que foram alterados, é necessário informar um log, que será usado para explicar o motivo das alterações para quem consultar o repositório diretamente. Isso tem a função de documentar a revisão que será gerada no repositório. comande: # svn commit --message "primeira versão" Para garantir que você está trabalhando na última versão do arquivo, comande a atualização dos arquivos locais para pegar as últimas versões do repositório e gravar localmente. # svn update Para melhorar o uso do Subversion, você ainda pode contar com comandos adicionais específicos para trabalhar com o repositório ou mesmo com os arquivos locais. Segue abaixo o ciclo básico de trabalho usando o Subversion: Atualiza sua cópia de trabalho: # svn update Realiza as mudanças: # svn add ou # svn delete ou # svn copy ou # svn move Examina as mudanças: # svn status # svn diff # svn revert Junta outras mudanças do repositório dentro da cópia de trabalho: # svn update # svn resolved Confirmar as alterações: # svn commit -message "porque da alteração" Conclusões O Subversion tem ganho muito espaço no meio open-source e também nas empresas desenvolvedoras de software. Se olharmos a integração disponível com o Apache e o PHP, temos tudo o que precisamos para implementar um sistema eficiente e barato em Linux para controle de documentos, independente da plataforma dos clientes que irão fazer uso dela. Minha praia de programação não é em Linux, porém esse portal para controle de documentos seria uma ferramenta e tanto para disponibilizar em um projeto futuro. Referência: • Installing SubVersion on FC 4 • SVN-BOOK - e-Book do Subversion