#!/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
