Files
mercury/tools/cvdd
Zoltan Somogyi 60df7e5e49 Made this tool more general, by producing output that can be processed
Estimated hours taken: 0.5
Branches: main

tools/cvdd:
	Made this tool more general, by producing output that can be processed
	by cvspatch in more circumstances.
2004-05-06 11:19:25 +00:00

166 lines
3.3 KiB
Bash
Executable File

#!/bin/sh
#
# This script performs a diff between the main directories of two Mercury
# workspaces. It is meant to be useful if you are not connected to a network
# and therefore unable to "cvs add" files; in such circumstances, doing a
# "cvdd clean_ws work_ws" can be a sufficiently good substitute for a
# "cvd diff work_ws". It is not intended to be a full replacement, e.g.
# it doesn't do anything meaningful if you add an entire new directory.
#
# Normally, the script restricts its attention to files and directories
# that are either under CVS control or whose names appear in a file called
# NEWFILES (for files) or NEWDIRS (for directories). If you specify the -e
# option, the script will also look at files with the name given as the
# argument of -e. The intended use is "cvdd -e Log", which includes any changes
# in Log files to be reflected in the output. This is useful when backing up
# a workspace.
pathname="."
extras=""
extraopts=""
diffopts=""
while test $# -gt 0
do
case "$1" in
-e)
extras="$extras $2"
extraopts="$extraopts -e $2"
shift ; shift
;;
-p)
pathname="$2"
shift ; shift
;;
-*)
diffopts="$diffopts $1"
shift
;;
*)
break ;;
esac
done
usage="usage: cvdd [-e filename] dir1 dir2"
if test "$diffopts" = ""
then
# these are the default diff options
diffopts="-ubB"
fi
if test $# -ne 2
then
echo "$usage"
exit 1
fi
case "$1" in
/*) arg1="$1" ;;
*) arg1=`/bin/pwd`/"$1" ;;
esac
case "$2" in
/*) arg2="$2" ;;
*) arg2=`/bin/pwd`/"$2" ;;
esac
if test ! -d "$arg1" -o ! -d "$arg2"
then
echo "$usage"
exit 1
fi
case "$pathname" in
./*)
pathname=`expr $pathname : '\./\(.*\)'`
;;
esac
echo "Diffing $pathname"
filelist="/tmp/cvdd_files$$"
dirlist="/tmp/cvdd_dirs$$"
trap "/bin/rm -f $filelist $dirlist > /dev/null 2>&1; exit 0" 0
trap "/bin/rm -f $filelist $dirlist > /dev/null 2>&1; exit 1" 1 2 3 15
(
cvsfiles $arg1
cvsfiles $arg2
if test -f $arg1/NEWFILES
then
cat $arg1/NEWFILES
fi
if test -f $arg2/NEWFILES
then
cat $arg2/NEWFILES
fi
for extra in "$extras"
do
if test -f $arg1/$extra -o -f $arg2/$extra
then
echo $extra
fi
done
) | sort -u > $filelist
(
cvsdirs $arg1
cvsdirs $arg2
if test -f $arg1/NEWDIRS
then
cat $arg1/NEWDIRS
fi
if test -f $arg2/NEWDIRS
then
cat $arg2/NEWDIRS
fi
) | sort -u > $dirlist
for file in `cat $filelist`
do
if test -f "$arg1/$file" -a -f "$arg2/$file"
then
(cd $arg2 ; diff $diffopts "$arg1/$file" "$file")
elif test -f "$arg1/$file"
then
# echo "old file $arg1/$file"
# cat "$arg1/$file"
(cd $arg1 ; diff $diffopts "$file" /dev/null)
elif test -f "$arg2/$file"
then
# echo "new file $arg2/$file"
# cat "$arg2/$file"
(cd $arg2 ; diff $diffopts /dev/null "$file")
else
echo "neither $arg1/$file nor $arg2/$file exist"
fi
done
for dir in `cat $dirlist`
do
if test -d "$arg1/$dir/CVS" -a -d "$arg2/$dir/CVS"
then
cvdd -p "$pathname/$dir" $extraopts $diffopts "$arg1/$dir" "$arg2/$dir"
elif test -d "$arg1/$dir/CVS"
then
echo "old dir $arg1/$dir"
if test -f "$arg1/$dir/NEWDIRFILES"
then
more `cat $arg1/$dir/NEWDIRFILES`
else
more $arg1/$dir/*
fi
elif test -d "$arg2/$dir/CVS"
then
echo "new dir $arg2/$dir"
if test -f "$arg2/$dir/NEWDIRFILES"
then
more `cat $arg2/$dir/NEWDIRFILES`
else
more $arg2/$dir/*
fi
else
echo "neither $arg1/$dir nor $arg2/$dir are under CVS control"
fi
done