#!/bin/rc rfork n fn usage { echo usage: sdiff [-c num] [-d date] [-r root] file1 ... >[1=2] echo example: sdiff /sys/src/cmd/ls.c /sys/src/cmd/acme '>'ls.diff >[1=2] exit usage } b=/n/sources/plan9 nd=/tmp/newdir nf=/tmp/newfile cmd=ape/diff arg=-Nru if(~ $#* 0){ usage } # choose context if(~ $1 -c){ if(~ $2 '') usage arg=(-NrU $2) shift shift } # diff against specific date if(~ $1 -d){ if(~ $2 '') usage yyyy=`{echo $2 | awk -F\- '{print $1}'} if(~ $yyyy '') usage mmdd=`{echo $2 | awk -F\- '{print $2$3}'} if(~ $mmdd '') usage b=/n/sourcesdump/$yyyy/$mmdd/plan9 shift shift } # use another directory as root if(~ $1 -r){ if(~ $2 '') usage r=`{cleanname $2} shift shift } if(! test -d $b){ 9fs sourcesdump if(! ~ $status ''){ echo $status exit } } rm -rf $nd $nf for(i in $*){ # i: local, s: sources s=`{cleanname $b/$i} if(! ~ $r '') # remove root s=`{echo $s | sed s,$r,,} if(test -d $i){ if(test -d $s){ if(~ $r '') $cmd $arg $s $i if not $cmd $arg $s $i | sed s,$r,,g } if not if(test -f $s){ echo $s is a file, while $i is a directory >[1=2] exit } if not{ # directory does not exist on server (new directory) mkdir $nd touch -t 0 $nd if(~ $r '') $cmd $arg $nd $i | sed s,$nd,$i,g if not $cmd $arg $nd $i | sed s,$nd,$i,g | sed s,$r,,g rm -rf $nd } } if not if(test -f $i){ if(test -f $s){ if(~ $r '') $cmd $arg $s $i if not $cmd $arg $s $i | sed s,$r,,g } if not if(test -d $s){ echo $s is a directory, while $i is a file >[1=2] exit } if not{ # file does not exist on server (new file) >$nf touch -t 0 $nf if(~ $r '') $cmd $arg $nf $i | sed s,$nf,$i,g if not $cmd $arg $nf $i | sed s,$nf,$i,g | sed s,$r,,g rm -f $nf } } if not{ # file does not exist on client (we don't handle deletion) echo $i does not exist >[1=2] exit } }