#!/bin/bash
MyPath=/usr/bin:/bin;
if [ -z "${PATH}" ]; then
export PATH=${MyPath};
else
export PATH=${PATH}:${MyPath};
fi
CVS_PROG="$(basename $0)"
CVS_PROG="${CVS_PROG%%-*}"
usage ()
{
echo "usage: $(basename $0) [-r <rev1> [-r <rev2>]] [-a <rev3>] [files...]";
echo " Compares <rev1> and <rev2> using FileMerge with optional ancestor <rev3>.";
echo " <rev1> defaults to the version the current working copy is based on.";
echo " <rev2> defaults to the current working copy.";
echo " If <rev1> is the current working copy, then the merge";
echo " directory is set to the current working directory.";
exit 2;
}
abort ()
{
local TmpDir1 TmpDir2 TmpDirA;
echo -n "Abort: cleaning up...";
if [ -n "${TmpDir1}" ]; then rm -rf "${TmpDir1}"; fi;
if [ -n "${TmpDir2}" ]; then rm -rf "${TmpDir2}"; fi;
if [ -n "${TmpDirA}" ]; then rm -rf "${TmpDirA}"; fi;
echo "done.";
exit 1;
}
trap abort 1 2 15
if [ -z "${TMPDIR}" ]; then TMPDIR=/tmp; fi;
TmpDir1=${TMPDIR}/cvs-diff-$$-1;
TmpDir2=${TMPDIR}/cvs-diff-$$-2;
TmpDirA=${TMPDIR}/cvs-diff-$$-A;
Revision1="";
Revision2="";
Ancestor="";
if ! args=$(getopt a:r: $*); then usage; fi;
set -- ${args};
for option; do
case "$option" in
-a)
Ancestor="-r $2";
shift;shift;
;;
-r)
if [ -z "${Revision1}" ]; then
Revision1="-r $2";
elif [ -z "${Revision2}" ]; then
Revision2="-r $2";
else
"Too many revisions specified.";
usage;
fi;
shift;shift;
;;
--)
shift;
break;
;;
esac;
done;
for file; do
if [ ! -e ${file} ]; then
echo "`basename $0`: ${file}: No such file or directory.";
exit 1;
fi;
done;
if [ ! -d "CVS" ]; then
echo "There is no version here. Exiting.";
exit 1;
fi;
echo -n "Figuring out which files changed...";
if [ -z "${Revision1}" ]; then
DiffFiles=$(${CVS_PROG} -fnq update ${Revision1} ${Revision2} $* | egrep -v '^U ' | cut -d ' ' -f 2);
else
DiffFiles=$(${CVS_PROG} -fq diff --brief ${Revision1} ${Revision2} $* | egrep '^RCS file: ' | cut -d ' ' -f 3);
fi;
echo " done";
for File in ${DiffFiles}; do
File=$(echo "$File" | sed 's|,v$||');
File=$(echo "$File" | sed 's|^/||');
LastFile="";
while [ ! -f "${File}" ]; do
if [ "${LastFile}" = "${File}" ]; then break; fi;
LastFile=${File};
File=$(echo "${File}" | sed 's|^[^/]*/||');
done;
if [ "${LastFile}" = "${File}" ]; then continue; fi;
echo -n "Fetching ${File}...";
if [ -z "${Revision1}" ]; then
RevisionRight="-r $(grep /$(basename "${File}")/ $(dirname "${File}")/CVS/Entries | sed 's|^[^/]*/[^/]*/||' | sed 's|/.*$||')";
else
RevisionRight="${Revision1}";
fi;
mkdir -p "${TmpDir1}"/$(dirname "${File}");
${CVS_PROG} -fq update -kb ${RevisionRight} -p "${File}" > "${TmpDir1}/${File}";
if [ -n "${Revision2}" ]; then
mkdir -p "${TmpDir2}"/$(dirname "${File}");
${CVS_PROG} -fq update -kb ${Revision2} -p "${File}" > "${TmpDir2}/${File}";
fi;
if [ -n "${Ancestor}" ]; then
mkdir -p "${TmpDirA}"/$(dirname "${File}");
${CVS_PROG} -fq update -kb ${Ancestor} -p "${File}" > "${TmpDirA}/${File}";
fi;
echo " done";
done;
if [ -d "${TmpDir1}" ]; then
AncestorArgs="";
if [ -n "${Ancestor}" ]; then AncestorArgs="-ancestor ${TmpDirA}"; fi;
if [ -d "${TmpDir2}" ]; then
opendiff "${TmpDir1}" "${TmpDir2}" ${AncestorArgs};
else
opendiff "${TmpDir1}" . -merge . ${AncestorArgs};
fi;
else
echo "No diffs.";
fi;