[Cascavel-pm] Problema em comparar campos de arquivos
Ronan Eustaquio
1nanor3b em gmail.com
Sábado Setembro 13 21:23:26 PDT 2008
Olá Galera,
Estou com uma dúvida que persiste há um tempo e não consigo resolver.
Aqui na empresa tem um repositório com o SVN e quando um camarada vai fazer
um commit ele coloca a seguinte sintaxe no log.
#file=caminho/do/arquivo/comitado#status=draft
ou quando o arquivo foi aprovado
#file=caminho/do/arquivo/comitado#status=aprovado
No svn tem um arquivo que é executado quando uma pessoa faz um commit no
repositório. Ele se chama commit-email.pl
O meu superior pediu para que eu gerasse uma base de dados com estas
informações que o pessoal coloca nos logs. Esta base de dados
ficaria da seguinte forma:
caminho/do/arquivo/comitado,draft
caminho/do/arquivo/comitado.doc,draft
caminho/do/arquivo2/comitado,draft
e quando o arquivo fosse aprovado, ele teria que ser substituido o draft por
aprovado. Ex.:
caminho/do/arquivo/comitado,aprovado
caminho/do/arquivo/comitado.doc,aprovado
caminho/do/arquivo2/comitado,aprovado
Então, eu fiz o código abaixo para gerar a base.
O que este código deve fazer: Ler a base de dados (um arquivo texto) e
comparar cada registro que está sendo processado na hora do
commit. Se o registro estiver diferente (ao invés de aprovado, estar draft),
altera o da base com o que está na memória.
O problema deste código é que ele está gravando os registros de forma
errada.
Ex.:
caminho/do/arquivo/comitado1
,aprovado
caminho/do/arquivo/comitado2.txt
,draft
caminho/do/arquivo/comitado.doc
,aprovado
Aí, na próxima vez que este script é executado, dá pau em tudo.
Espero que vocês tenham entendido e consigam me ajudar.
######################################################################
# Harvest data using svnlook.
# Get the author, date, and log from svnlook.
my @infolines = &read_from_process($svnlook, 'info', $repos, '-r',
$rev);
$author = shift @infolines;
my $date = shift @infolines;
shift @infolines;
my @log = map { "$_\n" } @infolines;
######################################################################
my $repositorio = $repos;
$repositorio =~ s/\/|svn//g;
$repositorio = uc($repositorio);
my $db_file = "/svn/basedados.$repositorio";
# Geracao de Base de dados para analise posterior
if ($db_file =~ /\w/){
my %registro = ("","") ;
my %registro_versionado = ("","");
my $linha = "";
my $status = "";
my $linha_versionada = "";
my $status_versionado = "";
delete($registro{""});
delete($registro_versionado{""});
# Processar a saida de log.
for (@log){
$linha_versionada = $_;
if($linha_versionada =~ /^#/){
$linha_versionada =~ s/^#//gi;
$linha_versionada =~ s/#/,/gi;
$linha_versionada =~ s/file=|status=//gi;
$status_versionado = $linha_versionada;
$status_versionado =~ s/(.*),//gi;
# $file_versionado recebe registro da memoria sem status
para comparar com o registro da base.
$linha_versionada =~ s/,(.*)//gi;
$registro_versionado{$linha_versionada} =
$status_versionado;
}
}
# Abrir base de dados para buscar registros.
if (open(DBFILE, "< $db_file"))
{
for my $value (<DBFILE>){
$linha = $value;
$status = $value;
$linha =~ s/,(.*)//gi;
$status =~ s/(.*),//gi;
$registro{$linha} = $status;
# print $linha.",".$registro{$linha}."\n";
}
close DBFILE
or warn "$0: error in closing `$db_file' for appending:
$!\n";
# Se a base esta vazia, nao tem o que fazer, a nao ser
adicionar o registro nela.
if ($linha eq "")
{
if (open(DBFILE, "> $db_file"))
{
while (my ($key, $value) =
each(%registro_versionado))
{
my $tmp = join (',',$key,$value);
$tmp =~ s/\n//;
print DBFILE $tmp;
}
close DBFILE
or warn "$0: error in closing `$db_file' for
appending: $!\n";
}
}
}
# Ordenacao do arquivo
#my @vetOrdem = sort {uc($a) cmp uc($b)} @vetTmp;
#
#while((my $key_versionado, my $value_versionado) =
each(%registro_versionado))
#{
# $registro{$key_versionado} = $value_versionado;
#}
foreach my $key_versionada (sort {$a cmp $b}
keys(%registro_versionado))
{
$registro{$key_versionada} =
$registro_versionado{$key_versionada};
}
if (open(DBFILE, "> $db_file"))
{
while(my ($key, $value) = each(%registro))
{
my $tmp = join(',',$key,$value);
$tmp =~ s/\n//;
print DBFILE $tmp;
}
close DBFILE
or warn "$0: error in closing `$db_file' for appending:
$!\n";
}
else
{
warn "$0: cannot open `$db_file' for appending: $!\n";
}
}
######################################################################
T+
--
-----------------------------
USE Linux - Slackware
-----------------------------
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20080914/202dfe09/attachment.html>
Mais detalhes sobre a lista de discussão Cascavel-pm