/** * 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); }
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); }