Журнал для каталога tags
должен включать ревизию, которую он зафиксировал, когда вы делали тег, номера ревизий вашего trunk
были бы тогда меньше.
Или я что-то не так понимаю?
Посмотрите на мою библиотеку классов: Представление WebSVN для каталога тегов моей библиотеки классов
Вы можете увидеть ревизию, которой заканчивалась каждая сборка, поскольку это один и тот же репозиторий, номер ревизии для тега на 1 больше максимально возможной ревизии в стволе для изменений, которые были помечены.
Вот как это выглядит с помощью простой команды svn log
:
[C:\Temp] :svn log http://svn.vkarlsen.no/svn/LVK/LVK_3_5/tags
-----------------------------------------------------------------------
r751 | lassevk | 2009-10-04 13:45:07 +0200 (sø, 04 okt 2009) | 1 line
Build 750
-----------------------------------------------------------------------
r636 | lassevk | 2009-07-31 07:00:11 +0200 (fr, 31 jul 2009) | 1 line
Build 635
-----------------------------------------------------------------------
r632 | lassevk | 2009-07-25 06:19:27 +0200 (lø, 25 jul 2009) | 1 line
Build 631
-----------------------------------------------------------------------
r614 | lassevk | 2009-07-23 06:18:58 +0200 (to, 23 jul 2009) | 1 line
Build 612
|----|
^
+-- this column here shows the tag commit revision, trunk is less than that
Или с xml:
[C:\Temp] :svn log http://svn.vkarlsen.no:81/svn/LVK/LVK_3_5/tags --xml
<?xml version="1.0"?>
<log>
<logentry
revision="751"> <-- this
<author>lassevk</author>
<date>2009-10-04T11:45:07.445750Z</date>
<msg>Build 750</msg>
</logentry>
<logentry
revision="636"> <-- and this
<author>lassevk</author>
<date>2009-07-31T05:00:11.796875Z</date>
<msg>Build 635</msg>
</logentry>
Вот скрипт на python, который будет что-то выводить, он не очень хорошо отформатирован, так как он не обрабатывает переводы строк в комментариях ревизии должным образом, но он должен помочь вам.
from xml.dom.minidom import parse;
# files created by:
# svn log http://svn.vkarlsen.no:81/svn/LVK/LVK_3_5/tags --xml >tags.xml
# svn log http://svn.vkarlsen.no:81/svn/LVK/LVK_3_5/trunk --xml >trunk.xml
def get_revs(filename):
log = parse(filename);
try:
for rev in log.getElementsByTagName("logentry"):
revision = int(rev.getAttribute("revision"));
rev.getElementsByTagName("msg")[0].normalize();
comment = rev.getElementsByTagName("msg")[0].firstChild.nodeValue.rstrip();
yield (revision, comment);
finally:
log.unlink();
tag_revs = [tr for tr in get_revs("tags.xml")];
trunk_revs = [tr for tr in get_revs("trunk.xml")];
tag_revs.insert(0, (max((tr[0] for tr in trunk_revs)), "HEAD"));
tag_rev_lookup = {};
for tag_rev in tag_revs:
tag_rev_lookup[tag_rev[0]] = tag_rev[1];
prev_tag = -1;
for trunk_rev in trunk_revs:
tag_rev_for_trunk_rev = min((tr[0] for tr in tag_revs if tr[0] >= trunk_rev[0]));
if tag_rev_for_trunk_rev != prev_tag:
print("tag #%d: %s" % (tag_rev_for_trunk_rev, tag_rev_lookup[tag_rev_for_trunk_rev]));
prev_tag = tag_rev_for_trunk_rev;
print(" rev #%d: %s" % trunk_rev);
Это выводит это (усечено):
tag #879: HEAD
rev #879: Fixed build properties and added FinalBuilder project. Need PostSharp 2 to work properly for x64.
rev #878: Adjusted property targets.
Fixed references to SQLite for 32 and 64-bit.
rev #877: Removed 32-bit only SQLite library.
rev #876: Removed 32-bit only SQLite library.
rev #875: Removed 32-bit only SQLite library.
rev #874: Cleaned up dependencies on SQLite.
rev #873: Removed SQLite connection editor from UI.Windows project.
rev #872: Added separate projects for SQLite functionality.
rev #870: Changes to allow code to compile without resource files.
rev #859: Added Any CPU target.
Я добавил искусственный тег с именем HEAD
, чтобы обеспечить наличие всех записей журнала, но вы можете легко удалить его и проигнорировать.
Код здесь: Хранилище WebSVN для приведенного выше примера кода .
Я изменил его для вывода xml, в том же формате, что и исходный svn log --xml
, код в хранилище имеет эти изменения, вывод теперь выглядит так:
<?xml version="1.0" ?>
<tags>
...
<tag revision="8"> --+
<logentry revision="8"> --+ |
<author> | |
lassevk | |
</author> | |
<date> | |
2007-12-08T20:36:18.730377Z +-- from tags.xml |
</date> | |
<msg> | |
Created folder remotely | |
</msg> | |
</logentry> --+ |
<revisions> +-- repeated
<logentry revision="7"> --+ | for each
<author> | | tag
lassevk | |
</author> | |
<date> | |
2007-12-08T20:36:14.324041Z +-- from trunk.xml |
</date> | repeated for each |
<msg> | revision |
Created folder remotely | |
</msg> | |
</logentry> --+ |
</revisions> |
</tag> --+
</tags>
Каждый узел <tag...>
имеет одного дочернего элемента <logentry...>
, который представляет собой запись журнала тегов из журнала тегов xml, а затем узел <revisions>
, где все дочерние элементы являются соответствующими записями журнала из журнала магистрального xml.