Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get the highest revision number from a subversion dump file in Perl or shell

I would like to extract the highest revision number in a subversion dump file. Besides parsing the file line by line, is there any easier (and hopefully faster) way using standard perl (no extra modules allowed on the server) or bash shell scripting?

like image 444
Volker Avatar asked Dec 07 '22 22:12

Volker


2 Answers

if you created a dump file using

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

The you can find the last revision number with this one-liner:

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

Alternately to avoid grepping the entire file, use tac (cat backwards) and stop on the first (last) match. Eliminates the need for tail on the large output of grep, and saves processing time.

tac Dump1.dump | grep -m1 --binary-files=text "Revision-number" | sed 's/Revision-number\:\ //g'
like image 69
Volker Avatar answered Feb 16 '23 00:02

Volker


I can subvert this solution, no pun intended, by simply checking in a text file that contains something like

Revision-number: 720

The output of the grep looks like this:

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

To really do this properly the dump file needs to be parsed. I wrote a perl script using the SVN::Dumpfile module and just looped through the revisions until I got to the end.

#!/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";
like image 33
David Newman Avatar answered Feb 15 '23 22:02

David Newman