SRC fails to commit non-basename files
Running src commit
on a non-basename file (e.g. ./data
, sub/data
)
fails.
This breaks vc-dir-mode which manipulates SRC repositories recursively.
The attached patch for vc-src is an ugly hack that avoids failure, but the display of logs etc. does no longer have correct directory information.
Here is the output from the test cases:
# --------------------------------------------------
# ||:sec:|| TEST: show log of sub/sub/data from top directory
# --------------------------------------------------
>>> src log sub/sub/data
= sub/sub/data =========================================================
# --------------------------------------------------
SUCCESS
# --------------------------------------------------
# ||:sec:|| TEST: commit data in top directory
# --------------------------------------------------
>>> src commit -m update data
# --------------------------------------------------
SUCCESS
# --------------------------------------------------
# ||:sec:|| TEST: commit sub/data in top directory
# --------------------------------------------------
>>> src commit -m update sub/data
src: "rcs -q -U -u 'sub/data,v' && ci -l -m'update\n' 'sub/data'" returned 1.
# --------------------------------------------------
FAILED
# --------------------------------------------------
# |:sec:| differences between initial directory and after failed command
# --------------------------------------------------
--- ls.old 2020-02-11 16:48:09.556982899 +0100
+++ ls.new 2020-02-11 16:48:09.660983136 +0100
@@ -7,8 +7,8 @@
./.src/data,v
./sub
./sub/data
-./sub/.src
-./sub/.src/data,v
+./sub/RCS
+./sub/RCS/data,v
./sub/sub
./sub/sub/data
./sub/sub/.src
# --------------------------------------------------
# ||:sec:|| TEST: commit sub/sub/data in top directory
# --------------------------------------------------
>>> src commit -m update sub/sub/data
src: in sub/sub/data, no changes to commit
# --------------------------------------------------
FAILED
# --------------------------------------------------
# |:sec:| differences between initial directory and after failed command
# --------------------------------------------------
--- ls.old 2020-02-11 16:48:09.664983145 +0100
+++ ls.new 2020-02-11 16:48:09.728983291 +0100
@@ -11,5 +11,5 @@
./sub/RCS/data,v
./sub/sub
./sub/sub/data
-./sub/sub/.src
-./sub/sub/.src/data,v
+./sub/sub/RCS
+./sub/sub/RCS/data,v
Here is the test script:
#!/bin/sh
texec ()
{
printf >&2 ">>> %s\n" "${*}"
${1+"$@"}
}
for dir_pfx in '' sub/ sub/sub/
do
rm -rf "${dir_pfx}RCS"
rm -rf "${dir_pfx}.src"
mkdir -p "${dir_pfx}.src"
(
cd "${dir_pfx}" || exit 1
echo data >data
src commit -m 'initial' data
echo data >>data
)
done
run_dir_state_test ()
{
title="${1-unspecified}"; test x"${1+set}" = xset && shift
find -print | sort | grep -v 'ls.\(old\|new\)' >ls.old
printf >&2 "%s\n" ''
printf >&2 "# --------------------------------------------------\n"
printf >&2 "# ||"":sec:|| TEST: %s\n" "${title}"
printf >&2 "# --------------------------------------------------\n"
printf >&2 "%s\n" ''
texec ${1+"$@"}
ecode="${?}"
printf >&2 "%s\n" ''
printf >&2 "# --------------------------------------------------\n"
find -print | sort | grep -v 'ls.\(old\|new\)' >ls.new
_diff="$( diff -u ls.old ls.new )"
if test -n "${_diff}" || test ${ecode} != 0
then
printf "%s\n" FAILED
if test -n "${_diff}"
then
printf >&2 "%s\n" ''
printf >&2 "# --------------------------------------------------\n"
printf >&2 "# |"":sec:| differences between initial directory and after failed command%s\n" ""
printf >&2 "# --------------------------------------------------\n"
printf >&2 "%s\n" ''
printf >&2 "%s\n" "${_diff}"
fi
else
printf "%s\n" SUCCESS
fi
}
run_dir_state_test "show log of sub/sub/data from top directory" src log sub/sub/data
for dir_pfx in '' sub/ sub/sub/
do
echo data >>"${dir_pfx}data"
run_dir_state_test 'commit '"${dir_pfx}data"' in top directory' src commit -m 'update' "${dir_pfx}data"
done