Яндекс.Метрика

    crazydev

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

    В 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