[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