Skip to content

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