Ненормальное программирование / Автоматическое добавление keywords к файлам в TortoiseSVN под Windows

в 16:03, , рубрики: bat, svn, tortoisesvn, метки: , ,

В 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), который в том числе умеет добавлять изменения в репозиторий.


  1. svnbook.red-bean.com/en/1.5/svn.advanced.props.special.keywords.html
  2. tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-propertypage.html#id597790
  3. tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-settings.html#tsvn-dug-settings-hooks
  4. tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html

Автор: mihasic


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js