mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-15 17:33:38 +00:00
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
|