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

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

21
задан hichris123 12 April 2015 в 15:30
поделиться

16 ответов

svn info <Repository-URL>

или

svn info --xml <Repository-URL>

Тогда смотрят на результат. Для xml, синтаксический анализ/info/entry / пересмотр для пересмотра репозитория (151 в этом примере) или/info/entry/commit / пересмотр для пересмотра последней фиксации против этого пути (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 информация и затем обработка способ пойти.

14
ответ дан Michael Stum 29 November 2019 в 06:08
поделиться

Вы хотите Подрывную деятельность информация подкоманда, следующим образом:

$ 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 в репозиторий.

А фрагмент C# для извлечения этого в соответствии с 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;
        }
    }
}

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

0
ответ дан Craig Trader 29 November 2019 в 06:08
поделиться

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

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

На основе моего опыта, svn информация не дает надежные числа после переименования каталогов.

1
ответ дан Omer Zak 29 November 2019 в 06:08
поделиться

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

1
ответ дан coppro 29 November 2019 в 06:08
поделиться

Используя 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
ответ дан Bert Huijben 29 November 2019 в 06:08
поделиться

Вы не говорите, какой язык программирования / платформа Вы используете. Вот то, как сделать это в 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
5
ответ дан Chris Conway 29 November 2019 в 06:08
поделиться

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

, Создают названный файл:

RevisionInfo.tmpl

SvnRevision = $WCREV$;

Тогда выполняют эту команду:

SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt

Это создаст файл ReivisonInfo.txt с Вашим числом пересмотра следующим образом:

SvnRevision = 5000;

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

7
ответ дан Brian R. Bondy 29 November 2019 в 06:08
поделиться

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

svn:keywords Revision

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

private const string REVISION = "$Revision$";

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

12
ответ дан Bob Nadler 29 November 2019 в 06:08
поделиться

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

$ svnversion
662:738M

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

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

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

19
ответ дан bahrep 29 November 2019 в 06:08
поделиться

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

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

$ svnversion
3846

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

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

Со смешанным пересмотром, измененным деревом:

$ (cd doc; svn up >/dev/null 2>/dev/null)
$ svnversion
3846:4182M
31
ответ дан Charles Duffy 29 November 2019 в 06:08
поделиться

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

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

связанные с версией разделы моего сценария сборки похожи на это:

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

3
ответ дан Ryan Taylor 29 November 2019 в 06:08
поделиться

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

SVN_VERSION  = IO.popen("svn info").readlines[4].strip.split[1]
2
ответ дан 29 November 2019 в 06:08
поделиться

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

Откройте файл build.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 .

3
ответ дан 29 November 2019 в 06:08
поделиться

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

Вот полная запись в блоге с инструкциями .

0
ответ дан 29 November 2019 в 06:08
поделиться

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

0
ответ дан 29 November 2019 в 06:08
поделиться

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

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

0
ответ дан 29 November 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: