Svn pre-commit hook для запрета svn: mergeinfo в некорневых каталогах - PullRequest
19 голосов
/ 22 июля 2010

Я хотел бы использовать ловушку перед фиксацией, которая не позволяет разработчикам устанавливать svn: mergeinfo в некорневых каталогах. То есть я хочу обеспечить, чтобы svn: mergeinfo могла только быть установлена ​​для таких каталогов, как "trunk" или "branch / branchName". Разработчикам иногда нужно «напомнить», что не рекомендуется использовать подкаталог корня в качестве цели слияния (в соответствии с лучшими практиками, перечисленными здесь ). У кого-нибудь есть такой скрипт хука или знаете, где его можно найти? Я нахожусь в среде Windows, поэтому предпочтительнее использовать пакетную или PowerShell, но все, что угодно, будет полезно.

Ответы [ 2 ]

7 голосов
/ 05 августа 2010

Прежде всего, я бы порекомендовал использовать Perl или Python для выполнения задачи, пакет Windows оставляет желать лучшего.

Вы можете использовать пример скрипта из http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ для запуска. Например, сценарий verify-po.py проверяет кодировки файлов, а commit-access-control.pl.in проверяет, есть ли у автора разрешения на принятие. Вероятно, вы использовали бы svnlook diff в своем скрипте (как и в последнем), чтобы получить измененные свойства для каталогов и пройти по соответствующим путям, будь то ветви или теги, используя регулярное выражение.

Обновление

Найдено принудительное выполнение сценарий перехвата предварительной фиксации , который, кажется, вам нужен.

Что этот скрипт делает, он использует svnlook, чтобы заглянуть в сделку это прогресс. Как просеивается через транзакция, она вызывает набор крючки, которые позволяют хранилище администратор, чтобы изучить, что происходит и решить, является ли это приемлемый.

Он содержит несколько методов и verify_property_line_added () среди них, поскольку вызывается для каждой строки, добавляемой к свойству в файле .

1 голос
/ 14 февраля 2016

Если вы можете CPAN на сервере:

https://github.com/gnustavo/SVN-Hooks/blob/master/examples/check-mergeinfo.pl

Если нет (на основе http://comments.gmane.org/gmane.comp.version-control.subversion.user/118969):

REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook

if !($SVNLOOK log -t "$TXN" "$REPOS" | grep -q '\[override] ';) then

    # Get list of paths which have changed      
    TXN_PATHS=$($SVNLOOK changed -t "$TXN" "$REPOS")

    # Filter those which are allowed: /trunk, /branches/*,...
    TXN_PATHS=$(echo "$TXN_PATHS" | grep -Ev "^....(trunk/|branches/[^/]+/)$")

    # Iterate over all paths, which are not allowed to have mergeinfo
    while IFS= read -r TXN_PATH; do
      ELEM_PATH=$(echo "$TXN_PATH" | cut -c 5-)

      MERGEINFO=$($SVNLOOK propget "$REPOS" svn:mergeinfo -t "$TXN" "$ELEM_PATH" 2>/dev/null)
      if [ ! "$MERGEINFO" = "" ]; then 
        echo "  Cannot merge into directory that is not trunk or a branch:" >&2;
        echo "  $ELEM_PATH" >&2;
        echo "  Override by using [override]." >&2;
        exit 1;
      fi      
    done <<< "$TXN_PATHS"

    # echo "Merge info check: OK"
fi
...