2009-12-03 5 views
2

Я написал следующий сценарий предварительной фиксации для SVN, чтобы проверить, что пользователь предоставил минимальный объем информации о фиксации файла. Однако при попытке добавить/удалить каталог, теперь он не работает. Я знаю, почему это происходит неудачно, я просто не понял, что сценарий pre-commit был вызван при каждом действии. Как фильтровать для выполняемого действия? Могу ли я сделать это с svn log или мне нужно использовать что-то еще?SVN pre-commit скрипт для проверки mkdir

<?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); 
} 
?> 

Как проверить, что команда svn вызывается в текущей транзакции? В основном я хочу, чтобы проверка выполнялась только на svn commit, а не на копии, mkdir и т. Д.

Заранее благодарен!

EDIT: Возможно, я должен был уточнить исходное сообщение, я использую папку создания TortoiseSVN ... для этого. Может быть, TortoiseSVN выполняет какую-то операцию фиксации?

+0

Назовите меня сумасшедшим, но если это крюк 'pre-commit', не должен ли он всегда быть операцией' commit' ...? –

+0

Это была моя первая мысль тоже ... Хотя, я могу понять, почему она будет вызвана и с SVN-копией. Я не в том месте, где я могу это проверить. :(Док говорит, что это ** ТОЛЬКО **, вызванное непосредственно перед транзакцией фиксации, для реальной проверки. –

+0

@silky & Dan - это были мои точные мысли при разработке сценария pre-commit, но он находится в факт: ( – jaywon

ответ

2

У меня нет большой ответ для вас, но ...

Может быть, вы можете использовать svnlook changed --copy-info, чтобы помочь немного. Используя это, вы можете определить, был ли какой-то предмет скопирован. Если все предметы скопированы, то может с уверенностью предположить это из инструкции svn copy. Аналогичным образом, если вы проверяете возвращаемые элементы, вы должны определить, было ли это добавлением или удалением каталога (так как это будет только один элемент каталога, который будет добавлен или удален.)

Надеюсь, что это поможет несколько ...

+0

Дэн, спасибо за предложение. Хотя не так прямо, как хотелось бы, решение было очень хорошим. Мне просто нужно проверить измененную информацию для «А» и увидеть, что добавление заканчивается на «/», который является единственным индикатором того, что он является каталогом, а не файлом. – jaywon

+0

Рад, что это помогло вам. –