12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- #!/bin/rc
- rfork en
- fn usage {
- echo 'usage: replica/pull [-csnv] replica-name [paths]' >[1=2]
- exit usage
- }
- . /rc/bin/replica/defs $*
- need clientlog serverlog clientdb clientroot serverroot
- # mount the server file system, update the log
- must servermount
- must serverupdate
- must clientmount
- # download the log
- n=`{ls -l $clientlog >[2]/dev/null |awk '{print $6}'}
- s=`{ls -l $serverlog >[2]/dev/null |awk '{print $6}'}
- if(~ $n 0 || ~ $#n 0 || test $s -lt $n){
- if(test -e $clientlog) must rm $clientlog
- must cp $serverlog $clientlog
- }
- if not{
- m=`{echo $n-1024 | hoc}
- if(~ $m -*)
- m=0
- cmp -s $serverlog $clientlog $m $m
- x=$status
- switch($x){
- case *': EOF'
- must tail +^$n^c $serverlog >>$clientlog
- case *': differ'
- must rm $clientlog
- must cp $serverlog $clientlog
- case ''
- ;
- case *
- fatal cmp: $x
- }
- }
- # normally we'd do this after applylog, but we want
- # applylog to be the last thing in this script, so we'll
- # do it here instead, compacting changes from the
- # _last_ applylog.
- ndb=`{echo $clientdb | sed 's;(.*)/(.*);\1/_\2;'}
- must replica/compactdb $clientdb >$ndb
- mv $ndb $clientdb
- # mount the client file system, apply the log
- # this is the last thing in the script and is execed so that
- # if replica/pull is overwritten nothing bad will happen.
- # applylog takes care of itself as far as protection against being overwritten.
- exec replica/applylog $opt $applyopt $clientdb $clientroot $serverroot $paths <$clientlog
|