Archive for April, 2008

SVN auto-props, что это такое и как его готовить.

Thursday, April 10th, 2008

Благодарности: Росту за то, что подтолкнул к написанию данной статьи. Олегу Галабурде – за своевременно поставленные вопросы.

Недавно возник интересный вопрос, как настроить автозамену специальных слов в SVN при коммитах и апдейтах. Поскольку обсуждение вопроса затянулось на 2 часа, решил написать подробную инструкцию, что и как. Однако, поскольку все специальные свойства представляют большой интерес, и могут принести большую пользу при их правильном использовании, то этой статье мы рассмотрим все специальные свойства, а не только свойства авто замены.

Итак, что же такое специальные свойства SVN? Это набор свойств, которые позволяют SVN клиенту определить логику обработки файлов при операциях commit, update и export. Скажите “непонятно” и будете правы, итак приступим к разбору пряников …

Допустим вы Perl программист, и вам необходимо, чтобы в разделе tags всегда лежал бинарный билд программы, который при экспорте или апдейте его на рабочий сервер, был исполнимым (в терминах Linux например имел права на запуск). Как это сделать? есть 2 варианта:

  1. Экспортировать версию и нужным файлам выдать права на запуск. Хорошо? Хорошо, но не красиво.
  2. Сказать SVN клиенту, что файл который извлекается, должен быть исполнимым. Вот это уже по-нашему. Итак, что нам нужно сделать? Да ничего особенного, необходимо просто установить свойство svn:executable. Теперь при commit, export, update svn клиент будет автоматически устанавливать флаги исполнимого файла для этого скрипта.

Возникает вопрос, а как правильно установить свойства для файла и можно ли это автоматизировать?
Для того, чтобы установить свойство для файла/папки в svn есть специальная комманда propset. В терминологии клиента коммандной строки установить свойство можно так:

/usr/bin/svn propset svn:executable 1 /you/file/name.pl

В subclipe просто кликните правой клавишей мыши на выбранном файле, войдите в пункт Team, и выберите пункт “Set Property…”, в появившемся окошке вводите имя свойства и его значение. Все …

Теперь к вопросу о автоматизации. Ответ – да, можно. Предположим, вы хотите для всех файлов с расширением .pl установить флаг исполнимости по умолчанию. Нет ничего проще.

1. Открываем конфигурационный файл SVN (в Win32 он находится %USERPROFILE%\Application Data\Subversion\config, в *nix – ${Home}/.subversion/config). В этом файлы, в разделе [miscellany] расскомментируем строчку:

[miscellany]
enable-auto-props = yes

Параметр enable-auto-props указывает SVN клиенту, разрешено ли ему применять свойства для добавляемых в репозиторий файлов.

2. После этого добавьте раздел [auto-props] и определите список типов файлов и автоматически применяемых к ним свойств
Например:

[auto-props]
*.xml = svn:mime-type=text/xml;svn:eol-style=native
*.as = svn:keywords=LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Date Revision Author # добавляем автозамену специальных шаблонов SVN на текущие значения этих свойств в репозитории.

# Linux scripts
*.sh = svn:eol-style=native;svn:executable;svn:mime-type=text/plain
*.m4 = svn:eol-style=native;svn:executable;svn:mime-type=text/plain
*.awk = svn:eol-style=native;svn:executable;svn:mime-type=text/plain
*.pl = svn:executable;svn:eol-style=native;svn:mime-type=text/plain

Все, теперь все новые файлы *.as будут иметь набор автозаменяющихся клачевых слов, а все скрипты Perl будут исполнимыми.

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

Итак с установкой свойств понятно, вернемся к нашим баранам. Приведем список специальных свойств, которые предлагает SVN.

1. svn:executable – используется для контроля прав файла на запуск в операционной системе.
2. svn:mime-type – в основном нужен, чтобы сказать SVN, текстовый это или бинарный ресурс.
3. svn:ignore – содержит набор шаблонов файлов, который будут игнорированы SVN при коммитах и апдейтах.
4. svn:keywords. Собственно то, из-за чего весь сыр-бор. Периодически, осматривая код идеологически подкованных товарищей можно встретить в комментариях информацию следующего вида:

@version  $Id: channelintegration.bs.class.php 1217 2008-04-08 13:32:19Z eugene $

информация полезная, но возникает вопрос, как заставить SVN вставлять ее в код и обновлять при изменении этого кода?

Ответ: просто, необходимо настроить параметр svn:keywords для файла и использовать теги ключевых слов в коде.
Всего SVN предоставляет 5 различных ключевых слов (и еще 5-6 алиасов на них), которые несут в себе основную информацию о версии текущего файла. Рассмотрим их:

- Date (алиас LastChangedDate), – описывает дату последнего изменения файла в репозитории, пример: $Date: 2008-04-10 10:41:51 +0300 (Thu, 10 Apr 2008) $
- Revision (алиасы Rev, LastChangedRevision), – отображает ревизию последнего изменения файла в репозитории, пример: @revision   SVN: $Revision: 1233 $
- Author (алиас LastChangedBy), – отображает автора последних изменений в репозитории, пример: @changedby  $Author: eugene $
- HeadURL (алиас URL), – отображает URL на последнюю версию файла в репозитории, пример: @link       $HeadURL: http://www.droopstreet.com/svn/WorldTV.com/trunk/Sources.PHP/svn-test/new-svn-test.php $
- Id – предоставляет комбинированную информацию из предыдущих ключевых слов, пример: @version    SVN: $Id: new-svn-test.php 1233 2008-04-10 07:41:51Z eugene $

  • Ключевые слова вставляются в код следующим образом: $keyword$.
  • Все ключевые слова являются регистрозависимыми, то есть если вы объявили $author$ – такое ключевое слово парсится не будет.
  • И самое главное, в код будут вставляться только те ключевые слова, которые определены в свойстве svn:keywords для этого файла, если вы установили это свойство в значение: “Id Date”, то ключевые слова $Author$, “HeadUrl” и т. д. будут проигнорированы.

Пример добавления ключевых слов:

/**
* Some File Description ...
*
* PHP version 5
* @category   Business Logic Classes
* @author     Eugene A. Kalosha <ekalosha@gmail.com>
* @changedby  $Author$
* @version    SVN: $Id$
* @revision   SVN: $Revision$
* @link       $HeadURL$
* @date       $Date$
* @copyright  (c) 2004-2008 by Eugene A. Kalosha
* @license    http://www.php.net/license/3_0.txt  PHP License 3.0
* @see        DLCommom
* @since      File available since Release 1.0
*/

После коммита получается следующий результат:

/**
* Some File Description ...
*
* PHP version 5
* @category   Business Logic Classes
* @author     Eugene A. Kalosha <ekalosha@gmail.com>
* @changedby  $Author: eugene $
* @version    SVN: $Id: new-svn-test.php 1233 2008-04-10 07:41:51Z eugene $
* @revision   SVN: $Revision: 1233 $
* @link       $HeadURL: http://www.droopstreet.com/svn/WorldTV.com/trunk/Sources.PHP/svn-test/new-svn-test.php $
* @date       $Date: 2008-04-10 10:41:51 +0300 (Thu, 10 Apr 2008) $
* @copyright  (c) 2004-2008 by Eugene A. Kalosha
* @license    http://www.php.net/license/3_0.txt  PHP License 3.0
* @see        DLCommom
* @since      File available since Release 1.0
*/

Спасибо за внимание, вопросы приветствуются.