/**
  * Executa comando 
  *
  * @param OutputInterface $oInput
  * @param InputInterface $oOutput
  * @access public
  * @return void
  */
 public function execute($oInput, $oOutput)
 {
     $sArquivo = $oInput->getArgument('arquivo');
     if (!file_exists($sArquivo)) {
         throw new Exception("Arquivo não existe: {$sArquivo}");
     }
     /**
      * Lista informacoes do commit, sem as tags
      */
     exec('cvs annotate ' . $sArquivo . ' 2> /tmp/cvsgit_last_error', $aRetornoComandoAnnotate, $iStatusComandoAnnotate);
     if ($iStatusComandoAnnotate > 0) {
         throw new Exception("Erro ao execurar cvs log -N {$sArquivo}" . PHP_EOL . $this->getApplication()->getLastError(), $iStatusComandoAnnotate);
     }
     $sDiretorioTemporario = '/tmp/cvs-annotate/';
     $sArquivoPrograma = $sDiretorioTemporario . 'arquivo_' . basename($sArquivo);
     $sArquivoDados = $sDiretorioTemporario . 'dados_' . basename($sArquivo);
     $sConteudoArquivoPrograma = '';
     $sConteudoArquivoDados = '';
     $iColunasDados = 0;
     /**
      * Cria diretorio temporario
      */
     if (!is_dir($sDiretorioTemporario) && !mkdir($sDiretorioTemporario, 0777, true)) {
         throw new Exception("Não foi possivel criar diretório temporario: {$sDiretorioTemporario}");
     }
     foreach ($aRetornoComandoAnnotate as $sLinha) {
         $aLinha = explode(':', $sLinha);
         $aLinhaDados = explode(" ", $aLinha[0]);
         $sLinhaPrograma = $aLinha[1];
         $sLinhaDados = '';
         foreach ($aLinhaDados as $iIndiceLinhaDados => $sDadosLinhaDados) {
             if (empty($sDadosLinhaDados)) {
                 continue;
             }
             $sDadosLinhaDados = str_replace(array('(', ')'), '', $sDadosLinhaDados);
             $sLinhaDados .= $sDadosLinhaDados . ' ';
         }
         $iLinhaDados = strlen($sLinhaDados);
         if ($iLinhaDados > $iColunasDados) {
             $iColunasDados = $iLinhaDados;
         }
         // $sConteudoArquivoPrograma .= $sLinhaPrograma . PHP_EOL;
         $sConteudoArquivoDados .= trim($sLinhaDados) . PHP_EOL;
     }
     // file_put_contents($sArquivoPrograma, $sConteudoArquivoPrograma);
     file_put_contents($sArquivoDados, $sConteudoArquivoDados);
     $this->binario($sArquivo, $sArquivoDados, $iColunasDados);
 }
