#!/bin/sh 
#
#   vcompare dir1 dir2
#
#   compares all files in dir2 with files in dir1
#

usage()
{
	if [ $# -eq 2 ] 
	then
		case $2 in
			-*) echo "unknown option \"$2\"";;
			*)	echo "extra parameter \"$2\"";;
		esac
	fi

	echo "vcompare [-p | -m ] directory1 directory2"
	echo "	-p		# print directories as they are compared"
	echo "	-m		# output names of files missing from directory1"

	exit $1
}



trap "exit 2" 2		# interrupts cause us to exit quickly

progress=0
missing=0
opts=""
dir1=""
dir2=""

# build a list of passed options
for i do
	case $i in
		-*) opts="$opts $i";;
	esac
done

# parse arguments
for i do
	case $i in
		-p) progress=1;;
		-m) missing=1;;
		-*) usage 1 $i;;
		*)
			if [ "$dir1" = "" ]
			then
				dir1="$i"
			elif [ "$dir2" = "" ]
			then
				dir2="$i"
			else
				usage 1 $i
			fi
			;;
	esac
done

if [ "$dir2" = "" ] 	# this covers both dir1 and dir2 omitted
then
	echo "not enough arguments"
	usage 1
fi

# make sure both args are directories
[ ! -d "$dir1" ] && { echo $dir1 is not a directory; usage 1; exit 1 }
[ ! -d "$dir2" ] && { echo $dir2 is not a directory; usage 1; exit 1 }

# pick x86 or ppc tool
if [ `uname -m` = BePC ]; then
	tool=pecomp
else
	tool="pefcomp -q"
fi

# Handle empty directories (makes wildcard expansion easier)
if [ "`ls "$dir2"`" = "" ]
then
	if [ "`ls "$dir1"`" = "" ]
	then
		exit 0
	else
		echo directory "$dir2" is empty, but directory "$dir1" is not
	fi
fi

for file in "$dir2"/*
do
	base=`basename "$file"`
	if [ -L "$file" ]			# link?
	then
		if [ ! -L "$dir1/$base" ]
		then
			[ "$missing" = "1" ] && echo link "$dir1/$base" does not exist, or is not a link
		fi
	else
		if [ -d "$file" ]		# directory?
		then
			if [ -d "$dir1/$base" ]
			then
				[ "$progress" = "1" ] && echo examining directory $dir1/$base
				$0 $opts "$dir1/$base" "$file"
				result=$?
				[ $result != 0 ] && exit $result
			else
				[ "$missing" = "1" ] && echo directory "$dir1/$base" does not exist
			fi
		else					# a file for sure
			if [ -f "$dir1/$base" ]
			then
				# echo comparing "$dir1/$base" "$file"
				if cmp -s "$dir1/$base"  "$file"	# simple compare?
				then
					true
				else
					$tool "$dir1/$base" "$file"	# do executable compare
					result=$?
					if [ $result != 0 ]; then
						echo "$dir1/$base" and "$file" differ
					 fi
				fi
			else
				[ "$missing" = "1" ] && echo file "$dir1/$base" does not exist
			fi
		fi
	fi
done
exit 0

