Как мне сопоставить вывод svnlook в Perl?

Я запускаю SVN на сервере Windows и использую сценарии Perl для реализации некоторых хуков перед фиксацией. Я вижу следующее сообщение об ошибке от TortoiseSVN:

Ошибка!! ScriptError!! Не могу разобрать строку: _U путь / к / файлам / транку

и это сценарий:

foreach my $line (`$svnlook changed -t "$txn" "$repos"`)
{
  chomp($line);
  if ($line !~ /([AUD]).\s\s(.+)$/)
  {
    print STDERR "!!Script Error!! Can't parse line: $line\n";
    exit(1);
  }
  else
  {
     # perform some actions 
  }
}

exit(0);

Я пытался заменить регулярное выражение с такими вещами, как /_([AUD]).\s\s(.+)$/ без успеха - я даже пытался /.*([AUD]).\s\s(.+)$/,

Мысли? Предложения?

2 ответа

Решение

Не заглядывая в документацию SVN, я просто догадываюсь: в приведенном выше выводе только один пробел показан между U и фактическим путем, но у вас есть \s\s во всех ваших регулярных выражениях.

[править] Хорошо, теперь я посмотрел ссылку на svnlook. Во-первых, ваше регулярное выражение терпит неудачу для текущих версий svnlook, поскольку выходные данные указываются следующим образом:

  • Первые два столбца содержат статус
  • путь начинается в пятом столбце
  • Состояние может быть одним из A (добавлено), U (содержимое изменено), D (удалено), _U (изменение свойств) и UU (содержимое + свойства изменены)

Таким образом, вы должны быть в состоянии сопоставить что-то вроде ^([_AUD]+)\s+(.+)$, Можно конкретизировать, но в этом нет необходимости.

Если это не совпадает, пожалуйста, передайте вывод команды в файл и опубликуйте соответствующую часть здесь.

if ($line !~ /^_?([AUD])\s+(.+)$/ должно работать нормально.

Другие вопросы по тегам