RCS + foo.c

O RCS (Revision Control System) é o avô do programas de controle de versão. Por exemplo, o CVS (Concurrent Versions System) é construído sobre a estrutura do RCS com a vantagem de operar sobre uma rede. Hoje em dia a maioria dos projetos open source utiliza o CVS ou o Subversion para gerenciar seus arquivos fonte.

Resumindo, eu arrumei uma (in)utilidade para um programa que ninguém mais usa…

Quem programa sabe que é muito comum criar pequenos trechos de código (em arquivos separados) para simular uma função ou um algoritmo antes de adicioná-lo em um programa maior. É o bom e velho teste.cpp, tmp.c, foo.java, etc. Muitas vezes o código é apagado e sobrescrito com melhores (ou piores) implementações. É aí que o RCS entra no jogo, em vez de criar vários arquivos fonte, você pode usá-lo para controlar as diferentes versões da mesma idéia.

Um exemplo, imagine que você esteja testando algum container da STL e faça algo do tipo:


#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main(int argc, char *argv[]) {

vector<string > v;
vector<string>::iterator it;

v.insert(v.begin(), "melão");
v.insert(v.begin(), "banana");
v.insert(v.begin(), "maça");
v.insert(v.begin(), "laranja");
v.insert(v.begin(), "uva");
v.insert(v.begin(), "pêra");

for (it = v.begin(); it != v.end(); it++)
cout << (*it) << endl;

return 0;

}
&#91;/source&#93;
<p align="justify">Supondo que o nome do arquivo seja stl.cpp. O programa é tão novo que o RCS não sabe nada sobre ele ainda. A maneira como você apresenta um novo programa ao RCS é simplemente verificando-o. Os passos a seguir são necessários para criar um novo arquivo, sob controle de revisão.</p>

<blockquote>#mkdir RCS
#<strong>ci -u</strong> stl.cpp
RCS/stl.cpp,v &lt;-- stl.cpp
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
&gt;&gt; Bricando com a STL
&gt;&gt; .
initial revision: 1.1
done</blockquote>
<p align="justify">Nesse exemplo foi criado uma pasta RCS para guardar as cópias (isso não é necessário, mas deixa mais organizado o controle dos arquivos). Utilize o comando <strong>ci </strong>para iniciar o processo de verificação. Podemos verificar o arquivo criado.</p>

<blockquote># ls -lR
-r--r--r-- 1 maluta users 432 2007-11-13 17:17 stl.cpp

./RCS:
-r--r--r-- 1 maluta users 620 2007-11-13 17:18 stl.cpp,v</blockquote>
<p align="justify">O arquivo stl.cpp,v é um arquivo RCS especial, pois mantém algumas informações adicionais nesse arquivo. Ele armazena as informações de versão, a descrição recentemente digitada, o histório de alteração e assim por diante. Note que o arquivo é configurado com permissão de leitura para impedir que o arquivo seja alterado indevidamente.</p>
<p align="justify"><span style="color:#000000;"></span>Aí, fuçando na <a target="_blank" href="http://www.sgi.com/tech/stl/" title="STL docs">documentação</a> você descobre a função <a target="_blank" href="http://www.sgi.com/tech/stl/copy.html" title="copy()">copy</a>()...🙂 Vamos mudar o código, mas antes é preciso solicitar que o arquivo seja bloqueado, para isso utilizaremos a opção <strong>-l</strong>.</p>

<blockquote>$ <strong>co -l</strong> stl.cpp
RCS/stl.cpp,v --&gt; stl.cpp
revision 1.1 (locked)
done</blockquote>
<p align="justify">Obs.: Se bloqueou o arquivo e não quer editar nada, digite apenas "<strong>rcs -u </strong>stl.cpp" para voltar.</p>


#include <iostream>
#include <string>
#include <vector>
#include <iterator>

using namespace std;

int main(int argc, char *argv[]) {

vector<string > v;

v.insert(v.begin(), "melão");
v.insert(v.begin(), "banana");
v.insert(v.begin(), "maça");
v.insert(v.begin(), "laranja");
v.insert(v.begin(), "uva");
v.insert(v.begin(), "pêra");

copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n"));

return 0;

}

# ci stl.cpp
RCS/stl.cpp,v <– stl.cpp
new revision: 1.2; previous revision: 1.1
enter log message, terminated with single ‘.’ or end of file:
>> Inserido a função copy()
>> Retirado os laços for(;;)
>> .
done

Agora para alterar entre as modificações entre os arquivos utilize o comando rcsmerge:

# co -l stl.cpp
RCS/stl.cpp,v –> stl.cpp
revision 1.2 (locked)
# rcsmerge -r1.2 -r1.1 stl.cpp
RCS file: RCS/stl.cpp,v
retrieving revision 1.2
retrieving revision 1.1
Merging differences between 1.2 and 1.1 into stl.cpp

Pronto, agora você pode alterar entre seus testes de programa de um jeito fácil e rápido.

 

Quer mais informações? Há paginas no man para todos os comando citados acima (ci, co, rcsmerge, etc).

 

Happy coding!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: