Подтвердить что ты не робот

Как получить доступ к текущему номеру сборки Subversion?

Как вы можете автоматически импортировать последний номер сборки/ревизии в subversion?

Цель состоит в том, чтобы это число было видимым на нижнем колонтитуле веб-страницы, например SO.

4b9b3361

Ответ 1

svn info <Repository-URL>

или

svn info --xml <Repository-URL>

Затем посмотрим на результат. Для xml, parse/info/entry/@revision для пересмотра репозитория (151 в этом примере) или /info/entry/commit/ @revision для пересмотра последнего фиксации по этому пути (133, полезно при работе с теги):

<?xml version="1.0"?>
<info>
<entry
   kind="dir"
   path="cmdtools"
   revision="151">
<url>http://myserver/svn/stumde/cmdtools</url>
<repository>
<root>http://myserver/svn/stumde</root>
<uuid>a148ce7d-da11-c240-b47f-6810ff02934c</uuid>
</repository>
<commit
   revision="133">
<author>mstum</author>
<date>2008-07-12T17:09:08.315246Z</date>
</commit>
</entry>
</info>

Я написал инструмент (cmdnetsvnrev, включая исходный код) для себя, который заменяет версию в моих файлах AssemblyInfo.cs. Однако он ограничен этой целью, но, как правило, svn-информация, а затем обработка - это путь.

Ответ 2

Попросите свой процесс сборки svnversion и вставлять свой вывод в сгенерированные {source | binaries}. Это не только даст текущую ревизию (как и многие другие примеры здесь), но и ее выходная строка также скажет, выполняется ли сборка в смешанном дереве или дереве, которое точно не соответствует указанному номеру ревизии (т.е. дерево с локальными изменениями).

Со стандартным деревом:

$ svnversion
3846

С измененным деревом:

$ echo 'foo' >> project-ext.dtd
$ svnversion                   
3846M

С измененным деревом:

$ (cd doc; svn up >/dev/null 2>/dev/null)
$ svnversion
3846:4182M

Ответ 3

Команда svnversion - это правильный способ сделать это. Он выводит номер ревизии, на котором работает ваша рабочая копия, или диапазон изменений, если ваша рабочая копия смешана (например, некоторые каталоги обновлены, а некоторые нет). Он также укажет, имеют ли рабочие копии локальные изменения. Например, в довольно нечистом рабочем каталоге:

$ svnversion
662:738M

Ключевое слово $Revision $не делает то, что вы хотите: оно изменяется только тогда, когда файл содержит. Книга Subversion дает более подробно. Команда "svn info" также не делает то, что вы хотите, поскольку она сообщает только состояние вашего текущего каталога, игнорируя состояние любых подкаталогов. В том же рабочем дереве, что и в предыдущем примере, у меня было несколько подкаталогов, которые были более новыми, чем каталог, в котором я был, но "svn info" не замечает:

$ svn info
... snip ...
Revision: 662

Легко включить svnversion в ваш процесс сборки, так что каждая сборка получает номер версии в некоторой доступной для выполнения форме. Например, для проекта Java у меня был makefile dump вывод svnversion в файл .properties.

Ответ 4

Добавьте svn: keywords в свойства SVN исходного файла:

svn:keywords Revision

Затем в исходном файле укажите:

private const string REVISION = "$Revision$";

Обновление будет обновляться с номером ревизии при следующем фиксации (например,) "$Revision: 4455$". Вы можете проанализировать эту строку, чтобы извлечь только номер версии.

Ответ 5

Если у вас есть черепаха SVN, вы можете использовать SubWCRev.exe

Создайте файл с именем:

RevisionInfo.tmpl

SvnRevision = $WCREV$;

Затем выполните следующую команду:

SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt

Он создаст файл ReivisonInfo.txt с номером вашей редакции следующим образом:

SvnRevision = 5000;

Но вместо использования .txt вы можете использовать любой исходный файл, который хотите, и иметь доступ к номеру reivsion в вашем исходном коде.

Ответ 6

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

import pysvn
repo = REPOSITORY_LOCATION
rev = pysvn.Revision( pysvn.opt_revision_kind.head )
client = pysvn.Client()
info = client.info2(repo,revision=rev,recurse=False)
revno = info[0][1].rev.number # revision number as an integer

Ответ 7

Используя С# и SharpSvn (из http://sharpsvn.net), код будет выглядеть следующим образом:

//using SharpSvn;
long revision = -1;
using(SvnClient client = new SvnClient())
{
  client.Info(path,
    delegate(object sender, SvnInfoEventArgs e)
    {
       revision = e.Revision;
    });
}

Ответ 8

В моем последнем проекте я решил эту проблему, используя несколько инструментов: SVN, NAnt и пользовательскую задачу NAnt.

  • Используйте NAnt для выполнения svn info --xml ./svnInfo.xml
  • Используйте NAnt для вывода номера версии из xml файла с помощью <xmlpeek>
  • Используйте специальную задачу NAnt для обновления атрибута AssemblyVersion в файле AssemblyInfo.cs с последним номером версии (например, major.minor.maintenance, revision) перед компиляцией проекта.

Разделы, связанные с версией моей сборки script, выглядят следующим образом:

<!-- Retrieve the current revision number for the working directory -->
<exec program="svn" commandline='info --xml' output="./svnInfo.xml" failonerror="false"/>
<xmlpeek file="./svnInfo.xml" xpath="info/entry/@revision" property="build.version.revision" if="${file::exists('./svnInfo.xml')}"/>

