mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-16 14:25:56 +00:00
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.
166 lines
3.3 KiB
Bash
Executable File
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
|