Pergunta

Eu escrevi o seguinte script pré-commit para o SVN para validar que um usuário tenha submetido a quantidade mínima de informações em um arquivo de cometer. No entanto, ao tentar adicionar / excluir um diretório, agora ele está falhando. Eu sei por que ele está falhando, obviamente, eu só não sabia que o pré-commit script foi chamado em cada ação. Como faço para filtrar para a ação que está sendo executada? Posso fazer isso com log svn ou eu preciso de usar qualquer outra coisa?

<?php
define('SVNLOOK', "\"C:\Program Files\CollabNet\Subversion Server\svnlook.exe\"");
define('NOTEXT', 1000);
define('NOPATTERNMATCH', 1001);
define('ERRORPROCESSING', 9999);

$repo_path = $argv[1];
$transaction = $argv[2];
$tracking_regex_pattern = "/\b(?:bug|issue|ter)\s*[#]{0,1}(\d+)\b/i";

exec(SVNLOOK . " log $repo_path -t$transaction", $revisions);

//loop through transaction message line by line for validation
$validation_passed = (bool) false;
$has_text = (bool) false;
foreach($revisions as $change_line){
  $change_line = trim($change_line);
  if (!empty($change_line)){
    $has_text = true;
    if (preg_match($tracking_regex_pattern, $change_line)) {
        $validation_passed = true;
    }
  }
}

if(!$validation_passed){
  switch($has_text) {
    case true:
      throwError(NOPATTERNMATCH, $revisions);
      break;
    case false:
      throwError(NOTEXT, $revisions);      
      break;
    default:
      throwError(ERRORPROCESSING, $revisions);
      break;
  }   
}else{
  exit(0);
}

function throwError($error_code, $revisions){
  $fp = fopen('php://stderr', 'w');
  fwrite($fp, "********** (Error Code: $error_code) **********\n");
  foreach($revisions as $change_line) {
    fwrite($fp, $change_line."\n"); 
  }
  fclose($fp); 
  exit($error_code);  
}
?>

Como teste de I para o comando svn está sendo exectued na transação atual? Basicamente eu só quero a validação para executar em um SVN commit e não uma cópia, mkdir, etc ...

Agradecemos antecipadamente !!!

EDIT: Eu provavelmente deveria ter clarificado com o post original, eu estou usando TortoiseSVN de Criar Pasta ... para fazer isso. Talvez TortoiseSVN está fazendo algum tipo de operação de confirmação?

Foi útil?

Solução

Eu não tenho uma grande resposta para você, mas ...

Talvez você possa usar svnlook changed --copy-info para ajudar um pouco. Usando isso, você pode dizer se um item foi copiado de algum lugar. Se todos os itens são copiados, então pode ser seguro assumir isso a partir de uma instrução svn copy. Da mesma forma, se você verificar os itens devolvidos, você deve ser capaz de determinar se era de adicionar ou excluir um diretório, bem como (uma vez que será apenas um único item diretório sendo adicionados ou excluídos.)

Espero que ajude um pouco ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top