<!-- Custom NAnt task to replace strings matching a pattern with a specific value -->
<replace file="${filename}" 
         pattern="AssemblyVersion(?:Attribute)?\(\s*?\&quot;(?&lt;version&gt;(?&lt;major&gt;[0-9]+)\.(?&lt;minor&gt;[0-9]+)\.(?&lt;build&gt;[0-9]+)\.(?&lt;revision&gt;[0-9]+))\&quot;\s*?\)" 
         value="AssemblyVersion(${build.version})"
         outfile="${filename}"/>

Кредит для регулярного выражения относится к: http://code.mattgriffith.net/UpdateVersion/. Тем не менее, я обнаружил, что UpdateVersion не отвечал моим потребностям, поскольку функция вывода была сломана в сборке, которую я имел. Следовательно, пользовательская задача NAnt.

Если кто-то интересуется кодом, для пользовательской задачи NAnt replace сообщите мне. Поскольку это было связано с проектом, связанным с работой, мне нужно будет проверить с руководством, можно ли его выпустить по дружественной (бесплатной) лицензии.

Ответ 9

Вот подсказка, как вы можете использовать возможности Netbeans "для
создайте пользовательские ant задачи, которые будут генерировать scm-version.txt:

Откройте файл build.xml и добавьте следующий код справа после
<import file="nbproject/build-impl.xml"/>

<!-- STORE SUBVERSION BUILD STRING -->
<target name="-pre-compile">
  <exec executable="svnversion"
    output="${src.dir}/YOUR/PACKAGE/NAME/scm-version.txt"/>
</target>

Теперь Netbeans берет строку версии Subversion до scm-version.txt каждый раз, когда вы делаете clean/build.

Вы можете прочитать файл во время выполнения, выполнив:

getClass().getResourceAsStream("scm-version.txt"); // ...

Не забудьте пометить файл scm-version.txt как svn: ignore.

Ответ 10

В Rails я использую этот фрагмент в моей среде .rb, который дает мне константу, которую я могу использовать во всем приложении (например, в нижнем колонтитуле макета приложения).

SVN_VERSION  = IO.popen("svn info").readlines[4].strip.split[1]

Ответ 11

Ну, вы можете запустить 'svn info', чтобы определить текущий номер версии, и вы могли бы, вероятно, извлечь это довольно легко с помощью регулярного выражения, например "Редакция: ([0-9] +)".

Ответ 12

Если вы работаете под GNU/Linux, cd в каталог рабочей копии и запускаете:

svn -u status | grep Status\ against\ revision: | awk '{print $4}'

Из моего опыта, svn-информация не дает надежных номеров после переименования каталогов.

Ответ 13

Вам нужна подкоманда Subversion info, как показано ниже:

$ svn info .
Path: .
URL: http://trac-hacks.org/svn/tracdeveloperplugin/trunk
Repository Root: http://trac-hacks.org/svn
Repository UUID: 7322e99d-02ea-0310-aa39-e9a107903beb
Revision: 4190
Node Kind: directory
Schedule: normal
Last Changed Author: coderanger
Last Changed Rev: 3397
Last Changed Date: 2008-03-19 00:49:02 -0400 (Wed, 19 Mar 2008)

В этом случае есть два номера редакции: 4190 и 3397. 4190 - последний номер версии для репозитория, а 3397 - номер версии последнего изменения поддерева, из которого было извлечено это рабочее пространство. Вы можете указать путь к рабочей области или URL-адрес в репозиторий.

Фрагмент С# для извлечения этого под Windows выглядит примерно так:

Process process = new Process();
process.StartInfo.FileName = @"svn.exe";
process.StartInfo.Arguments = String.Format(@"info {0}", path);
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();

// Parse the svn info output for something like "Last Changed Rev: 1234"
using (StreamReader output = process.StandardOutput)
{
    Regex LCR = new Regex(@"Last Changed Rev: (\d+)");

    string line;
    while ((line = output.ReadLine()) != null)
    {
        Match match = LCR.Match(line);
        if (match.Success)
        {
            revision = match.Groups[1].Value;
        }
    }
}

(В моем случае мы используем ревизию Subversion как часть номера версии для сборок.)

Ответ 14

Я использую проект Проект MSBuild Community Tasks, в котором есть инструмент для извлечения номера версии SVN и добавления его в AssemblyInfo.vb. Затем вы можете использовать отражение для извлечения этой строки, чтобы отобразить ее в пользовательском интерфейсе.

Здесь полное сообщение в блоге с инструкциями.

Ответ 15

Если вы используете svnant, вы можете использовать wcVersion, который дублирует svnveresion и возвращает удобоваримые значения. видеть: http://subclipse.tigris.org/svnant/svn.html#wcVersion

Ответ 16

Я создал плагин версии SVN для Build Version Increment на CodePlex. Этот подключаемый модуль SVN вытащит последний номер версии изменения из вашей рабочей копии и позволит вам использовать его в своем номере версии, который должен выполнить именно то, что вы пытаетесь сделать. Build Version Increment довольно гибкая и позволит вам настроить, как выполняется управление версиями несколькими способами.

BVI работает только с Visual Studio, но поскольку вы используете Asp.Net, это не будет проблемой. Это не требует написания кода или редактирования xml, поэтому yay!