Получение последнего номера ревизии в SVN?



используя PHP, Perl или Python (предпочтительно PHP), мне нужен способ запросить базу данных SVN и узнать последний номер версии, отправленный в SVN. Мне не нужно ничего кроме этого. Он должен быть неинтенсивным (поэтому я делаю это каждые 5 минут в качестве задания cron; производительность SVN не должна влиять).



SVN находится в моей интрасети, но не на моем конкретном компьютере.



У меня установлен SVN, но Нет привязок, установленных для PHP/Perl/Python. Я запускаю Windows XP, Но я предпочел бы платформенно-независимое решение, которое также может работать в Linux. Если у вас есть решение только для Linux (или только для XP), это также было бы полезно.

928   25  
svn

25 ответов:

<?php
    $url = 'your repository here';
    $output = `svn info $url`;
    echo "<pre>$output</pre>";
?>

вы можете получить вывод в XML следующим образом:

$output = `svn info $url --xml`;

Если есть ошибка, то вывод будет направлен на stderr. Чтобы захватить stderr в вашем выходе используйте таким образом:

$output = `svn info $url 2>&1`;

Если вы хотите проанализировать локальную рабочую копию, лучшим инструментом является svnversion, который поставляется с Subversion и производит выход, как 968:1000M. В документации говорится:

номер версии будет один если рабочая копия один редакции, без изменений, не включается и с URL-адресом, который соответствует Аргумент TRAIL_URL. Если рабочий копия необычна номер версии будет сложнее:

4123:4168     mixed revision working copy
4168M         modified working copy
4123S         switched working copy
4123:4168MS   mixed revision, modified, switched working copy

svn info -r HEAD

это даст вам последний номер ревизии в репозитории.

есть несколько хороших сообщений в блоге об интеграции номеров subversion в ваш скрипт сборки:

Это должно работать в bash, из рабочего каталога. Я использовал его в Windows с unixutils установлено:

svn info |grep Revision: |cut -c11-

следующее должно работать:

svnlook youngest <repo-path>

он возвращает один номер ревизии.

чтобы действительно получить последнюю версию ("head revision") номер на вашем remote respository, используйте этот:

svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"

мероприятия к примеру:

35669

примечание о получении последнего номера редакции:

скажи, что я cd - ed в пересмотренном подкаталоге (MyProjectDir). Тогда, если я позвоню svnversion:

$ svnversion .
323:340

... Я получаю"323:340", что, я думаю, означает:"у вас есть элементы здесь, начиная от ревизии 323 до 340".

тогда, если я называю svn info:

$ svn info
Path: .
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 323
Node Kind: directory
Schedule: normal
Last Changed Author: USER
Last Changed Rev: 323
Last Changed Date: 2011-11-09 18:34:34 +0000 (Wed, 09 Nov 2011)

... Я получаю"323 " как пересмотр - который на самом деле низкий пересмотр тех, о которых сообщает svnversion!

мы можем использовать svn info в рекурсивном режиме, чтобы получить дополнительную информацию из локального каталога:

> svn info -R | grep 'Path\|Revision'
Path: .
Revision: 323
Path: file1.txt
Revision: 333
Path: file2.txt
Revision: 327
Path: file3.txt
Revision: 323
Path: subdirA
Revision: 328
Path: subdirA/file1.txt
Revision: 339
Path: subdirA/file1.txt
Revision: 340
Path: file1.txt
Revision: 323
...

... (снимите grep чтобы увидеть более подробную информацию).

наконец, что делать, когда мы хотим проверить, что последняя редакция онлайн хранилище (в данном случае, @ server.com)? Тогда мы снова выдадим svn info, но с -r HEAD (Примечание разница между капиталом -R опция ранее, и в нижнем регистре -r сейчас):

> svn info -r 'HEAD'
[email protected]'s password:
Path: MyProjectDir
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 340
Node Kind: directory
Last Changed Author: USER
Last Changed Rev: 340
Last Changed Date: 2011-11-11 01:53:50 +0000 (Fri, 11 Nov 2011)

самое интересное - svn info по-прежнему ссылается на текущий подкаталог (MyProjectDir), однако онлайн путь отображается как MyProjectDir (вместо . для локального случая) - и сообщается о онлайн-версии высокий (340 - в отличие от младшей, 323 сообщил локально).

  • начиная с Subversion 1.9 вы можете использовать опцию --show-item чтобы получить значение одного из полей команды. Эта команда отобразит только номер версии:

    svn info --show-item=revision <URL-to-repository>
    
  • получить XMLed вывод информации svn с помощью --xml опция и использовать PowerShell, чтобы получить номер редакции. Вот простой пример:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • сервер с помощью клиента VisualSVN 3.4 или более поздней версии, вы можете получить количество изменения в репозитории, выполнив следующие команды:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    посмотреть Get-SvnRepository ссылка на командлет PowerShell для получения дополнительной информации.

