Автоматически добавлять svn:needs-lock

Привет, мне было интересно, есть ли способ для сервера SVN автоматически назначать свойство svn:needs-lock для любого файла, который является двоичным, а не текстовым.

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

5 ответов

Решение

Отредактируйте конфигурационный файл SVN и добавьте запись для автоматического реквизита или используйте svn:auto-props версионное свойство с SVN 1.8 и более новыми клиентами. Читайте SVNBook!

РЕДАКТИРОВАТЬ:

Из SVN 1.8 вы можете применить svn:auto-props свойство к корневому пути вашего хранилища. См. Эту заметку о выпуске и обновленную главу SVNBook 1.8.

В Apache Subversion 1.8 была представлена функция конфигурации с репозиторием, для которой требуется клиент SVN 1.8, но сервер 1.8 не нужен, потому что это функция на стороне клиента.

С Subversion 1.8 вы можете настраивать шаблоны автоматического проппинга в репозитории, используя новую Subversion svn:auto-props наследственное имущество

Например, установить svn:auto-props значение для *.exe = svn:needs-lock=* свойство в корне вашего репозитория (или путь к репозиторию, который представляет корень проекта). Это приведет к тому, что каждый добавленный файл *.exe будет иметь svn:needs-lock=* собственность применяется.

Вы можете хранить многострочные значения в свойствах Subversion, поэтому вы можете добавить следующие стандартные svn:needs-lock и MIME pattern в svn:auto-props:

*.bmp = svn:mime-type=image/bmp;svn:needs-lock=*
*.gif = svn:mime-type=image/gif;svn:needs-lock=*
*.ico = svn:mime-type=image/x-icon;svn:needs-lock=*
*.jpeg = svn:mime-type=image/jpeg;svn:needs-lock=*
*.jpg = svn:mime-type=image/jpeg;svn:needs-lock=*
*.png = svn:mime-type=image/png;svn:needs-lock=*
*.tif = svn:mime-type=image/tiff;svn:needs-lock=*
*.tiff = svn:mime-type=image/tiff;svn:needs-lock=*    
*.doc = svn:mime-type=application/x-msword;svn:needs-lock=*
*.docx = svn:mime-type=application/x-msword;svn:needs-lock=*
*.jar = svn:mime-type=application/octet-stream;svn:needs-lock=*
*.odc = svn:mime-type=application/vnd.oasis.opendocument.chart;svn:needs-lock=*
*.odf = svn:mime-type=application/vnd.oasis.opendocument.formula;svn:needs-lock=*
*.odg = svn:mime-type=application/vnd.oasis.opendocument.graphics;svn:needs-lock=*
*.odi = svn:mime-type=application/vnd.oasis.opendocument.image;svn:needs-lock=*
*.odp = svn:mime-type=application/vnd.oasis.opendocument.presentation;svn:needs-lock=*
*.ods = svn:mime-type=application/vnd.oasis.opendocument.spreadsheet;svn:needs-lock=*
*.odt = svn:mime-type=application/vnd.oasis.opendocument.text;svn:needs-lock=*
*.pdf = svn:mime-type=application/pdf;svn:needs-lock=*
*.ppt = svn:mime-type=application/vnd.ms-powerpoint;svn:needs-lock=*
*.ser = svn:mime-type=application/octet-stream;svn:needs-lock=*
*.swf = svn:mime-type=application/x-shockwave-flash;svn:needs-lock=*
*.vsd = svn:mime-type=application/x-visio;svn:needs-lock=*
*.xls = svn:mime-type=application/vnd.ms-excel;svn:needs-lock=*
*.zip = svn:mime-type=application/zip;svn:needs-lock=*

Следует отметить, что метод auto props должен быть настроен на каждом используемом клиенте SVN. Поэтому, когда вы настраиваете нового разработчика или уже существующего разработчика на новом компьютере, вы должны помнить о необходимости выполнить эту настройку.

Если вы все используете TortoiseSVN, вы можете установить свойство tsvn:autoprops в базовой папке каждой проверки, и оно будет учитываться всеми клиентами TortoiseSVN.

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

Если у вас есть Python-fu, RepoGuard (преемник SVNChecker) выглядит так, как будто он тоже может быть полезен.

Я думаю, что независимо от того, что вы выберете, нет никакого способа применить свойство задним числом к ​​существующим файлам в хранилище. Однако вы, вероятно, сможете применить его к следующему коммиту файла.

Используйте хук перед фиксацией

#!/bin/bash

REPOS="$1"
TXN="$2"

SVNLOOK=/usr/bin/svnlook
ICONV=/usr/bin/iconv

SVNLOOKOK=1

# Check files for svn:needs-lock property
# Exit on all errors.
set -e

echo "`$SVNLOOK changed -t "$TXN" "$REPOS"`" | while read REPOS_PATH
do
 if [[ $REPOS_PATH =~ (A|M|U)[[:blank:]]{3}(.*)\.(.*) ]]
 then
  if [ ${#BASH_REMATCH[*]} -ge 2 ]
    then
  FILENAME=${BASH_REMATCH[2]}.${BASH_REMATCH[3]};

  # Make sure every file has the svn:needs-lock property set
   if [ "" == "`$SVNLOOK propget -t \"$TXN\" \"$REPOS\" svn:needs-lock \"$FILENAME\" 2> /dev/null`" ]
    then
    ERROR=1;
    echo "" >&2
    echo "svn:needs-lock property has to be set on \"$FILENAME\"" >&2
    echo "" >&2
   fi
  fi
 fi
 test -z $ERROR || (exit 1)
done

# All checks passed, so allow the commit.
exit 0

и крюк предварительной блокировки

#!/bin/bash

REPOS="$1"
PATH="$2"
USER="$3"

# If a lock exists and is owned by a different person, don't allow it
# to be stolen (e.g., with 'svn lock --force ...').

# (Maybe this script could send email to the lock owner?)
SVNLOOK=/usr/bin/svnlook
GREP=/bin/grep
SED=/bin/sed

LOCK_OWNER=`$SVNLOOK lock "$REPOS" "$PATH" | \
            $GREP '^Owner: ' | $SED 's/Owner: //'`

# If we get no result from svnlook, there's no lock, allow the lock to
# happen:
if [ "$LOCK_OWNER" = "" ]; then
  exit 0
fi

# If the person locking matches the lock's owner, allow the lock to
# happen:
if [ "$LOCK_OWNER" = "$USER" ]; then
  exit 0
fi

В этой вики Subversion есть страница, на которой описаны различные опции, как автоматически добавлять нужную блокировку и как ее установить. На странице также приведены примеры сценариев и сведения о конфигурации:

http://www.orcaware.com/svn/wiki/Automatic_lock-modify-unlock

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