Получить наибольший номер ревизии из файла дампа Subversion в Perl или shell

Я хотел бы извлечь самый высокий номер ревизии в файл дампа Subversion. Помимо анализа файла построчно, есть ли более простой (и, надеюсь, более быстрый) способ использования стандартного perl (на сервере не разрешено использовать дополнительные модули) или сценариев оболочки bash?

2 ответа

Решение

Если вы создали файл дампа с помощью

svnadmin dump /path/to/repo > Dump1.dump

Вы можете найти номер последней ревизии с помощью этой строки:

grep --binary-files=text "Revision-number" Dump1.dump | tail -n 1 | sed 's/Revision-number\:\ //g'

В качестве альтернативы, чтобы избежать поиска всего файла, используйте tac (cat backwards) и остановитесь на первом (последнем) совпадении. Устраняет необходимость хвоста при большом выходе grep и экономит время обработки.

tac Dump1.dump | grep -m1 --binary-files=text "Revision-number" | sed 's/Revision-number\:\ //g'

Я могу подорвать это решение, не каламбур, просто проверяя в текстовом файле, который содержит что-то вроде

Revision-number: 720

Вывод grep выглядит следующим образом:

-bash-3.2$ grep "Revision-number:" test.dump.2
Revision-number: 0
Revision-number: 1
Revision-number: 2
Revision-number: 720

Чтобы действительно сделать это правильно, файл дампа должен быть проанализирован. Я написал Perl-скрипт, используя модуль SVN::Dumpfile, и просто просматривал ревизии, пока не дошел до конца.

#!/usr/bin/perl
use SVN::Dumpfile;
use strict;

my $df = new SVN::Dumpfile;
$df->open('/usr/tmp/test.dump.2');

my $revision=-1;
while (my $node = $df->read_node()) {
  if ($node->is_rev) {
    $revision = $node->header('Revision-number');
  }
}

print "$revision\n";
Другие вопросы по тегам