. L
From=`p "$1"`
To=`p "$2"`
[ -d "$To" ] &&
	To="$To/`basename "$From"`"
FromDir=`dirname "$From"`
ToDir=`dirname "$To"`
FromName=`basename "$From"`
ToName=`basename "$To"`
cd "$FromDir" >/dev/null
FromReposDir="`<CVS/Root`/`<CVS/Repository`"
FromReposDir=/"${FromReposDir#*/}"  # assume the repos is local
cd "$ToDir" >/dev/null
ToReposDir="`<CVS/Root`/`<CVS/Repository`"
ToReposDir=/"${ToReposDir#*/}"  # assume the repos is local
[ -d "$FromReposDir" -a -d "$ToReposDir" ] || die "the repository directories $FromReposDir and $ToReposDir do not exist."
V=,v
if [ -d "$From" ]; then
	V=
	Root="`<CVS/Root`"
	Repository="`<CVS/Repository`/$ToName"
fi
FromRepos="$FromReposDir/$FromName$V"
ToRepos="$ToReposDir/$ToName$V"
[ -e "$To" ] && die "file '$To' already exists"
[ -e "$ToRepos" ] && die "file '$ToRepos' already exists"

E=`cvs-entry "$From"` &&
E=`echo "$E" | fsed "/$FromName/" "/$ToName/"` &&
cvs-entry-rm "$From" &&
mv -i "$From" "$To" &&
mv -i "$FromRepos" "$ToRepos" &&
echo "$E" >>"$ToDir/CVS/Entries" &&
if [ -z "$V" ]; then  # the file being moved is a directory
	printf "%s\n" "$Root" >"$To/CVS/Root"
	printf "%s\n" "$Repository" >"$To/CVS/Repository"
	# TODO update all subdirectory Root and Repository files too...
fi
