Получить наибольший номер ревизии из файла дампа 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";