#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