В Subversion существует функциональность автоматической подстановки встроенных ключевых слов. Данная возможность позволяет добавить в файл, например, такую информацию как последний пользователь редактировавший файл, ревизию и дату модификации.
В данный момент эта функциональность сильно ограничена, но тем не менее может быть весьма полезной. Одно из основных ограничений – необходимость добавлять обработку ключевых слов для каждого нового файла. Это же относится к переименованным и перемещенным файлам (SVN обрабатывает их как новые).
Подставляемые ключевые слова[1]
Согласно руководству, существуют следующие автоподстановки:
Date |
последняя дата модификации. $Date$ заменяыется на что-то вроде
$Date: 2006-07-22 21:42:37 -0700 (Sat, 22 Jul 2006) $ |
Revision |
последняя ревизия с модификацией |
Author |
автор последних изменений |
HeadURL |
путь в репозитории к последней версии файла |
Id |
комбинация предыдущей информации, получается в формате вроде:
$Id: calc.c 148 2006-07-28 21:30:43Z sally $ где calc.c – имя файла, 158 – ревизия, после дата и время, а затем автор |
В одном из текущих проектов, в которых я участвую, было решено использовать эти авто-подстановки в заголовках SQL скриптов. В частности это даст возможность версионировать файлы и просмотреть установленные версии на производственном сервере.
Изначально добавление ключевых слов, в файлы было очень простым. В TortoiseSVN 1.7 этот процесс стал еще проще чем в предыдущих[2]. После же появилась проблема – разработчики не всегда добавляли версии к новым файлам. Аналогично случилось после изменения структуры проекта, когда большинство файлов были организованы по функциональности.
Ограничения
Политики безопастности компании ограничивали доступ разработчиков к серверной части репозитория, так что возможности использовать серверные хуки не было.
У некоторых разработчиков установлен ограниченный набор ПО, расширять который без весомой аргументации они не намерены. Например, некоторые не хотят переходить с версии TSVN 1.6.
Решение
В качестве наиболее безболезненного решения было решено использовать автоматический скрипт, который будет добавлять эти слова к новым и модифицированным файлам.
Поскольку PowerShell установлен не у всех, будем использовать BAT. А для получения информации о репозитории и добавления ключевых слов – Subversion Command-line Client (например, устанавливается вместе с TSVN).
В результате получился такой скрипт:
@echo off title Update tags rem %CD% - current directory :start rem for %%i in (*.tmp) do del %%i del *.tmp > nul svn status "%CD%Sql" > svn_chg.tmp set CNT=0 :repeat set line="" for /f "eol= tokens=2 delims= " %%i in (svn_chg.tmp) do set line=%%i if "%line%"=="" goto ender if "%line%"=="""" goto ender SET /A CNT=%CNT%+1 echo %CNT%: %line% svn propset svn:keywords "Author Date Revision" "%line%">nul type svn_chg.tmp| find /v "%line%"> svn_chg1.tmp copy /Y svn_chg1.tmp svn_chg.tmp >nul goto repeat :ender del *.tmp > nul echo Press <Enter> to exit... pause
Использованный функционал:
%CD% |
текущая директория |
for %%i in (*.tmp) do del %%i |
удаление *.tmp файлов в цикле |
svn status "%CD%Sql" > svn_chg.tmp |
считывание списка модифицированных/новых файлов в директории Sql в файл svn_chg.tmp |
for /f "eol= tokens=2 delims= " %%i in (svn_chg.tmp) do set line=%%i |
получение подстроки с путем к файлу (берем последнюю строку) |
Таким образом у разработчиков появилась возможность постепенно добавить поддержку ключевых слов к своим собственным файлам.
Альтернативные решения
Данный скрипт можно использовать в клиентском хуке на Pre-Commit. Также для хука можно модифицировать данный скрипт, чтоб не было «svn status»[3].
Как расширение ключевых слов, существует SubWCRev[4]. Решение с использованием этой утилиты не было предусмотрено изначально, т.к. использование скриптов не предполагалось, хотели все “из коробки”. Возможно, позже будет миграция.
Еще есть возможность настроить свои скрипты на билд-сервере (у нас TeamCity), который в том числе умеет добавлять изменения в репозиторий.
- svnbook.red-bean.com/en/1.5/svn.advanced.props.special.keywords.html
- tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html#id597790
- tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-settings.html#tsvn-dug-settings-hooks
- tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html
Автор: mihasic