Автоматическое создание тега в Subversion - PullRequest
6 голосов
/ 12 ноября 2008

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

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

$ cvs tag TAG_NAME

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

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

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

Это, конечно, предполагает, что репозиторий svn имеет рекомендованную структуру каталогов "trunk, tags, branch". Поэтому, чтобы быть в безопасности, я, вероятно, сначала должен это проверить.

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

Ответы [ 4 ]

5 голосов
/ 05 декабря 2008

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

<!-- 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 и subversion в отношении тегов, и что версия subversion для всех практических целей эквивалентна тегу. К сожалению, это не совсем актуально; мои пользователи хотят получить символическое имя, состоящее из имени модуля и (другого) номера версии.

5 голосов
/ 13 ноября 2008

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

.../PROJECTNAME/trunk
                tags
                branches

Предположим, вы где-то в рабочей копии PROJECTNAME / branch / 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

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

5 голосов
/ 13 ноября 2008

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

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

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

2 голосов
/ 12 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...