Принудительно использовать svn: eol-style=native на сервере?

#svn #line-endings #eol

#svn #окончания строк #eol

Вопрос:

В настоящее время, чтобы убедиться, что для свойства subversion eol-style установлено значение native для каждого нового файла, добавляемого в наш проект, мы должны добавить это в ~/.subversion/config файл на каждом из наших компьютеров разработчиков:

 [miscellany]
enable-auto-props = yes

[auto-props]
*.java = svn:eol-style=native
  

Есть ли способ сделать аналогичный на сервере svn?

Ответ №1:

Нет, этого не происходит.

Вы можете использовать скрипты-перехватчики для поиска свойства, которое должно быть установлено или нет, но в остальном это невозможно. Subversion, в отличие от CVS, не может изменить содержимое кода, поступающего из коммита.

В книге SVN есть примечание по этому вопросу:

Предупреждение

Не пытайтесь изменить транзакцию с помощью скриптов перехвата. Распространенным примером этого может быть автоматическая установка таких свойств, как svn:eol-style или svn:mime-type во время фиксации. Хотя это может показаться хорошей идеей, это вызывает проблемы. Основная проблема заключается в том, что клиент не знает об изменении, внесенном скриптом перехвата, и нет способа сообщить клиенту, что он устарел. Это несоответствие может привести к неожиданному поведению.

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

Комментарии:

1. Интересно. Спасибо за ссылку. Похоже, что это правильный путь: «Вместо того, чтобы пытаться изменить транзакцию, гораздо лучше проверить транзакцию в перехватчике предварительной фиксации и отклонить фиксацию, если она не соответствует желаемым требованиям».

2. Почему это устарело?

Ответ №2:

Просто потому, что ответ Фаусто теперь устарел после выпуска Subversion 1.8


В случае Subversion 1.8 или более поздней версии вы можете использовать на уровне репозитория (не глобально для всех репозиториев на сервере) конфигурацию, диктуемую репозиторием (см. Также Тему в блоге Collab), а именно — svn: auto-props в корне trunk каждого репозитория

Комментарии:

1. Не могли бы вы, пожалуйста, указать мне, как настроить конфигурацию, продиктованную репозиторием? Эти ссылки показывают только, как это прочитать, и, похоже, я тоже ничего не могу получить от Google.

2. Что ж, я нашел способ через браузер репозитория TortoiseSVN, но консольный способ тоже интересен.

3. Этот ответ полезен, но нуждается в уточнении. Эта операция ищет эквивалент auto-props, но принудительный на сервере. В этом ответе указывается на новую и полезную функцию клиентского хранилища в репозитории SVN 1.8 с svn:auto-props наследуемыми свойствами, но важно отметить, что 1) это функция на стороне клиента — более старый клиент SVN, например 1.7, вообще не будет ее использовать, и реквизиты не будут применены, и 2) даже клиент SVN 1.8 может svn add --no-auto-props , и опять же, ничего не применяется. В общем, вам нужен хук.

Ответ №3:

Я не смог найти пример того, как напрямую проверить наличие свойства svn: eol-style для исходного кода в скрипте предварительной фиксации. Наиболее близким является check-mime-type.pl который использует свойства типа mime для определения, является ли файл текстовым файлом.

Следующий скрипт, вставленный в файл сценария предварительной фиксации, проверит, что все файлы .cpp /.h, добавленные в фиксацию, имеют установленное свойство svn:eol-style. (Его можно легко расширить, чтобы проверить дополнительные расширения файлов). Также будут предоставлены сообщения, указывающие, в каких файлах отсутствует свойство svn: eol-style.

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

# Get new cpp/h files
ADDFILES=$(${SVNLOOK} changed "$REPOS" -t "$TXN" | sed -n -e '/^A.*(.cpp|.h)$/s/^A *//p')
#echo "ADDFILES=$ADDFILES" >amp;2

# Check files for svn:eol-style property
ESMISSING=''
for f in ${ADDFILES}
do
  if [[ "$(${SVNLOOK} pl ${REPOS} -t ${TXN} ${f})" != *svn:eol-style* ]]
  then
    # output to stderr to include message in svn commit ouput
    echo "No svn:eol-style property set on file $f" >amp;2
    ESMISSING=1
  fi
done

if [[ -n "$ESMISSING" ]]
then
  exit 1
fi