Как определить, является ли элемент в разнице SVN файлом или папкой? - PullRequest
1 голос
/ 30 ноября 2010

Я пишу хук после фиксации, в котором я использую svn diff -summarize, чтобы получить сводку того, что было изменено. Когда файлы / папки добавляются или изменяются, я могу просто получить их тип файла в рабочей копии, которая постоянно обновляется автоматически. Но когда файл или папка удаляются, у меня нет возможности узнать, был ли элемент в svn diff -summarize файлом или папкой.

Один из обходных путей, о котором я подумал, - это сохранить другую рабочую копию, обновленную автоматически, но всегда оставляющую одну ревизию позади другой рабочей копии. Таким образом, если файл / папка была удалена, я мог бы получить ее в более старой рабочей копии. Однако я думаю, что это чрезвычайно неэффективный способ сделать это, заставив меня хранить две разные рабочие копии одновременно, и мне было интересно, есть ли что-нибудь в SVN, которое помогло бы с этой задачей.

1 Ответ

2 голосов
/ 17 марта 2011

При написании svn-хуков любого типа, если вам нужна информация о репозитории или о транзакции, вы хотите использовать программу svnlook из сценария оболочки или использовать svn API на выбранном вами языке. Использование svnlook быстрее, так как оно обходит весь код SVN RA (удаленного доступа), включая уровень проверок авторизации - поскольку сценарии выполняются в контексте сервера, это не проблема. Кроме того, у вас нет дополнительных затрат на обновление рабочей копии, которую вы не используете для чего-либо, кроме информации о типе файла.

svnlook содержит множество опций для исследования как ревизий (для перехватов после *), так и транзакций (для пре-транзакций *). Особый интерес здесь представляет опция changed.

<blockquote>changed: usage: svnlook changed REPOS_PATH

Print the paths that were changed.

Valid options:
  -r [--revision] ARG      : specify revision number ARG
  -t [--transaction] ARG   : specify transaction name ARG
  --copy-info              : show details for copies
</blockquote>

Изменения, которые составили ревизию или транзакцию, отображаются следующим образом:

A   trunk/src/new-dir/
A   trunk/src/new-dir/newheader.h
A   trunk/src/new-dir/newsrc.c
U   trunk/src/existingsrc.c

Вывод из svnlook при обращении к каталогу всегда заканчивается на /. Это простой дискриминатор для обнаружения файла или каталога.

Однако, когда дело касается удалений, все становится немного мрачнее. Если каталог удаляется, все содержимое каталога также удаляется, и эта информация не отображается в changed. Смотрите здесь:

D   trunk/src/new-dir/
U   trunk/src/existingsrc.c

Основываясь на описании того, на что вы смотрите, я собираюсь предположить, что вы ищете какую-то форму отчетов после фиксации. Если это так, вы можете проверить postver * mail hook_verver . Даже если вы не хотите отправлять результаты по электронной почте, код демонстрирует, как пройти через транзакцию или ревизию изменений с помощью API SVN.

...