Exemple #2
0
 private function processarArquivo($sArquivo)
 {
     if (!file_exists($sArquivo)) {
         throw new Exception("Arquivo não existe: {$sArquivo}");
     }
     $nPrimeiraVersao = $this->oInput->getArgument('primeira_versao');
     $nSegundaVersao = $this->oInput->getArgument('segunda_versao');
     /**
      * Nenhuma versao informada para usar diff 
      */
     if (empty($nPrimeiraVersao)) {
         /**
          * Lista informacoes do commit, sem as tags
          */
         $oComando = $this->getApplication()->execute('cvs log -N ' . escapeshellarg($sArquivo));
         $aRetornoComandoInformacoes = $oComando->output;
         $iStatusComandoInformacoes = $oComando->code;
         if ($iStatusComandoInformacoes > 0) {
             throw new Exception("Erro ao execurar cvs log -N " . escapeshellarg($sArquivo) . PHP_EOL . $this->getApplication()->getLastError(), $iStatusComandoInformacoes);
         }
         $iVersaoAtual = null;
         foreach ($aRetornoComandoInformacoes as $iIndice => $sLinhaRetorno) {
             if (strpos($sLinhaRetorno, 'head:') !== false) {
                 $iVersaoAtual = trim(str_replace('head:', '', $sLinhaRetorno));
                 break;
             }
         }
         $nPrimeiraVersao = $iVersaoAtual;
     }
     if (!file_exists('CVS/Repository')) {
         throw new Exception('Diretório atual não é um repositorio CVS.');
     }
     $sDiretorioRepositorio = trim(file_get_contents('CVS/Repository'));
     $aDiretorioRepositorio = explode('/', $sDiretorioRepositorio);
     $sProjeto = $aDiretorioRepositorio[0];
     $sDiretorioCheckout = $sDiretorioRepositorio;
     $sDiretorioTemporario = '/tmp/cvs-diff/';
     $sSeparador = '__';
     $sComandoCheckout = "cvs checkout -r %s " . escapeshellarg("{$sDiretorioCheckout}/" . $sArquivo) . " 2> /tmp/cvsgit_last_error";
     $sComandoMover = "mv " . escapeshellarg("{$sDiretorioCheckout}/" . $sArquivo) . " {$sDiretorioTemporario}[%s]\\ " . basename($sArquivo);
     $sComandoMoverProjeto = "cp -rf " . escapeshellarg($sProjeto) . " {$sDiretorioTemporario} && rm -rf " . escapeshellarg($sProjeto);
     /**
      * Cria diretorio temporario
      */
     if (!is_dir($sDiretorioTemporario) && !mkdir($sDiretorioTemporario, 0777, true)) {
         throw new Exception("Não foi possivel criar diretório temporario: {$sDiretorioTemporario}");
     }
     /**
      * Checkout - Primeira versao 
      */
     $oComando = $this->getApplication()->execute(sprintf($sComandoCheckout, $nPrimeiraVersao));
     $aRetornoCheckout = $oComando->output;
     $iStatusCheckout = $oComando->code;
     /**
      * Erro - Primeira versao 
      */
     if ($iStatusCheckout > 0) {
         throw new Exception('Erro ao executar checkout da versão "' . $nPrimeiraVersao . '"' . PHP_EOL . $this->getApplication()->getLastError(), $iStatusCheckout);
     }
     /**
      * Mover primeria versao
      * - mover arquivo da primeira versao para diretorio temporario
      */
     $oComando = $this->getApplication()->execute(sprintf($sComandoMover, $nPrimeiraVersao));
     $aRetornoMover = $oComando->output;
     $iStatusMover = $oComando->code;
     if ($iStatusMover > 0) {
         throw new Exception('Erro ao executar: ' . sprintf($sComandoMover, $nPrimeiraVersao), $iStatusMover);
     }
     $sArquivoPrimeiraVersao = $sDiretorioTemporario . "[" . $nPrimeiraVersao . "] " . basename($sArquivo);
     /**
      * Vim diff - segunda versao nao inforamada
      */
     if (empty($nSegundaVersao)) {
         exec('diff ' . escapeshellarg($sArquivo) . ' ' . escapeshellarg($sArquivoPrimeiraVersao) . ' > /tmp/cvsgit_diff');
         $sDiffPrimeiraVersao = trim(file_get_contents('/tmp/cvsgit_diff'));
         if (empty($sDiffPrimeiraVersao)) {
             exec($sComandoMoverProjeto);
             throw new Exception('Nenhuma diferença com a versão ' . $nPrimeiraVersao);
         }
         exec($sComandoMoverProjeto);
         $this->binario($sArquivo, $sArquivoPrimeiraVersao);
         return 1;
     }
     /**
      * Checkout - Segunda versao
      */
     exec(sprintf($sComandoCheckout, $nSegundaVersao), $aRetornoCheckout, $iStatusCheckout);
     if ($iStatusCheckout > 0) {
         exec($sComandoMoverProjeto);
         throw new Exception('Erro ao executar checkout da versão "' . $nSegundaVersao . '"' . PHP_EOL . $this->getApplication()->getLastError());
     }
     /**
      * Mover segunda versao
      * - mover arquivo da primeira versao para diretorio temporario
      */
     exec(sprintf($sComandoMover . ' 2> /tmp/cvsgit_last_error', $nSegundaVersao), $aRetornoMover, $iStatusMover);
     if ($iStatusMover > 0) {
         throw new Exception('Erro ao executar: ' . sprintf($sComandoMover, $nSegundaVersao));
     }
     $sArquivoSegundaVersao = $sDiretorioTemporario . "[" . $nSegundaVersao . "] " . basename($sArquivo);
     exec('diff ' . escapeshellarg($sArquivoPrimeiraVersao) . ' ' . escapeshellarg($sArquivoSegundaVersao) . ' > /tmp/cvsgit_diff');
     $sDiffDuasVersoes = trim(file_get_contents('/tmp/cvsgit_diff'));
     if (empty($sDiffDuasVersoes)) {
         throw new Exception('Nenhuma diferença entre as versões ' . $nPrimeiraVersao . ' e ' . $nSegundaVersao);
     }
     exec($sComandoMoverProjeto);
     $this->binario($sArquivoPrimeiraVersao, $sArquivoSegundaVersao);
 }