The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl


use strict ;

# if the following programm are not in your path, you might
# change the definitions

our $ssh      = 'ssh -C ' ;
our $svnadmin = '/usr/local/bin/svnadmin' ;
our $svnlook  = '/usr/local/bin/svnlook' ;
our $test     = 'test' ;

# don't change anything below this line

our $dump     = "$svnadmin dump" ;
our $load     = "$svnadmin load" ;
our $testf    = "$test -f" ;
our $create   = "$svnadmin create" ;
our $youngest = "$svnlook youngest" ;

# ------------------------------------------------------------------------

sub splitpath
	{
	my ($src) = @_ ;
	
	my ($host, $path) = split (/:/, $src, 2) ;
	if ($host && !$path)
		{
		$path = $host ;
		$host = '' ;
		}
		
	return ($host, $path) ;
	}

# ------------------------------------------------------------------------

sub execcmd
	{
	my ($host, $cmd) = @_ ;
	
	my $fullcmd = $host?"$ssh $host \"$cmd\"":$cmd ;
	
	#print "h=$host c=$cmd f=$fullcmd\n" ;
	open FH, "$fullcmd|" or die "Cannot run $fullcmd ($!)" ;
	my @out = <FH> ;
	close FH ;
	
	return @out ;
	}

# ------------------------------------------------------------------------

sub execcmdpipe
	{
	my ($hosta, $cmda, $hostb, $cmdb) = @_ ;
	
	my $fullcmda = $hosta?"$ssh $hosta \"$cmda\"":$cmda ;
	my $fullcmdb = $hostb?"$ssh $hostb \"$cmdb\"":$cmdb ;
	
        #print "start $fullcmda | $fullcmdb\n" ; 
	system ("$fullcmda | $fullcmdb") ;
	}

# ------------------------------------------------------------------------


die "$0 <srcpath> <destpath>\n" if (@ARGV != 2) ;

my ($src, $dst) = @ARGV ;
my ($srchost, $srcpath) = splitpath ($src) ;
my ($dsthost, $dstpath) = splitpath ($dst) ;

my @dstrev = execcmd ($dsthost, "$testf '$dstpath/format' || $create '$dstpath' ; $youngest $dstpath") ;

my $dstrev = $dstrev[0] ;
chop($dstrev) ;
die "Cannot get youngest revision of $dst\n" if ($dstrev !~ /^\d+$/) ;

my @srcrev = execcmd ($srchost, "$youngest $srcpath") ;

my $srcrev = $srcrev[0] ;
chop($srcrev) ;
die "Cannot get youngest revision of $src\n" if ($srcrev !~ /^\d+$/) ;
 
print "$src is at revision $srcrev\n" ;
print "$dst is at revision $dstrev\n" ;

if ($srcrev <= $dstrev)
	{
	print "Destination is up to date\n" ;
	exit 0 ;
	}
my $revision = '' ;
if ($dstrev > 0)
	{
	$revision = ' --incremental --revision ' . ($dstrev + 1) . ':HEAD' ;
	}

execcmdpipe ($srchost, "$dump $revision $srcpath", $dsthost, "$load $dstpath") ;