#!/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 = ; 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 \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") ;