Как получить доступ к текущему номеру сборки Subversion? - PullRequest
21 голосов
/ 21 сентября 2008

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

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

Ответы [ 16 ]

31 голосов
/ 21 сентября 2008

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

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

$ svnversion
3846

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

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

С измененной версией смешанного дерева:

$ (cd doc; svn up >/dev/null 2>/dev/null)
$ svnversion
3846:4182M
19 голосов
/ 22 сентября 2008

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

$ svnversion
662:738M

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

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

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

14 голосов
/ 21 сентября 2008
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 , включая исходный код), который заменяет Revision в моих файлах AssemblyInfo.cs. Хотя это ограничено этой целью, но обычно svn info и последующая обработка - это путь.

12 голосов
/ 21 сентября 2008

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

svn:keywords Revision

Тогда в исходный файл включите:

private const string REVISION = "$Revision$";

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

7 голосов
/ 21 сентября 2008

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

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

RevisionInfo.tmpl

SvnRevision = $WCREV$;

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

SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt

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

SvnRevision = 5000;

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

5 голосов
/ 21 сентября 2008

Используя c # и 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;
    });
}
5 голосов
/ 21 сентября 2008

Вы не говорите, какой язык программирования / рамки вы используете. Вот как это сделать в 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
3 голосов
/ 20 июня 2009

Вот подсказка, как вы можете использовать Netbeans 'возможности для
создать пользовательских задач муравья , которые будут генерировать 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: игнорировать .

3 голосов
/ 21 сентября 2008

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

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

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

<!-- 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 дайте мне знать. Поскольку это был проект, связанный с работой, мне нужно будет проконсультироваться с руководством, чтобы узнать, сможем ли мы выпустить его по дружественной (бесплатной) лицензии.

2 голосов
/ 15 апреля 2009

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

SVN_VERSION  = IO.popen("svn info").readlines[4].strip.split[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...