
# UNISRC_ID: @(#)diffdir.sh	27.1	85/03/10  
# Script to diff all files under two directories and provide diff output.

# Assumes there's no white space in the arguments given.


	PATH=/bin:/usr/bin:/usr/contrib/bin


# Check arguments:

	if [ $# != 2 ]
	then
		echo "usage: $0 dir1 dir2" >&2
		exit 1
	fi


# Initialize:

	maxlines=56				# biggest reportable diff.

	list1=/tmp/dd$$dir1			# dir1 filename list.
	list2=/tmp/dd$$dir2			# dir2 filename list.
	table=/tmp/dd$$table			# comparison table.
	diff1=/tmp/dd$$diff1			# one diff output.
	diff2=/tmp/dd$$diff2			# saved series of diff output.

	trap "rm -f $list1 $list2 $table $diff1 $diff2; trap '' 0; exit" 0 1 2 3


# Find and prepare filename lists:

	for dir in $1 $2
	do
		echo "Finding files in $dir." >&2

		if [ $dir = $1 ]
		then
			out=$list1
		else
			out=$list2
		fi

		find $dir -type f -print	|
		sed "s:^$dir/::"		|
		sort				>$out

		if [ ! -s $out ]
		then
			echo "$0: find failed for $dir" >&2
			exit 1
		fi
	done


# Compare filename lists and diff files where needed, into temp files:

{	echo "Dir1 = $1\nDir2 = $2\n"

	file1=`line <&3`			# read first filenames.
	file2=`line <&4`

	while true
	do
		if [ `expr $file1 "<" $file2` = 1 ]	# file1 < file2.
		then
			echo "Skipping $file1." >&2
			echo "1 only\t$file1"
			file1=`line <&3`

		elif [ `expr $file1 ">" $file2` = 1 ]	# file1 > file2.
		then
			echo "Skipping $file2." >&2
			echo "2 only\t$file2"
			file2=`line <&4`

		else					# file1 = file2.
			echo "Comparing $file1." >&2
			diff $1/$file1 $2/$file2 >$diff1

			lines=`cat $diff1 | wc -l`

			if [ $lines = 0 ]
			then
				echo "same\t$file1"

			elif [ $lines -gt $maxlines ]
			then
				echo "diff*\t$file1"
			else
				echo "diff\t$file1"
				pr -h $file1 $diff1 >>$diff2
			fi

			file1=`line <&3`
			file2=`line <&4`
		fi

		if [ ! "$file1" ]		# end of list1.
		then
			file1="~"
		fi

		if [ ! "$file2" ]		# end of list2.
		then
			file2="~"
		fi

		if [ $file1$file2 = "~~" ]	# end of both lists.
		then
			break
		fi
	done
} 3<$list1 4<$list2 >$table


# Print output from temp files:

	pr -h "table" $table
	cat $diff2
