#!/bin/rc # # Bundle-O-Diffs, bundle-o-fun. # myname=$0 version=`{date -n} output=() srcdir=() fn header{ echo '#!/bin/rc' echo '#' echo '# command:' $myname $1 $2 echo '# srcdir:' $srcdir echo '# version: '$version echo '# date:' `{date $version} echo '#' echo 'myname=$0' echo 'doextract=no' echo echo 'fn usage{' echo ' echo $myname: usage: $myname ''[-X] [src-directory]'' >[1=2]' echo ' exit usage' echo '}' echo echo 'fn sigint{' echo ' rm -rf '$version echo ' exit interrupt' echo '}' echo echo 'while(~ $1 -*){' echo ' switch($1){' echo ' case -X' echo ' doextract=yes' echo ' case -*' echo ' usage' echo ' }' echo ' shift' echo '}' echo echo 'switch($#*){' echo 'case 0' echo ' srcdir='`{ echo $srcdir | sed 's,/n/juke/plan_9,,'} echo 'case 1' echo ' srcdir=$1' echo 'case *' echo ' usage' echo '}' echo echo 'if(! ~ $doextract yes){' echo ' echo' 'This shell file contains a bundle of diffs representing changes' echo ' echo' 'to original source files in the Plan 9 distribution. It will run' echo ' echo' 'against the files in' echo ' echo' '''' '''' '$srcdir' echo ' echo' '''(unless overridden by the optional source directory argument)''' echo ' echo' 'and create a directory '$version 'containing the updated files.' echo ' echo' 'It will NOT automatically update the original files.' echo ' echo' echo ' echo' 'Invoke with argument -X to perform the actual extraction.' echo ' exit 0' echo '}' echo echo 'rm -rf' $version echo 'mkdir' $version echo } fn mknew{ target=$version/$2 echo 'target='$target echo 'echo -n '''$target' (new): ''' echo 'cat >' $target '>[2]/dev/null <<''//GO.SYSIN DD VADIM '$1'''' cat $1/$2 echo '//GO.SYSIN DD VADIM '$1 sum=`{sum < $1/$2} echo 'sum=`{sum < '$target^'}' echo 'if(~ '$sum(1)^$sum(2)' $sum(1)^$sum(2))' echo ' echo' echo 'if not{' echo ' echo' $target 'checksum error extracting new file' echo ' exit checksum' echo '}' } fn mkdiff{ target=$version/$1 echo 'target='$target echo 'echo -n '''$target': ''' echo 'if(! test -f $srcdir/'$1' || ! test -r $srcdir/'$1'){' echo ' echo $srcdir/'$1' unreadable' echo ' exit unreadable' echo '}' sum=`{sum < $srcdir/$1} echo 'sum=`{sum < $srcdir/'$1'}' echo 'if(! ~ '$sum(1)^$sum(2)' $sum(1)^$sum(2)){' echo ' echo $srcdir/'$1 'is not the original distribution file' echo ' exit original' echo '}' echo 'cp $srcdir/'$1 $target echo 'ed' $target '>/dev/null >[2=1] <<''//GO.SYSIN DD VADIM '$1'''' diff -e $srcdir/$1 $2 echo 'wq' echo '//GO.SYSIN DD VADIM '$1 sum=`{sum < $2} echo 'sum=`{sum < '$target^'}' echo 'if(~ '$sum(1)^$sum(2)' $sum(1)^$sum(2))' echo ' echo' echo 'if not{' echo ' echo' $target 'checksum error creating updated file' echo ' exit checksum' echo '}' } fn done{ if(! ~ $#output 0) echo $myname':' 'output:' $output >[1=2] exit 0 } fn mkdiffone{ mkdiff $1 $2 done } fn mkdiffmany{ obsolete=() new=() for(i in `{ls -p $1}){ src=$1/$i dst=$2/$i if(test -f $src -a -r $src){ if(test -f $dst -a -r $dst && ! cmp -s $src $dst) mkdiff $i $dst if not if(! test -e $dst) obsolete=($obsolete $src) } } for(i in `{ls -p $2}){ src=$1/$i dst=$2/$i if(test -f $dst -a -r $dst && ! test -e $src){ mknew $2 $i new=($new $i) } } #if(! ~ $#new 0) # echo 'echo new files: ' $new if(! ~ $#obsolete 0){ echo 'echo obsolete files: ' $obsolete #echo 'echo remove with ''''''@{cd $srcdir; rm' $obsolete'}''''''' } #echo 'echo update with ''''''@{cd '$version'; cp * $srcdir}''''''' done } fn usage{ echo $myname':' 'usage:' $myname '[-o output] old new' >[1=2] exit 'usage' } fn boddle{ if(test -d $1){ srcdir=$1 header $1 $2 if(test -d $2) mkdiffmany $1 $2 if(test -f $2 -a -r $2){ f=`{basename $2} if(test -f $1/$f -a -r $1/$f) mkdiffone $f $2 } usage } if(test -f $1 -a -r $1){ srcdir=`{basename -d $1} header $1 $2 f=`{basename $1} if(test -f $2 -a -r $2) mkdiffone $f $2 if(test -d $2){ if(test -f $2/$f -a -r $2/$f) mkdiffone $f $2/$f } usage } usage } while(~ $1 -*){ switch($1){ case -o if(test $#* -lt 3) usage shift output=(`{eval echo $1}) case -* usage } shift } switch($#*){ case 2 if(~ $#output 0) boddle $1 $2 if not { boddle $1 $2 }>$output case 0 1 * usage } exit 0