Я думаю, что вы ищете

svn info -r HEAD

можете ли вы выполнить эту команду?

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

кто-то еще избил меня, чтобы опубликовать ответ о svnversion, что, безусловно, лучшее решение, если у вас есть рабочая копия (IIRC, он не работает с URL-адресами). Я добавлю это: если вы находитесь на сервере хостинга SVN, лучший способ-использовать

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354

или

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml |     xmlstarlet sel -t --value-of "//entry/@revision"
12354

или

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision"
12335

вы можете использовать команды:

1)
> svn info | awk '/Revision:/ { print  }' =>returns the latest version


2)
> svn log -l 1 | grep '^r[0-9]\+' | awk '{print }'

svn log -l 1     => returns the latest version commit 
grep '^r[0-9]\+' => greps the r4324 (revision) number
awk '{print }' => prints the match found

Если вы хотите действительно короткий:

svn info ^/

на каре нотации является сокращением для "URL корневого каталога репозитория".

вы ищете вызов, который похож на вызов командной строки

svn info URL

Кажется, что это возможно с помощью библиотеки pysvn, и там рецепт это должно помочь вам начать работу. Я не уверен, что есть что-то подобное для PHP.

Если вам нужно прибегнуть к вызову двоичного файла SVN самостоятельно, убедитесь, что вы используете --xml параметр для получения результата в виде XML. Это должно быть проще разобрать, чем вывод командной строки.

вы можете использовать формат XML out, например:

  svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +

пример: использование номера редакции

working=`svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +`
svn diff -r $working:HEAD --summarize --xml

просто svn info в Баш даст вам все детали

RESULT:
Path: .
URL: 
Repository Root: 
Repository UUID: 
Revision: 54
Node Kind: directory
Schedule: normal
Last Changed Author: 
Last Changed Rev: 54
Last Changed Date: 

вы получите ревизию от этого

Если у вас есть несчастье необходимости сделать это из пакетного файла Windows, вот заклинание, которое вы ищете:

set REV=unknown
for /f "usebackq tokens=1,2 delims=: " %%A in (`svn info`) do if "%%A" == "Revision" set REV=%%B
echo Current SVN revision is %REV%

это запускает "svn info", повторяя каждую строку сгенерированного вывода. Он использует двоеточие в качестве разделителя между первым и вторым токеном в строке. Когда первый токен является "ревизией", он устанавливает переменную среды REV на второй токен.

вы можете попробовать следующую команду:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print }'

опубликованные решения не обрабатывают случай, когда используются внешние.

если у меня есть URL или рабочая копия с svn:externals набор свойств, внешние могут измениться и, таким образом, последняя версия сервера subversion изменится. Но последняя версия рабочей копии или URL-адреса будет сообщать только номер версии, когда svn: externals propty был изменен или любой элемент ниже в пути URL-адреса, что является ожидаемым поведением.

так что вы либо получите svn:externals свойства и итерации по URL-адресам и выберите ревизию heights или запросите базовый URL-адрес с сервера subversion. Версия, сообщенная из базового URL, будет содержать последнюю версию для всего на сервере.

так что, если вы используете внешние, лучше всего использовать svn info BASE_URL здесь BASE_URL - это корневой URL-адрес для всех путей на сервере subversion.

Это получит только номер ревизии последней измененной ревизии:

<?php
$REV="";
$repo = ""; #url or directory
$REV = svn info $repo --show-item last-changed-revision;
?>

Я надеюсь, что это помогает.

$ svn log | head -10 в любом каталоге, который имеет .svn папку

самый простой и чистый способ сделать это (на самом деле svn 1.9, выпущенный в 2015 году) использует:

svn info --show-item revision [--no-newline] [SVNURL/SVNPATH] 

выход-это число последней ревизии (joungest) для SVNURL, или число текущей редакции рабочей копии SVNPATH. Элемент --no-newline является необязательным, сообщает svn не выделять косметическую новую строку (\n) после значения, если вам нужен минимальный выход (только номер версии).

посмотреть: https://subversion.apache.org/docs/release-notes/1.9.html#svn-info-item

svn info или svnversion не будем принимать во внимание подкаталоги, чтобы найти последнюю "ревизию" живой кодовой базы, взломанный способ ниже работал для меня - это может занять некоторое время для запуска:

repo_root$ find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$

похоже, что это запись в официальном FAQ для этого. Исходный код находится в C, но применяется тот же принцип, что и здесь изложил в этом сообщении.

Update: Subversion 1.9 будет поддерживать новую команду "svn youngest", которая выводит только последний номер версии. Отличие от " svnlook youngest "заключается в том, что" svn youngest " также работает удаленно.

http://subversion.tigris.org/issues/show_bug.cgi?id=4299

Comments

    Ничего не найдено.