2008-11-12 2 views
6

Я поддерживаю систему сборки в своей компании, которая в настоящее время использует CVS. Эта система сборки используется для нескольких проектов и нескольких репозиториев CVS.Автоматическое создание тега в subversion

Всякий раз, когда у нас есть релиз, мы создаем тег. В CVS, это легко:

$ cvs tag TAG_NAME 

Эта команда работает независимо от модуля CVS или хранилище, до тех пор, как она выполняется в рабочем каталоге CVS.

Чтобы сделать то же самое в subversion, хотя, похоже, мне сначала нужно проанализировать вывод svn info, чтобы получить корень репозитория. Тогда я могу создать тег:

svn cp . $REPO_ROOT/tags/TAG_NAME -m"Created tag TAG_NAME" 

Это, конечно, предполагает, что репозиторий SVN имеет рекомендованную «ствол, теги ветви» структуру каталогов. Поэтому, чтобы быть в безопасности, мне, вероятно, придется сначала проверить это.

Это похоже на работу, предназначенную для сопоставления номера версии с символическим именем. Есть ли способ лучше?

+0

Если вы добавляете --parents к вашему svn cp, каталог тегов создается, когда он не существует. – 2008-11-13 14:10:02

+0

Хм, похоже, не работает здесь с 1.4 клиентом. Какую версию svn вы используете? – 2008-11-13 14:51:22

ответ

5

Вот как я осуществил это, в случае, если кому-то интересно:

<!-- First, we need to get the svn repository root URL by parsing 
the output of 'svn info'. --> 
<exec executable="svn" failonerror="yes"> 
    <arg line="info"/> 

    <redirector outputproperty="svninfo.out" errorproperty="svninfo.err"> 
     <outputfilterchain> 
      <linecontains> 
       <contains value="Repository Root: "/> 
      </linecontains> 

      <tokenfilter> 
       <replacestring from="Repository Root: " to=""/> 
      </tokenfilter> 
     </outputfilterchain> 
    </redirector> 
</exec> 

<echo level="verbose" message="Root from svn info: ${svninfo.out}"/> 

<!-- Set the svn.root property from the svn info output, and append 
the module prefix if it exists. The module prefix allows multiple 
projects to use the same repository root. --> 
<condition property="svn.root" value="${svninfo.out}/${svn.module.prefix}"> 
    <isset property="svn.module.prefix"/> 
</condition> 
<!-- Note that the next line will have no effect if the property was 
set in the condition above, since ant properties are immutable. The 
effect is an "else", if the condition above is NOT true. --> 
<property name="svn.root" value="${svninfo.out}"/> 
<echo level="verbose" message="Root: ${svn.root}"/> 

<!-- Verify the tags directory exists. --> 
<exec executable="svn" 
     failonerror="no" 
     outputproperty="null" 
     errorproperty="svn.ls.error"> 
    <arg line="ls ${svn.root}/tags"/> 
</exec> 
<fail> 
Cannot find 'tags' subdirectory. 

${svn.ls.error} 

The subversion repository is expected to have 'trunk', 'branches', and 'tags' 
subdirectories. The tag '${tag}' will need to be manually created. 
    <condition> 
     <not> 
      <equals arg1="${svn.ls.error}" arg2="" trim="yes"/> 
     </not> 
    </condition> 
</fail> 

<!-- Finally, do the actual tag (copy in subversion). --> 
<exec executable="svn" failonerror="yes"> 
    <arg line="cp . ${svn.root}/tags/${tag} -m 'Created tag ${tag}'"/> 
</exec> 

Я также хочу отметить, что я отдаю себе отчет в различиях между CVS и подрывной деятельности в отношении мечения, и подрывной пересмотр для всех практических целей эквивалентен тегу. К сожалению, это не очень актуально; мои пользователи хотят иметь символическое имя, состоящее из имени модуля и (другого) номера версии.

2

В отличие от CVS, теги - это больше, чем просто символическое имя в подворах, вот в чем смысл. Мы создаем тег, вы на самом деле создаете ветку. Я рекомендую прочитать это, если вы еще этого не сделали: http://svnbook.red-bean.com/

5

Я использую svn из командной строки почти исключительно, и я быстро устал печатать в чужих URL-адресах. Я, наконец, написал сценарий svnurl, который я использую из оболочки. Он действует на предположении о том, что «проект» еси форму:

.../PROJECTNAME/trunk 
       tags 
       branches 

Давайте предположим, что вы где-то в рабочей копии Projectname/филиалов/Foo:

svnurl -tl # gives a list of tags for the current project 
svnurl -tlu # the same as full urls 
svnurl -t 1.1 # the url for the tag 1.1 of the current project 
# analagous functions for branches 
svnurl -ru # the url of the "root" of the current working copy 
      # eg svn://.../PROJECTNAME/branches/foo 
svnurl -T # the url of the trunk of the current project 
svnurl -pn # the name of the current project, `PROJECTNAME` 
# ... 

Использование выглядит примерно так:

$ svn cp $(svnurl -T) $(svnurl -t 1.1.1) # tag trunk as 1.1.1 

код не красиво, но это спасло меня много нажатий клавиш и полезно способами, я не ожидал. Я бы хотел поделиться им, если вы заинтересованы.

+0

Спасибо, я бы с удовольствием посмотрел. Я не буду использовать его напрямую, так как мне приходится поддерживать Windows-клиенты, но мне бы хотелось посмотреть, как это работает. – 2008-11-13 14:53:34

5

Вам не хватает основного принципа Subversion: номер версии - это тег. Когда вы «помечаете» его svn cp, вы просто делаете копию этой конкретной версии с более длинным именем. И в отличие от тега CVS, вы (или другие разработчики) могли бы продолжать текущую разработку на этом «теге». Это не статичная сущность, как тег CVS (ну, честно говоря, вы можете перемещать тег на отдельные CVS-файлы, которые эффективно «меняют» его).

Большинство пользователей svn обрабатывают теги, как их представляли CVS. И (под Apache, по крайней мере) вы можете настроить сервер DAV, чтобы не разрешать записи/проверки в любом каталоге тегов. Я не пробовал это, и это может помешать вам использовать URL-адреса http для создания тегов (вам придется использовать пути к файлам из оболочки на хостинге). Но для всех практических целей процесс выпуска должен быть больше заинтересован в конкретном номере ревизии, чем в некоторой произвольной текстовой строке. Последнее может быть изменено после выпуска; первый должен [*] всегда предоставлять вам доступ к одному и тому же набору файлов каждый раз, когда вы его проверяете.

[*] Всегда есть способ поиграть с файлами за кулисами, после факта ... Я использовал для редактирования файлов RCS и CVS с vi, когда мне нужно было исправить комментарий и т. Д.Но без какой-либо серьезной svn-ловкости данный номер версии должен быть довольно постоянным.

Смежные вопросы