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;

}

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.

#mkdir RCS
#ci -u stl.cpp
RCS/stl.cpp,v <– stl.cpp
enter description, terminated with single ‘.’ or end of file:
NOTE: This is NOT the log message!
>> Bricando com a STL
>> .
initial revision: 1.1
done

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 ci para iniciar o processo de verificação. Podemos verificar o arquivo criado.

# 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

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.

Aí, fuçando na documentação você descobre a função copy()… :-) Vamos mudar o código, mas antes é preciso solicitar que o arquivo seja bloqueado, para isso utilizaremos a opção -l.

$ co -l stl.cpp
RCS/stl.cpp,v –> stl.cpp
revision 1.1 (locked)
done

Obs.: Se bloqueou o arquivo e não quer editar nada, digite apenas “rcs -u stl.cpp” para voltar.


#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