/contrib/cvs/src/sanity.sh
https://bitbucket.org/freebsd/freebsd-head/ · Shell · 30254 lines · 24091 code · 2587 blank · 3576 comment · 795 complexity · cceaf0e0b88c0126424fe2fefc488af9 MD5 · raw file
- #! /bin/sh
- :
- # sanity.sh -- a growing testsuite for cvs.
- #
- # The copyright notice said: "Copyright (C) 1992, 1993 Cygnus Support"
- # I'm not adding new copyright notices for new years as our recent
- # practice has been to include copying terms without copyright notices.
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2, or (at your option)
- # any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # Original Author: K. Richard Pixley
- # usage:
- usage ()
- {
- echo "Usage: `basename $0` --help"
- echo "Usage: `basename $0` [-eklrv] [-f FROM-TEST] [-h HOSTNAME] CVS-TO-TEST [TESTS-TO-RUN...]"
- }
- exit_usage ()
- {
- usage 1>&2
- exit 2
- }
- exit_help ()
- {
- usage
- echo
- echo "-H|--help Display this text."
- echo "-e|--skipfail Treat tests that would otherwise be nonfatally skipped"
- echo " for reasons like missing tools as failures, exiting"
- echo " with an error message. Also treat warnings as"
- echo " failures."
- echo "-f FROM-TEST Run TESTS-TO-RUN, skipping all tests in the list before"
- echo " FROM-TEST."
- echo "-h HOSTNAME Use :ext:HOSTNAME to run remote tests rather than"
- echo " :fork:. Implies --remote and assumes that \$TESTDIR"
- echo " resolves to the same directory on both the client and"
- echo " the server."
- echo "-k|--keep Try to keep directories created by individual tests"
- echo " around, exiting after the first test which supports"
- echo " --keep."
- echo "-l|--link-root"
- echo " Test CVS using a symlink to a real CVSROOT."
- echo "-r|--remote Test remote instead of local cvs."
- echo "-v|--verbose List test names as they are executed."
- echo
- echo "CVS-TO-TEST The path to the CVS executable to be tested."
- echo "TESTS-TO-RUN The names of the tests to run (defaults to all tests)."
- exit 2
- }
- # See TODO list at end of file.
- # required to make this script work properly.
- unset CVSREAD
- # This will cause malloc to run slower but should also catch some common errors
- # when CVS is linked with glibc 2.x.
- MALLOC_CHECK_=2; export MALLOC_CHECK_
- # We want to invoke a predictable set of i18n behaviors, not whatever
- # the user running this script might have set.
- # In particular:
- # 'sort' and tabs and spaces (LC_COLLATE).
- # Messages from getopt (LC_MESSAGES) (in the future, CVS itself might
- # also alter its messages based on LC_MESSAGES).
- LANG=C
- export LANG
- LC_ALL=C
- export LC_ALL
- #
- # Initialize the test counts.
- #
- passed=0
- skipped=0
- warnings=0
- #
- # read our options
- #
- unset fromtest
- unset remotehost
- keep=false
- linkroot=false
- remote=false
- skipfail=false
- verbose=false
- while getopts ef:h:Hklrv-: option ; do
- # convert the long opts to short opts
- if test x$option = x-; then
- case "$OPTARG" in
- [hH]|[hH][eE]|[hH][eE][lL]|[hH][eE][lL][pP])
- option=H;
- OPTARG=
- ;;
- [kK]|[kK][eE]|[kK][eE][eE]|[kK][eE][eE][pP])
- option=k;
- OPTARG=
- ;;
- l|li|lin|link|link-|link-r]|link-ro|link-roo|link-root)
- option=l;
- OPTARG=
- ;;
- [rR]|[rR][eE]|[rR][eE][mM]|[rR][eE][mM][oO]|[rR][eE][mM][oO][tT]|[rR][eE][mM][oO][tT][eE])
- option=k;
- OPTARG=
- ;;
- s|sk|ski|skip|skipf|skipfa|skipfai|skipfail)
- option=e
- OPTARG=
- ;;
- v|ve|ver|verb|verbo|verbos|verbose)
- option=v
- OPTARG=
- ;;
- *)
- option=\?
- OPTARG=
- esac
- fi
- case "$option" in
- e)
- skipfail=:
- ;;
- f)
- fromtest="$OPTARG"
- ;;
- h)
- # Set a remotehost to run the remote tests on via :ext:
- # Implies `-r' and assumes that $TESTDIR resolves to the same
- # directory on the client and the server.
- remotehost="$OPTARG"
- remote=:
- ;;
- H)
- exit_help
- ;;
- k)
- # The -k (keep) option will eventually cause all the tests to
- # leave around the contents of the /tmp directory; right now only
- # some implement it. Not originally intended to be useful with
- # more than one test, but this should work if each test uses a
- # uniquely named dir (use the name of the test).
- keep=:
- ;;
- l)
- linkroot=:
- ;;
- r)
- remote=:
- ;;
- v)
- verbose=:
- ;;
- \?)
- exit_usage
- ;;
- esac
- done
- # boot the arguments we used above
- while test $OPTIND -gt 1 ; do
- shift
- OPTIND=`expr $OPTIND - 1`
- done
- # Use full path for CVS executable, so that CVS_SERVER gets set properly
- # for remote.
- case $1 in
- "")
- exit_usage
- ;;
- /*)
- testcvs=$1
- ;;
- *)
- testcvs=`pwd`/$1
- ;;
- esac
- shift
- # If $remotehost is set, warn if $TESTDIR isn't since we are pretty sure
- # that its default value of `/tmp/cvs-sanity' will not resolve to the same
- # directory on two different machines.
- if test -n "$remotehost" && test -z "$TESTDIR"; then
- echo "WARNING: CVS server hostname is set and \$TESTDIR is not. If" >&2
- echo "$remotehost is not the local machine, then it is unlikely that" >&2
- echo "the default value assigned to \$TESTDIR will resolve to the same" >&2
- echo "directory on both this client and the CVS server." >&2
- fi
- ###
- ### GUTS
- ###
- # "debugger"
- #set -x
- echo 'This test should produce no other output than this message, and a final "OK".'
- echo '(Note that the test can take an hour or more to run and periodically stops'
- echo 'for as long as one minute. Do not assume there is a problem just because'
- echo 'nothing seems to happen for a long time. If you cannot live without'
- echo 'running status, use the -v option or try the command:'
- echo "\`tail -f check.log' from another window.)"
- # Regexp to match what CVS will call itself in output that it prints.
- # FIXME: we don't properly quote this--if the name contains . we'll
- # just spuriously match a few things; if the name contains other regexp
- # special characters we are probably in big trouble.
- PROG=`basename ${testcvs}`
- # Match the hostname
- hostname="[-_.a-zA-Z0-9]*"
- # Regexp to match the name of a temporary file (from cvs_temp_name).
- # This appears in certain diff output.
- tempname="[-a-zA-Z0-9/.%_]*"
- # Regexp to match a date in RFC822 format (as amended by RFC1123).
- RFCDATE="[a-zA-Z0-9 ][a-zA-Z0-9 ]* [0-9:][0-9:]* -0000"
- RFCDATE_EPOCH="1 Jan 1970 00:00:00 -0000"
- # Regexp to match a date in standard Unix format as used by rdiff
- # FIXCVS: There's no reason for rdiff to use a different date format
- # than diff does
- DATE="[a-zA-Z]* [a-zA-Z]* [ 1-3][0-9] [0-9:]* [0-9]*"
- # Which directories should Which and find_tool search for executables?
- SEARCHPATH=$PATH:/usr/local/bin:/usr/contrib/bin:/usr/contrib:/usr/gnu/bin:/local/bin:/local/gnu/bin:/gnu/bin:/sw/bin:/usr/pkg/bin
- # Do not assume that `type -p cmd` is portable
- # Usage: Which [-a] [-x|-f|-r] prog [$SEARCHPATH:/with/directories:/to/search]
- Which() {
- # Optional first argument for file type, defaults to -x.
- # Second argument is the file or directory to be found.
- # Third argument is the PATH to search.
- # By default, print only the first file that matches,
- # -a will cause all matches to be printed.
- notevery=:
- if [ "x$1" = "x-a" ]; then notevery=false; shift; fi
- case "$1" in
- -*) t=$1; shift ;;
- *) t=-x ;;
- esac
- case "$1" in
- # FIXME: Someday this may need to be fixed
- # to deal better with C:\some\path\to\ssh values...
- /*) test $t $1 && echo $1 ;;
- *) for d in `IFS=:; echo ${2-$SEARCHPATH}`
- do
- test $t $d/$1 && { echo $d/$1; if $notevery; then break; fi; }
- done
- ;;
- esac
- }
- # On cygwin32, we may not have /bin/sh.
- if test -r /bin/sh; then
- TESTSHELL="/bin/sh"
- else
- TESTSHELL=`Which -f sh`
- if test ! -r "$TESTSHELL"; then
- TESTSHELL="/bin/sh"
- fi
- fi
- # FIXME: try things (what things? checkins?) without -m.
- #
- # Some of these tests are written to expect -Q. But testing with
- # -Q is kind of bogus, it is not the way users actually use CVS (usually).
- # So new tests probably should invoke ${testcvs} directly, rather than ${CVS}.
- # and then they've obviously got to do something with the output....
- #
- CVS="${testcvs} -Q"
- LOGFILE=`pwd`/check.log
- # Save the previous log in case the person running the tests decides
- # they want to look at it. The extension ".plog" is chosen for consistency
- # with dejagnu.
- if test -f check.log; then
- mv check.log check.plog
- fi
- # Create the log file so check.log can be tailed almost immediately after
- # this script is started. Otherwise it can take up to a minute or two before
- # the log file gets created when $remotehost is specified on some systems,
- # which makes for a lot of failed `tail -f' attempts.
- touch check.log
- # Workaround any X11Forwarding by ssh. Otherwise this text:
- # Warning: No xauth data; using fake authentication data for X11 forwarding.
- # has been known to end up in the test results below
- # causing the test to fail.
- [ -n "$DISPLAY" ] && unset DISPLAY
-
- # The default value of /tmp/cvs-sanity for TESTDIR is dubious,
- # because it loses if two people/scripts try to run the tests
- # at the same time. Some possible solutions:
- # 1. Use /tmp/cvs-test$$. One disadvantage is that the old
- # cvs-test* directories would pile up, because they wouldn't
- # necessarily get removed.
- # 2. Have everyone/everything running the testsuite set
- # TESTDIR to some appropriate directory.
- # 3. Have the default value of TESTDIR be some variation of
- # `pwd`/cvs-sanity. The biggest problem here is that we have
- # been fairly careful to test that CVS prints in messages the
- # actual pathnames that we pass to it, rather than a different
- # pathname for the same directory, as may come out of `pwd`.
- # So this would be lost if everything was `pwd`-based. I suppose
- # if we wanted to get baroque we could start making symlinks
- # to ensure the two are different.
- : ${CVS_RSH=rsh}; export CVS_RSH
- if test -n "$remotehost"; then
- # We need to set $tmp on the server since $TMPDIR is compared against
- # messages generated by the server.
- tmp=`$CVS_RSH $remotehost 'cd /tmp; /bin/pwd || pwd' 2>/dev/null`
- if test $? != 0; then
- echo "$CVS_RSH $remotehost failed." >&2
- exit 1
- fi
- else
- tmp=`(cd /tmp; /bin/pwd || pwd) 2>/dev/null`
- fi
- # Now:
- # 1) Set TESTDIR if it's not set already
- # 2) Remove any old test remnants
- # 3) Create $TESTDIR
- # 4) Normalize TESTDIR with `cd && (/bin/pwd || pwd)`
- # (This will match CVS output later)
- : ${TESTDIR=$tmp/cvs-sanity}
- # clean any old remnants (we need the chmod because some tests make
- # directories read-only)
- if test -d ${TESTDIR}; then
- chmod -R a+wx ${TESTDIR}
- rm -rf ${TESTDIR}
- fi
- # These exits are important. The first time I tried this, if the `mkdir && cd`
- # failed then the build directory would get blown away. Some people probably
- # wouldn't appreciate that.
- mkdir ${TESTDIR} || exit 1
- cd ${TESTDIR} || exit 1
- # Ensure $TESTDIR is absolute
- if echo "${TESTDIR}" |grep '^[^/]'; then
- # Don't resolve this unless we have to. This keeps symlinks intact. This
- # is important at least when testing using -h $remotehost, because the same
- # value for $TESTDIR must resolve to the same directory on the client and
- # the server and we likely used Samba, and possibly symlinks, to do this.
- TESTDIR=`(/bin/pwd || pwd) 2>/dev/null`
- fi
- if test -z "${TESTDIR}" || echo "${TESTDIR}" |grep '^[^/]'; then
- echo "Unable to resolve TESTDIR to an absolute directory." >&2
- exit 1
- fi
- cd ${TESTDIR}
- # Now set $TMPDIR if the user hasn't overridden it.
- #
- # We use a $TMPDIR under $TESTDIR by default so that two tests may be run at
- # the same time without bumping heads without requiring the user to specify
- # more than $TESTDIR. See the test for leftover cvs-serv* directories near the
- # end of this script at the end of "The big loop".
- : ${TMPDIR=$TESTDIR/tmp}
- export TMPDIR
- if test -d $TMPDIR; then :; else
- mkdir $TMPDIR
- fi
- # Make sure various tools work the way we expect, or try to find
- # versions that do.
- : ${AWK=awk}
- : ${EXPR=expr}
- : ${ID=id}
- : ${TR=tr}
- # Keep track of tools that are found, but do NOT work as we hope
- # in order to avoid them in future
- badtools=
- set_bad_tool ()
- {
- badtools=$badtools:$1
- }
- is_bad_tool ()
- {
- case ":$badtools:" in *:$1:*) return 0 ;; *) return 1 ; esac
- }
- version_test ()
- {
- vercmd=$1
- verbad=:
- if RES=`$vercmd --version </dev/null 2>&1`; then
- if test "X$RES" != "X--version" && test "X$RES" != "X" ; then
- echo "$RES"
- verbad=false
- fi
- fi
- if $verbad; then
- echo "The command \`$vercmd' does not support the --version option."
- fi
- # It does not really matter that --version is not supported
- return 0
- }
- # Try to find a tool that satisfies all of the tests.
- # Usage: list:of:colon:separated:alternatives test1 test2 test3 test4...
- # Example: find_tool awk:gawk:nawk awk_tooltest1 awk_tooltest2
- find_tool ()
- {
- default_TOOL=$1
- echo find_tool: ${1+"$@"} >>$LOGFILE
- cmds="`IFS=:; echo $1`"; shift; tooltests="${1+$@}"
- if test -z "$tooltests"; then tooltests=version_test; fi
- clist=; for cmd in $cmds; do clist="$clist `Which -a $cmd`"; done
- # Make sure the default tool is just the first real command name
- for default_TOOL in $clist `IFS=:; echo $default_TOOL`; do break; done
- TOOL=""
- for trytool in $clist ; do
- pass=:
- for tooltest in $tooltests; do
- result=`eval $tooltest $trytool`
- rc=$?
- echo "Running $tooltest $trytool" >>$LOGFILE
- if test -n "$result"; then
- echo "$result" >>$LOGFILE
- fi
- if test "$rc" = "0"; then
- echo "PASS: $tooltest $trytool" >>$LOGFILE
- elif test "$rc" = "77"; then
- echo "MARGINAL: $tooltest $trytool; rc=$rc" >>$LOGFILE
- TOOL=$trytool
- pass=false
- else
- set_bad_tool $trytool
- echo "FAIL: $tooltest $trytool; rc=$rc" >>$LOGFILE
- pass=false
- fi
- done
- if $pass; then
- echo $trytool
- return 0
- fi
- done
- if test -n "$TOOL"; then
- echo "Notice: The default version of \`$default_TOOL' is defective." >>$LOGFILE
- echo "using \`$TOOL' and hoping for the best." >>$LOGFILE
- echo "Notice: The default version of \`$default_TOOL' is defective." >&2
- echo "using \`$TOOL' and hoping for the best." >&2
- echo $TOOL
- else
- echo $default_TOOL
- fi
- }
- id_tool_test ()
- {
- id=$1
- if $id -u >/dev/null 2>&1 && $id -un >/dev/null 2>&1; then
- return 0
- else
- echo "Running these tests requires an \`id' program that understands the"
- echo "-u and -n flags. Make sure that such an id (GNU, or many but not"
- echo "all vendor-supplied versions) is in your path."
- return 1
- fi
- }
- ID=`find_tool id version_test id_tool_test`
- echo "Using ID=$ID" >>$LOGFILE
- # You can't run CVS as root; print a nice error message here instead
- # of somewhere later, after making a mess.
- for pass in false :; do
- case "`$ID -u 2>/dev/null`" in
- "0")
- echo "Test suite does not work correctly when run as root" >&2
- exit 1
- ;;
- *)
- break
- ;;
- esac
- done
- # Cause NextStep 3.3 users to lose in a more graceful fashion.
- expr_tooltest1 ()
- {
- expr=$1
- if $expr 'abc
- def' : 'abc
- def' >/dev/null; then
- # good, it works
- return 0
- else
- echo 'Running these tests requires an "expr" program that can handle'
- echo 'multi-line patterns. Make sure that such an expr (GNU, or many but'
- echo 'not all vendor-supplied versions) is in your path.'
- return 1
- fi
- }
- # Warn SunOS, SysVr3.2, etc., users that they may be partially losing
- # if we can't find a GNU expr to ease their troubles...
- expr_tooltest2 ()
- {
- expr=$1
- if $expr 'a
- b' : 'a
- c' >/dev/null; then
- echo 'WARNING: you are using a version of expr that does not correctly'
- echo 'match multi-line patterns. Some tests may spuriously pass or fail.'
- echo 'You may wish to make sure GNU expr is in your path.'
- return 1
- else
- return 0
- fi
- }
- expr_create_bar ()
- {
- echo 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' >${TESTDIR}/foo
- cat ${TESTDIR}/foo ${TESTDIR}/foo ${TESTDIR}/foo ${TESTDIR}/foo >${TESTDIR}/bar
- cat ${TESTDIR}/bar ${TESTDIR}/bar ${TESTDIR}/bar ${TESTDIR}/bar >${TESTDIR}/foo
- cat ${TESTDIR}/foo ${TESTDIR}/foo ${TESTDIR}/foo ${TESTDIR}/foo >${TESTDIR}/bar
- rm -f ${TESTDIR}/foo
- }
- expr_tooltest3 ()
- {
- expr=$1
- # More SunOS lossage...
- test ! -f ${TESTDIR}/bar && expr_create_bar
- if $expr "`cat ${TESTDIR}/bar`" : "`cat ${TESTDIR}/bar`" >/dev/null; then
- : good, it works
- else
- echo 'WARNING: you are using a version of expr that does not correctly'
- echo 'match large patterns. Some tests may spuriously pass or fail.'
- echo 'You may wish to make sure GNU expr is in your path.'
- return 1
- fi
- if $expr "`cat ${TESTDIR}/bar`x" : "`cat ${TESTDIR}/bar`y" >/dev/null; then
- echo 'WARNING: you are using a version of expr that does not correctly'
- echo 'match large patterns. Some tests may spuriously pass or fail.'
- echo 'You may wish to make sure GNU expr is in your path.'
- return 1
- fi
- # good, it works
- return 0
- }
- # That we should have to do this is total bogosity, but GNU expr
- # version 1.9.4-1.12 uses the emacs definition of "$" instead of the unix
- # (e.g. SunOS 4.1.3 expr) one. Rumor has it this will be fixed in the
- # next release of GNU expr after 1.12 (but we still have to cater to the old
- # ones for some time because they are in many linux distributions).
- ENDANCHOR="$"
- expr_set_ENDANCHOR ()
- {
- expr=$1
- ENDANCHOR="$"
- if $expr 'abc
- def' : 'abc$' >/dev/null; then
- ENDANCHOR='\'\'
- echo "Notice: An ENDANCHOR of dollar does not work."
- echo "Using a workaround for GNU expr versions 1.9.4 thru 1.12"
- fi
- return 0
- }
- # Work around another GNU expr (version 1.10-1.12) bug/incompatibility.
- # "." doesn't appear to match a newline (it does with SunOS 4.1.3 expr).
- # Note that the workaround is not a complete equivalent of .* because
- # the first parenthesized expression in the regexp must match something
- # in order for expr to return a successful exit status.
- # Rumor has it this will be fixed in the
- # next release of GNU expr after 1.12 (but we still have to cater to the old
- # ones for some time because they are in many linux distributions).
- DOTSTAR='.*'
- expr_set_DOTSTAR ()
- {
- expr=$1
- DOTSTAR='.*'
- if $expr 'abc
- def' : "a${DOTSTAR}f" >/dev/null; then
- : good, it works
- else
- DOTSTAR='\(.\|
- \)*'
- echo "Notice: DOTSTAR changed from sane \`.*' value to \`$DOTSTAR\`"
- echo "to workaround GNU expr version 1.10 thru 1.12 bug where \`.'"
- echo "does not match a newline."
- fi
- return 0
- }
- # Now that we have DOTSTAR, make sure it works with big matches
- expr_tooltest_DOTSTAR ()
- {
- expr=$1
- test ! -f ${TESTDIR}/bar && expr_create_bar
- if $expr "`cat ${TESTDIR}/bar`" : "${DOTSTAR}xyzABC${DOTSTAR}$" >/dev/null; then
- # good, it works
- return 0
- else
- echo 'WARNING: you are using a version of expr that does not correctly'
- echo 'match large patterns. Some tests may spuriously pass or fail.'
- echo 'You may wish to make sure GNU expr is in your path.'
- return 77
- fi
- }
- # FreeBSD 5.2 and 6.1 support 'expr [-e] expression'
- # They get confused unless '--' is used before the expressions
- # when those expressions begin with a '-' character, such as the
- # output of an ls -l command. The EXPR_COMPAT environment variable may
- # be used to go back to the non-POSIX behavior as an alternative.
- # (GNU expr appears to accept the '--' argument and work correctly or
- # not have it and still get the results we want.)
- exprDASHDASH='false'
- expr_set_DASHDASH ()
- {
- expr=$1
- exprDASHDASH='false'
- # Not POSIX, but works on a lot of expr versions.
- if $expr "-rw-rw-r--" : "-rw-rw-r--" >/dev/null 2>&1; then
- # good, it works
- return 0
- else
- # Do things in the POSIX manner.
- if $expr -- "-rw-rw-r--" : "-rw-rw-r--" >/dev/null 2>&1; then
- exprDASHDASH=':'
- return 0
- else
- echo 'WARNING: Your $expr does not correctly handle'
- echo 'leading "-" characters in regular expressions to'
- echo 'be matched. You may wish to see if there is an'
- echo 'environment variable or other setting to allow'
- echo 'POSIX functionality to be enabled.'
- return 77
- fi
- fi
- }
- EXPR=`find_tool ${EXPR}:gexpr \
- version_test expr_tooltest1 expr_tooltest2 expr_tooltest3 \
- expr_set_ENDANCHOR expr_set_DOTSTAR expr_tooltest_DOTSTAR`
- # Set the ENDANCHOR and DOTSTAR for the chosen expr version.
- expr_set_ENDANCHOR ${EXPR} >/dev/null
- expr_tooltest_DOTSTAR ${EXPR} >/dev/null
- # Is $EXPR a POSIX or non-POSIX implementation
- # with regard to command-line arguments?
- expr_set_DASHDASH ${EXPR}
- $exprDASHDASH && EXPR="$EXPR --"
- echo "Using EXPR=$EXPR" >>$LOGFILE
- echo "Using ENDANCHOR=$ENDANCHOR" >>$LOGFILE
- echo "Using DOTSTAR=$DOTSTAR" >>$LOGFILE
- # Cleanup
- rm -f ${TESTDIR}/bar
- # Work around yet another GNU expr (version 1.10) bug/incompatibility.
- # "+" is a special character, yet for unix expr (e.g. SunOS 4.1.3)
- # it is not. I doubt that POSIX allows us to use \+ and assume it means
- # (non-special) +, so here is another workaround
- # Rumor has it this will be fixed in the
- # next release of GNU expr after 1.12 (but we still have to cater to the old
- # ones for some time because they are in many linux distributions).
- PLUS='+'
- if $EXPR 'a +b' : "a ${PLUS}b" >/dev/null; then
- : good, it works
- else
- PLUS='\+'
- fi
- # Likewise, for ?
- QUESTION='?'
- if $EXPR 'a?b' : "a${QUESTION}b" >/dev/null; then
- : good, it works
- else
- QUESTION='\?'
- fi
- # Now test the username to make sure it contains only valid characters
- username=`$ID -un`
- if $EXPR "${username}" : "${username}" >/dev/null; then
- : good, it works
- else
- echo "Test suite does not work correctly when run by a username" >&2
- echo "containing regular expression meta-characters." >&2
- exit 1
- fi
- # Only 8 characters of $username appear in some output.
- if test `echo $username |wc -c` -gt 8; then
- username8=`echo $username |sed 's/^\(........\).*/\1/'`
- else
- username8=$username
- fi
- # Rarely, we need to match any username, not just the name of the user
- # running this test.
- #
- # I'm not really sure what characters should be here. a-zA-Z obviously.
- # People complained when 0-9 were not allowed in usernames. Other than that
- # I'm not sure.
- anyusername="[-a-zA-Z0-9][-a-zA-Z0-9]*"
- # now make sure that tr works on NULs
- tr_tooltest1 ()
- {
- tr=$1
- if $EXPR `echo "123" | $tr '2' '\0'` : "123" >/dev/null 2>&1; then
- echo 'Warning: you are using a version of tr which does not correctly'
- echo 'handle NUL bytes. Some tests may spuriously pass or fail.'
- echo 'You may wish to make sure GNU tr is in your path.'
- return 77
- fi
- # good, it works
- return 0
- }
- TR=`find_tool ${TR}:gtr version_test tr_tooltest1`
- echo "Using TR=$TR" >>$LOGFILE
- # Awk testing
- awk_tooltest1 ()
- {
- awk=$1
- $awk 'BEGIN {printf("one\ntwo\nthree\nfour\nfive\nsix")}' </dev/null >abc
- if $EXPR "`cat abc`" : \
- 'one
- two
- three
- four
- five
- six'; then
- rm abc
- return 0
- else
- rm abc
- echo "Notice: awk BEGIN clause or printf is not be working properly."
- return 1
- fi
- }
- # Format item %c check
- awk_tooltest2 ()
- {
- awk=$1
- $awk 'BEGIN { printf "%c%c%c", 2, 3, 4 }' </dev/null \
- | ${TR} '\002\003\004' '123' >abc
- if $EXPR "`cat abc`" : "123" ; then
- : good, found it
- else
- echo "Notice: awk format %c string may not be working properly."
- rm abc
- return 77
- fi
- rm abc
- return 0
- }
- AWK=`find_tool gawk:nawk:awk version_test awk_tooltest1 awk_tooltest2`
- echo "Using AWK=$AWK" >>$LOGFILE
- # Test that $1 works as a remote shell. If so, set $host, $CVS_RSH, &
- # $save_CVS_RSH to match and return 0. Otherwise, set $skipreason and return
- # 77.
- depends_on_rsh ()
- {
- host=${remotehost-"`hostname`"}
- result=`$1 $host 'echo test'`
- rc=$?
- if test $? != 0 || test "x$result" != "xtest"; then
- skipreason="\`$1 $host' failed rc=$rc result=$result"
- return 77
- fi
- save_CVS_RSH=$CVS_RSH
- CVS_RSH=$1; export CVS_RSH
- return 0
- }
- # Find a usable SSH. When a usable ssh is found, set $host, $CVS_RSH, and
- # $save_CVS_RSH and return 0. Otherwise, set $skipreason and return 77.
- depends_on_ssh ()
- {
- case "$CVS_RSH" in
- *ssh*|*putty*)
- tryssh=`Which $CVS_RSH`
- if [ ! -n "$tryssh" ]; then
- skipreason="Unable to find CVS_RSH=$CVS_RSH executable"
- return 77
- elif [ ! -x "$tryssh" ]; then
- skipreason="Unable to execute $tryssh program"
- return 77
- fi
- ;;
- *)
- # Look in the user's PATH for "ssh"
- tryssh=`Which ssh`
- if test ! -r "$tryssh"; then
- skipreason="Unable to find ssh program"
- return 77
- fi
- ;;
- esac
- depends_on_rsh "$tryssh"
- return $?
- }
- pass ()
- {
- echo "PASS: $1" >>${LOGFILE}
- passed=`expr $passed + 1`
- }
- # Like skip(), but don't fail when $skipfail is set.
- skip_always ()
- {
- echo "SKIP: $1${2+ ($2)}" >>$LOGFILE
- skipped=`expr $skipped + 1`
- }
- skip ()
- {
- if $skipfail; then
- fail "$1${2+ ($2)}"
- else
- echo "SKIP: $1${2+ ($2)}" >>$LOGFILE
- fi
- skipped=`expr $skipped + 1`
- }
- warn ()
- {
- if $skipfail; then
- fail "$1${2+ ($2)}"
- else
- echo "WARNING: $1${2+ ($2)}" >>$LOGFILE
- fi
- warnings=`expr $warnings + 1`
- }
- # Convenience function for skipping tests run only in local mode.
- localonly ()
- {
- skip_always $1 "only tested in local mode"
- }
- fail ()
- {
- echo "FAIL: $1" | tee -a ${LOGFILE}
- echo "*** Please see the \`TESTS' and \`check.log' files for more information." >&2
- # This way the tester can go and see what remnants were left
- exit 1
- }
- verify_tmp_empty ()
- {
- # Test our temp directory for cvs-serv* directories and cvsXXXXXX temp
- # files. We would like to not leave any behind.
- if $remote && ls $TMPDIR/cvs-serv* >/dev/null 2>&1; then
- # A true value means ls found files/directories with these names.
- # Give the server some time to finish, then retry.
- sleep 1
- if ls $TMPDIR/cvs-serv* >/dev/null 2>&1; then
- warn "$1" "Found cvs-serv* directories in $TMPDIR."
- # The above will exit if $skipfail
- rm -rf $TMPDIR/cvs-serv*
- fi
- fi
- if ls $TMPDIR/cvs?????? >/dev/null 2>&1; then
- # A true value means ls found files/directories with these names.
- warn "$1" "Found cvsXXXXXX temp files in $TMPDIR."
- # The above will exit if $skipfail
- rm -f ls $TMPDIR/cvs??????
- fi
- }
- # Restore changes to CVSROOT admin files.
- restore_adm ()
- {
- rm -rf $CVSROOT_DIRNAME/CVSROOT
- cp -Rp $TESTDIR/CVSROOT.save $CVSROOT_DIRNAME/CVSROOT
- }
- # See dotest and dotest_fail for explanation (this is the parts
- # of the implementation common to the two).
- dotest_internal ()
- {
- if $EXPR "`cat ${TESTDIR}/dotest.tmp`" : "$3${ENDANCHOR}" >/dev/null; then
- # Why, I hear you ask, do we write this to the logfile
- # even when the test passes? The reason is that the test
- # may give us the regexp which we were supposed to match,
- # but sometimes it may be useful to look at the exact
- # text which was output. For example, suppose one wants
- # to grep for a particular warning, and make _sure_ that
- # CVS never hits it (even in cases where the tests might
- # match it with .*). Or suppose one wants to see the exact
- # date format output in a certain case (where the test will
- # surely use a somewhat non-specific pattern).
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- pass "$1"
- verify_tmp_empty "$1"
- # expr can't distinguish between "zero characters matched" and "no match",
- # so special-case it.
- elif test -z "$3" && test ! -s ${TESTDIR}/dotest.tmp; then
- pass "$1"
- verify_tmp_empty "$1"
- elif test x"$4" != x; then
- if $EXPR "`cat ${TESTDIR}/dotest.tmp`" : "$4${ENDANCHOR}" >/dev/null; then
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- pass "$1"
- verify_tmp_empty "$1"
- else
- echo "** expected: " >>${LOGFILE}
- echo "$3" >>${LOGFILE}
- echo "$3" > ${TESTDIR}/dotest.ex1
- echo "** or: " >>${LOGFILE}
- echo "$4" >>${LOGFILE}
- echo "$4" > ${TESTDIR}/dotest.ex2
- echo "** got: " >>${LOGFILE}
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- fail "$1"
- fi
- else
- echo "** expected: " >>${LOGFILE}
- echo "$3" >>${LOGFILE}
- echo "$3" > ${TESTDIR}/dotest.exp
- echo "** got: " >>${LOGFILE}
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- fail "$1"
- fi
- }
- dotest_all_in_one ()
- {
- if $EXPR "`cat ${TESTDIR}/dotest.tmp`" : \
- "`cat ${TESTDIR}/dotest.exp`" >/dev/null; then
- return 0
- fi
- return 1
- }
- # WARNING: this won't work with REs that match newlines....
- #
- dotest_line_by_line ()
- {
- line=1
- while [ $line -le `wc -l <${TESTDIR}/dotest.tmp` ] ; do
- if $EXPR "`sed -n ${line}p ${TESTDIR}/dotest.tmp`" : \
- "`sed -n ${line}p ${TESTDIR}/dotest.exp`" >/dev/null; then
- :
- elif test -z "`sed -n ${line}p ${TESTDIR}/dotest.tmp`" &&
- test -z "`sed -n ${line}p ${TESTDIR}/dotest.exp`"; then
- :
- else
- echo "Line $line:" >> ${LOGFILE}
- echo "**** expected: " >>${LOGFILE}
- sed -n ${line}p ${TESTDIR}/dotest.exp >>${LOGFILE}
- echo "**** got: " >>${LOGFILE}
- sed -n ${line}p ${TESTDIR}/dotest.tmp >>${LOGFILE}
- unset line
- return 1
- fi
- line=`expr $line + 1`
- done
- unset line
- return 0
- }
- # If you are having trouble telling which line of a multi-line
- # expression is not being matched, replace calls to dotest_internal()
- # with calls to this function:
- #
- dotest_internal_debug ()
- {
- if test -z "$3"; then
- if test -s ${TESTDIR}/dotest.tmp; then
- echo "** expected: " >>${LOGFILE}
- echo "$3" >>${LOGFILE}
- echo "$3" > ${TESTDIR}/dotest.exp
- rm -f ${TESTDIR}/dotest.ex2
- echo "** got: " >>${LOGFILE}
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- fail "$1"
- else
- pass "$1"
- verify_tmp_empty "$1"
- fi
- else
- echo "$3" > ${TESTDIR}/dotest.exp
- if dotest_line_by_line "$1" "$2"; then
- pass "$1"
- verify_tmp_empty "$1"
- else
- if test x"$4" != x; then
- mv ${TESTDIR}/dotest.exp ${TESTDIR}/dotest.ex1
- echo "$4" > ${TESTDIR}/dotest.exp
- if dotest_line_by_line "$1" "$2"; then
- pass "$1"
- verify_tmp_empty "$1"
- else
- mv ${TESTDIR}/dotest.exp ${TESTDIR}/dotest.ex2
- echo "** expected: " >>${LOGFILE}
- echo "$3" >>${LOGFILE}
- echo "** or: " >>${LOGFILE}
- echo "$4" >>${LOGFILE}
- echo "** got: " >>${LOGFILE}
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- fail "$1"
- fi
- else
- echo "** expected: " >>${LOGFILE}
- echo "$3" >>${LOGFILE}
- echo "** got: " >>${LOGFILE}
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- fail "$1"
- fi
- fi
- fi
- }
- # Usage:
- # dotest TESTNAME COMMAND OUTPUT [OUTPUT2]
- # TESTNAME is the name used in the log to identify the test.
- # COMMAND is the command to run; for the test to pass, it exits with
- # exitstatus zero.
- # OUTPUT is a regexp which is compared against the output (stdout and
- # stderr combined) from the test. It is anchored to the start and end
- # of the output, so should start or end with ".*" if that is what is desired.
- # Trailing newlines are stripped from the command's actual output before
- # matching against OUTPUT.
- # If OUTPUT2 is specified and the output matches it, then it is also
- # a pass (partial workaround for the fact that some versions of expr
- # lack \|).
- dotest ()
- {
- rm -f ${TESTDIR}/dotest.ex? 2>&1
- eval "$2" >${TESTDIR}/dotest.tmp 2>&1
- status=$?
- if test "$status" != 0; then
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- echo "exit status was $status" >>${LOGFILE}
- fail "$1"
- fi
- dotest_internal "$@"
- }
- # Like dotest except only 2 args and result must exactly match stdin
- dotest_lit ()
- {
- rm -f ${TESTDIR}/dotest.ex? 2>&1
- eval "$2" >${TESTDIR}/dotest.tmp 2>&1
- status=$?
- if test "$status" != 0; then
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- echo "exit status was $status" >>${LOGFILE}
- fail "$1"
- fi
- cat >${TESTDIR}/dotest.exp
- if cmp ${TESTDIR}/dotest.exp ${TESTDIR}/dotest.tmp >/dev/null 2>&1; then
- pass "$1"
- verify_tmp_empty "$1"
- else
- echo "** expected: " >>${LOGFILE}
- cat ${TESTDIR}/dotest.exp >>${LOGFILE}
- echo "** got: " >>${LOGFILE}
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- fail "$1"
- fi
- }
- # Like dotest except exitstatus should be nonzero.
- dotest_fail ()
- {
- rm -f ${TESTDIR}/dotest.ex? 2>&1
- eval "$2" >${TESTDIR}/dotest.tmp 2>&1
- status=$?
- if test "$status" = 0; then
- cat ${TESTDIR}/dotest.tmp >>${LOGFILE}
- echo "exit status was $status" >>${LOGFILE}
- fail "$1"
- fi
- dotest_internal "$@"
- }
- # Like dotest except output is sorted.
- dotest_sort ()
- {
- rm -f ${TESTDIR}/dotest.ex? 2>&1
- eval "$2" >${TESTDIR}/dotest.tmp1 2>&1
- status=$?
- if test "$status" != 0; then
- cat ${TESTDIR}/dotest.tmp1 >>${LOGFILE}
- echo "exit status was $status" >>${LOGFILE}
- fail "$1"
- fi
- ${TR} ' ' ' ' < ${TESTDIR}/dotest.tmp1 | sort > ${TESTDIR}/dotest.tmp
- dotest_internal "$@"
- }
- # A function for fetching the timestamp of a revison of a file
- getrlogdate () {
- ${testcvs} -n rlog -N ${1+"$@"} |
- while read token value; do
- case "$token" in
- date:)
- echo $value | sed "s,;.*,,"
- break;
- ;;
- esac
- done
- }
- # Avoid picking up any stray .cvsrc, etc., from the user running the tests
- mkdir home
- HOME=${TESTDIR}/home; export HOME
- # Make sure this variable is not defined to anything that would
- # change the format of rcs dates. Otherwise people using e.g.,
- # RCSINIT=-zLT get lots of spurious failures.
- RCSINIT=; export RCSINIT
- # Remaining arguments are the names of tests to run.
- #
- # The testsuite is broken up into (hopefully manageably-sized)
- # independently runnable tests, so that one can quickly get a result
- # from a cvs or testsuite change, and to facilitate understanding the
- # tests.
- if test x"$*" = x; then
- # Basic/miscellaneous functionality
- tests="version basica basicb basicc basic1 deep basic2"
- tests="${tests} parseroot parseroot2 files spacefiles commit-readonly"
- tests="${tests} commit-add-missing"
- tests="$tests add-restricted"
- tests="${tests} status"
- # Branching, tagging, removing, adding, multiple directories
- tests="${tests} rdiff rdiff-short"
- tests="${tests} rdiff2 diff diffnl death death2 death-rtag"
- tests="${tests} rm-update-message rmadd rmadd2 rmadd3 resurrection"
- tests="${tests} dirs dirs2 branches branches2 tagc tagf "
- tests="${tests} tag-log tag-space"
- tests="${tests} rcslib multibranch import importb importc import-CVS"
- tests="$tests import-quirks"
- tests="${tests} update-p import-after-initial branch-after-import"
- tests="${tests} join join2 join3 join4 join5 join6 join7 join8 join9"
- tests="${tests} join-readonly-conflict join-admin join-admin-2"
- tests="${tests} join-rm"
- tests="${tests} new newb conflicts conflicts2 conflicts3 conflicts4"
- tests="${tests} clean"
- # Checking out various places (modules, checkout -d, &c)
- tests="${tests} modules modules2 modules3 modules4 modules5 modules6"
- tests="${tests} modules7 mkmodules co-d"
- tests="${tests} cvsadm emptydir abspath abspath2 toplevel toplevel2"
- tests="${tests} rstar-toplevel trailingslashes checkout_repository"
- # Log messages, error messages.
- tests="${tests} mflag editor errmsg1 errmsg2 adderrmsg opterrmsg"
- # Watches, binary files, history browsing, &c.
- tests="${tests} devcom devcom2 devcom3 watch4 watch5 watch6"
- tests="${tests} unedit-without-baserev"
- tests="${tests} ignore ignore-on-branch binfiles binfiles2 binfiles3"
- tests="${tests} mcopy binwrap binwrap2"
- tests="${tests} binwrap3 mwrap info taginfo config"
- tests="${tests} serverpatch log log2 logopt ann ann-id"
- # Repository Storage (RCS file format, CVS lock files, creating
- # a repository without "cvs init", &c).
- tests="${tests} crerepos crerepos-extssh rcs rcs2 rcs3 rcs4 rcs5 rcs6"
- tests="$tests lockfiles backuprecover"
- tests="${tests} sshstdio"
- # More history browsing, &c.
- tests="${tests} history"
- tests="${tests} big modes modes2 modes3 stamps"
- # PreservePermissions stuff: permissions, symlinks et al.
- # tests="${tests} perms symlinks symlinks2 hardlinks"
- # More tag and branch tests, keywords.
- tests="${tests} sticky keyword keywordlog keywordname keyword2"
- tests="${tests} head tagdate multibranch2 tag8k"
- # "cvs admin", reserved checkouts.
- tests="${tests} admin reserved"
- # Nuts and bolts of diffing/merging (diff library, &c)
- tests="${tests} diffmerge1 diffmerge2"
- # Release of multiple directories
- tests="${tests} release"
- tests="${tests} recase"
- # Multiple root directories and low-level protocol tests.
- tests="${tests} multiroot multiroot2 multiroot3 multiroot4"
- tests="$tests rmroot reposmv pserver server server2 server3"
- tests="$tests client client2"
- tests="${tests} dottedroot fork commit-d"
- else
- tests="$*"
- fi
- # Now check the -f argument for validity.
- if test -n "$fromtest"; then
- # Don't allow spaces - they are our delimiters in tests
- count=0
- for sub in $fromtest; do
- count=`expr $count + 1`
- done
- if test $count != 1; then
- echo "No such test \`$fromtest'." >&2
- exit 2
- fi
- # make sure it is in $tests
- case " $tests " in
- *" $fromtest "*)
- ;;
- *)
- echo "No such test \`$fromtest'." >&2
- exit 2
- ;;
- esac
- fi
- # a simple function to compare directory contents
- #
- # Returns: 0 for same, 1 for different
- #
- directory_cmp ()
- {
- OLDPWD=`pwd`
- DIR_1=$1
- DIR_2=$2
- cd $DIR_1
- find . -print | fgrep -v /CVS | sort > $TESTDIR/dc$$d1
- # go back where we were to avoid symlink hell...
- cd $OLDPWD
- cd $DIR_2
- find . -print | fgrep -v /CVS | sort > $TESTDIR/dc$$d2
- if diff $TESTDIR/dc$$d1 $TESTDIR/dc$$d2 >/dev/null 2>&1
- then
- :
- else
- return 1
- fi
- cd $OLDPWD
- while read a
- do
- if test -f $DIR_1/"$a" ; then
- cmp -s $DIR_1/"$a" $DIR_2/"$a"
- if test $? -ne 0 ; then
- return 1
- fi
- fi
- done < $TESTDIR/dc$$d1
- rm -f $TESTDIR/dc$$*
- return 0
- }
- #
- # The following 4 functions are used by the diffmerge1 test case. They set up,
- # respectively, the four versions of the files necessary:
- #
- # 1. Ancestor revisions.
- # 2. "Your" changes.
- # 3. "My" changes.
- # 4. Expected merge result.
- #
- # Create ancestor revisions for diffmerge1
- diffmerge_create_older_files() {
- # This test case was supplied by Noah Friedman:
- cat >testcase01 <<EOF
- // Button.java
- package random.application;
- import random.util.*;
- public class Button
- {
- /* Instantiates a Button with origin (0, 0) and zero width and height.
- * You must call an initializer method to properly initialize the Button.
- */
- public Button ()
- {
- super ();
- _titleColor = Color.black;
- _disabledTitleColor = Color.gray;
- _titleFont = Font.defaultFont ();
- }
- /* Convenience constructor for instantiating a Button with
- * bounds x, y, width, and height. Equivalent to
- * foo = new Button ();
- * foo.init (x, y, width, height);
- */
- public Button (int x, int y, int width, int height)
- {
- this ();
- init (x, y, width, height);
- }
- }
- EOF
- # This test case was supplied by Jacob Burckhardt:
- cat >testcase02 <<EOF
- a
- a
- a
- a
- a
- EOF
- # This test case was supplied by Karl Tomlinson who also wrote the
- # patch which lets CVS correctly handle this and several other cases:
- cat >testcase03 <<EOF
- x
- s
- a
- b
- s
- y
- EOF
- # This test case was supplied by Karl Tomlinson:
- cat >testcase04 <<EOF
- s
- x
- m
- m
- x
- s
- v
- s
- x
- m
- m
- x
- s
- EOF
- # This test case was supplied by Karl Tomlinson:
- cat >testcase05 <<EOF
- s
- x
- m
- m
- x
- x
- x
- x
- x
- x
- x
- x
- x
- x
- s
- s
- s
- s
- s
- s
- s
- s
- s
- s
- v
- EOF
- # This test case was supplied by Jacob Burckhardt:
- cat >testcase06 <<EOF
- g
- i
- EOF
- # This test is supposed to verify that the horizon lines are the same
- # for both 2-way diffs, but unfortunately, it does not fail with the
- # old version of cvs. However, Karl Tomlinson still thought it would
- # be good to test it anyway:
- cat >testcase07 <<EOF
- h
- f
- g
- r
- i
- i
- EOF
- # This test case was supplied by Jacob Burckhardt:
- cat >testcase08 <<EOF
- Both changes move this line to the end of the file.
- no
- changes
- here
- First change will delete this line.
- First change will also delete this line.
- no
- changes
- here
- Second change will change it here.
- no
- changes
- here
- EOF
- # This test case was supplied by Jacob Burckhardt. Note that I do not
- # think cvs has ever failed with this case, but I include it anyway,
- # since I think it is a hard case. It is hard because Peter Miller's
- # fmerge utility fails on it:
- cat >testcase09 <<EOF
- m
- a
- {
- }
- b
- {
- }
- EOF
- # This test case was supplied by Martin Dorey and simplified by Jacob
- # Burckhardt:
- cat >testcase10 <<EOF
- petRpY ( MtatRk );
- fV ( MtatRk != Zy ) UDTXUK_DUUZU ( BGKT_ZFDK_qjT_HGTG );
- MtatRk = MQfr_GttpfIRte_MtpeaL ( &acI, jfle_Uecopd_KRLIep * jfle_Uecopd_MfJe_fY_nEtek );
- OjZy MtatRk = Uead_GttpfIRte_MtpeaL ( &acI, jfle_Uecopd_MfJe_fY_nEtek, nRVVep );
- Bloke_GttpfIRte_MtpeaL ( &acI );
- MTGTXM Uead_Ktz_qjT_jfle_Uecopd ( fYt Y, uofd *nRVVep )
- {
- fV ( Y < 16 )
- {
- petRpY ( Uead_Mectopk ( noot_Uecopd.qVtHatabcY0 * noot_Uecopd.MectopkFepBlRktep +
- Y * jfle_Uecopd_MfJe_fY_Mectopk,
- jfle_Uecopd_MfJe_fY_Mectopk,
- nRVVep ) );
- }
- elke
- {
- petRpY ( Uead_Mectopk ( noot_Uecopd.qVtqfppHatabcY0 * noot_Uecopd.MectopkFepBlRktep +
- ( Y - 16 ) * jfle_Uecopd_MfJe_fY_Mectopk,
- jfle_Uecopd_MfJe_fY_Mectopk,
- nRVVep ) );
- }
- }
- /****************************************************************************
- * *
- * Uead Mectopk ( Uelatfue to tze cRppeYt raptftfoY ) *
- * *
- ****************************************************************************/
- MTGTXM Uead_Mectopk ( RfYt64 Mtapt_Mectop, RfYt64 KRL_Mectopk, uofd *nRVVep )
- {
- MTGTXM MtatRk = Zy;
- MtatRk = Uead_HfkQ ( FaptftfoY_TaIle.Uelatfue_Mectop + Mtapt_Mectop, KRL_Mectopk, nRVVep );
- petRpY ( MtatRk );
- }
- HfkQipfte ( waYdle, /* waYdle */
- waYdleFok, /* ZVVket VpoL ktapt oV dfkQ */
- (coYkt RfYt8*) nRVVep, /* nRVVep */
- 0, /* MRrepVlRoRk KfxoYfkL */
- beYgtz /* nEtek to Apfte */
- );
- petRpY ( Zy );
- }
- EOF
- }
- # Create "your" revisions for diffmerge1
- diffmerge_create_your_files() {
- # remove the Button() method
- cat >testcase01 <<\EOF
- // Button.java
- package random.application;
- import random.util.*;
- public class Button
- {
- /* Instantiates a Button with origin (0, 0) and zero width and height.
- * You must call an initializer method to properly initialize the Button.
- */
- public Button ()
- {
- super ();
- _titleColor = Color.black;
- _disabledTitleColor = Color.gray;
- _titleFont = Font.defaultFont ();
- }
- }
- EOF
- cat >testcase02 <<\EOF
- y
- a
- a
- a
- a
- EOF
- cat >testcase03 <<\EOF
- x
- s
- a
- b
- s
- b
- s
- y
- EOF
- cat >testcase04 <<\EOF
- s
- m
- s
- v
- s
- m
- s
- EOF
- cat >testcase05 <<\EOF
- v
- s
- m
- s
- s
- s
- s
- s
- s
- s
- s
- s
- s
- v
- EOF
- # Test case 6 and test case 7 both use the same input files, but they
- # order the input files differently. In one case, a certain file is
- # used as the older file, but in the other test case, that same file
- # is used as the file which has changes. I could have put echo
- # commands here, but since the echo lines would be the same as those
- # in the previous function, I decided to save space and avoid repeating
- # several lines of code. Instead, I merely swap the files:
- mv testcase07 tmp
- mv testcase06 testcase07
- mv tmp testcase06
- # Make the date newer so that cvs thinks that the files are changed:
- touch testcase06 testcase07
- cat >testcase08 <<\EOF
- no
- changes
- here
- First change has now added this in.
- no
- changes
- here
- Second change will change it here.
- no
- changes
- here
- Both changes move this line to the end of the file.
- EOF
- cat >testcase09 <<\EOF
- m
- a
- {
- }
- b
- {
- }
- c
- {
- }
- EOF
- cat >testcase10 <<\EOF
- fV ( BzQkV_URYYfYg ) (*jfle_Uecopdk)[0].jfle_Uecopd_KRLIep = ZpfgfYal_jUK;
- petRpY ( MtatRk );
- fV ( MtatRk != Zy ) UDTXUK_DUUZU ( BGKT_ZFDK_qjT_HGTG );
- fV ( jfle_Uecopd_KRLIep < 16 )
- {
- MtatRk = Uead_Ktz_qjT_jfle_Uecopd ( jfle_Uecopd_KRLIep, (uofd*)nRVVep );
- }
- elke
- {
- MtatRk = ZreY_GttpfIRte_MtpeaL ( qjT_jfle_Uecopdk, qjT_jfle_Uecopd_BoRYt, HGTG_TvFD, KXbb, KXbb, &acI );
- fV ( MtatRk != Zy ) UDTXUK_DUUZU ( BGKT_ZFDK_qjT_HGTG );
- MtatRk = MQfr_GttpfIRte_MtpeaL ( &acI, jfle_Uecopd_KRLIep * jfle_Uecopd_MfJe_fY_nEtek );
- OjZy MtatRk = Uead_GttpfIRte_MtpeaL ( &acI, jfle_Uecopd_MfJe_fY_nEtek, nRVVep );
- Bloke_GttpfIRte_MtpeaL ( &acI );
- MTGTXM Uead_Ktz_qjT_jfle_Uecopd ( fYt Y, uofd *nRVVep )
- {
- MTGTXM MtatRk = Zy;
- fV ( Y < 16 )
- {
- petRpY ( Uead_Mectopk ( noot_Uecopd.qVtHatabcY0 * noot_Uecopd.MectopkFepBlRktep +
- Y * jfle_Uecopd_MfJe_fY_Mectopk,
- jfle_Uecopd_MfJe_fY_Mectopk,
- nRVVep ) );
- }
- elke
- {
- petRpY ( Uead_Mectopk ( noot_Uecopd.qVtqfppHatabcY0 * noot_Uecopd.MectopkFepBlRktep +
- ( Y - 16 ) * jfle_Uecopd_MfJe_fY_Mectopk,
- jfle_Uecopd_MfJe_fY_Mectopk,
- nRVVep ) );
- }
- petRpY ( MtatRk );
- }
- /****************************************************************************
- * *
- * Uead Mectopk ( Uelatfue to tze cRppeYt raptftfoY ) *
- * *
- ****************************************************************************/
- MTGTXM Uead_Mectopk ( RfYt64 Mtapt_Mectop, RfYt64 KRL_Mectopk, uofd *nRVVep )
- {
- MTGTXM MtatRk = Zy;
- MtatRk = Uead_HfkQ ( FaptftfoY_TaIle.Uelatfue_Mectop + Mtapt_Mectop, KRL_Mectopk, nRVVep );
- petRpY ( MtatRk );
- }
- HfkQipfte ( waYdle, /* waYdle */
- waYdleFok, /* ZVVket VpoL ktapt oV dfkQ */
- (coYkt RfYt8*) nRVVep, /* nRVVep */
- 0, /* MRrepVlRoRk KfxoYfkL */
- beYgtz /* nEtek to Apfte */
- );
- petRpY ( Zy );
- }
- EOF
- }
- # Create "my" revisions for diffmerge1
- diffmerge_create_my_files() {
- # My working copy still has the Button() method, but I
- # comment out some code at the top of the class.
- cat >testcase01 <<\EOF
- // Button.java
- package random.application;
- import random.util.*;
- public class Button
- {
- /* Instantiates a Button with origin (0, 0) and zero width and height.
- * You must call an initializer method to properly initialize the Button.
- */
- public Button ()
- {
- super ();
- // _titleColor = Color.black;
- // _disabledTitleColor = Color.gray;
- // _titleFont = Font.defaultFont ();
- }
- /* Convenience constructor for instantiating a Button with
- * bounds x, y, width, and height. Equivalent to
- * foo = new Button ();
- * foo.init (x, y, width, height);
- */
- public Button (int x, int y, int width, int height)
- {
- this ();
- init (x, y, width, height);
- }
- }
- EOF
- cat >testcase02 <<\EOF
- a
- a
- a
- a
- m
- EOF
- cat >testcase03 <<\EOF
- x
- s
- c
- s
- b
- s
- y
- EOF
- cat >testcase04 <<\EOF
- v
- s
- x
- m
- m
- x
- s
- v
- s
- x
- m
- m
- x
- s
- v
- EOF
- # Note that in test case 5, there are no changes in the "mine"
- # section, which explains why there is no command here which writes to
- # file testcase05.
- # no changes for testcase06
- # The two branches make the same changes:
- cp ../yours/testcase07 .
- cat >testcase08 <<\EOF
- no
- changes
- here
- First change will delete this line.
- First change will also delete this line.
- no
- changes
- here
- Second change has now changed it here.
- no
- changes
- here
- Both changes move this line to the end of the file.
- EOF
- cat >testcase09 <<\EOF
- m
- a
- {
- }
- b
- {
- }
- c
- {
- }
- EOF
- cat >testcase10 <<\EOF
- petRpY ( MtatRk );
- fV ( MtatRk != Zy ) UDTXUK_DUUZU ( BGKT_ZFDK_qjT_HGTG );
- MtatRk = MQfr_GttpfIRte_MtpeaL ( &acI, jfle_Uecopd_KRLIep * jfle_Uecopd_MfJe_fY_nEtek );
- OjZy MtatRk = Uead_GttpfIRte_MtpeaL ( &acI, jfle_Uecopd_MfJe_fY_nEtek, nRVVep );
- Bloke_GttpfIRte_MtpeaL ( &acI );
- MTGTXM Uead_Ktz_qjT_jfle_Uecopd ( fYt Y, uofd *nRVVep )
- {
- fV ( Y < 16 )
- {
- petRpY ( Uead_Mectopk ( noot_Uecopd.qVtHatabcY0 * noot_Uecopd.MectopkFepBlRktep +
- Y * jfle_Uecopd_MfJe_fY_Mectopk,
- jfle_Uecopd_MfJe_fY_Mectopk,
- nRVVep ) );
- }
- elke
- {
- petRpY ( Uead_Mectopk ( noot_Uecopd.qVtqfppHatabcY0 * noot_Uecopd.MectopkFepBlRktep +
- ( Y - 16 ) * jfle_Uecopd_MfJe_fY_Mectopk,
- jfle_Uecopd_MfJe_fY_Mectopk,
- nRVVep ) );
- }
- }
- /****************************************************************************
- * *
- * Uead Mectopk ( Uelatfue to tze cRppeYt raptftfoY ) *
- * *
- ****************************************************************************/
- MTGTXM Uead_Mectopk ( RfYt64 Mtapt_Mectop, RfYt64 KRL_Mectopk, uofd *nRVVep )
- {
- MTGTXM MtatRk = Zy;
- MtatRk = Uead_HfkQ ( FaptftfoY_TaIle.Uelatfue_Mectop + Mtapt_Mectop, KRL_Mectopk, nRVVep );
- petRpY ( MtatRk );
- }
- HfkQipfte ( waYdle, /* waYdle */
- waYdleFok, /* ZVVket VpoL ktapt oV dfkQ */
- (coYkt RfYt8*) nRVVep, /* nRVVep */
- beYgtz /* nEtek to Apfte */
- );
- petRpY ( Zy );
- }
- EOF
- }
- # Create expected results of merge for diffmerge1
- diffmerge_create_expected_files() {
- cat >testcase01 <<\EOF
- // Button.java
- package random.application;
- import random.util.*;
- public class Button
- {
- /* Instantiates a Button with origin (0, 0) and zero width and height.
- * You must call an initializer method to properly initialize the Button.
- */
- public Button ()
- {
- super ();
- // _titleColor = Color.black;
- // _disabledTitleColor = Color.gray;
- // _titleFont = Font.defaultFont ();
- }
- }
- EOF
- cat >testcase02 <<\EOF
- y
- a
- a
- a
- m
- EOF
- cat >testcase03 <<\EOF
- x
- s
- c
- s
- b
- s
- b
- s
- y
- EOF
- cat >testcase04 <<\EOF
- v
- s
- m
- s
- v
- s
- m
- s
- v
- EOF
- # Since there are no changes in the "mine" section, just take exactly
- # the version in the "yours" section:
- cp ../yours/testcase05 .
- cp ../yours/testcase06 .
- # Since the two branches make the same changes, the result should be
- # the same as both branches. Here, I happen to pick yours to copy from,
- # but I could have also picked mine, since the source of the copy is
- # the same in either case. However, the mine has already been
- # altered by the update command, so don't use it. Instead, use the
- # yours section which has not had an update on it and so is unchanged:
- cp ../yours/testcase07 .
- cat >testcase08 <<\EOF
- no
- changes
- here
- First change has now added this in.
- no
- changes
- here
- Second change has now changed it here.
- no
- changes
- here
- Both changes move this line to the end of the file.
- EOF
- cat >testcase09 <<\EOF
- m
- a
- {
- }
- b
- {
- }
- c
- {
- }
- EOF
- cat >testcase10 <<\EOF
- fV ( BzQkV_URYYfYg ) (*jfle_Uecopdk)[0].jfle_Uecopd_KRLIep = ZpfgfYal_jUK;
- petRpY ( MtatRk );
- fV ( MtatRk != Zy ) UDTXUK_DUUZU ( BGKT_ZFDK_qjT_HGTG );
- fV ( jfle_Uecopd_KRLIep < 16 )
- {
- MtatRk = Uead_Ktz_qjT_jfle_Uecopd ( jfle_Uecopd_KRLIep, (uofd*)nRVVep );
- }
- elke
- {
- MtatRk = ZreY_GttpfIRte_MtpeaL ( qjT_jfle_Uecopdk, qjT_jfle_Uecopd_BoRYt, HGTG_TvFD, KXbb, KXbb, &acI );
- fV ( MtatRk != Zy ) UDTXUK_DUUZU ( BGKT_ZFDK_qjT_HGTG );
- MtatRk = MQfr_GttpfIRte_MtpeaL ( &acI, jfle_Uecopd_KRLIep * jfle_Uecopd_MfJe_fY_nEtek );
- OjZy MtatRk = Uead_GttpfIRte_MtpeaL ( &acI, jfle_Uecopd_MfJe_fY_nEtek, nRVVep );
- Bloke_GttpfIRte_MtpeaL ( &acI );
- MTGTXM Uead_Ktz_qjT_jfle_Uecopd ( fYt Y, uofd *nRVVep )
- {
- MTGTXM MtatRk = Zy;
- fV ( Y < 16 )
- {
- petRpY ( Uead_Mectopk ( noot_Uecopd.qVtHatabcY0 * noot_Uecopd.MectopkFepBlRktep +
- Y * jfle_Uecopd_MfJe_fY_Mectopk,
- jfle_Uecopd_MfJe_fY_Mectopk,
- nRVVep ) );
- }
- elke
- {
- petRpY ( Uead_Mectopk ( noot_Uecopd.qVtqfppHatabcY0 * noot_Uecopd.MectopkFepBlRktep +
- ( Y - 16 ) * jfle_Uecopd_MfJe_fY_Mectopk,
- jfle_Uecopd_MfJe_fY_Mectopk,
- nRVVep ) );
- }
- petRpY ( MtatRk );
- }
- /****************************************************************************
- * *
- * Uead Mectopk ( Uelatfue to tze cRppeYt raptftfoY ) *
- * *
- ****************************************************************************/
- MTGTXM Uead_Mectopk ( RfYt64 Mtapt_Mectop, RfYt64 KRL_Mectopk, uofd *nRVVep )
- {
- MTGTXM MtatRk = Zy;
- MtatRk = Uead_HfkQ ( FaptftfoY_TaIle.Uelatfue_Mectop + Mtapt_Mectop, KRL_Mectopk, nRVVep );
- petRpY ( MtatRk );
- }
- HfkQipfte ( waYdle, /* waYdle */
- waYdleFok, /* ZVVket VpoL ktapt oV dfkQ */
- (coYkt RfYt8*) nRVVep, /* nRVVep */
- beYgtz /* nEtek to Apfte */
- );
- petRpY ( Zy );
- }
- EOF
- }
- # Echo a new CVSROOT based on $1, $remote, and $remotehost
- newroot() {
- if $remote; then
- if test -n "$remotehost"; then
- echo :ext:$remotehost$1
- else
- echo :fork:$1
- fi
- else
- echo $1
- fi
- }
- # Set up CVSROOT (the crerepos tests will test operating without CVSROOT set).
- #
- # Currently we test :fork: and :ext: (see crerepos test). There is a
- # known difference between the two in modes-15 (see comments there).
- #
- # :ext: can be tested against a remote machine if:
- #
- # 1. $remotehost is set using the `-h' option to this script.
- # 2. ${CVS_RSH=rsh} $remotehost works.
- # 3. The path to $TESTDIR is the same on both machines (symlinks are okay)
- # 4. The path to $testcvs is the same on both machines (symlinks are okay)
- # or $CVS_SERVER is overridden in this script's environment to point to
- # a working CVS exectuable on the remote machine.
- #
- # Testing :pserver: would be hard (inetd issues). (How about using tcpserver
- # and some high port number? DRP)
- # Allow CVS_SERVER to be overridden. This facilitates constructs like
- # testing a local case-insensitive client against a remote case
- # sensitive server and visa versa.
- : ${CVS_SERVER=$testcvs}; export CVS_SERVER
- # Use a name which will be different than CVSROOT on case insensitive
- # filesystems (e.g., HFS+)
- CVSROOTDIR=cvsrootdir
- if $linkroot; then
- mkdir ${TESTDIR}/realcvsroot
- ln -s realcvsroot ${TESTDIR}/${CVSROOTDIR}
- fi
- CVSROOT_DIRNAME=${TESTDIR}/${CVSROOTDIR}
- CVSROOT=`newroot $CVSROOT_DIRNAME`; export CVSROOT
- ###
- ### Init the repository.
- ###
- dotest init-1 "$testcvs -d$CVSROOT_DIRNAME init"
- # Copy the admin files for restore_adm.
- cp -Rp $CVSROOT_DIRNAME/CVSROOT $TESTDIR/CVSROOT.save
- ###
- ### The tests
- ###
- if $remote; then
- localonly init-2
- localonly init-3
- else
- dotest init-2 "$testcvs init"
- dotest_fail init-3 "$testcvs -d $CVSROOT/sdir init" \
- "$PROG \[init aborted\]: Cannot initialize repository under existing CVSROOT: \`$CVSROOT_DIRNAME'"
- fi
- ### The big loop
- for what in $tests; do
- if test -n "$fromtest" ; then
- if test $fromtest = $what ; then
- unset fromtest
- else
- continue
- fi
- fi
- if $verbose; then
- echo "$what:"
- fi
- case $what in
- version)
- # We've had cases where the version command started dumping core,
- # so we might as well test it
- dotest version-1 "${testcvs} --version" \
- '
- Concurrent Versions System (CVS) [0-9.]*.*
- Copyright (C) [0-9]* Free Software Foundation, Inc.
- Senior active maintainers include Larry Jones, Derek R. Price,
- and Mark D. Baushke. Please see the AUTHORS and README files from the CVS
- distribution kit for a complete list of contributors and copyrights.
- CVS may be copied only under the terms of the GNU General Public License,
- a copy of which can be found with the CVS distribution kit.
- Specify the --help option for further information about CVS'
- if $remote; then
- dotest version-2r "${testcvs} version" \
- 'Client: Concurrent Versions System (CVS) [0-9p.]* (client/server)
- Server: Concurrent Versions System (CVS) [0-9p.]* (client/server)'
- else
- dotest version-2 "${testcvs} version" \
- 'Concurrent Versions System (CVS) [0-9.]*.*'
- fi
- ;;
- basica)
- # Similar in spirit to some of the basic1, and basic2
- # tests, but hopefully a lot faster. Also tests operating on
- # files two directories down *without* operating on the parent dirs.
- # Tests basica-0a and basica-0b provide the equivalent of the:
- # mkdir ${CVSROOT_DIRNAME}/first-dir
- # used by many of the tests. It is "more official" in the sense
- # that is does everything through CVS; the reason most of the
- # tests don't use it is mostly historical.
- mkdir 1; cd 1
- dotest basica-0a "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest basica-0b "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd ..
- rm -r 1
- dotest basica-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- # Test a few operations, to ensure they gracefully do
- # nothing in an empty directory.
- dotest basica-1a0 "${testcvs} -q update" ''
- dotest basica-1a1 "${testcvs} -q diff -c" ''
- dotest basica-1a2 "${testcvs} -q status" ''
- dotest basica-1a3 "${testcvs} -q update ." ''
- dotest basica-1a4 "${testcvs} -q update ./" ''
- mkdir sdir
- # Remote CVS gives the "cannot open CVS/Entries" error, which is
- # clearly a bug, but not a simple one to fix.
- dotest basica-1a10 "${testcvs} -n add sdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/sdir added to the repository" \
- "${PROG} add: cannot open CVS/Entries for reading: No such file or directory
- Directory ${CVSROOT_DIRNAME}/first-dir/sdir added to the repository"
- dotest_fail basica-1a11 \
- "test -d ${CVSROOT_DIRNAME}/first-dir/sdir" ''
- dotest basica-2 "${testcvs} add sdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/sdir added to the repository"
- cd sdir
- mkdir ssdir
- dotest basica-3 "${testcvs} add ssdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir added to the repository"
- cd ssdir
- echo ssfile >ssfile
- # Trying to commit it without a "cvs add" should be an error.
- # The "use `cvs add' to create an entry" message is the one
- # that I consider to be more correct, but local cvs prints the
- # "nothing known" message and noone has gotten around to fixing it.
- dotest_fail basica-notadded "${testcvs} -q ci ssfile" \
- "${PROG} [a-z]*: use .${PROG} add. to create an entry for ssfile
- ${PROG}"' \[[a-z]* aborted\]: correct above errors first!' \
- "${PROG}"' [a-z]*: nothing known about `ssfile'\''
- '"${PROG}"' \[[a-z]* aborted\]: correct above errors first!'
- dotest basica-4 "${testcvs} add ssfile" \
- "${PROG}"' add: scheduling file `ssfile'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest_fail basica-4a "${testcvs} tag tag0 ssfile" \
- "${PROG} tag: nothing known about ssfile
- ${PROG} "'\[tag aborted\]: correct the above errors first!'
- cd ../..
- dotest basica-5 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- done
- Checking in sdir/ssdir/ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- initial revision: 1\.1
- done"
- dotest_fail basica-5a \
- "${testcvs} -q tag BASE sdir/ssdir/ssfile" \
- "${PROG} tag: Attempt to add reserved tag name BASE
- ${PROG} \[tag aborted\]: failed to set tag BASE to revision 1\.1 in ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v"
- dotest basica-5b "${testcvs} -q tag NOT_RESERVED" \
- 'T sdir/ssdir/ssfile'
- dotest basica-6 "${testcvs} -q update" ''
- echo "ssfile line 2" >>sdir/ssdir/ssfile
- dotest_fail basica-6.2 "${testcvs} -q diff -c" \
- "Index: sdir/ssdir/ssfile
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- retrieving revision 1\.1
- diff -c -r1\.1 ssfile
- \*\*\* sdir/ssdir/ssfile ${RFCDATE} 1\.1
- --- sdir/ssdir/ssfile ${RFCDATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- --- 1,2 ----
- ssfile
- ${PLUS} ssfile line 2"
- dotest_fail basica-6.3 "${testcvs} -q diff -c -rBASE" \
- "Index: sdir/ssdir/ssfile
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- retrieving revision 1\.1
- diff -c -r1\.1 ssfile
- \*\*\* sdir/ssdir/ssfile ${RFCDATE} 1\.1
- --- sdir/ssdir/ssfile ${RFCDATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- --- 1,2 ----
- ssfile
- ${PLUS} ssfile line 2"
- dotest_fail basica-6.4 "${testcvs} -q diff -c -rBASE -C3isacrowd" \
- "Index: sdir/ssdir/ssfile
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- retrieving revision 1\.1
- diff -c -C 3isacrowd -r1\.1 ssfile
- ${PROG} diff: invalid context length argument"
- dotest basica-7 "${testcvs} -q ci -m modify-it" \
- "Checking in sdir/ssdir/ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest_fail basica-nonexist "${testcvs} -q ci nonexist" \
- "${PROG}"' [a-z]*: nothing known about `nonexist'\''
- '"${PROG}"' \[[a-z]* aborted\]: correct above errors first!'
- dotest basica-8 "${testcvs} -q update ." ''
- # Test the -f option to ci
- cd sdir/ssdir
- dotest basica-8a0 "${testcvs} -q ci -m not-modified ssfile" ''
- dotest basica-8a "${testcvs} -q ci -f -m force-it" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 1\.3; previous revision: 1\.2
- done"
- dotest basica-8a1 "${testcvs} -q ci -m bump-it -r 2.0" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 2\.0; previous revision: 1\.3
- done"
- dotest basica-8a1a "${testcvs} -q ci -m bump-it -r 2.9" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 2\.9; previous revision: 2\.0
- done"
- # Test string-based revion number increment rollover
- dotest basica-8a1b "${testcvs} -q ci -m bump-it -f -r 2" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 2\.10; previous revision: 2\.9
- done"
- dotest basica-8a1c "${testcvs} -q ci -m bump-it -r 2.99" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 2\.99; previous revision: 2\.10
- done"
- # Test string-based revion number increment rollover
- dotest basica-8a1d "${testcvs} -q ci -m bump-it -f -r 2" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 2\.100; previous revision: 2\.99
- done"
- dotest basica-8a1e "${testcvs} -q ci -m bump-it -r 2.1099" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 2\.1099; previous revision: 2\.100
- done"
- # Test string-based revion number increment rollover
- dotest basica-8a1f "${testcvs} -q ci -m bump-it -f -r 2" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 2\.1100; previous revision: 2\.1099
- done"
- # -f should not be necessary, but it should be harmless.
- # Also test the "-r 3" (rather than "-r 3.0") usage.
- dotest basica-8a2 "${testcvs} -q ci -m bump-it -f -r 3" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 3\.1; previous revision: 2\.1100
- done"
- # Test using -r to create a branch
- dotest_fail basica-8a3 "${testcvs} -q ci -m bogus -r 3.0.0" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- ${PROG} commit: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v: can't find branch point 3\.0
- ${PROG} commit: could not check in ssfile"
- dotest basica-8a4 "${testcvs} -q ci -m valid -r 3.1.2" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 3\.1\.2\.1; previous revision: 3\.1
- done"
- # Verify that this file remains unchanged since up -A should not
- # change the contents here.
- cp ssfile $TESTDIR/ssfile.sav
- # now get rid of the sticky tag and go back to the trunk
- dotest basica-8a5 "$testcvs -q up -A ./" '[UP] ssfile'
- dotest basica-8a6 "cmp ssfile $TESTDIR/ssfile.sav"
- rm $TESTDIR/ssfile.sav
- cd ../..
- dotest basica-8b "${testcvs} -q diff -r1.2 -r1.3"
- dotest basica-8b1 "${testcvs} -q diff -r1.2 -r1.3 -C 3isacrowd"
- # The .* here will normally be "No such file or directory",
- # but if memory serves some systems (AIX?) have a different message.
- : dotest_fail basica-9 \
- "${testcvs} -q -d ${TESTDIR}/nonexist update" \
- "${PROG}: cannot access cvs root ${TESTDIR}/nonexist: .*"
- dotest_fail basica-9 \
- "${testcvs} -q -d ${TESTDIR}/nonexist update" \
- "${PROG} \[[a-z]* aborted\]: ${TESTDIR}/nonexist/CVSROOT: .*"
- dotest basica-10 "${testcvs} annotate" \
- '
- Annotations for sdir/ssdir/ssfile
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1 .'"$username8"' *[0-9a-zA-Z-]*.: ssfile
- 1\.2 .'"$username8"' *[0-9a-zA-Z-]*.: ssfile line 2'
- # Test resurrecting with strange revision numbers
- cd sdir/ssdir
- dotest basica-r1 "${testcvs} rm -f ssfile" \
- "${PROG} remove: scheduling .ssfile. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest basica-r2 "${testcvs} -q ci -m remove" \
- "Removing ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: delete; previous revision: 3\.1
- done"
- dotest basica-r3 "${testcvs} -q up -p -r 3.1 ./ssfile >ssfile" ""
- dotest basica-r4 "${testcvs} add ssfile" \
- "${PROG} add: Re-adding file .ssfile. (in place of dead revision 3\.2)\.
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest basica-r5 "${testcvs} -q ci -m resurrect" \
- "Checking in ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
- new revision: 3\.3; previous revision: 3\.2
- done"
- cd ../..
- # As long as we have a file with a few revisions, test
- # a few "cvs admin -o" invocations.
- cd sdir/ssdir
- dotest_fail basica-o1 "${testcvs} admin -o 1.2::1.2" \
- "${PROG} [a-z]*: while processing more than one file:
- ${PROG} \[[a-z]* aborted\]: attempt to specify a numeric revision"
- dotest basica-o2 "${testcvs} admin -o 1.2::1.2 ssfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- done"
- dotest basica-o2a "${testcvs} admin -o 1.1::NOT_RESERVED ssfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- done"
- dotest_fail basica-o2b "${testcvs} admin -o 1.1::NOT_EXIST ssfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v: Revision NOT_EXIST doesn't exist.
- ${PROG} admin: RCS file for .ssfile. not modified\."
- dotest basica-o3 "${testcvs} admin -o 1.2::1.3 ssfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- done"
- dotest basica-o4 "${testcvs} admin -o 3.1:: ssfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- deleting revision 3\.3
- deleting revision 3\.2
- done"
- dotest basica-o5 "${testcvs} admin -o ::1.1 ssfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- done"
- dotest basica-o5a "${testcvs} -n admin -o 1.2::3.1 ssfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- deleting revision 2\.1100
- deleting revision 2\.1099
- deleting revision 2\.100
- deleting revision 2\.99
- deleting revision 2\.10
- deleting revision 2\.9
- deleting revision 2\.0
- deleting revision 1\.3
- done"
- dotest basica-o6 "${testcvs} admin -o 1.2::3.1 ssfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- deleting revision 2\.1100
- deleting revision 2\.1099
- deleting revision 2\.100
- deleting revision 2\.99
- deleting revision 2\.10
- deleting revision 2\.9
- deleting revision 2\.0
- deleting revision 1\.3
- done"
- dotest basica-o6a "${testcvs} admin -o 3.1.2: ssfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- deleting revision 3\.1\.2\.1
- done"
- dotest basica-o7 "${testcvs} log -N ssfile" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
- Working file: ssfile
- head: 3\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- ----------------------------
- revision 3\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}0 -0
- bump-it
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- modify-it
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- add-it
- ============================================================================="
- dotest basica-o8 "${testcvs} -q update -p -r 1.1 ./ssfile" "ssfile"
- cd ../..
- cd ..
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -r first-dir
- ;;
- basicb)
- # More basic tests, including non-branch tags and co -d.
- mkdir 1; cd 1
- dotest basicb-0a "${testcvs} -q co -l ." ''
- touch topfile
- dotest basicb-0b "${testcvs} add topfile" \
- "${PROG} add: scheduling file .topfile. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest basicb-0c "${testcvs} -q ci -m add-it topfile" \
- "RCS file: ${CVSROOT_DIRNAME}/topfile,v
- done
- Checking in topfile;
- ${CVSROOT_DIRNAME}/topfile,v <-- topfile
- initial revision: 1\.1
- done"
- cd ..
- rm -r 1
- mkdir 2; cd 2
- dotest basicb-0d "${testcvs} -q co -l ." "U topfile"
- # Now test the ability to run checkout on an existing working
- # directory without having it lose its mind. I don't know
- # whether this is tested elsewhere in sanity.sh. A more elaborate
- # test might also have modified files, make sure it works if
- # the modules file was modified to add new directories to the
- # module, and such.
- dotest basicb-0d0 "${testcvs} -q co -l ." ""
- mkdir first-dir
- dotest basicb-0e "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd ..
- rm -r 2
- dotest basicb-1 "${testcvs} -q co first-dir" ''
- # The top-level CVS directory is not created by default.
- # I'm leaving basicb-1a and basicb-1b untouched, mostly, in
- # case we decide that the default should be reversed...
- dotest_fail basicb-1a "test -d CVS" ''
- dotest basicb-1c "cat first-dir/CVS/Repository" "first-dir"
- cd first-dir
- # Note that the name Emptydir is chosen to test that CVS just
- # treats it like any other directory name. It should be
- # special only when it is directly in $CVSROOT/CVSROOT.
- mkdir Emptydir sdir2
- dotest basicb-2 "${testcvs} add Emptydir sdir2" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/Emptydir added to the repository
- Directory ${CVSROOT_DIRNAME}/first-dir/sdir2 added to the repository"
- cd Emptydir
- echo sfile1 starts >sfile1
- dotest basicb-2a10 "${testcvs} -n add sfile1" \
- "${PROG} add: scheduling file .sfile1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest basicb-2a11 "${testcvs} status sfile1" \
- "${PROG} status: use .${PROG} add. to create an entry for sfile1
- ===================================================================
- File: sfile1 Status: Unknown
- Working revision: No entry for sfile1
- Repository revision: No revision control file"
- dotest basicb-3 "${testcvs} add sfile1" \
- "${PROG} add: scheduling file .sfile1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest basicb-3a1 "${testcvs} status sfile1" \
- "===================================================================
- File: sfile1 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- cd ../sdir2
- echo sfile2 starts >sfile2
- dotest basicb-4 "${testcvs} add sfile2" \
- "${PROG} add: scheduling file .sfile2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest basicb-4a "${testcvs} -q ci CVS" \
- "${PROG} [a-z]*: warning: directory CVS specified in argument
- ${PROG} [a-z]*: but CVS uses CVS for its own purposes; skipping CVS directory"
- cd ..
- dotest basicb-5 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Emptydir/sfile1,v
- done
- Checking in Emptydir/sfile1;
- ${CVSROOT_DIRNAME}/first-dir/Emptydir/sfile1,v <-- sfile1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir2/sfile2,v
- done
- Checking in sdir2/sfile2;
- ${CVSROOT_DIRNAME}/first-dir/sdir2/sfile2,v <-- sfile2
- initial revision: 1\.1
- done"
- echo sfile1 develops >Emptydir/sfile1
- dotest basicb-6 "${testcvs} -q ci -m modify" \
- "Checking in Emptydir/sfile1;
- ${CVSROOT_DIRNAME}/first-dir/Emptydir/sfile1,v <-- sfile1
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest basicb-7 "${testcvs} -q tag release-1" 'T Emptydir/sfile1
- T sdir2/sfile2'
- echo not in time for release-1 >sdir2/sfile2
- dotest basicb-8 "${testcvs} -q ci -m modify-2" \
- "Checking in sdir2/sfile2;
- ${CVSROOT_DIRNAME}/first-dir/sdir2/sfile2,v <-- sfile2
- new revision: 1\.2; previous revision: 1\.1
- done"
- # See if CVS can correctly notice when an invalid numeric
- # revision is specified.
- # Commented out until we get around to fixing CVS
- : dotest basicb-8a0 "${testcvs} diff -r 1.5 -r 1.7 sfile2" 'error msg'
- cd ..
- # Test that we recurse into the correct directory when checking
- # for existing files, even if co -d is in use.
- touch first-dir/extra
- dotest basicb-cod-1 "${testcvs} -q co -d first-dir1 first-dir" \
- 'U first-dir1/Emptydir/sfile1
- U first-dir1/sdir2/sfile2'
- rm -r first-dir1
- rm -r first-dir
- # FIXME? basicb-9 used to check things out like this:
- # U newdir/Emptydir/sfile1
- # U newdir/sdir2/sfile2
- # but that's difficult to do. The whole "shorten" thing
- # is pretty bogus, because it will break on things
- # like "cvs co foo/bar baz/quux". Unless there's some
- # pretty detailed expansion and analysis of the command-line
- # arguments, we shouldn't do "shorten" stuff at all.
- dotest basicb-9 \
- "${testcvs} -q co -d newdir -r release-1 first-dir/Emptydir first-dir/sdir2" \
- 'U newdir/first-dir/Emptydir/sfile1
- U newdir/first-dir/sdir2/sfile2'
- # basicb-9a and basicb-9b: see note about basicb-1a
- dotest_fail basicb-9a "test -d CVS" ''
- dotest basicb-9c "cat newdir/CVS/Repository" "\."
- dotest basicb-9d "cat newdir/first-dir/CVS/Repository" \
- "${CVSROOT_DIRNAME}/first-dir" \
- "first-dir"
- dotest basicb-9e "cat newdir/first-dir/Emptydir/CVS/Repository" \
- "${CVSROOT_DIRNAME}/first-dir/Emptydir" \
- "first-dir/Emptydir"
- dotest basicb-9f "cat newdir/first-dir/sdir2/CVS/Repository" \
- "${CVSROOT_DIRNAME}/first-dir/sdir2" \
- "first-dir/sdir2"
- dotest basicb-10 "cat newdir/first-dir/Emptydir/sfile1 newdir/first-dir/sdir2/sfile2" \
- "sfile1 develops
- sfile2 starts"
- rm -r newdir
- # Hmm, this might be a case for CVSNULLREPOS, but CVS doesn't
- # seem to deal with it...
- if false; then
- dotest basicb-11 "${testcvs} -q co -d sub1/sub2 first-dir" \
- "U sub1/sub2/Emptydir/sfile1
- U sub1/sub2/sdir2/sfile2"
- cd sub1
- dotest basicb-12 "${testcvs} -q update ./." ''
- touch xx
- dotest basicb-13 "${testcvs} add xx" fixme
- cd ..
- rm -r sub1
- # to test: sub1/sub2/sub3
- fi # end of tests commented out.
- # Create a second directory.
- mkdir 1
- cd 1
- dotest basicb-14 "${testcvs} -q co -l ." 'U topfile'
- mkdir second-dir
- dotest basicb-15 "${testcvs} add second-dir" \
- "Directory ${CVSROOT_DIRNAME}/second-dir added to the repository"
- cd second-dir
- touch aa
- dotest basicb-16 "${testcvs} add aa" \
- "${PROG} add: scheduling file .aa. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest basicb-17 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/second-dir/aa,v
- done
- Checking in aa;
- ${CVSROOT_DIRNAME}/second-dir/aa,v <-- aa
- initial revision: 1\.1
- done"
- cd ..
- # Try to remove all revisions in a file.
- dotest_fail basicb-o1 "${testcvs} admin -o1.1 topfile" \
- "RCS file: ${CVSROOT_DIRNAME}/topfile,v
- deleting revision 1\.1
- ${PROG} \[admin aborted\]: attempt to delete all revisions"
- dotest basicb-o2 "${testcvs} -q update -d first-dir" \
- "U first-dir/Emptydir/sfile1
- U first-dir/sdir2/sfile2"
- dotest_fail basicb-o3 \
- "${testcvs} admin -o1.1:1.2 first-dir/sdir2/sfile2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir2/sfile2,v
- deleting revision 1\.2
- deleting revision 1\.1
- ${PROG} \[admin aborted\]: attempt to delete all revisions"
- cd ..
- rm -r 1
- mkdir 1; cd 1
- # Note that -H is an illegal option.
- # I suspect that the choice between "illegal" and "invalid"
- # depends on the user's environment variables, the phase
- # of the moon (weirdness with optind), and who knows what else.
- # I've been seeing "illegal"...
- dotest_fail basicb-21 "${testcvs} -q admin -H" \
- "admin: illegal option -- H
- ${PROG} \[admin aborted\]: specify ${PROG} -H admin for usage information" \
- "admin: invalid option -- H
- ${PROG} \[admin aborted\]: specify ${PROG} -H admin for usage information"
- cd ..
- rmdir 1
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -rf ${CVSROOT_DIRNAME}/second-dir
- rm -f ${CVSROOT_DIRNAME}/topfile,v
- ;;
- basicc)
- # More tests of basic/miscellaneous functionality.
- mkdir 1; cd 1
- dotest_fail basicc-1 "${testcvs} diff" \
- "${PROG} [a-z]*: in directory \.:
- ${PROG} \[[a-z]* aborted\]: there is no version here; run .${PROG} checkout. first"
- dotest basicc-2 "${testcvs} -q co -l ." ''
- mkdir first-dir second-dir
- dotest basicc-3 "${testcvs} add first-dir second-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository
- Directory ${CVSROOT_DIRNAME}/second-dir added to the repository"
- # Old versions of CVS often didn't create this top-level CVS
- # directory in the first place. I think that maybe the only
- # way to get it to work currently is to let CVS create it,
- # and then blow it away (don't complain if it does not
- # exist). But that is perfectly legal; people who are used
- # to the old behavior especially may be interested.
- # FIXME: this test is intended for the TopLevelAdmin=yes case;
- # should adjust/move it accordingly.
- rm -rf CVS
- dotest basicc-4 "echo *" "first-dir second-dir"
- dotest basicc-5 "${testcvs} update" \
- "${PROG} update: Updating first-dir
- ${PROG} update: Updating second-dir" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating first-dir
- ${PROG} update: Updating second-dir"
- cd first-dir
- dotest basicc-6 "${testcvs} release -d" ""
- dotest basicc-7 "test -d ../first-dir" ""
- # The Linux 2.2 kernel lets you delete ".". That's OK either way,
- # the point is that CVS must not mess with anything *outside* "."
- # the way that CVS 1.10 and older tried to.
- dotest basicc-8 "${testcvs} -Q release -d ." \
- "" "${PROG} release: deletion of directory \. failed: .*"
- dotest basicc-9 "test -d ../second-dir" ""
- # For CVS to make a syntactic check for "." wouldn't suffice.
- # On Linux 2.2 systems, the cwd may be gone, so we recreate it
- # to allow basicc-11 to actually happen
- if test ! -d ../first-dir; then
- # Apparently `cd ..' doesn't work with Linux 2.2 & Bash 2.05b.
- cd $TESTDIR/1
- mkdir ./first-dir
- cd ./first-dir
- fi
- dotest basicc-11 "${testcvs} -Q release -d ./." \
- "" "${PROG} release: deletion of directory \./\. failed: .*"
- dotest basicc-11a "test -d ../second-dir" ""
- cd ../..
- mkdir 2; cd 2
- dotest basicc-12 "${testcvs} -Q co ." ""
- # actual entries can be in either Entries or Entries.log, do
- # an update to get them consolidated into Entries
- dotest basicc-12a "${testcvs} -Q up" ""
- dotest basicc-12b "cat CVS/Entries" \
- "D/CVSROOT////
- D/first-dir////
- D/second-dir////"
- dotest basicc-13 "echo *" "CVS CVSROOT first-dir second-dir"
- dotest basicc-14 "${testcvs} -Q release first-dir second-dir" ""
- # a normal release shouldn't affect the Entries file
- dotest basicc-14b "cat CVS/Entries" \
- "D/CVSROOT////
- D/first-dir////
- D/second-dir////"
- # FIXCVS: but release -d probably should
- dotest basicc-15 "${testcvs} -Q release -d first-dir second-dir" ""
- dotest basicc-16 "echo *" "CVS CVSROOT"
- dotest basicc-17 "cat CVS/Entries" \
- "D/CVSROOT////
- D/first-dir////
- D/second-dir////"
- # FIXCVS: if not, update should notice the missing directories
- # and update Entries accordingly
- dotest basicc-18 "${testcvs} -Q up" ""
- dotest basicc-19 "cat CVS/Entries" \
- "D/CVSROOT////
- D/first-dir////
- D/second-dir////"
- cd ..
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- basic1)
- # first dive - add a files, first singly, then in a group.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir basic1; cd basic1
- # check out an empty directory
- dotest basic1-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- echo file2 >file2
- echo file3 >file3
- echo file4 >file4
- echo file5 >file5
- dotest basic1-14-add-add "${testcvs} add file2 file3 file4 file5" \
- "${PROG} add: scheduling file \`file2' for addition
- ${PROG} add: scheduling file \`file3' for addition
- ${PROG} add: scheduling file \`file4' for addition
- ${PROG} add: scheduling file \`file5' for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest basic1-15-add-add \
- "${testcvs} -q update file2 file3 file4 file5" \
- "A file2
- A file3
- A file4
- A file5"
- dotest basic1-16-add-add "${testcvs} -q update" \
- "A file2
- A file3
- A file4
- A file5"
- dotest basic1-17-add-add "${testcvs} -q status" \
- "===================================================================
- File: file2 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file4 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file5 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest basic1-18-add-add "${testcvs} -q log" \
- "${PROG} log: file2 has been added, but not committed
- ${PROG} log: file3 has been added, but not committed
- ${PROG} log: file4 has been added, but not committed
- ${PROG} log: file5 has been added, but not committed"
- cd ..
- dotest basic1-21-add-add "${testcvs} -q update" \
- "A first-dir/file2
- A first-dir/file3
- A first-dir/file4
- A first-dir/file5"
- # FIXCVS? Shouldn't this read first-dir/file2 instead of file2?
- dotest basic1-22-add-add "${testcvs} log first-dir" \
- "${PROG} log: Logging first-dir
- ${PROG} log: file2 has been added, but not committed
- ${PROG} log: file3 has been added, but not committed
- ${PROG} log: file4 has been added, but not committed
- ${PROG} log: file5 has been added, but not committed"
- dotest basic1-23-add-add "${testcvs} status first-dir" \
- "${PROG} status: Examining first-dir
- ===================================================================
- File: file2 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file4 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file5 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest basic1-24-add-add "${testcvs} update first-dir" \
- "${PROG} update: Updating first-dir
- A first-dir/file2
- A first-dir/file3
- A first-dir/file4
- A first-dir/file5"
- dotest basic1-27-add-add "${testcvs} co first-dir" \
- "${PROG} checkout: Updating first-dir
- A first-dir/file2
- A first-dir/file3
- A first-dir/file4
- A first-dir/file5"
- cd first-dir
- dotest basic1-14-add-ci \
- "${testcvs} commit -m test file2 file3 file4 file5" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file4,v
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file5,v
- done
- Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/file5,v <-- file5
- initial revision: 1\.1
- done"
- dotest basic1-15-add-ci \
- "${testcvs} -q update file2 file3 file4 file5" ''
- dotest basic1-16-add-ci "${testcvs} -q update" ''
- dotest basic1-17-add-ci "${testcvs} -q status" \
- "===================================================================
- File: file2 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file3,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file4 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file4,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file5 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file5,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- # The "log" tests and friends probably already test the output
- # from log quite adequately.
- # Note: using dotest fails here. It seems to be related
- # to the output being sufficiently large (Red Hat 4.1).
- # dotest basic1-18-add-ci "${testcvs} log" "${DOTSTAR}"
- if ${testcvs} -q log >>${LOGFILE}; then
- pass basic1-18-add-ci
- else
- pass basic1-18-add-ci
- fi
- cd ..
- dotest basic1-21-add-ci "${testcvs} -q update" ''
- # See test basic1-18-add-ci for explanation of non-use of dotest.
- if ${testcvs} -q log first-dir >>${LOGFILE}; then
- pass basic1-22-add-ci
- else
- pass basic1-22-add-ci
- fi
- # At least for the moment I am going to consider 17-add-ci
- # an adequate test of the output here.
- # See test basic1-18-add-ci for explanation of non-use of dotest.
- if ${testcvs} -q status first-dir >>${LOGFILE}; then
- pass basic1-23-add-ci
- else
- pass basic1-23-add-ci
- fi
- dotest basic1-24-add-ci "${testcvs} -q update first-dir" ''
- dotest basic1-27-add-ci "${testcvs} -q co first-dir" ''
- cd first-dir
- rm file2 file3 file4 file5
- dotest basic1-14-rm-rm "${testcvs} rm file2 file3 file4 file5" \
- "${PROG} remove: scheduling .file2. for removal
- ${PROG} remove: scheduling .file3. for removal
- ${PROG} remove: scheduling .file4. for removal
- ${PROG} remove: scheduling .file5. for removal
- ${PROG} remove: use .${PROG} commit. to remove these files permanently"
- # 15-rm-rm was commented out. Why?
- dotest basic1-15-rm-rm \
- "${testcvs} -q update file2 file3 file4 file5" \
- "R file2
- R file3
- R file4
- R file5"
- dotest basic1-16-rm-rm "${testcvs} -q update" \
- "R file2
- R file3
- R file4
- R file5"
- dotest basic1-17-rm-rm "${testcvs} -q status" \
- "===================================================================
- File: no file file2 Status: Locally Removed
- Working revision: -1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: no file file3 Status: Locally Removed
- Working revision: -1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file3,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: no file file4 Status: Locally Removed
- Working revision: -1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file4,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: no file file5 Status: Locally Removed
- Working revision: -1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file5,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- # Would be nice to test that real logs appear (with dead state
- # and all), either here or someplace like log2 tests.
- if ${testcvs} -q log >>${LOGFILE}; then
- pass basic1-18-rm-rm
- else
- fail basic1-18-rm-rm
- fi
- cd ..
- dotest basic1-21-rm-rm "${testcvs} -q update" \
- "R first-dir/file2
- R first-dir/file3
- R first-dir/file4
- R first-dir/file5"
- if ${testcvs} -q log first-dir >>${LOGFILE}; then
- pass basic1-22-rm-rm
- else
- fail basic1-22-rm-rm
- fi
- if ${testcvs} -q status first-dir >>${LOGFILE}; then
- pass basic1-23-rm-rm
- else
- fail basic1-23-rm-rm
- fi
- dotest basic1-24-rm-rm "${testcvs} -q update first-dir" \
- "R first-dir/file2
- R first-dir/file3
- R first-dir/file4
- R first-dir/file5"
- dotest basic1-27-rm-rm "${testcvs} -q co first-dir" \
- "R first-dir/file2
- R first-dir/file3
- R first-dir/file4
- R first-dir/file5"
- cd first-dir
- dotest basic1-14-rm-ci "${testcvs} -q commit -m test" \
- "Removing file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: delete; previous revision: 1\.1
- done
- Removing file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- new revision: delete; previous revision: 1\.1
- done
- Removing file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: delete; previous revision: 1\.1
- done
- Removing file5;
- ${CVSROOT_DIRNAME}/first-dir/file5,v <-- file5
- new revision: delete; previous revision: 1\.1
- done"
- dotest basic1-15-rm-ci \
- "${testcvs} -q update file2 file3 file4 file5" ''
- dotest basic1-16-rm-ci "${testcvs} -q update" ''
- dotest basic1-17-rm-ci "${testcvs} -q status" ''
- # Would be nice to test that real logs appear (with dead state
- # and all), either here or someplace like log2 tests.
- if ${testcvs} -q log >>${LOGFILE}; then
- pass basic1-18-rm-ci
- else
- fail basic1-18-rm-ci
- fi
- cd ..
- dotest basic1-21-rm-ci "${testcvs} -q update" ''
- if ${testcvs} -q log first-dir >>${LOGFILE}; then
- pass basic1-22-rm-ci
- else
- fail basic1-22-rm-ci
- fi
- if ${testcvs} -q status first-dir >>${LOGFILE}; then
- pass basic1-23-rm-ci
- else
- fail basic1-23-rm-ci
- fi
- dotest basic1-24-rm-ci "${testcvs} -q update first-dir" ''
- dotest basic1-27-rm-ci "${testcvs} -q co first-dir" ''
- cd first-dir
- # All the files are removed, so nothing gets tagged.
- dotest basic1-28 "${testcvs} -q tag first-dive" ''
- cd ..
- cd ..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -r basic1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- deep)
- # Test the ability to operate on directories nested rather deeply.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest deep-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- for i in dir1 dir2 dir3 dir4 dir5 dir6 dir7 dir8; do
- mkdir $i
- dotest deep-2-$i "${testcvs} add $i" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir1[/dir0-9]* added to the repository"
- cd $i
- echo file1 >file1
- dotest deep-3-$i "${testcvs} add file1" \
- "${PROG}"' add: scheduling file `file1'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- done
- cd ../../../../../../../../..
- dotest_lit deep-4 "${testcvs} -q ci -m add-them first-dir" <<HERE
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/file1,v
- done
- Checking in first-dir/dir1/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/file1,v <-- file1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file1,v
- done
- Checking in first-dir/dir1/dir2/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file1,v <-- file1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/file1,v
- done
- Checking in first-dir/dir1/dir2/dir3/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/file1,v <-- file1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/file1,v
- done
- Checking in first-dir/dir1/dir2/dir3/dir4/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/file1,v <-- file1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/file1,v
- done
- Checking in first-dir/dir1/dir2/dir3/dir4/dir5/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/file1,v <-- file1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/dir6/file1,v
- done
- Checking in first-dir/dir1/dir2/dir3/dir4/dir5/dir6/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/dir6/file1,v <-- file1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/dir6/dir7/file1,v
- done
- Checking in first-dir/dir1/dir2/dir3/dir4/dir5/dir6/dir7/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/dir6/dir7/file1,v <-- file1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/file1,v
- done
- Checking in first-dir/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/file1,v <-- file1
- initial revision: 1.1
- done
- HERE
- cd first-dir/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8
- rm file1
- dotest deep-4a0 "${testcvs} rm file1" \
- "${PROG} remove: scheduling .file1. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest deep-4a1 "${testcvs} -q ci -m rm-it" "Removing file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done"
- cd ../../..
- dotest deep-4a2 "${testcvs} -q update -P dir6/dir7" ''
- # Should be using "test -e" if that is portable enough.
- dotest_fail deep-4a3 "test -d dir6/dir7/dir8" ''
- # Test that if we remove the working directory, CVS does not
- # recreate it. (I realize that this behavior is what the
- # users expect, but in the longer run we might want to
- # re-think it. The corresponding behavior for a file is that
- # CVS *will* recreate it, and we might want to make it so
- # that "cvs release -d" is the way to delete the directory
- # and have it stay gone -kingdon, Oct1996).
- rm -r dir6
- dotest deep-4b0a "${testcvs} -q diff" ''
- dotest deep-4b0b "${testcvs} -q ci" ''
- dotest deep-4b1 "${testcvs} -q update" ''
- dotest deep-4b2 "${testcvs} -q update -d -P" \
- 'U dir6/file1
- U dir6/dir7/file1'
- # Test what happens if one uses -P when there are files removed
- # but not committed.
- cd dir6/dir7
- dotest deep-rm1 "${testcvs} rm -f file1" \
- "${PROG} remove: scheduling .file1. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- cd ..
- dotest deep-rm2 "${testcvs} -q update -d -P" 'R dir7/file1'
- dotest deep-rm3 "test -d dir7" ''
- dotest deep-rm4 "${testcvs} -q ci -m rm-it" "Removing dir7/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/dir6/dir7/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done"
- dotest deep-rm5 "${testcvs} -q update -d -P" ''
- dotest_fail deep-rm6 "test -d dir7" ''
- # Test rm -f -R.
- cd ../..
- dotest deep-rm7 "${testcvs} rm -f -R dir5" \
- "${PROG} remove: Removing dir5
- ${PROG} remove: scheduling .dir5/file1. for removal
- ${PROG} remove: Removing dir5/dir6
- ${PROG} remove: scheduling .dir5/dir6/file1. for removal
- ${PROG} remove: use .${PROG} commit. to remove these files permanently"
- dotest deep-rm8 "${testcvs} -q ci -m rm-it" \
- "Removing dir5/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done
- Removing dir5/dir6/file1;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/dir3/dir4/dir5/dir6/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done"
- dotest deep-rm9 "${testcvs} -q update -d -P" ''
- dotest_fail deep-rm10 "test -d dir5"
- cd ../../../../..
- if echo "yes" | ${testcvs} release -d first-dir >>${LOGFILE}; then
- pass deep-5
- else
- fail deep-5
- fi
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- basic2)
- # Test rtag, import, history, various miscellaneous operations
- # NOTE: this section has reached the size and
- # complexity where it is getting to be a good idea to
- # add new tests to a new section rather than
- # continuing to piggyback them onto the tests here.
- # First empty the history file
- rm ${CVSROOT_DIRNAME}/CVSROOT/history
- touch ${CVSROOT_DIRNAME}/CVSROOT/history
- ### XXX maybe should use 'cvs imprt -b1 -m new-module first-dir F F1' in an
- ### empty directory to do this instead of hacking directly into $CVSROOT
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest basic2-1 "${testcvs} -q co first-dir" ''
- for i in first-dir dir1 dir2 ; do
- if test ! -d $i ; then
- mkdir $i
- dotest basic2-2-$i "${testcvs} add $i" \
- "Directory ${CVSROOT_DIRNAME}/.*/$i added to the repository"
- fi
- cd $i
- for j in file6 file7; do
- echo $j > $j
- done
- dotest basic2-3-$i "${testcvs} add file6 file7" \
- "${PROG} add: scheduling file .file6. for addition
- ${PROG} add: scheduling file .file7. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- done
- cd ../../..
- dotest basic2-4 "${testcvs} update first-dir" \
- "${PROG} update: Updating first-dir
- A first-dir/file6
- A first-dir/file7
- ${PROG} update: Updating first-dir/dir1
- A first-dir/dir1/file6
- A first-dir/dir1/file7
- ${PROG} update: Updating first-dir/dir1/dir2
- A first-dir/dir1/dir2/file6
- A first-dir/dir1/dir2/file7"
- # fixme: doesn't work right for added files.
- dotest basic2-5 "${testcvs} log first-dir" \
- "${PROG} log: Logging first-dir
- ${PROG} log: file6 has been added, but not committed
- ${PROG} log: file7 has been added, but not committed
- ${PROG} log: Logging first-dir/dir1
- ${PROG} log: file6 has been added, but not committed
- ${PROG} log: file7 has been added, but not committed
- ${PROG} log: Logging first-dir/dir1/dir2
- ${PROG} log: file6 has been added, but not committed
- ${PROG} log: file7 has been added, but not committed"
- dotest basic2-6 "${testcvs} status first-dir" \
- "${PROG} status: Examining first-dir
- ===================================================================
- File: file6 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file7 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ${PROG} status: Examining first-dir/dir1
- ===================================================================
- File: file6 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file7 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ${PROG} status: Examining first-dir/dir1/dir2
- ===================================================================
- File: file6 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file7 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- # XXX why is this commented out???
- # if ${CVS} diff -u first-dir >> ${LOGFILE} || test $? = 1 ; then
- # pass 34
- # else
- # fail 34
- # fi
- dotest basic2-8 "${testcvs} -q ci -m 'second dive' first-dir" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file6,v
- done
- Checking in first-dir/file6;
- ${CVSROOT_DIRNAME}/first-dir/file6,v <-- file6
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file7,v
- done
- Checking in first-dir/file7;
- ${CVSROOT_DIRNAME}/first-dir/file7,v <-- file7
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/file6,v
- done
- Checking in first-dir/dir1/file6;
- ${CVSROOT_DIRNAME}/first-dir/dir1/file6,v <-- file6
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/file7,v
- done
- Checking in first-dir/dir1/file7;
- ${CVSROOT_DIRNAME}/first-dir/dir1/file7,v <-- file7
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file6,v
- done
- Checking in first-dir/dir1/dir2/file6;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file6,v <-- file6
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file7,v
- done
- Checking in first-dir/dir1/dir2/file7;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file7,v <-- file7
- initial revision: 1\.1
- done"
- dotest basic2-9 "${testcvs} tag second-dive first-dir" \
- "${PROG} tag: Tagging first-dir
- T first-dir/file6
- T first-dir/file7
- ${PROG} tag: Tagging first-dir/dir1
- T first-dir/dir1/file6
- T first-dir/dir1/file7
- ${PROG} tag: Tagging first-dir/dir1/dir2
- T first-dir/dir1/dir2/file6
- T first-dir/dir1/dir2/file7"
- # third dive - in bunch o' directories, add bunch o' files,
- # delete some, change some.
- for i in first-dir dir1 dir2 ; do
- cd $i
- # modify a file
- echo file6 >>file6
- # delete a file
- rm file7
- dotest basic2-10-$i "${testcvs} rm file7" \
- "${PROG} remove: scheduling .file7. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- # and add a new file
- echo file14 >file14
- dotest basic2-11-$i "${testcvs} add file14" \
- "${PROG} add: scheduling file .file14. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- done
- cd ../../..
- dotest basic2-12 "${testcvs} update first-dir" \
- "${PROG} update: Updating first-dir
- A first-dir/file14
- M first-dir/file6
- R first-dir/file7
- ${PROG} update: Updating first-dir/dir1
- A first-dir/dir1/file14
- M first-dir/dir1/file6
- R first-dir/dir1/file7
- ${PROG} update: Updating first-dir/dir1/dir2
- A first-dir/dir1/dir2/file14
- M first-dir/dir1/dir2/file6
- R first-dir/dir1/dir2/file7"
- # FIXME: doesn't work right for added files
- dotest basic2-13 "${testcvs} log first-dir" \
- "${PROG} log: Logging first-dir
- ${PROG} log: file14 has been added, but not committed
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file6,v
- Working file: first-dir/file6
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- second-dive: 1\.1
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- second dive
- =============================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file7,v
- Working file: first-dir/file7
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- second-dive: 1\.1
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- second dive
- =============================================================================
- ${PROG} log: Logging first-dir/dir1
- ${PROG} log: file14 has been added, but not committed
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/file6,v
- Working file: first-dir/dir1/file6
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- second-dive: 1\.1
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- second dive
- =============================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/file7,v
- Working file: first-dir/dir1/file7
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- second-dive: 1\.1
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- second dive
- =============================================================================
- ${PROG} log: Logging first-dir/dir1/dir2
- ${PROG} log: file14 has been added, but not committed
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file6,v
- Working file: first-dir/dir1/dir2/file6
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- second-dive: 1\.1
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- second dive
- =============================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file7,v
- Working file: first-dir/dir1/dir2/file7
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- second-dive: 1\.1
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- second dive
- ============================================================================="
- dotest basic2-14 "${testcvs} status first-dir" \
- "${PROG} status: Examining first-dir
- ===================================================================
- File: file14 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file6 Status: Locally Modified
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file6,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: no file file7 Status: Locally Removed
- Working revision: -1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file7,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ${PROG} status: Examining first-dir/dir1
- ===================================================================
- File: file14 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file6 Status: Locally Modified
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/dir1/file6,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: no file file7 Status: Locally Removed
- Working revision: -1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/dir1/file7,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ${PROG} status: Examining first-dir/dir1/dir2
- ===================================================================
- File: file14 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file6 Status: Locally Modified
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file6,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: no file file7 Status: Locally Removed
- Working revision: -1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file7,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- # XXX why is this commented out?
- # if ${CVS} diff -u first-dir >> ${LOGFILE} || test $? = 1 ; then
- # pass 42
- # else
- # fail 42
- # fi
- dotest basic2-16 "${testcvs} ci -m 'third dive' first-dir" \
- "${PROG} [a-z]*: Examining first-dir
- ${PROG} [a-z]*: Examining first-dir/dir1
- ${PROG} [a-z]*: Examining first-dir/dir1/dir2
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file14,v
- done
- Checking in first-dir/file14;
- ${CVSROOT_DIRNAME}/first-dir/file14,v <-- file14
- initial revision: 1\.1
- done
- Checking in first-dir/file6;
- ${CVSROOT_DIRNAME}/first-dir/file6,v <-- file6
- new revision: 1\.2; previous revision: 1\.1
- done
- Removing first-dir/file7;
- ${CVSROOT_DIRNAME}/first-dir/file7,v <-- file7
- new revision: delete; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/file14,v
- done
- Checking in first-dir/dir1/file14;
- ${CVSROOT_DIRNAME}/first-dir/dir1/file14,v <-- file14
- initial revision: 1\.1
- done
- Checking in first-dir/dir1/file6;
- ${CVSROOT_DIRNAME}/first-dir/dir1/file6,v <-- file6
- new revision: 1\.2; previous revision: 1\.1
- done
- Removing first-dir/dir1/file7;
- ${CVSROOT_DIRNAME}/first-dir/dir1/file7,v <-- file7
- new revision: delete; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file14,v
- done
- Checking in first-dir/dir1/dir2/file14;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file14,v <-- file14
- initial revision: 1\.1
- done
- Checking in first-dir/dir1/dir2/file6;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file6,v <-- file6
- new revision: 1\.2; previous revision: 1\.1
- done
- Removing first-dir/dir1/dir2/file7;
- ${CVSROOT_DIRNAME}/first-dir/dir1/dir2/file7,v <-- file7
- new revision: delete; previous revision: 1\.1
- done"
- dotest basic2-17 "${testcvs} -q update first-dir" ''
- dotest basic2-18 "${testcvs} tag third-dive first-dir" \
- "${PROG} tag: Tagging first-dir
- T first-dir/file14
- T first-dir/file6
- ${PROG} tag: Tagging first-dir/dir1
- T first-dir/dir1/file14
- T first-dir/dir1/file6
- ${PROG} tag: Tagging first-dir/dir1/dir2
- T first-dir/dir1/dir2/file14
- T first-dir/dir1/dir2/file6"
- dotest basic2-19 "echo yes | ${testcvs} release -d first-dir" \
- "You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .first-dir.: "
- # end of third dive
- dotest_fail basic2-20 "test -d first-dir" ""
- # now try some rtags
- # rtag HEADS
- dotest basic2-21 "${testcvs} rtag rtagged-by-head first-dir" \
- "${PROG} rtag: Tagging first-dir
- ${PROG} rtag: Tagging first-dir/dir1
- ${PROG} rtag: Tagging first-dir/dir1/dir2"
- # The next test used to cause an assert failure
- # something like:
- # cvs: ./recurse.c:667: do_recursion: Assertion `repository != ((void *)0)' failed.
- dotest basic2-21b "${testcvs} co -p -r rtagged-by-head first-dir/file6" \
- "===================================================================
- Checking out first-dir/file6
- RCS: $CVSROOT_DIRNAME/first-dir/file6,v
- VERS: 1\.2
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- file6
- file6"
- # tag by tag
- dotest basic2-22 "${testcvs} rtag -r rtagged-by-head rtagged-by-tag first-dir" \
- "${PROG} rtag: Tagging first-dir
- ${PROG} rtag: Tagging first-dir/dir1
- ${PROG} rtag: Tagging first-dir/dir1/dir2"
- # tag by revision
- dotest basic2-23 "${testcvs} rtag -r1.1 rtagged-by-revision first-dir" \
- "${PROG} rtag: Tagging first-dir
- ${PROG} rtag: Tagging first-dir/dir1
- ${PROG} rtag: Tagging first-dir/dir1/dir2"
- # rdiff by revision
- dotest basic2-24 "${testcvs} rdiff -r1.1 -rrtagged-by-head first-dir" \
- "${PROG} rdiff: Diffing first-dir
- Index: first-dir/file6
- diff -c first-dir/file6:1\.1 first-dir/file6:1\.2
- \*\*\* first-dir/file6:1\.1 ${DATE}
- --- first-dir/file6 ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- --- 1,2 ----
- file6
- ${PLUS} file6
- Index: first-dir/file7
- diff -c first-dir/file7:1\.1 first-dir/file7:removed
- \*\*\* first-dir/file7:1.1 ${DATE}
- --- first-dir/file7 ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- - file7
- --- 0 ----
- ${PROG} rdiff: Diffing first-dir/dir1
- Index: first-dir/dir1/file6
- diff -c first-dir/dir1/file6:1\.1 first-dir/dir1/file6:1\.2
- \*\*\* first-dir/dir1/file6:1\.1 ${DATE}
- --- first-dir/dir1/file6 ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- --- 1,2 ----
- file6
- ${PLUS} file6
- Index: first-dir/dir1/file7
- diff -c first-dir/dir1/file7:1\.1 first-dir/dir1/file7:removed
- \*\*\* first-dir/dir1/file7:1\.1 ${DATE}
- --- first-dir/dir1/file7 ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- - file7
- --- 0 ----
- ${PROG} rdiff: Diffing first-dir/dir1/dir2
- Index: first-dir/dir1/dir2/file6
- diff -c first-dir/dir1/dir2/file6:1\.1 first-dir/dir1/dir2/file6:1\.2
- \*\*\* first-dir/dir1/dir2/file6:1\.1 ${DATE}
- --- first-dir/dir1/dir2/file6 ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- --- 1,2 ----
- file6
- ${PLUS} file6
- Index: first-dir/dir1/dir2/file7
- diff -c first-dir/dir1/dir2/file7:1\.1 first-dir/dir1/dir2/file7:removed
- \*\*\* first-dir/dir1/dir2/file7:1\.1 ${DATE}
- --- first-dir/dir1/dir2/file7 ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- - file7
- --- 0 ----"
- dotest basic2-24a "${testcvs} rdiff -l -r1.1 -rrtagged-by-head first-dir" \
- "${PROG} rdiff: Diffing first-dir
- Index: first-dir/file6
- diff -c first-dir/file6:1\.1 first-dir/file6:1\.2
- \*\*\* first-dir/file6:1\.1 ${DATE}
- --- first-dir/file6 ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- --- 1,2 ----
- file6
- ${PLUS} file6
- Index: first-dir/file7
- diff -c first-dir/file7:1\.1 first-dir/file7:removed
- \*\*\* first-dir/file7:1.1 ${DATE}
- --- first-dir/file7 ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- - file7
- --- 0 ----"
- # now export by rtagged-by-head and rtagged-by-tag and compare.
- dotest basic2-25 "${testcvs} export -r rtagged-by-head -d 1dir first-dir" \
- "${PROG} export: Updating 1dir
- U 1dir/file14
- U 1dir/file6
- ${PROG} export: Updating 1dir/dir1
- U 1dir/dir1/file14
- U 1dir/dir1/file6
- ${PROG} export: Updating 1dir/dir1/dir2
- U 1dir/dir1/dir2/file14
- U 1dir/dir1/dir2/file6"
- dotest_fail basic2-25a "test -d 1dir/CVS"
- dotest_fail basic2-25b "test -d 1dir/dir1/CVS"
- dotest_fail basic2-25c "test -d 1dir/dir1/dir2/CVS"
- dotest basic2-26 "${testcvs} export -r rtagged-by-tag first-dir" \
- "${PROG} export: Updating first-dir
- U first-dir/file14
- U first-dir/file6
- ${PROG} export: Updating first-dir/dir1
- U first-dir/dir1/file14
- U first-dir/dir1/file6
- ${PROG} export: Updating first-dir/dir1/dir2
- U first-dir/dir1/dir2/file14
- U first-dir/dir1/dir2/file6"
- dotest_fail basic2-26a "test -d first-dir/CVS"
- dotest_fail basic2-26b "test -d first-dir/dir1/CVS"
- dotest_fail basic2-26c "test -d first-dir/dir1/dir2/CVS"
- dotest basic2-27 "directory_cmp 1dir first-dir"
- rm -r 1dir first-dir
- # checkout by revision vs export by rtagged-by-revision and compare.
- mkdir export-dir
- dotest basic2-28 "${testcvs} export -rrtagged-by-revision -d export-dir first-dir" \
- "${PROG} export: Updating export-dir
- U export-dir/file14
- U export-dir/file6
- U export-dir/file7
- ${PROG} export: Updating export-dir/dir1
- U export-dir/dir1/file14
- U export-dir/dir1/file6
- U export-dir/dir1/file7
- ${PROG} export: Updating export-dir/dir1/dir2
- U export-dir/dir1/dir2/file14
- U export-dir/dir1/dir2/file6
- U export-dir/dir1/dir2/file7"
- dotest_fail basic2-28a "test -d export-dir/CVS"
- dotest_fail basic2-28b "test -d export-dir/dir1/CVS"
- dotest_fail basic2-28c "test -d export-dir/dir1/dir2/CVS"
- dotest basic2-29 "${testcvs} co -r1.1 first-dir" \
- "${PROG} checkout: Updating first-dir
- U first-dir/file14
- U first-dir/file6
- U first-dir/file7
- ${PROG} checkout: Updating first-dir/dir1
- U first-dir/dir1/file14
- U first-dir/dir1/file6
- U first-dir/dir1/file7
- ${PROG} checkout: Updating first-dir/dir1/dir2
- U first-dir/dir1/dir2/file14
- U first-dir/dir1/dir2/file6
- U first-dir/dir1/dir2/file7"
- # directory copies are done in an oblique way in order to avoid a bug in sun's tmp filesystem.
- mkdir first-dir.cpy ; (cd first-dir ; tar cf - . | (cd ../first-dir.cpy ; tar xf -))
- dotest basic2-30 "directory_cmp first-dir export-dir"
- # interrupt, while we've got a clean 1.1 here, let's import it
- # into a couple of other modules.
- cd export-dir
- dotest_sort basic2-31 "${testcvs} import -m first-import second-dir first-immigration immigration1 immigration1_0" \
- "
- N second-dir/dir1/dir2/file14
- N second-dir/dir1/dir2/file6
- N second-dir/dir1/dir2/file7
- N second-dir/dir1/file14
- N second-dir/dir1/file6
- N second-dir/dir1/file7
- N second-dir/file14
- N second-dir/file6
- N second-dir/file7
- No conflicts created by this import
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/second-dir/dir1
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/second-dir/dir1/dir2"
- cd ..
- dotest basic2-32 "${testcvs} export -r HEAD second-dir" \
- "${PROG} export: Updating second-dir
- U second-dir/file14
- U second-dir/file6
- U second-dir/file7
- ${PROG} export: Updating second-dir/dir1
- U second-dir/dir1/file14
- U second-dir/dir1/file6
- U second-dir/dir1/file7
- ${PROG} export: Updating second-dir/dir1/dir2
- U second-dir/dir1/dir2/file14
- U second-dir/dir1/dir2/file6
- U second-dir/dir1/dir2/file7"
- dotest basic2-33 "directory_cmp first-dir second-dir"
- rm -r second-dir
- rm -r export-dir first-dir
- mkdir first-dir
- (cd first-dir.cpy ; tar cf - . | (cd ../first-dir ; tar xf -))
- # update the top, cancelling sticky tags, retag, update other copy, compare.
- cd first-dir
- dotest basic2-34 "${testcvs} update -A -l *file*" \
- "[UP] file6
- ${PROG} update: file7 is no longer in the repository"
- # If we don't delete the tag first, cvs won't retag it.
- # This would appear to be a feature.
- dotest basic2-35 "${testcvs} tag -l -d rtagged-by-revision" \
- "${PROG} tag: Untagging \.
- D file14
- D file6"
- dotest basic2-36 "${testcvs} tag -l rtagged-by-revision" \
- "${PROG} tag: Tagging \.
- T file14
- T file6"
- cd ..
- mv first-dir 1dir
- mv first-dir.cpy first-dir
- cd first-dir
- dotest basic2-37 "${testcvs} -q diff -u" ''
- dotest basic2-38 "${testcvs} update" \
- "${PROG} update: Updating .
- ${PROG} update: Updating dir1
- ${PROG} update: Updating dir1/dir2"
- cd ..
- #### FIXME: is this expected to work??? Need to investigate
- #### and fix or remove the test.
- # dotest basic2-39 "directory_cmp 1dir first-dir"
- rm -r 1dir first-dir
- # Test the cvs history command.
- # The reason that there are two patterns rather than using
- # \(${TESTDIR}\|<remote>\) is that we are trying to
- # make this portable. Perhaps at some point we should
- # ditch that notion and require GNU expr (or dejagnu or....)
- # since it seems to be so painful.
- # why are there two lines at the end of the local output
- # which don't exist in the remote output? would seem to be
- # a CVS bug.
- dotest basic2-64 "${testcvs} his -x TOFWUPCGMAR -a" \
- "O [0-9-]* [0-9:]* ${PLUS}0000 ${username} first-dir =first-dir= ${TESTDIR}/\*
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file6 first-dir == ${TESTDIR}
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file7 first-dir == ${TESTDIR}
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file6 first-dir/dir1 == ${TESTDIR}
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file7 first-dir/dir1 == ${TESTDIR}
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file6 first-dir/dir1/dir2 == ${TESTDIR}
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file7 first-dir/dir1/dir2 == ${TESTDIR}
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file14 first-dir == ${TESTDIR}
- M [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file6 first-dir == ${TESTDIR}
- R [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file7 first-dir == ${TESTDIR}
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file14 first-dir/dir1 == ${TESTDIR}
- M [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file6 first-dir/dir1 == ${TESTDIR}
- R [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file7 first-dir/dir1 == ${TESTDIR}
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file14 first-dir/dir1/dir2 == ${TESTDIR}
- M [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file6 first-dir/dir1/dir2 == ${TESTDIR}
- R [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file7 first-dir/dir1/dir2 == ${TESTDIR}
- F [0-9-]* [0-9:]* ${PLUS}0000 ${username} =first-dir= ${TESTDIR}/\*
- T [0-9-]* [0-9:]* ${PLUS}0000 ${username} first-dir \[rtagged-by-head:A\]
- T [0-9-]* [0-9:]* ${PLUS}0000 ${username} first-dir \[rtagged-by-tag:rtagged-by-head\]
- T [0-9-]* [0-9:]* ${PLUS}0000 ${username} first-dir \[rtagged-by-revision:1\.1\]
- O [0-9-]* [0-9:]* ${PLUS}0000 ${username} \[1\.1\] first-dir =first-dir= ${TESTDIR}/\*
- U [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file6 first-dir == ${TESTDIR}/first-dir
- W [0-9-]* [0-9:]* ${PLUS}0000 ${username} file7 first-dir == ${TESTDIR}/first-dir" \
- "O [0-9-]* [0-9:]* ${PLUS}0000 ${username} first-dir =first-dir= <remote>/\*
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file6 first-dir == <remote>
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file7 first-dir == <remote>
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file6 first-dir/dir1 == <remote>
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file7 first-dir/dir1 == <remote>
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file6 first-dir/dir1/dir2 == <remote>
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file7 first-dir/dir1/dir2 == <remote>
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file14 first-dir == <remote>
- M [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file6 first-dir == <remote>
- R [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file7 first-dir == <remote>
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file14 first-dir/dir1 == <remote>
- M [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file6 first-dir/dir1 == <remote>
- R [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file7 first-dir/dir1 == <remote>
- A [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file14 first-dir/dir1/dir2 == <remote>
- M [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file6 first-dir/dir1/dir2 == <remote>
- R [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file7 first-dir/dir1/dir2 == <remote>
- F [0-9-]* [0-9:]* ${PLUS}0000 ${username} =first-dir= <remote>/\*
- T [0-9-]* [0-9:]* ${PLUS}0000 ${username} first-dir \[rtagged-by-head:A\]
- T [0-9-]* [0-9:]* ${PLUS}0000 ${username} first-dir \[rtagged-by-tag:rtagged-by-head\]
- T [0-9-]* [0-9:]* ${PLUS}0000 ${username} first-dir \[rtagged-by-revision:1\.1\]
- O [0-9-]* [0-9:]* ${PLUS}0000 ${username} \[1\.1\] first-dir =first-dir= <remote>/\*
- P [0-9-]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file6 first-dir == <remote>
- W [0-9-]* [0-9:]* ${PLUS}0000 ${username} file7 first-dir == <remote>"
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -rf ${CVSROOT_DIRNAME}/second-dir
- ;;
- parseroot)
- mkdir 1; cd 1
- # Test odd cases involving CVSROOT. At the moment, that means we
- # are testing roots with '/'s on the end, which CVS should parse off.
- CVSROOT_save=${CVSROOT}
- CVSROOT="${CVSROOT}/////"
- dotest parseroot-1 "${testcvs} -q co CVSROOT/modules" \
- "U CVSROOT/modules"
- dotest parseroot-2 "${testcvs} -q ci -fmnull-change CVSROOT/modules" \
- "Checking in CVSROOT/modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.2; previous revision: 1\.1
- done
- ${PROG} commit: Rebuilding administrative file database"
- if $remote; then
- # I only test these when testing remote in case CVS was compiled
- # without client support.
- # logout does not try to contact the server.
- CVSROOT=":pserver;proxy=localhost;proxyport=8080:localhost/dev/null"
- dotest parseroot-3r "$testcvs -d'$CVSROOT' logout" \
- "$PROG logout: WARNING: Ignoring method options found in CVSROOT: \`proxy=localhost;proxyport=8080'\.
- $PROG logout: Use CVS version 1\.12\.7 or later to handle method options\.
- Logging out of :pserver:$username@localhost:2401/dev/null
- $PROG logout: warning: failed to open $HOME/\.cvspass for reading: No such file or directory
- $PROG logout: Entry not found\."
- fi
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- CVSROOT=$CVSROOT_save
- cd ..
- rm -r 1
- ;;
- files)
- # Test of how we specify files on the command line
- # (recurse.c and that sort of thing). Vaguely similar to
- # tests like basic* and deep. See modules and such tests
- # for what happens when we throw in modules and co -d, &c.
- # This particular test is fairly carefully crafted, to spot
- # one particular issue with remote.
- mkdir 1; cd 1
- dotest files-1 "${testcvs} -q co -l ." ""
- mkdir first-dir
- dotest files-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch tfile
- dotest files-3 "${testcvs} add tfile" \
- "${PROG} add: scheduling file .tfile. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest files-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/tfile,v
- done
- Checking in tfile;
- ${CVSROOT_DIRNAME}/first-dir/tfile,v <-- tfile
- initial revision: 1\.1
- done"
- dotest files-5 "${testcvs} -q tag -b C" "T tfile"
- dotest files-6 "$testcvs -q update -r C" "U tfile"
- mkdir dir
- dotest files-7 "${testcvs} add dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir added to the repository
- --> Using per-directory sticky tag .C'"
- cd dir
- touch .file
- dotest files-6 "${testcvs} add .file" \
- "${PROG} add: scheduling file .\.file' for addition on branch .C.
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- mkdir sdir
- dotest files-7 "${testcvs} add sdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir/sdir added to the repository
- --> Using per-directory sticky tag .C'"
- cd sdir
- mkdir ssdir
- dotest files-8 "${testcvs} add ssdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir/sdir/ssdir added to the repository
- --> Using per-directory sticky tag .C'"
- cd ssdir
- touch .file
- dotest files-9 "${testcvs} add .file" \
- "${PROG} add: scheduling file .\.file' for addition on branch .C.
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- cd ../..
- dotest files-10 "${testcvs} -q ci -m test" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/dir/Attic/\.file,v
- done
- Checking in \.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/Attic/\.file,v <-- \.file
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir/sdir/ssdir/Attic/\.file,v
- done
- Checking in sdir/ssdir/\.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/sdir/ssdir/Attic/\.file,v <-- \.file
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest files-11 \
- "${testcvs} commit -m test -f ./.file ./sdir/ssdir/.file" \
- "Checking in \.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/Attic/\.file,v <-- \.file
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done
- Checking in \./sdir/ssdir/\.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/sdir/ssdir/Attic/\.file,v <-- \.file
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done"
- if $remote; then
- # FIXCVS:
- # This is a bug, looks like that toplevel_repos cruft in
- # client.c is coming back to haunt us.
- # May want to think about the whole issue, toplevel_repos
- # has always been crufty and trying to patch it up again
- # might be a mistake.
- dotest files-12 \
- "${testcvs} commit -f -m test ./sdir/ssdir/.file ./.file" \
- "Checking in \./sdir/ssdir/\.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/sdir/ssdir/Attic/\.file,v <-- \.file
- new revision: 1\.1\.2\.3; previous revision: 1\.1\.2\.2
- done"
- # Sync up the version numbers so that the rest of the
- # tests don't need to expect different numbers based
- # local or remote.
- dotest files-12-workaround \
- "${testcvs} commit -f -m test .file" \
- "Checking in \.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/Attic/\.file,v <-- \.file
- new revision: 1\.1\.2\.3; previous revision: 1\.1\.2\.2
- done"
- else
- dotest files-12 \
- "${testcvs} commit -f -m test ./sdir/ssdir/.file ./.file" \
- "Checking in \./sdir/ssdir/\.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/sdir/ssdir/Attic/\.file,v <-- \.file
- new revision: 1\.1\.2\.3; previous revision: 1\.1\.2\.2
- done
- Checking in \.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/Attic/\.file,v <-- \.file
- new revision: 1\.1\.2\.3; previous revision: 1\.1\.2\.2
- done"
- fi
- dotest files-13 \
- "${testcvs} commit -fmtest ./sdir/../sdir/ssdir/..///ssdir/.file" \
- "Checking in \./sdir/\.\./sdir/ssdir/\.\.///ssdir/\.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/sdir/ssdir/Attic/\.file,v <-- \.file
- new revision: 1\.1\.2\.4; previous revision: 1\.1\.2\.3
- done"
- if $remote; then
- dotest files-14 \
- "${testcvs} commit -fmtest ../../first-dir/dir/.file" \
- "Checking in \.\./\.\./first-dir/dir/\.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/Attic/\.file,v <-- .file
- new revision: 1\.1\.2\.4; previous revision: 1\.1\.2\.3
- done"
- else
- dotest files-14 \
- "${testcvs} commit -fmtest ../../first-dir/dir/.file" \
- "Checking in \.\./\.\./first-dir/dir/\.file;
- ${CVSROOT_DIRNAME}/first-dir/dir/Attic/\.file,v <-- \.file
- new revision: 1\.1\.2\.4; previous revision: 1\.1\.2\.3
- done"
- fi
- cd ../../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- spacefiles)
- # More filename tests, in particular spaces in file names.
- # (it might be better to just change a few of the names in
- # basica or some other test instead, always good to keep the
- # testsuite concise).
- mkdir 1; cd 1
- dotest spacefiles-1 "${testcvs} -q co -l ." ""
- touch ./-c
- dotest spacefiles-2 "${testcvs} add -- -c" \
- "${PROG} add: scheduling file .-c. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest spacefiles-3 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/-c,v
- done
- Checking in -c;
- ${CVSROOT_DIRNAME}/-c,v <-- -c
- initial revision: 1\.1
- done"
- mkdir 'first dir'
- dotest spacefiles-4 "${testcvs} add 'first dir'" \
- "Directory ${CVSROOT_DIRNAME}/first dir added to the repository"
- mkdir ./-b
- dotest spacefiles-5 "${testcvs} add -- -b" \
- "Directory ${CVSROOT_DIRNAME}/-b added to the repository"
- cd 'first dir'
- touch 'a file'
- dotest spacefiles-6 "${testcvs} add 'a file'" \
- "${PROG} add: scheduling file .a file. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest spacefiles-7 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first dir/a file,v
- done
- Checking in a file;
- ${CVSROOT_DIRNAME}/first dir/a file,v <-- a file
- initial revision: 1\.1
- done"
- dotest spacefiles-8 "${testcvs} -q tag new-tag" "T a file"
- cd ../..
- mkdir 2; cd 2
- dotest spacefiles-10 "${testcvs} co -- -b" \
- "${PROG} checkout: Updating -b"
- dotest spacefiles-11 "${testcvs} -q co -- -c" "U \./-c"
- rm ./-c
- dotest spacefiles-13 "${testcvs} -q co 'first dir'" \
- "U first dir/a file"
- cd ..
- mkdir 3; cd 3
- dotest spacefiles-14 "${testcvs} -q co 'first dir/a file'" \
- "U first dir/a file"
- cd ..
- rm -r 1 2 3
- rm -rf "${CVSROOT_DIRNAME}/first dir"
- rm -r ${CVSROOT_DIRNAME}/-b
- rm -f ${CVSROOT_DIRNAME}/-c,v
- ;;
- commit-readonly)
- mkdir 1; cd 1
- module=x
- : > junk
- dotest commit-readonly-1 "$testcvs -Q import -m . $module X Y" ''
- dotest commit-readonly-2 "$testcvs -Q co $module" ''
- cd $module
- file=m
- # Include an rcs keyword to be expanded.
- echo '$Id''$' > $file
- dotest commit-readonly-3 "$testcvs add $file" \
- "${PROG} add: scheduling file .$file. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest commit-readonly-4 "$testcvs -Q ci -m . $file" \
- "RCS file: ${CVSROOT_DIRNAME}/$module/$file,v
- done
- Checking in $file;
- ${CVSROOT_DIRNAME}/$module/$file,v <-- $file
- initial revision: 1\.1
- done"
- echo line2 >> $file
- # Make the file read-only.
- chmod a-w $file
- dotest commit-readonly-5 "$testcvs -Q ci -m . $file" \
- "Checking in $file;
- ${CVSROOT_DIRNAME}/$module/$file,v <-- $file
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/$module
- ;;
- status)
- # This tests for a bug in the status command which failed to
- # notice resolved conflicts.
- mkdir status; cd status
- dotest status-init-1 "${testcvs} -q co -l ." ""
- mkdir first-dir
- dotest status-init-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo a line >tfile
- dotest status-init-3 "${testcvs} add tfile" \
- "${PROG} add: scheduling file .tfile. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest status-init-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/tfile,v
- done
- Checking in tfile;
- ${CVSROOT_DIRNAME}/first-dir/tfile,v <-- tfile
- initial revision: 1\.1
- done"
- cd ..
- dotest status-init-5 "${testcvs} -q co -dsecond-dir first-dir" \
- "U second-dir/tfile"
- cd second-dir
- echo some junk >>tfile
- dotest status-init-6 "${testcvs} -q ci -maline" \
- "Checking in tfile;
- ${CVSROOT_DIRNAME}/first-dir/tfile,v <-- tfile
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../first-dir
- echo force a conflict >>tfile
- dotest status-init-7 "${testcvs} -q up" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/tfile,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into tfile
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in tfile
- C tfile"
- # Now note our status
- dotest status-1 "${testcvs} status tfile" \
- "===================================================================
- File: tfile Status: Unresolved Conflict
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/tfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- # touch the file, leaving conflict markers in place
- # and note our status
- touch tfile
- dotest status-2 "${testcvs} status tfile" \
- "===================================================================
- File: tfile Status: File had conflicts on merge
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/tfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- # resolve the conflict
- echo resolution >tfile
- dotest status-3 "${testcvs} status tfile" \
- "===================================================================
- File: tfile Status: Locally Modified
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/tfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- # Check that there are no problems just using CVS/Root too.
- save_CVSROOT=$CVSROOT
- unset CVSROOT
- dotest status-3a "${testcvs} status tfile" \
- "===================================================================
- File: tfile Status: Locally Modified
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/tfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- CVSROOT=$save_CVSROOT
- export CVSROOT
- # FIXCVS:
- # Update is supposed to re-Register() the file when it
- # finds resolved conflicts:
- dotest status-4 "grep 'Result of merge' CVS/Entries" \
- "/tfile/1\.2/Result of merge${PLUS}[a-zA-Z0-9 :]*//"
- cd ..
- mkdir fourth-dir
- dotest status-init-8 "$testcvs add fourth-dir" \
- "Directory $CVSROOT_DIRNAME/fourth-dir added to the repository"
- cd fourth-dir
- echo yet another line >t3file
- dotest status-init-9 "$testcvs add t3file" \
- "$PROG add: scheduling file .t3file. for addition
- $PROG add: use .$PROG commit. to add this file permanently"
- dotest status-init-10 "$testcvs -q ci -m add" \
- "RCS file: $CVSROOT_DIRNAME/fourth-dir/t3file,v
- done
- Checking in t3file;
- $CVSROOT_DIRNAME/fourth-dir/t3file,v <-- t3file
- initial revision: 1\.1
- done"
- cd ../first-dir
- mkdir third-dir
- dotest status-init-11 "$testcvs add third-dir" \
- "Directory $CVSROOT_DIRNAME/first-dir/third-dir added to the repository"
- cd third-dir
- echo another line >t2file
- dotest status-init-12 "$testcvs add t2file" \
- "$PROG add: scheduling file .t2file. for addition
- $PROG add: use .$PROG commit. to add this file permanently"
- dotest status-init-13 "$testcvs -q ci -m add" \
- "RCS file: $CVSROOT_DIRNAME/first-dir/third-dir/t2file,v
- done
- Checking in t2file;
- $CVSROOT_DIRNAME/first-dir/third-dir/t2file,v <-- t2file
- initial revision: 1\.1
- done"
- dotest status-5 "$testcvs status ../tfile" \
- "===================================================================
- File: tfile Status: Locally Modified
- Working revision: 1\.2.*
- Repository revision: 1\.2 $CVSROOT_DIRNAME/first-dir/tfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest status-6 "$testcvs status ../../fourth-dir/t3file" \
- "===================================================================
- File: t3file Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 $CVSROOT_DIRNAME/fourth-dir/t3file,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../../..
- rm -rf status
- rm -rf $CVSROOT_DIRNAME/first-dir $CVSROOT_DIRNAME/fourth-dir
- ;;
- rdiff)
- # Test rdiff
- # XXX for now this is just the most essential test...
- cd ${TESTDIR}
- mkdir testimport
- cd testimport
- echo '$''Id$' > foo
- echo '$''Name$' >> foo
- echo '$''Id$' > bar
- echo '$''Name$' >> bar
- dotest_sort rdiff-1 \
- "${testcvs} import -I ! -m test-import-with-keyword trdiff TRDIFF T1" \
- '
- N trdiff/bar
- N trdiff/foo
- No conflicts created by this import'
- dotest rdiff-2 \
- "${testcvs} co -ko trdiff" \
- "${PROG} checkout: Updating trdiff
- U trdiff/bar
- U trdiff/foo"
- cd trdiff
- echo something >> foo
- dotest rdiff-3 \
- "${testcvs} ci -m added-something foo" \
- "Checking in foo;
- ${CVSROOT_DIRNAME}/trdiff/foo,v <-- foo
- new revision: 1\.2; previous revision: 1\.1
- done"
- echo '#ident "@(#)trdiff:$''Name$:$''Id$"' > new
- echo "new file" >> new
- dotest rdiff-4 \
- "${testcvs} add -m new-file-description new" \
- "${PROG} add: scheduling file \`new' for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest rdiff-5 \
- "${testcvs} commit -m added-new-file new" \
- "RCS file: ${CVSROOT_DIRNAME}/trdiff/new,v
- done
- Checking in new;
- ${CVSROOT_DIRNAME}/trdiff/new,v <-- new
- initial revision: 1\.1
- done"
- dotest rdiff-6 \
- "${testcvs} tag local-v0" \
- "${PROG} tag: Tagging .
- T bar
- T foo
- T new"
- dotest rdiff-7 \
- "${testcvs} status -v foo" \
- "===================================================================
- File: foo Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/trdiff/foo,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -ko
- Existing Tags:
- local-v0 (revision: 1\.2)
- T1 (revision: 1\.1\.1\.1)
- TRDIFF (branch: 1\.1\.1)"
- cd ..
- rm -r trdiff
- dotest rdiff-8 \
- "${testcvs} rdiff -r T1 -r local-v0 trdiff" \
- "${PROG}"' rdiff: Diffing trdiff
- Index: trdiff/foo
- diff -c trdiff/foo:1\.1\.1\.1 trdiff/foo:1\.2
- \*\*\* trdiff/foo:1\.1\.1\.1 '"${DATE}"'
- --- trdiff/foo '"${DATE}"'
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1,2 \*\*\*\*
- ! \$''Id: foo,v 1\.1\.1\.1 [0-9/]* [0-9:]* '"${username}"' Exp \$
- ! \$''Name: T1 \$
- --- 1,3 ----
- ! \$''Id: foo,v 1\.2 [0-9/]* [0-9:]* '"${username}"' Exp \$
- ! \$''Name: local-v0 \$
- ! something
- Index: trdiff/new
- diff -c /dev/null trdiff/new:1\.1
- \*\*\* /dev/null '"${DATE}"'
- --- trdiff/new '"${DATE}"'
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 0 \*\*\*\*
- --- 1,2 ----
- '"${PLUS}"' #ident "@(#)trdiff:\$''Name: local-v0 \$:\$''Id: new,v 1\.1 [0-9/]* [0-9:]* '"${username}"' Exp \$"
- '"${PLUS}"' new file'
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ..
- rm -r testimport
- rm -rf ${CVSROOT_DIRNAME}/trdiff
- ;;
- rdiff-short)
- # Test that the short patch behaves as expected
- # 1) Added file.
- # 2) Removed file.
- # 3) Different revision number with no difference.
- # 4) Different revision number with changes.
- # 5) Against trunk.
- # 6) Same revision number (no difference).
- mkdir rdiff-short; cd rdiff-short
- mkdir abc
- dotest rdiff-short-init-1 \
- "${testcvs} -q import -I ! -m initial-import abc vendor initial" \
- '
- No conflicts created by this import'
- dotest rdiff-short-init-2 "${testcvs} -q get abc" ''
- cd abc
- echo "abc" >file1.txt
- dotest rdiff-short-init-3 "${testcvs} add file1.txt" \
- "${PROG} add: scheduling file .file1\.txt' for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest rdiff-short-init-4 \
- "${testcvs} commit -madd-file1 file1.txt" \
- "RCS file: ${CVSROOT_DIRNAME}/abc/file1\.txt,v
- done
- Checking in file1\.txt;
- ${CVSROOT_DIRNAME}/abc/file1\.txt,v <-- file1\.txt
- initial revision: 1\.1
- done"
- echo def >>file1.txt
- dotest rdiff-short-init-5 \
- "${testcvs} commit -mchange-file1 file1.txt" \
- "Checking in file1\.txt;
- ${CVSROOT_DIRNAME}/abc/file1\.txt,v <-- file1\.txt
- new revision: 1\.2; previous revision: 1\.1
- done"
- echo "abc" >file1.txt
- dotest rdiff-short-init-6 \
- "${testcvs} commit -mrestore-file1-rev1 file1.txt" \
- "Checking in file1\.txt;
- ${CVSROOT_DIRNAME}/abc/file1\.txt,v <-- file1\.txt
- new revision: 1\.3; previous revision: 1\.2
- done"
- dotest rdiff-short-init-7 \
- "${testcvs} tag -r 1.1 tag1 file1.txt" \
- "T file1\.txt"
- dotest rdiff-short-init-8 \
- "${testcvs} tag -r 1.2 tag2 file1.txt" \
- "T file1\.txt"
- dotest rdiff-short-init-9 \
- "${testcvs} tag -r 1.3 tag3 file1.txt" \
- "T file1\.txt"
- echo "abc" >file2.txt
- dotest rdiff-short-init-10 \
- "${testcvs} add file2.txt" \
- "${PROG} add: scheduling file .file2\.txt' for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest rdiff-add-remove-nodiff-init-11 \
- "${testcvs} commit -madd-file2 file2.txt" \
- "RCS file: ${CVSROOT_DIRNAME}/abc/file2\.txt,v
- done
- Checking in file2\.txt;
- ${CVSROOT_DIRNAME}/abc/file2\.txt,v <-- file2\.txt
- initial revision: 1\.1
- done"
- dotest rdiff-short-init-12 \
- "${testcvs} tag -r 1.1 tag4 file2.txt" \
- "T file2\.txt"
- dotest rdiff-short-init-13 \
- "${testcvs} tag -r 1.1 tag5 file2.txt" \
- "T file2\.txt"
- cd ../..
- rm -fr rdiff-short
- # 3) Different revision number with no difference.
- dotest rdiff-short-no-real-change \
- "${testcvs} -q rdiff -s -r tag1 -r tag3 abc"
- # 4) Different revision number with changes.
- dotest rdiff-short-real-change \
- "${testcvs} -q rdiff -s -r tag1 -r tag2 abc" \
- 'File abc/file1.txt changed from revision 1\.1 to 1\.2'
- # 1) Added file.
- # 2) Removed file.
- dotest_sort rdiff-short-remove-add \
- "${testcvs} -q rdiff -s -r tag2 -r tag4 abc" \
- 'File abc/file1\.txt is removed; tag2 revision 1\.2
- File abc/file2\.txt is new; tag4 revision 1\.1'
- # 6) Same revision number (no difference).
- dotest rdiff-short-no-change \
- "${testcvs} -q rdiff -s -r tag4 -r tag5 abc"
- # 5) Against trunk.
- # Check that the messages change when we diff against the trunk
- # rather than a tag or date.
- dotest rdiff-short-against-trunk-1 \
- "${testcvs} -q rdiff -s -rtag4 abc" \
- "File abc/file1\.txt is new; current revision 1\.3"
- dotest rdiff-short-against-trunk-2 \
- "${testcvs} -q rdiff -s -rtag2 abc" \
- "File abc/file1\.txt changed from revision 1\.2 to 1\.3
- File abc/file2\.txt is new; current revision 1\.1"
- rm -rf ${CVSROOT_DIRNAME}/abc
- ;;
- rdiff2)
- # Test for the segv problem reported by James Cribb
- # Somewhere to work
- mkdir rdiff2; cd rdiff2
- # Create a module "m" with files "foo" and "d/bar"
- mkdir m; cd m
- echo foo >foo
- mkdir d
- echo bar >d/bar
- dotest_sort rdiff2-1 \
- "${testcvs} -q import -I ! -m initial-import m vendor initial" \
- '
- N m/d/bar
- N m/foo
- No conflicts created by this import'
- cd ..
- rm -r m
-
- # Remove "foo"
- dotest rdiff2-2 "${testcvs} get m" \
- "${PROG} checkout: Updating m
- U m/foo
- ${PROG} checkout: Updating m/d
- U m/d/bar"
- cd m
- dotest rdiff2-3 "${testcvs} rm -f foo" \
- "${PROG} remove: scheduling .foo. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest rdiff2-4 "${testcvs} commit -m Removed foo" \
- "Removing foo;
- ${CVSROOT_DIRNAME}/m/foo,v <-- foo
- new revision: delete; previous revision: 1\.1\.1\.1
- done"
-
- # Modify "d/bar"
- echo foo >d/bar
- dotest rdiff2-5 "${testcvs} commit -m Changed d/bar" \
- "Checking in d/bar;
- ${CVSROOT_DIRNAME}/m/d/bar,v <-- bar
- new revision: 1\.2; previous revision: 1\.1
- done"
-
- # Crash before showing d/bar diffs
- dotest_fail rdiff2-6 "${testcvs} rdiff -t m" \
- "${PROG} rdiff: Diffing m
- ${PROG} rdiff: Diffing m/d
- Index: m/d/bar
- diff -c m/d/bar:1\.1\.1\.1 m/d/bar:1\.2
- \*\*\* m/d/bar:1\.1\.1\.1 ${DATE}
- --- m/d/bar ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- ! bar
- --- 1 ----
- ! foo"
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -rf rdiff2
- rm -rf ${CVSROOT_DIRNAME}/m
- ;;
- diff)
- # Various tests specific to the "cvs diff" command.
- # Related tests:
- # death2: -N
- # rcslib: cvs diff and $Name.
- # rdiff: cvs rdiff.
- # diffmerge*: nuts and bolts (stuff within diff library)
- mkdir 1; cd 1
- dotest diff-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest diff-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- # diff is anomalous. Most CVS commands print the "nothing
- # known" message (or worse yet, no message in some cases) but
- # diff says "I know nothing". Shrug.
- dotest_fail diff-3 "${testcvs} diff xyzpdq" \
- "${PROG} diff: I know nothing about xyzpdq"
- touch abc
- dotest diff-4 "${testcvs} add abc" \
- "${PROG} add: scheduling file .abc. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest diff-5 "${testcvs} -q ci -mtest" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- done
- Checking in abc;
- ${CVSROOT_DIRNAME}/first-dir/abc,v <-- abc
- initial revision: 1\.1
- done"
- echo "extern int gethostname ();" >abc
- dotest diff-6 "${testcvs} -q ci -mtest" \
- "Checking in abc;
- ${CVSROOT_DIRNAME}/first-dir/abc,v <-- abc
- new revision: 1\.2; previous revision: 1\.1
- done"
- echo "#include <winsock.h>" >abc
- # check the behavior of the --ifdef=MACRO option
- dotest_fail diff-7 "${testcvs} -q diff --ifdef=HAVE_WINSOCK_H" \
- "Index: abc
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- retrieving revision 1\.2
- diff --ifdef HAVE_WINSOCK_H -r1\.2 abc
- #ifndef HAVE_WINSOCK_H
- extern int gethostname ();
- #else /\* HAVE_WINSOCK_H \*/
- #include <winsock\.h>
- #endif /\* HAVE_WINSOCK_H \*/"
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -r 1
- ;;
- diffnl)
- # Test handling of 'cvs diff' of files without newlines
- mkdir 1; cd 1
- dotest diffnl-000 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest diffnl-001 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- ${AWK} 'BEGIN {printf("one\ntwo\nthree\nfour\nfive\nsix")}' </dev/null >abc
- dotest diffnl-002 "${testcvs} add abc" \
- "${PROG} add: scheduling file .abc. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest diffnl-003 "${testcvs} -q ci -mtest" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- done
- Checking in abc;
- ${CVSROOT_DIRNAME}/first-dir/abc,v <-- abc
- initial revision: 1\.1
- done"
- # change to line near EOF
- ${AWK} 'BEGIN {printf("one\ntwo\nthree\nfour\nsix")}' </dev/null >abc
- dotest_fail diffnl-100 "${testcvs} diff abc" \
- "Index: abc
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- retrieving revision 1\.1
- diff -r1\.1 abc
- 5d4
- < five"
- dotest_fail diffnl-101 "${testcvs} diff -u abc" \
- "Index: abc
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- retrieving revision 1\.1
- diff -u -r1\.1 abc
- --- abc ${RFCDATE} 1\.1
- +++ abc ${RFCDATE}
- @@ -2,5 +2,4 @@
- two
- three
- four
- -five
- six
- \\\\ No newline at end of file"
- dotest diffnl-102 "${testcvs} -q ci -mtest abc" \
- "Checking in abc;
- ${CVSROOT_DIRNAME}/first-dir/abc,v <-- abc
- new revision: 1\.2; previous revision: 1\.1
- done"
- # Change to last line
- ${AWK} 'BEGIN {printf("one\ntwo\nthree\nfour\nseven")}' </dev/null >abc
- dotest_fail diffnl-200 "${testcvs} diff abc" \
- "Index: abc
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- retrieving revision 1\.2
- diff -r1\.2 abc
- 5c5
- < six
- \\\\ No newline at end of file
- ---
- > seven
- \\\\ No newline at end of file"
- dotest_fail diffnl-201 "${testcvs} diff -u abc" \
- "Index: abc
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- retrieving revision 1\.2
- diff -u -r1\.2 abc
- --- abc ${RFCDATE} 1\.2
- +++ abc ${RFCDATE}
- @@ -2,4 +2,4 @@
- two
- three
- four
- -six
- \\\\ No newline at end of file
- +seven
- \\\\ No newline at end of file"
- dotest diffnl-202 "${testcvs} ci -mtest abc" \
- "Checking in abc;
- ${CVSROOT_DIRNAME}/first-dir/abc,v <-- abc
- new revision: 1\.3; previous revision: 1\.2
- done"
- # Addition of newline
- echo "one
- two
- three
- four
- seven" > abc
- dotest_fail diffnl-300 "${testcvs} diff abc" \
- "Index: abc
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- retrieving revision 1\.3
- diff -r1\.3 abc
- 5c5
- < seven
- \\\\ No newline at end of file
- ---
- > seven"
- dotest_fail diffnl-301 "${testcvs} diff -u abc" \
- "Index: abc
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- retrieving revision 1\.3
- diff -u -r1\.3 abc
- --- abc ${RFCDATE} 1\.3
- +++ abc ${RFCDATE}
- @@ -2,4 +2,4 @@
- two
- three
- four
- -seven
- \\\\ No newline at end of file
- +seven"
- dotest diffnl-302 "${testcvs} ci -mtest abc" \
- "Checking in abc;
- ${CVSROOT_DIRNAME}/first-dir/abc,v <-- abc
- new revision: 1\.4; previous revision: 1\.3
- done"
- # Removal of newline
- ${AWK} 'BEGIN {printf("one\ntwo\nthree\nfour\nseven")}' </dev/null >abc
- dotest_fail diffnl-400 "${testcvs} diff abc" \
- "Index: abc
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- retrieving revision 1\.4
- diff -r1\.4 abc
- 5c5
- < seven
- ---
- > seven
- \\\\ No newline at end of file"
- dotest_fail diffnl-401 "${testcvs} diff -u abc" \
- "Index: abc
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- retrieving revision 1\.4
- diff -u -r1\.4 abc
- --- abc ${RFCDATE} 1\.4
- +++ abc ${RFCDATE}
- @@ -2,4 +2,4 @@
- two
- three
- four
- -seven
- +seven
- \\\\ No newline at end of file"
-
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- death)
- # next dive. test death support.
- # NOTE: this section has reached the size and
- # complexity where it is getting to be a good idea to
- # add new death support tests to a new section rather
- # than continuing to piggyback them onto the tests here.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- if ${CVS} co first-dir ; then
- pass 65
- else
- fail 65
- fi
- cd first-dir
- # Create a directory with only dead files, to make sure CVS
- # doesn't get confused by it.
- mkdir subdir
- dotest 65a0 "${testcvs} add subdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/subdir added to the repository"
- cd subdir
- echo file in subdir >sfile
- dotest 65a1 "${testcvs} add sfile" \
- "${PROG}"' add: scheduling file `sfile'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest 65a2 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/subdir/sfile,v
- done
- Checking in sfile;
- ${CVSROOT_DIRNAME}/first-dir/subdir/sfile,v <-- sfile
- initial revision: 1\.1
- done"
- rm sfile
- dotest 65a3 "${testcvs} rm sfile" \
- "${PROG}"' remove: scheduling `sfile'\'' for removal
- '"${PROG}"' remove: use .'"${PROG}"' commit. to remove this file permanently'
- dotest 65a4 "${testcvs} -q ci -m remove-it" \
- "Removing sfile;
- ${CVSROOT_DIRNAME}/first-dir/subdir/sfile,v <-- sfile
- new revision: delete; previous revision: 1\.1
- done"
- cd ..
- dotest 65a5 "${testcvs} -q update -P" ''
- dotest_fail 65a6 "test -d subdir" ''
- # add a file.
- touch file1
- if ${CVS} add file1 2>> ${LOGFILE}; then
- pass 66
- else
- fail 66
- fi
- # commit
- if ${CVS} ci -m test >> ${LOGFILE} 2>&1; then
- pass 67
- else
- fail 67
- fi
- # remove
- rm file1
- if ${CVS} rm file1 2>> ${LOGFILE}; then
- pass 68
- else
- fail 68
- fi
- # commit
- if ${CVS} ci -m test >>${LOGFILE} ; then
- pass 69
- else
- fail 69
- fi
- dotest_fail 69a0 "test -f file1" ''
- # get the old contents of file1 back
- if ${testcvs} update -p -r 1.1 file1 >file1 2>>${LOGFILE}; then
- pass 69a1
- else
- fail 69a1
- fi
- dotest 69a2 "cat file1" ''
- # create second file
- touch file2
- if ${CVS} add file1 file2 2>> ${LOGFILE}; then
- pass 70
- else
- fail 70
- fi
- # commit
- if ${CVS} ci -m test >> ${LOGFILE} 2>&1; then
- pass 71
- else
- fail 71
- fi
- # log
- if ${CVS} log file1 >> ${LOGFILE}; then
- pass 72
- else
- fail 72
- fi
- # file4 will be dead at the time of branching and stay dead.
- echo file4 > file4
- dotest death-file4-add "${testcvs} add file4" \
- "${PROG}"' add: scheduling file `file4'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest death-file4-ciadd "${testcvs} -q ci -m add file4" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file4,v
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- initial revision: 1\.1
- done"
- rm file4
- dotest death-file4-rm "${testcvs} remove file4" \
- "${PROG}"' remove: scheduling `file4'\'' for removal
- '"${PROG}"' remove: use .'"${PROG}"' commit. to remove this file permanently'
- dotest death-file4-cirm "${testcvs} -q ci -m remove file4" \
- "Removing file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: delete; previous revision: 1\.1
- done"
- # Tag the branchpoint.
- dotest death-72a "${testcvs} -q tag bp_branch1" 'T file1
- T file2'
- # branch1
- if ${CVS} tag -b branch1 ; then
- pass 73
- else
- fail 73
- fi
- # and move to the branch.
- if ${CVS} update -r branch1 ; then
- pass 74
- else
- fail 74
- fi
- dotest_fail death-file4-3 "test -f file4" ''
- # add a file in the branch
- echo line1 from branch1 >> file3
- if ${CVS} add file3 2>> ${LOGFILE}; then
- pass 75
- else
- fail 75
- fi
- # commit
- if ${CVS} ci -m test >> ${LOGFILE} 2>&1; then
- pass 76
- else
- fail 76
- fi
- dotest death-76a0 \
- "${testcvs} -q rdiff -r bp_branch1 -r branch1 first-dir" \
- "Index: first-dir/file3
- diff -c /dev/null first-dir/file3:1\.1\.2\.1
- \*\*\* /dev/null ${DATE}
- --- first-dir/file3 ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 0 \*\*\*\*
- --- 1 ----
- ${PLUS} line1 from branch1"
- dotest death-76a1 \
- "${testcvs} -q rdiff -r branch1 -r bp_branch1 first-dir" \
- "Index: first-dir/file3
- diff -c first-dir/file3:1\.1\.2\.1 first-dir/file3:removed
- \*\*\* first-dir/file3:1\.1\.2\.1 ${DATE}
- --- first-dir/file3 ${DATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- - line1 from branch1
- --- 0 ----"
- # remove
- rm file3
- if ${CVS} rm file3 2>> ${LOGFILE}; then
- pass 77
- else
- fail 77
- fi
- # commit
- if ${CVS} ci -m test >>${LOGFILE} ; then
- pass 78
- else
- fail 78
- fi
- # add again
- echo line1 from branch1 >> file3
- if ${CVS} add file3 2>> ${LOGFILE}; then
- pass 79
- else
- fail 79
- fi
- # commit
- if ${CVS} ci -m test >> ${LOGFILE} 2>&1; then
- pass 80
- else
- fail 80
- fi
- # change the first file
- echo line2 from branch1 >> file1
- # commit
- if ${CVS} ci -m test >> ${LOGFILE} 2>&1; then
- pass 81
- else
- fail 81
- fi
- # remove the second
- rm file2
- if ${CVS} rm file2 2>> ${LOGFILE}; then
- pass 82
- else
- fail 82
- fi
- # commit
- if ${CVS} ci -m test >>${LOGFILE}; then
- pass 83
- else
- fail 83
- fi
- # back to the trunk.
- if ${CVS} update -A 2>> ${LOGFILE}; then
- pass 84
- else
- fail 84
- fi
- dotest_fail death-file4-4 "test -f file4" ''
- if test -f file3 ; then
- fail 85
- else
- pass 85
- fi
- # join
- dotest 86 "${testcvs} -q update -j branch1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.3
- retrieving revision 1\.3\.2\.1
- Merging differences between 1\.3 and 1\.3\.2\.1 into file1
- ${PROG} update: scheduling file2 for removal
- U file3"
- dotest_fail death-file4-5 "test -f file4" ''
- if test -f file3 ; then
- pass 87
- else
- fail 87
- fi
- # Make sure that we joined the correct change to file1
- if echo line2 from branch1 | cmp - file1 >/dev/null; then
- pass 87a
- else
- fail 87a
- fi
- # update
- if ${CVS} update ; then
- pass 88
- else
- fail 88
- fi
- # commit
- dotest 89 "${testcvs} -q ci -m test" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.4; previous revision: 1\.3
- done
- Removing file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: delete; previous revision: 1\.1
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ..
- mkdir 2
- cd 2
- dotest 89a "${testcvs} -q co first-dir" 'U first-dir/file1
- U first-dir/file3'
- cd ..
- rm -r 2
- cd first-dir
- # remove first file.
- rm file1
- if ${CVS} rm file1 2>> ${LOGFILE}; then
- pass 90
- else
- fail 90
- fi
- # commit
- if ${CVS} ci -m test >>${LOGFILE}; then
- pass 91
- else
- fail 91
- fi
- if test -f file1 ; then
- fail 92
- else
- pass 92
- fi
- # typo; try to get to the branch and fail
- dotest_fail 92.1a "${testcvs} update -r brnach1" \
- "${PROG}"' \[update aborted\]: no such tag brnach1'
- # Make sure we are still on the trunk
- if test -f file1 ; then
- fail 92.1b
- else
- pass 92.1b
- fi
- if test -f file3 ; then
- pass 92.1c
- else
- fail 92.1c
- fi
- # back to branch1
- if ${CVS} update -r branch1 2>> ${LOGFILE}; then
- pass 93
- else
- fail 93
- fi
- dotest_fail death-file4-6 "test -f file4" ''
- if test -f file1 ; then
- pass 94
- else
- fail 94
- fi
- # and join
- dotest 95 "$testcvs -q update -j HEAD" \
- "$PROG update: file file1 has been removed in revision HEAD, but the destination is incompatibly modified
- C file1
- $PROG update: file file3 exists, but has been added in revision HEAD"
- dotest_fail death-file4-7 "test -f file4" ''
- # file2 should not have been recreated. It was
- # deleted on the branch, and has not been modified on
- # the trunk. That means that there have been no
- # changes between the greatest common ancestor (the
- # trunk version) and HEAD.
- dotest_fail death-file2-1 "test -f file2" ''
- cd .. ; rm -rf first-dir ${CVSROOT_DIRNAME}/first-dir
- ;;
- death2)
- # More tests of death support.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest death2-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- # Add two files on the trunk.
- echo "first revision" > file1
- echo "file4 first revision" > file4
- dotest death2-2 "${testcvs} add file1 file4" \
- "${PROG}"' add: scheduling file `file1'\'' for addition
- '"${PROG}"' add: scheduling file `file4'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add these files permanently'
- dotest death2-3 "${testcvs} -q commit -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file4,v
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- initial revision: 1\.1
- done"
- # Make a branch and a non-branch tag.
- dotest death2-4 "${testcvs} -q tag -b branch" \
- 'T file1
- T file4'
- dotest death2-5 "${testcvs} -q tag tag" \
- 'T file1
- T file4'
- # Switch over to the branch.
- dotest death2-6 "$testcvs -q update -r branch" \
- '[UP] file1
- [UP] file4'
- # Delete the file on the branch.
- rm file1
- dotest death2-7 "${testcvs} rm file1" \
- "${PROG} remove: scheduling .file1. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- # Test diff of the removed file before it is committed.
- dotest_fail death2-diff-1 "${testcvs} -q diff file1" \
- "${PROG} diff: file1 was removed, no comparison available"
- dotest_fail death2-diff-2 "${testcvs} -q diff -N -c file1" \
- "Index: file1
- ===================================================================
- RCS file: file1
- diff -N file1
- \*\*\* file1 ${RFCDATE} [0-9.]*
- --- /dev/null ${RFCDATE_EPOCH}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- - first revision
- --- 0 ----"
- dotest death2-8 "${testcvs} -q ci -m removed" \
- "Removing file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done"
- # Test diff of a dead file.
- dotest_fail death2-diff-3 \
- "${testcvs} -q diff -r1.1 -rbranch -c file1" \
- "${PROG} diff: Tag branch refers to a dead (removed) revision in file .file1.\.
- ${PROG} diff: No comparison available\. Pass .-N. to .${PROG} diff.${QUESTION}"
- # and in reverse
- dotest_fail death2-diff-3a \
- "${testcvs} -q diff -rbranch -r1.1 -c file1" \
- "${PROG} diff: Tag branch refers to a dead (removed) revision in file .file1.\.
- ${PROG} diff: No comparison available\. Pass .-N. to .${PROG} diff.${QUESTION}"
- dotest_fail death2-diff-4 \
- "${testcvs} -q diff -r1.1 -rbranch -N -c file1" \
- "Index: file1
- ===================================================================
- RCS file: file1
- diff -N file1
- \*\*\* file1 ${RFCDATE} [0-9.]*
- --- /dev/null ${RFCDATE_EPOCH}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- - first revision
- --- 0 ----"
- # and in reverse
- dotest_fail death2-diff-4a \
- "${testcvs} -q diff -rbranch -r1.1 -N -c file1" \
- "Index: file1
- ===================================================================
- RCS file: file1
- diff -N file1
- \*\*\* /dev/null ${RFCDATE_EPOCH}
- --- file1 ${RFCDATE} [0-9.]*
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 0 \*\*\*\*
- --- 1 ----
- + first revision"
- dotest_fail death2-diff-5 "${testcvs} -q diff -rtag -c ." \
- "${PROG} diff: file1 no longer exists, no comparison available"
- dotest_fail death2-diff-6 "${testcvs} -q diff -rtag -N -c ." \
- "Index: file1
- ===================================================================
- RCS file: file1
- diff -N file1
- \*\*\* file1 [-a-zA-Z0-9: ]* [0-9.]*
- --- /dev/null ${RFCDATE_EPOCH}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- - first revision
- --- 0 ----"
- # Test rdiff of a dead file.
- dotest death2-rdiff-1 \
- "${testcvs} -q rtag -rbranch rdiff-tag first-dir" ''
- dotest death2-rdiff-2 "${testcvs} -q rdiff -rtag -rbranch first-dir" \
- "Index: first-dir/file1
- diff -c first-dir/file1:1\.1 first-dir/file1:removed
- \*\*\* first-dir/file1:1\.1 [a-zA-Z0-9: ]*
- --- first-dir/file1 [a-zA-Z0-9: ]*
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- - first revision
- --- 0 ----"
- # Readd the file to the branch.
- echo "second revision" > file1
- dotest death2-9 "${testcvs} add file1" \
- "${PROG}"' add: file `file1'\'' will be added on branch `branch'\'' from version 1\.1\.2\.1
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- # Test diff of the added file before it is committed.
- dotest_fail death2-diff-7 "${testcvs} -q diff file1" \
- "${PROG} diff: file1 is a new entry, no comparison available"
- dotest_fail death2-diff-8 "${testcvs} -q diff -N -c file1" \
- "Index: file1
- ===================================================================
- RCS file: file1
- diff -N file1
- \*\*\* /dev/null ${RFCDATE_EPOCH}
- --- file1 ${RFCDATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 0 \*\*\*\*
- --- 1 ----
- ${PLUS} second revision"
- dotest death2-10 "${testcvs} -q commit -m add" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done"
- # Delete file4 from the branch
- dotest death2-10a "${testcvs} rm -f file4" \
- "${PROG} remove: scheduling .file4. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest death2-10b "${testcvs} -q ci -m removed" \
- "Removing file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: delete; previous revision: 1\.1
- done"
- # Back to the trunk.
- dotest death2-11 "${testcvs} -q update -A" \
- "[UP] file1
- U file4"
- # Add another file on the trunk.
- echo "first revision" > file2
- dotest death2-12 "${testcvs} add file2" \
- "${PROG}"' add: scheduling file `file2'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest death2-13 "${testcvs} -q commit -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- # Modify file4 on the trunk.
- echo "new file4 revision" > file4
- dotest death2-13a "${testcvs} -q commit -m mod" \
- "Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: 1\.2; previous revision: 1\.1
- done"
- # Back to the branch.
- # The ``no longer in the repository'' message doesn't really
- # look right to me, but that's what CVS currently prints for
- # this case.
- dotest death2-14 "${testcvs} -q update -r branch" \
- "[UP] file1
- ${PROG} update: file2 is no longer in the repository
- ${PROG} update: file4 is no longer in the repository"
- # Add a file on the branch with the same name.
- echo "branch revision" > file2
- dotest death2-15 "${testcvs} add file2" \
- "${PROG}"' add: scheduling file `file2'\'' for addition on branch `branch'\''
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest death2-16 "${testcvs} -q commit -m add" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done"
- # Add a new file on the branch.
- echo "first revision" > file3
- dotest death2-17 "${testcvs} add file3" \
- "${PROG}"' add: scheduling file `file3'\'' for addition on branch `branch'\''
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest death2-18 "${testcvs} -q commit -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v <-- file3
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- # Test diff of a nonexistent tag
- dotest_fail death2-diff-9 "${testcvs} -q diff -rtag -c file3" \
- "${PROG} diff: tag tag is not in file file3"
- dotest_fail death2-diff-10 "${testcvs} -q diff -rtag -N -c file3" \
- "Index: file3
- ===================================================================
- RCS file: file3
- diff -N file3
- \*\*\* /dev/null ${RFCDATE_EPOCH}
- --- file3 ${RFCDATE} [0-9.]*
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 0 \*\*\*\*
- --- 1 ----
- ${PLUS} first revision"
- dotest_fail death2-diff-11 "${testcvs} -q diff -rtag -c ." \
- "Index: file1
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.2
- diff -c -r1\.1 -r1\.1\.2\.2
- \*\*\* file1 ${RFCDATE} [0-9.]*
- --- file1 ${RFCDATE} [0-9.]*
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- ! first revision
- --- 1 ----
- ! second revision
- ${PROG} diff: tag tag is not in file file2
- ${PROG} diff: tag tag is not in file file3
- ${PROG} diff: file4 no longer exists, no comparison available"
- dotest_fail death2-diff-12 "${testcvs} -q diff -rtag -c -N ." \
- "Index: file1
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.2
- diff -c -r1\.1 -r1\.1\.2\.2
- \*\*\* file1 ${RFCDATE} [0-9.]*
- --- file1 ${RFCDATE} [0-9.]*
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- ! first revision
- --- 1 ----
- ! second revision
- Index: file2
- ===================================================================
- RCS file: file2
- diff -N file2
- \*\*\* /dev/null ${RFCDATE_EPOCH}
- --- file2 ${RFCDATE} [0-9.]*
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 0 \*\*\*\*
- --- 1 ----
- ${PLUS} branch revision
- Index: file3
- ===================================================================
- RCS file: file3
- diff -N file3
- \*\*\* /dev/null ${RFCDATE_EPOCH}
- --- file3 ${RFCDATE} [0-9.]*
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 0 \*\*\*\*
- --- 1 ----
- ${PLUS} first revision
- Index: file4
- ===================================================================
- RCS file: file4
- diff -N file4
- \*\*\* file4 ${RFCDATE} [0-9.]*
- --- /dev/null ${RFCDATE_EPOCH}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- - file4 first revision
- --- 0 ----"
- # Switch to the nonbranch tag.
- dotest death2-19 "${testcvs} -q update -r tag" \
- "[UP] file1
- ${PROG} update: file2 is no longer in the repository
- ${PROG} update: file3 is no longer in the repository
- U file4"
- dotest_fail death2-20 "test -f file2"
- # Make sure diff only reports appropriate files.
- dotest_fail death2-diff-13 "${testcvs} -q diff -r rdiff-tag" \
- "${PROG} diff: Tag rdiff-tag refers to a dead (removed) revision in file .file1.\.
- ${PROG} diff: No comparison available\. Pass .-N. to .${PROG} diff.${QUESTION}"
- dotest_fail death2-diff-14 "${testcvs} -q diff -r rdiff-tag -c -N" \
- "Index: file1
- ===================================================================
- RCS file: file1
- diff -N file1
- \*\*\* /dev/null ${RFCDATE_EPOCH}
- --- file1 ${RFCDATE} [0-9.]*
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 0 \*\*\*\*
- --- 1 ----
- ${PLUS} first revision"
- # now back to the trunk
- dotest death2-21 "$testcvs -q update -A" \
- '[UP] file1
- U file2
- U file4'
- # test merging with a dead file
- dotest death2-22 "${testcvs} -q co first-dir" \
- "U first-dir/file1
- U first-dir/file2
- U first-dir/file4"
- cd first-dir
- dotest death2-23 "${testcvs} rm -f file4" \
- "${PROG} remove: scheduling .file4. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest death2-24 "${testcvs} -q ci -m removed file4" \
- "Removing file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: delete; previous revision: 1\.2
- done"
- cd ..
- echo "new stuff" >file4
- dotest_fail death2-25 "${testcvs} up file4" \
- "${PROG} update: conflict: file4 is modified but no longer in the repository
- C file4"
- cd .. ; rm -rf first-dir ${CVSROOT_DIRNAME}/first-dir
- ;;
- death-rtag)
- # This documents a bug in CVS that prevents rtag from tagging files
- # in the Attic.
- mkdir $CVSROOT_DIRNAME/death-rtag
- dotest death-rtag-init-1 "$testcvs -Q co death-rtag"
- cd death-rtag
- echo "This is the file foo" > foo
- echo "This is the file bar" > bar
- dotest death-rtag-init-2 "$testcvs -Q add foo bar"
- dotest death-rtag-init-3 "$testcvs -Q ci -m 'Add foo and bar.'" \
- "RCS file: $CVSROOT_DIRNAME/death-rtag/bar,v
- done
- Checking in bar;
- $CVSROOT_DIRNAME/death-rtag/bar,v <-- bar
- initial revision: 1\.[0-9]*
- done
- RCS file: $CVSROOT_DIRNAME/death-rtag/foo,v
- done
- Checking in foo;
- $CVSROOT_DIRNAME/death-rtag/foo,v <-- foo
- initial revision: 1\.[0-9]*
- done"
- dotest death-rtag-init-5 "$testcvs -Q tag -b mybranch"
- dotest death-rtag-1 "$testcvs -q rtag -rmybranch willtag death-rtag"
- dotest death-rtag-2 "$testcvs -Q rm -f foo"
- dotest death-rtag-3 "$testcvs -Q ci -m 'Remove foo.'" \
- "Removing foo;
- $CVSROOT_DIRNAME/death-rtag/foo,v <-- foo
- new revision: delete; previous revision: 1\.[0-9]*
- done"
- # commit something on the branch so that the moving tag is visible.
- dotest death-rtag-3.2 "$testcvs -Q up -rmybranch"
- echo some branch content >>foo
- echo some branch content >>bar
- dotest death-rtag-3.3 "$testcvs -Q ci -m 'Change foo.'" \
- "Checking in bar;
- $CVSROOT_DIRNAME/death-rtag/bar,v <-- bar
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in foo;
- $CVSROOT_DIRNAME/death-rtag/Attic/foo,v <-- foo
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest death-rtag-3.4 \
- "$testcvs -q rtag -rmybranch wontmove death-rtag"
- dotest death-rtag-3.5 "$testcvs -q rtag -F wontmove death-rtag"
- cd ..
- # Removing -f below avoids this bug.
- dotest death-rtag-4 "$testcvs -q rtag -frmybranch wonttag death-rtag"
- # When the bug existed, `wonttag' would not have been present in
- # foo,v.
- #
- # A second bug prevented `wontmove' from moving from the branch to
- # the dead revision on the trunk (death-rtag-3.4 & death-rtag-3.5).
- dotest death-rtag-5 "$testcvs -q rlog death-rtag" \
- "
- RCS file: $CVSROOT_DIRNAME/death-rtag/bar,v
- head: 1.[0-9]*
- branch:
- locks: strict
- access list:
- symbolic names:
- wonttag: 1\.1\.2\.1
- wontmove: 1\.1
- willtag: 1\.1
- mybranch: 1\.1.0\.2
- keyword substitution: kv
- $DOTSTAR
- RCS file: $CVSROOT_DIRNAME/death-rtag/Attic/foo,v
- head: 1.[0-9]*
- branch:
- locks: strict
- access list:
- symbolic names:
- wonttag: 1\.1\.2\.1
- wontmove: 1\.2
- willtag: 1\.1
- mybranch: 1\.1.0\.2
- keyword substitution: kv
- $DOTSTAR"
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- rm -r death-rtag
- rm -rf $CVSROOT_DIRNAME/death-rtag
- ;;
- rm-update-message)
- # FIXME
- # local CVS prints a warning message when update notices a missing
- # file and client/server CVS doesn't. These should be identical.
- mkdir rm-update-message; cd rm-update-message
- mkdir $CVSROOT_DIRNAME/rm-update-message
- dotest rm-update-message-setup-1 "$testcvs -q co rm-update-message" ''
- cd rm-update-message
- file=x
- echo >$file
- dotest rm-update-message-setup-2 "$testcvs -q add $file" \
- "${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest rm-update-message-setup-3 "$testcvs -q ci -mcreate $file" \
- "RCS file: $CVSROOT_DIRNAME/rm-update-message/$file,v
- done
- Checking in $file;
- $CVSROOT_DIRNAME/rm-update-message/$file,v <-- $file
- initial revision: 1\.1
- done"
- rm $file
- dotest rm-update-message-1 "$testcvs up $file" \
- "${PROG} update: warning: $file was lost
- U $file"
- cd ../..
- if $keep; then :; else
- rm -rf rm-update-message
- rm -rf $CVSROOT_DIRNAME/rm-update-message
- fi
- ;;
- rmadd)
- # More tests of adding and removing files.
- # In particular ci -r.
- # Other ci -r tests:
- # * editor-9: checking in a modified file,
- # where "ci -r" means a branch.
- # * basica-8a1: checking in a modified file with numeric revision.
- # * basica-8a2: likewise.
- # * keywordlog-4: adding a new file with numeric revision.
- mkdir 1; cd 1
- dotest rmadd-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest rmadd-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo first file1 >file1
- dotest rmadd-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest_fail rmadd-4 "${testcvs} -q ci -r 1.2.2.4 -m add" \
- "${PROG} commit: cannot add file .file1' with revision .1\.2\.2\.4'; must be on trunk
- ${PROG} \[commit aborted\]: correct above errors first!"
- dotest_fail rmadd-5 "${testcvs} -q ci -r 1.2.2 -m add" \
- "${PROG} commit: cannot add file .file1' with revision .1\.2\.2'; must be on trunk
- ${PROG} \[commit aborted\]: correct above errors first!"
- dotest_fail rmadd-6 "${testcvs} -q ci -r mybranch -m add" \
- "${PROG} \[commit aborted\]: no such tag mybranch"
- # The thing with the trailing periods strikes me as a very
- # bizarre behavior, but it would seem to be intentional
- # (see commit.c). It probably could go away....
- dotest rmadd-7 "${testcvs} -q ci -r 7.... -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 7\.1
- done"
- if $remote; then
- # I guess remote doesn't set a sticky tag in this case.
- # Kind of odd, in the sense that rmadd-24a does set one
- # both local and remote.
- dotest_fail rmadd-7a "test -f CVS/Tag"
- echo T7 >CVS/Tag
- else
- dotest rmadd-7a "cat CVS/Tag" "T7"
- fi
- dotest rmadd-8 "${testcvs} -q tag -b mybranch" "T file1"
- dotest rmadd-9 "${testcvs} -q tag mynonbranch" "T file1"
- touch file2
- # The previous "cvs ci -r" set a sticky tag of '7'. Seems a
- # bit odd, and I guess commit.c (findmaxrev) makes '7' sticky
- # tags unnecessary (?). I kind of suspect that it should be
- # saying "sticky tag is not a branch" like keywordlog-4b.
- # Or something.
- dotest rmadd-10 "${testcvs} add file2" \
- "${PROG} add: scheduling file .file2. for addition on branch .7'
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- # As in the previous example, CVS is confused....
- dotest rmadd-11 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 7\.1
- done"
- dotest rmadd-12 "${testcvs} -q update -A" ""
- touch file3
- dotest rmadd-13 "${testcvs} add file3" \
- "${PROG} add: scheduling file .file3. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- # Huh? file2 is not up to date? Seems buggy to me....
- dotest_fail rmadd-14 "${testcvs} -q ci -r mybranch -m add" \
- "${PROG} commit: Up-to-date check failed for .file2'
- ${PROG} \[commit aborted\]: correct above errors first!"
- # Whatever, let's not let file2 distract us....
- dotest rmadd-15 "${testcvs} -q ci -r mybranch -m add file3" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v <-- file3
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- touch file4
- dotest rmadd-16 "${testcvs} add file4" \
- "${PROG} add: scheduling file .file4. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- # Same "Up-to-date check" issues as in rmadd-14.
- # The "no such tag" thing is due to the fact that we only
- # update val-tags when the tag is used (might be more of a
- # bug than a feature, I dunno).
- dotest_fail rmadd-17 \
- "${testcvs} -q ci -r mynonbranch -m add file4" \
- "${PROG} \[commit aborted\]: no such tag mynonbranch"
- # Try to make CVS write val-tags.
- dotest rmadd-18 "${testcvs} -q update -p -r mynonbranch file1" \
- "first file1"
- # Oops, -p suppresses writing val-tags (probably a questionable
- # behavior).
- dotest_fail rmadd-19 \
- "${testcvs} -q ci -r mynonbranch -m add file4" \
- "${PROG} \[commit aborted\]: no such tag mynonbranch"
- # Now make CVS write val-tags for real.
- dotest rmadd-20 "$testcvs -q update -r mynonbranch file1" '[UP] file1'
- # Oops - CVS isn't distinguishing between a branch tag and
- # a non-branch tag.
- dotest rmadd-21 \
- "${testcvs} -q ci -r mynonbranch -m add file4" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file4,v
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file4,v <-- file4
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- # OK, we add this one in a vanilla way, but then check in
- # a modification with ci -r and sniff around for sticky tags.
- echo file5 >file5
- dotest rmadd-22 "${testcvs} add file5" \
- "${PROG} add: scheduling file .file5. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- if $remote; then
- # Interesting bug (or missing feature) here. findmaxrev
- # gets the major revision from the Entries. Well, remote
- # doesn't send the entries for files which are not involved.
- dotest rmadd-23r "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file5,v
- done
- Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/file5,v <-- file5
- initial revision: 1\.1
- done"
- dotest rmadd-23-workaroundr \
- "${testcvs} -q ci -r 7 -m bump-it file5" \
- "Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/file5,v <-- file5
- new revision: 7\.1; previous revision: 1\.1
- done"
- else
- dotest rmadd-23 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file5,v
- done
- Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/file5,v <-- file5
- initial revision: 7\.1
- done"
- fi
- echo change it >file5
- dotest_fail rmadd-24 "${testcvs} -q ci -r 4.8 -m change file5" \
- "Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/file5,v <-- file5
- ${PROG} commit: ${CVSROOT_DIRNAME}/first-dir/file5,v: revision 4\.8 too low; must be higher than 7\.1
- ${PROG} commit: could not check in file5"
- dotest rmadd-24a "${testcvs} -q ci -r 8.4 -m change file5" \
- "Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/file5,v <-- file5
- new revision: 8\.4; previous revision: 7\.1
- done"
- # I'm not really sure that a sticky tag make sense here.
- # It seems to be longstanding behavior for what that is worth.
- dotest rmadd-25 "${testcvs} status file5" \
- "===================================================================
- File: file5 Status: Up-to-date
- Working revision: 8\.4.*
- Repository revision: 8\.4 ${CVSROOT_DIRNAME}/first-dir/file5,v
- Sticky Tag: 8\.4
- Sticky Date: (none)
- Sticky Options: (none)"
- # now try forced revision with recursion
- mkdir sub
- dotest rmadd-26 "${testcvs} -q add sub" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/sub added to the repository"
- echo hello >sub/subfile
- dotest rmadd-27 "${testcvs} -q add sub/subfile" \
- "${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest rmadd-28 "${testcvs} -q ci -m. sub" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sub/subfile,v
- done
- Checking in sub/subfile;
- ${CVSROOT_DIRNAME}/first-dir/sub/subfile,v <-- subfile
- initial revision: 1\.1
- done"
- # lose the branch
- dotest rmadd-29 "$testcvs -q up -A" \
- "[UP] file1
- $PROG update: file3 is no longer in the repository
- $PROG update: file4 is no longer in the repository"
- # -f disables recursion
- dotest rmadd-30 "${testcvs} -q ci -f -r9 -m." \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 9\.1; previous revision: 7\.1
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 9\.1; previous revision: 7\.1
- done
- Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/file5,v <-- file5
- new revision: 9\.1; previous revision: 8\.4
- done"
- # add -R to force recursion
- dotest rmadd-31 "${testcvs} -q ci -f -r9 -R -m." \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 9\.2; previous revision: 9\.1
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 9\.2; previous revision: 9\.1
- done
- Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/file5,v <-- file5
- new revision: 9\.2; previous revision: 9\.1
- done
- Checking in sub/subfile;
- ${CVSROOT_DIRNAME}/first-dir/sub/subfile,v <-- subfile
- new revision: 9\.1; previous revision: 1\.1
- done"
- if $remote; then
- # as noted above, remote doesn't set a sticky tag
- :
- else
- dotest rmadd-32 "cat CVS/Tag" "T9"
- dotest rmadd-33 "cat sub/CVS/Tag" "T9"
- fi
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- rmadd2)
- # Tests of undoing commits, including in the presence of
- # adding and removing files. See join for a list of -j tests.
- mkdir 1; cd 1
- dotest rmadd2-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest rmadd2-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo 'initial contents' >file1
- dotest rmadd2-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest rmadd2-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest rmadd2-4a "${testcvs} -Q tag tagone" ""
- dotest rmadd2-5 "${testcvs} rm -f file1" \
- "${PROG} remove: scheduling .file1. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest rmadd2-6 "${testcvs} -q ci -m remove" \
- "Removing file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done"
- dotest rmadd2-7 "${testcvs} -q update -j 1.2 -j 1.1 file1" "U file1"
- dotest rmadd2-8 "${testcvs} -q ci -m readd" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done"
- echo 'new contents' >file1
- dotest rmadd2-9 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.4; previous revision: 1\.3
- done"
- dotest rmadd2-10 "${testcvs} -q update -j 1.4 -j 1.3 file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.4
- retrieving revision 1\.3
- Merging differences between 1\.4 and 1\.3 into file1"
- dotest rmadd2-11 "${testcvs} -q ci -m undo" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.5; previous revision: 1\.4
- done"
- dotest rmadd2-12 "cat file1" "initial contents"
- dotest rmadd2-13 "${testcvs} -q update -p -r 1.3" "initial contents"
- # Hmm, might be a bit odd that this works even if 1.3 is not
- # the head.
- dotest rmadd2-14 "${testcvs} -q update -j 1.3 -j 1.2 file1" \
- "${PROG} update: scheduling file1 for removal"
- # Check that -p can get arbitrary revisions of a removed file
- dotest rmadd2-14a "${testcvs} -q update -p" "initial contents"
- dotest rmadd2-14b "${testcvs} -q update -p -r 1.5" "initial contents"
- dotest rmadd2-14c "${testcvs} -q update -p -r 1.3" "initial contents"
- dotest rmadd2-15 "${testcvs} -q ci -m re-remove" \
- "Removing file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: delete; previous revision: 1\.5
- done"
- dotest rmadd2-16 "${testcvs} log -h file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- Working file: file1
- head: 1\.6
- branch:
- locks: strict
- access list:
- symbolic names:
- tagone: 1\.1
- keyword substitution: kv
- total revisions: 6
- ============================================================================="
- dotest rmadd2-17 "${testcvs} status -v file1" \
- "===================================================================
- File: no file file1 Status: Up-to-date
- Working revision: No entry for file1
- Repository revision: 1\.6 ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- Existing Tags:
- tagone (revision: 1.1)"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- rmadd3)
- # This test demonstrates that CVS notices that file1 exists rather
- # that deleting or writing over it after:
- #
- # cvs remove -f file1; touch file1; cvs add file1.
- #
- # According to the manual, this should work for:
- #
- # rm file1; cvs remove file1; cvs add file1
- #
- # but in past version of CVS, new content in file1 would be
- # erroneously deleted when file1 reappeared between the remove and
- # the add.
- #
- # Later versions of CVS would refuse to perform the add, but still
- # allow a subsequent local commit to erase the file from the
- # workspace, possibly losing data.
- mkdir 1; cd 1
- dotest rmadd3-init1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest rmadd3-init2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo initial content for file1 >file1
- dotest rmadd3-init3 "${testcvs} add file1" \
- "${PROG} add: scheduling file \`file1' for addition
- ${PROG} add: use '${PROG} commit' to add this file permanently"
- dotest rmadd3-init4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- # Here begins the guts of this test, as detailed above.
- dotest rmadd3-1 "${testcvs} rm -f file1" \
- "${PROG} remove: scheduling \`file1' for removal
- ${PROG} remove: use '${PROG} commit' to remove this file permanently"
- # Now recreate the file:
- echo desired future contents for file1 >file1
- # And attempt to resurrect it at the same time:
- dotest_fail rmadd3-2 "${testcvs} add file1" \
- "${PROG} add: file1 should be removed and is still there (or is back again)"
- # Now prove that commit knows that it shouldn't erase files.
- dotest_fail rmadd3-3 "${testcvs} -q ci -m." \
- "$PROG commit: \`file1' should be removed and is still there (or is back again)
- $PROG \[commit aborted\]: correct above errors first!"
- # Then these should pass too:
- dotest rmadd3-4 "test -f file1"
- dotest rmadd3-5 "cat file1" "desired future contents for file1"
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- resurrection)
- # This test tests a few file resurrection scenarios.
- mkdir 1; cd 1
- dotest resurrection-init1 "$testcvs -q co -l ." ''
- mkdir first-dir
- dotest resurrection-init2 "$testcvs add first-dir" \
- "Directory $CVSROOT_DIRNAME/first-dir added to the repository"
- cd first-dir
- echo initial content for file1 >file1
- dotest resurrection-init3 "$testcvs add file1" \
- "$PROG add: scheduling file \`file1' for addition
- $PROG add: use '$PROG commit' to add this file permanently"
- dotest resurrection-init4 "$testcvs -q ci -m add" \
- "RCS file: $CVSROOT_DIRNAME/first-dir/file1,v
- done
- Checking in file1;
- $CVSROOT_DIRNAME/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest resurrection-init5 "$testcvs -Q rm -f file1"
- # The first test is that `cvs add' will resurrect a file before its
- # removal has been committed.
- dotest_sort resurrection-1 "$testcvs add file1" \
- "U file1
- $PROG add: file1, version 1\.1, resurrected"
- dotest resurrection-2 "$testcvs -Q diff file1" ""
- dotest resurrection-init6 "$testcvs -Q tag -b resurrection"
- dotest resurrection-init7 "$testcvs -Q rm -f file1"
- dotest resurrection-init8 "$testcvs -Q ci -mrm" \
- "Removing file1;
- $CVSROOT_DIRNAME/first-dir/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done"
- # The next test is that CVS will resurrect a committed removal.
- dotest_sort resurrection-3 "$testcvs add file1" \
- "U file1
- $PROG add: Re-adding file \`file1' (in place of dead revision 1\.2)\.
- $PROG add: Resurrecting file \`file1' from revision 1\.1\.
- $PROG add: use 'cvs commit' to add this file permanently"
- dotest resurrection-4 "$testcvs -q diff -r1.1 file1" ""
- dotest resurrection-5 "$testcvs -q ci -mreadd" \
- "Checking in file1;
- $CVSROOT_DIRNAME/first-dir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done"
- dotest resurrection-init9 "$testcvs -Q up -rresurrection"
- dotest resurrection-init10 "$testcvs -Q rm -f file1"
- dotest resurrection-init11 "$testcvs -Q ci -mrm-on-resurrection" \
- "Removing file1;
- $CVSROOT_DIRNAME/first-dir/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done"
- # The next test is that CVS will resurrect a committed removal to a
- # branch.
- dotest_sort resurrection-6 "$testcvs add file1" \
- "U file1
- $PROG add: Resurrecting file \`file1' from revision 1\.1\.
- $PROG add: file \`file1' will be added on branch \`resurrection' from version 1\.1\.2\.1
- $PROG add: use 'cvs commit' to add this file permanently"
- dotest resurrection-7 "$testcvs -Q diff -r1.1 file1" ""
- dotest resurrection-8 "$testcvs -q ci -mreadd" \
- "Checking in file1;
- $CVSROOT_DIRNAME/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done"
- # The next few tests verify that an attempted resurrection of a file
- # with no previous revision on the trunk fails.
- touch file2
- dotest resurrection-9 "$testcvs -Q add file2"
- dotest resurrection-10 "$testcvs -Q ci -mnew-file2" \
- "RCS file: $CVSROOT_DIRNAME/first-dir/Attic/file2,v
- done
- Checking in file2;
- $CVSROOT_DIRNAME/first-dir/Attic/file2,v <-- file2
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest resurrection-11 "$testcvs -Q up -A"
- # This command once caused an assertion failure.
- dotest resurrection-12 "$testcvs add file2" \
- "$PROG add: File \`file2' has no previous revision to resurrect\."
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -r 1
- rm -rf $CVSROOT_DIRNAME/first-dir
- ;;
- dirs)
- # Tests related to removing and adding directories.
- # See also:
- # conflicts (especially dir1 in conflicts-130): What happens if
- # directory exists in repository and a non-CVS-controlled
- # directory in the working directory?
- # conflicts3-15. More cases, especially where CVS directory
- # exists but without CVS/Repository and friends.
- # conflicts3-22. Similar to conflicts-130 but there is a file
- # in the directory.
- # dirs2. Sort of similar to conflicts3-22 but somewhat different.
- mkdir imp-dir; cd imp-dir
- echo file1 >file1
- mkdir sdir
- echo sfile >sdir/sfile
- dotest_sort dirs-1 \
- "${testcvs} import -m import-it dir1 vend rel" "
- N dir1/file1
- N dir1/sdir/sfile
- No conflicts created by this import
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/dir1/sdir"
- cd ..
- mkdir 1; cd 1
- dotest dirs-2 "${testcvs} -Q co dir1" ""
- # Various CVS administrators are in the habit of removing
- # the repository directory for things they don't want any
- # more. I've even been known to do it myself (on rare
- # occasions). Not the usual recommended practice, but we want
- # to try to come up with some kind of reasonable/documented/sensible
- # behavior.
- rm -rf ${CVSROOT_DIRNAME}/dir1/sdir
- dotest dirs-3 "${testcvs} update" \
- "${PROG} update: Updating dir1
- ${PROG} update: Updating dir1/sdir
- ${PROG} update: cannot open directory ${CVSROOT_DIRNAME}/dir1/sdir: No such file or directory
- ${PROG} update: skipping directory dir1/sdir"
- dotest dirs-3a "${testcvs} update -d" \
- "${PROG} update*: Updating dir1
- ${PROG} update: Updating dir1/sdir
- ${PROG} update: cannot open directory ${CVSROOT_DIRNAME}/dir1/sdir: No such file or directory
- ${PROG} update: skipping directory dir1/sdir"
- # If we say "yes", then CVS gives errors about not being able to
- # create lock files.
- # The fact that it says "skipping directory " rather than
- # "skipping directory dir1/sdir" is some kind of bug.
- dotest dirs-4 "echo no | ${testcvs} release -d dir1/sdir" \
- "${PROG} update: cannot open directory ${CVSROOT_DIRNAME}/dir1/sdir: No such file or directory
- ${PROG} update: skipping directory
- You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .dir1/sdir': .. .release' aborted by user choice."
- # OK, if "cvs release" won't help, we'll try it the other way...
- rm -r dir1/sdir
- dotest dirs-5 "cat dir1/CVS/Entries" \
- "/file1/1.1.1.1/[a-zA-Z0-9 :]*//
- D/sdir////"
- dotest dirs-6 "${testcvs} update" "${PROG} update: Updating dir1"
- dotest dirs-7 "cat dir1/CVS/Entries" \
- "/file1/1.1.1.1/[a-zA-Z0-9 :]*//
- D/sdir////"
- dotest dirs-8 "${testcvs} update -d dir1" \
- "${PROG} update: Updating dir1"
- cd ..
- rm -r imp-dir 1
- # clean up our repositories
- rm -rf ${CVSROOT_DIRNAME}/dir1
- ;;
- dirs2)
- # See "dirs" for a list of tests involving adding and
- # removing directories.
- mkdir 1; cd 1
- dotest dirs2-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest dirs2-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- mkdir sdir
- dotest dirs2-3 "${testcvs} add sdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/sdir added to the repository"
- touch sdir/file1
- dotest dirs2-4 "${testcvs} add sdir/file1" \
- "${PROG} add: scheduling file .sdir/file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest dirs2-5 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/file1,v
- done
- Checking in sdir/file1;
- ${CVSROOT_DIRNAME}/first-dir/sdir/file1,v <-- file1
- initial revision: 1\.1
- done"
- rm -r sdir/CVS
- if $remote; then
- # This is just like conflicts3-23
- dotest_fail dirs2-6 "${testcvs} update -d" \
- "${QUESTION} sdir
- ${PROG} update: Updating \.
- ${PROG} update: Updating sdir
- ${PROG} update: move away sdir/file1; it is in the way
- C sdir/file1"
- rm sdir/file1
- rm -r sdir/CVS
- # This is where things are not just like conflicts3-23
- dotest dirs2-7 "${testcvs} update -d" \
- "${QUESTION} sdir
- ${PROG} update: Updating \.
- ${PROG} update: Updating sdir
- U sdir/file1"
- else
- dotest dirs2-6 "${testcvs} update -d" \
- "${PROG} update: Updating \.
- ${QUESTION} sdir"
- rm sdir/file1
- dotest dirs2-7 "${testcvs} update -d" \
- "${PROG} update: Updating \.
- ${QUESTION} sdir"
- fi
- cd ../..
- # Now, the same thing (more or less) on a branch.
- mkdir 2; cd 2
- dotest dirs2-8 "${testcvs} -q co first-dir" 'U first-dir/sdir/file1'
- cd first-dir
- dotest dirs2-9 "${testcvs} -q tag -b br" "T sdir/file1"
- rm -r sdir/CVS
- if $remote; then
- # Cute little quirk of val-tags; if we don't recurse into
- # the directories where the tag is defined, val-tags won't
- # get updated.
- dotest_fail dirs2-10 "${testcvs} update -d -r br" \
- "${QUESTION} sdir
- ${PROG} \[update aborted\]: no such tag br"
- dotest dirs2-10ar \
- "${testcvs} -q rdiff -u -r 1.1 -r br first-dir/sdir/file1"
- dotest_fail dirs2-10-again "${testcvs} update -d -r br" \
- "${QUESTION} sdir
- ${PROG} update: Updating \.
- ${PROG} update: Updating sdir
- ${PROG} update: move away sdir/file1; it is in the way
- C sdir/file1"
- else
- dotest_fail dirs2-10 "${testcvs} update -d -r br" \
- "${PROG} update: in directory sdir:
- ${PROG} \[update aborted\]: there is no version here; do '${PROG} checkout' first"
- fi
- cd ../..
- # OK, the above tests make the situation somewhat harder
- # than it might be, in the sense that they actually have a
- # file which is alive on the branch we are updating. Let's
- # try it where it is just a directory where all the files
- # have been removed.
- mkdir 3; cd 3
- dotest dirs2-11 "${testcvs} -q co -r br first-dir" \
- "U first-dir/sdir/file1"
- cd first-dir
- # Hmm, this doesn't mention the branch like add does. That's
- # an odd non-orthogonality.
- dotest dirs2-12 "${testcvs} rm -f sdir/file1" \
- "${PROG} remove: scheduling .sdir/file1. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest dirs2-13 "${testcvs} -q ci -m remove" \
- "Removing sdir/file1;
- ${CVSROOT_DIRNAME}/first-dir/sdir/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done"
- cd ../../2/first-dir
- if $remote; then
- dotest dirs2-14 "${testcvs} update -d -r br" \
- "${QUESTION} sdir/file1
- ${PROG} update: Updating \.
- ${PROG} update: Updating sdir"
- else
- dotest dirs2-14 "${testcvs} update -d -r br" \
- "${PROG} update: Updating \.
- ${QUESTION} sdir"
- fi
- cd ../..
- rm -r 1 2 3
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- branches)
- # More branch tests, including branches off of branches
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest branches-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- echo 1:ancest >file1
- echo 2:ancest >file2
- echo 3:ancest >file3
- echo 4:trunk-1 >file4
- dotest branches-2 "${testcvs} add file1 file2 file3 file4" \
- "${PROG}"' add: scheduling file `file1'\'' for addition
- '"${PROG}"' add: scheduling file `file2'\'' for addition
- '"${PROG}"' add: scheduling file `file3'\'' for addition
- '"${PROG}"' add: scheduling file `file4'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add these files permanently'
- dotest branches-2a "${testcvs} -n -q ci -m dont-commit" ""
- dotest_lit branches-3 "${testcvs} -q ci -m add-it" <<HERE
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file4,v
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- initial revision: 1.1
- done
- HERE
- echo 4:trunk-2 >file4
- dotest branches-3.2 "${testcvs} -q ci -m trunk-before-branch" \
- "Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: 1\.2; previous revision: 1\.1
- done"
- # The "cvs log file4" in test branches-14.3 will test that we
- # didn't really add the tag.
- dotest branches-3.3 "${testcvs} -qn tag dont-tag" \
- "T file1
- T file2
- T file3
- T file4"
- # Modify this file before branching, to deal with the case where
- # someone is hacking along, says "oops, I should be doing this on
- # a branch", and only then creates the branch.
- echo 1:br1 >file1
- dotest branches-4 "${testcvs} tag -b br1" "${PROG}"' tag: Tagging \.
- T file1
- T file2
- T file3
- T file4'
- dotest branches-5 "$testcvs update -r br1" \
- "$PROG update: Updating \.
- M file1
- [UP] file2
- [UP] file3
- [UP] file4"
- echo 2:br1 >file2
- echo 4:br1 >file4
- dotest branches-6 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: 1\.2\.2\.1; previous revision: 1\.2
- done"
- dotest branches-7 "${testcvs} -q tag -b brbr" 'T file1
- T file2
- T file3
- T file4'
- dotest branches-8 "$testcvs -q update -r brbr" \
- '[UP] file1
- [UP] file2
- [UP] file3
- [UP] file4'
- echo 1:brbr >file1
- echo 4:brbr >file4
- dotest branches-9 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1\.2\.1; previous revision: 1\.1\.2\.1
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: 1\.2\.2\.1\.2\.1; previous revision: 1\.2\.2\.1
- done"
- dotest branches-10 "cat file1 file2 file3 file4" '1:brbr
- 2:br1
- 3:ancest
- 4:brbr'
- dotest branches-11 "$testcvs -q update -r br1" \
- 'U file1
- [UP] file2
- [UP] file3
- U file4'
- dotest branches-12 "cat file1 file2 file3 file4" '1:br1
- 2:br1
- 3:ancest
- 4:br1'
- echo 4:br1-2 >file4
- dotest branches-12.2 "${testcvs} -q ci -m change-on-br1" \
- "Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: 1\.2\.2\.2; previous revision: 1\.2\.2\.1
- done"
- dotest branches-13 "${testcvs} -q update -A" \
- 'U file1
- U file2
- [UP] file3
- U file4'
- dotest branches-14 "cat file1 file2 file3 file4" '1:ancest
- 2:ancest
- 3:ancest
- 4:trunk-2'
- echo 4:trunk-3 >file4
- dotest branches-14.2 \
- "${testcvs} -q ci -m trunk-change-after-branch" \
- "Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: 1\.3; previous revision: 1\.2
- done"
- dotest branches-14.3 "${testcvs} log file4" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file4,v
- Working file: file4
- head: 1\.3
- branch:
- locks: strict
- access list:
- symbolic names:
- brbr: 1\.2\.2\.1\.0\.2
- br1: 1\.2\.0\.2
- keyword substitution: kv
- total revisions: 6; selected revisions: 6
- description:
- ----------------------------
- revision 1\.3
- date: [0-9/: ]*; author: ${username}; state: Exp; lines: ${PLUS}1 -1
- trunk-change-after-branch
- ----------------------------
- revision 1\.2
- date: [0-9/: ]*; author: ${username}; state: Exp; lines: ${PLUS}1 -1
- branches: 1\.2\.2;
- trunk-before-branch
- ----------------------------
- revision 1\.1
- date: [0-9/: ]*; author: ${username}; state: Exp;
- add-it
- ----------------------------
- revision 1\.2\.2\.2
- date: [0-9/: ]*; author: ${username}; state: Exp; lines: ${PLUS}1 -1
- change-on-br1
- ----------------------------
- revision 1\.2\.2\.1
- date: [0-9/: ]*; author: ${username}; state: Exp; lines: ${PLUS}1 -1
- branches: 1\.2\.2\.1\.2;
- modify
- ----------------------------
- revision 1\.2\.2\.1\.2\.1
- date: [0-9/: ]*; author: ${username}; state: Exp; lines: ${PLUS}1 -1
- modify
- ============================================================================="
- dotest_fail branches-14.4 \
- "${testcvs} diff -c -r 1.1 -r 1.3 file4" \
- "Index: file4
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file4,v
- retrieving revision 1\.1
- retrieving revision 1\.3
- diff -c -r1\.1 -r1\.3
- \*\*\* file4 ${RFCDATE} 1\.1
- --- file4 ${RFCDATE} 1\.3
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- ! 4:trunk-1
- --- 1 ----
- ! 4:trunk-3"
- dotest_fail branches-14.5 \
- "${testcvs} diff -c -r 1.1 -r 1.2.2.1 file4" \
- "Index: file4
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file4,v
- retrieving revision 1\.1
- retrieving revision 1\.2\.2\.1
- diff -c -r1\.1 -r1\.2\.2\.1
- \*\*\* file4 ${RFCDATE} 1\.1
- --- file4 ${RFCDATE} 1\.2\.2\.1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1 \*\*\*\*
- ! 4:trunk-1
- --- 1 ----
- ! 4:br1"
- dotest branches-15 \
- "${testcvs} update -j 1.1.2.1 -j 1.1.2.1.2.1 file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.1\.2\.1
- retrieving revision 1\.1\.2\.1\.2\.1
- Merging differences between 1\.1\.2\.1 and 1\.1\.2\.1\.2\.1 into file1
- rcsmerge: warning: conflicts during merge"
- dotest branches-16 "cat file1" '<<<<<<< file1
- 1:ancest
- [=]======
- 1:brbr
- [>]>>>>>> 1\.1\.2\.1\.2\.1'
- dotest branches-o1 "${testcvs} -q admin -o ::brbr" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file3,v
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file4,v
- done"
- cd ..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -r first-dir
- ;;
- branches2)
- # More branch tests.
- # Test that when updating a new subdirectory in a directory
- # which was checked out on a branch, the new subdirectory is
- # created on the appropriate branch. Test this when joining
- # as well.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir trunk; cd trunk
- # Create a file.
- dotest branches2-1 "${testcvs} -q co first-dir"
- cd first-dir
- echo "file1 first revision" > file1
- dotest branches2-2 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest branches2-3 "${testcvs} commit -m add file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- # Tag the file.
- dotest branches2-4 "${testcvs} -q tag tag1" 'T file1'
- # Make two branches.
- dotest branches2-5 "${testcvs} -q rtag -b -r tag1 b1 first-dir" ''
- dotest branches2-6 "${testcvs} -q rtag -b -r tag1 b2 first-dir" ''
- # Create some files and a subdirectory on branch b1.
- cd ../..
- mkdir b1; cd b1
- dotest branches2-7 "${testcvs} -q co -r b1 first-dir" \
- "U first-dir/file1"
- cd first-dir
- echo "file2 first revision" > file2
- dotest branches2-8 "${testcvs} add file2" \
- "${PROG}"' add: scheduling file `file2'\'' for addition on branch `b1'\''
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- mkdir dir1
- dotest branches2-9 "${testcvs} add dir1" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir1 added to the repository
- --> Using per-directory sticky tag "'`'"b1'"
- echo "file3 first revision" > dir1/file3
- dotest branches2-10 "${testcvs} add dir1/file3" \
- "${PROG}"' add: scheduling file `dir1/file3'\'' for addition on branch `b1'\''
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest branches2-11 "${testcvs} -q ci -madd ." \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file2,v <-- file2
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir1/Attic/file3,v
- done
- Checking in dir1/file3;
- ${CVSROOT_DIRNAME}/first-dir/dir1/Attic/file3,v <-- file3
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- # Check out the second branch, and update the working
- # directory to the first branch, to make sure the right
- # happens with dir1.
- cd ../..
- mkdir b2; cd b2
- dotest branches2-12 "${testcvs} -q co -r b2 first-dir" \
- 'U first-dir/file1'
- cd first-dir
- dotest branches2-13 "${testcvs} update -d -r b1 dir1" \
- "${PROG} update: Updating dir1
- U dir1/file3"
- dotest branches2-14 "${testcvs} -q status" \
- "===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: b2 (branch: 1\.1\.4)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Up-to-date
- Working revision: 1\.1\.2\.1.*
- Repository revision: 1\.1\.2\.1 ${CVSROOT_DIRNAME}/first-dir/dir1/Attic/file3,v
- Sticky Tag: b1 (branch: 1\.1\.2)
- Sticky Date: (none)
- Sticky Options: (none)"
- # FIXME: Just clobbering the directory like this is a bit
- # tacky, although people generally expect it to work. Maybe
- # we should release it instead. We do it a few other places
- # below as well.
- rm -r dir1
- dotest branches2-15 "${testcvs} update -d -j b1 dir1" \
- "${PROG} update: Updating dir1
- U dir1/file3"
- # FIXCVS: The `No revision control file' stuff seems to be
- # CVS's way of telling us that we're adding the file on a
- # branch, and the file is not on that branch yet. This
- # should be nicer.
- dotest branches2-16 "${testcvs} -q status" \
- "===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: b2 (branch: 1\.1\.4)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: b2 - MISSING from RCS file!
- Sticky Date: (none)
- Sticky Options: (none)"
- cd ../../trunk/first-dir
- dotest branches2-17 "${testcvs} update -d -P dir1" \
- "${PROG} update: Updating dir1"
- dotest_fail branches2-18 "test -d dir1"
- dotest branches2-19 "${testcvs} update -d -P -r b1 dir1" \
- "${PROG} update: Updating dir1
- U dir1/file3"
- dotest branches2-20 "${testcvs} -q status" \
- "===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Up-to-date
- Working revision: 1\.1\.2\.1.*
- Repository revision: 1\.1\.2\.1 ${CVSROOT_DIRNAME}/first-dir/dir1/Attic/file3,v
- Sticky Tag: b1 (branch: 1\.1\.2)
- Sticky Date: (none)
- Sticky Options: (none)"
- rm -r dir1
- dotest branches2-21 "${testcvs} update -d -P -j b1 dir1" \
- "${PROG} update: Updating dir1
- U dir1/file3"
- dotest branches2-22 "${testcvs} -q status" \
- "===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Locally Added
- Working revision: New file!
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/dir1/Attic/file3,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- cd ../..
- rm -r b1 b2
- # Check out branch b1 twice. Crate a new directory in one
- # working directory, then do a cvs update in the other
- # working directory and see if the tags are right.
- mkdir b1a
- mkdir b1b
- cd b1b
- dotest branches2-23 "${testcvs} -q co -r b1 first-dir" \
- 'U first-dir/file1
- U first-dir/file2
- U first-dir/dir1/file3'
- cd ../b1a
- dotest branches2-24 "${testcvs} -q co -r b1 first-dir" \
- 'U first-dir/file1
- U first-dir/file2
- U first-dir/dir1/file3'
- cd first-dir
- mkdir dir2
- dotest branches2-25 "${testcvs} add dir2" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir2 added to the repository
- --> Using per-directory sticky tag "'`'"b1'"
- echo "file4 first revision" > dir2/file4
- dotest branches2-26 "${testcvs} add dir2/file4" \
- "${PROG}"' add: scheduling file `dir2/file4'\'' for addition on branch `b1'\''
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest branches2-27 "${testcvs} -q commit -madd" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/dir2/Attic/file4,v
- done
- Checking in dir2/file4;
- ${CVSROOT_DIRNAME}/first-dir/dir2/Attic/file4,v <-- file4
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- cd ../../b1b/first-dir
- dotest branches2-28 "${testcvs} update -d dir2" \
- "${PROG} update: Updating dir2
- U dir2/file4"
- cd dir2
- dotest branches2-29 "${testcvs} -q status" \
- "===================================================================
- File: file4 Status: Up-to-date
- Working revision: 1\.1\.2\.1.*
- Repository revision: 1\.1\.2\.1 ${CVSROOT_DIRNAME}/first-dir/dir2/Attic/file4,v
- Sticky Tag: b1 (branch: 1\.1\.2)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest branches2-30 "cat CVS/Tag" 'Tb1'
- # Test update -A on a subdirectory
- cd ..
- rm -r dir2
- dotest branches2-31 "${testcvs} update -A -d dir2" \
- "${PROG} update: Updating dir2"
- cd dir2
- dotest branches2-32 "${testcvs} -q status" ''
- dotest_fail branches2-33 "test -f CVS/Tag"
- # Add a file on the trunk.
- echo "file5 first revision" > file5
- dotest branches2-34 "${testcvs} add file5" \
- "${PROG}"' add: scheduling file `file5'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest branches2-35 "${testcvs} -q commit -madd" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/dir2/file5,v
- done
- Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/dir2/file5,v <-- file5
- initial revision: 1\.1
- done"
- cd ../../../trunk/first-dir
- dotest branches2-36 "${testcvs} -q update -d dir2" 'U dir2/file5'
- cd dir2
- dotest branches2-37 "${testcvs} -q status" \
- "===================================================================
- File: file5 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/dir2/file5,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest_fail branches2-38 "test -f CVS/status"
- cd ../../..
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -r trunk b1a b1b
- ;;
- tagc)
- # Test the tag -c option.
- mkdir 1; cd 1
- dotest tagc-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest tagc-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch file1 file2
- dotest tagc-3 "${testcvs} add file1 file2" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest tagc-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- dotest tagc-5 "${testcvs} -q tag -c tag1" \
- "T file1
- T file2"
- touch file1 file2
- dotest tagc-6 "${testcvs} -q tag -c tag2" \
- "T file1
- T file2"
- # Avoid timestamp granularity bugs (FIXME: CVS should be
- # doing the sleep, right?).
- sleep 1
- echo myedit >>file1
- dotest tagc-6a "${testcvs} rm -f file2" \
- "${PROG} remove: scheduling .file2. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- touch file3
- dotest tagc-6b "${testcvs} add file3" \
- "${PROG} add: scheduling file .file3. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest_fail tagc-7 "${testcvs} -q tag -c tag3" \
- "${PROG} tag: file1 is locally modified
- ${PROG} tag: file2 is locally modified
- ${PROG} tag: file3 is locally modified
- ${PROG} \[tag aborted\]: correct the above errors first!"
- cd ../..
- mkdir 2
- cd 2
- dotest tagc-8 "${testcvs} -q co first-dir" \
- "U first-dir/file1
- U first-dir/file2"
- cd ../1/first-dir
- dotest tagc-9 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done
- Removing file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: delete; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- initial revision: 1\.1
- done"
- cd ../../2/first-dir
- dotest tagc-10 "${testcvs} -q tag -c tag4" \
- "${PROG} tag: file2 is no longer in the repository
- T file1
- T file2"
- cd ../..
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- update-p)
- # Make sure `cvs update -p -rT FILE' works from a branch when
- # FILE is already on the trunk and is being added to that branch.
- mkdir 1; cd 1
- module=x
- echo > unused-file
- # Create the module.
- dotest update-p-1 \
- "$testcvs -Q import -m. $module X Y" ''
- file=F
- # Check it out and tag it.
- dotest update-p-2 "$testcvs -Q co $module" ''
- cd $module
- dotest update-p-3 "$testcvs -Q tag -b B" ''
- echo v1 > $file
- dotest update-p-4 "$testcvs -Q add $file" ''
- dotest update-p-5 "$testcvs -Q ci -m. $file" \
- "RCS file: ${CVSROOT_DIRNAME}/$module/$file,v
- done
- Checking in $file;
- ${CVSROOT_DIRNAME}/$module/$file,v <-- $file
- initial revision: 1\.1
- done"
- dotest update-p-6 "$testcvs -Q tag T $file" ''
- dotest update-p-7 "$testcvs -Q update -rB" ''
- # This merge effectively adds file F on branch B.
- dotest update-p-8 "$testcvs -Q update -jT" ''
- # Before the fix that prompted the addition of this test,
- # the following command would fail with this diagnostic:
- # cvs update: conflict: F created independently by second party
- dotest update-p-9 "$testcvs update -p -rT $file" \
- "===================================================================
- Checking out $file
- RCS: ${CVSROOT_DIRNAME}/$module/$file,v
- VERS: 1\.1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- v1"
- # Repeat the above, but with $file removed.
- # This exercises a slightly different code path.
- rm $file
- # Before the fix that prompted the addition of this test,
- # the following command would fail with this diagnostic:
- # cvs update: warning: new-born F has disappeared
- dotest update-p-10 "$testcvs update -p -rT $file" \
- "===================================================================
- Checking out $file
- RCS: ${CVSROOT_DIRNAME}/$module/$file,v
- VERS: 1\.1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- v1"
- # Exercise yet another code path:
- # the one that involves reviving a `dead' file.
- # And a little more, for good measure...
- touch new
- dotest update-p-a1 "$testcvs -Q add new" ''
- dotest update-p-a2 "$testcvs -Q update -p new" ''
- dotest update-p-a3 "$testcvs -Q rm -f new" ''
- # Both an update -A, *and* the following update are required
- # to return to the state of being on the trunk with a $file
- # that we can then remove.
- dotest update-p-undead-0 "$testcvs update -A" \
- "$PROG update: Updating \.
- $PROG update: warning: new-born $file has disappeared
- [UP] unused-file"
- dotest update-p-undead-1 "$testcvs update" \
- "${PROG} update: Updating \.
- U $file"
- dotest update-p-undead-2 "$testcvs -Q update -p -rT $file" v1
- dotest update-p-undead-3 "$testcvs -Q rm -f $file" ''
- dotest update-p-undead-4 "$testcvs -Q update -p -rT $file" v1
- dotest update-p-undead-5 "$testcvs -Q ci -m. $file" \
- "Removing $file;
- ${CVSROOT_DIRNAME}/$module/$file,v <-- $file
- new revision: delete; previous revision: 1\.1
- done"
- dotest update-p-undead-6 "$testcvs -Q update -p -rT $file" v1
- echo v2 > $file
- dotest update-p-undead-7 "$testcvs -Q update -p -rT $file" v1
- dotest update-p-undead-8 "$testcvs add $file" \
- "${PROG} add: Re-adding file .$file. (in place of dead revision 1\.2)\.
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest update-p-undead-9 "$testcvs -Q update -p -rT $file" v1
- cd ../..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/$module
- ;;
- tagf)
- # More tagging tests, including using tag -F -B to convert a
- # branch tag to a regular tag and recovering thereof.
- # Setup; check in first-dir/file1
- mkdir 1; cd 1
- dotest tagf-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest tagf-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch file1 file2
- dotest tagf-3 "${testcvs} add file1 file2" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest tagf-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- # Now create a branch and commit a revision there.
- dotest tagf-5 "${testcvs} -q tag -b br" "T file1
- T file2"
- dotest tagf-6 "$testcvs -q update -r br" \
- 'U file1
- U file2'
- echo brmod >> file1
- echo brmod >> file2
- dotest tagf-7 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- # Here we try to make it a non-branch tag, but will
- # succeed in getting only warnings, even with -F
- # because converting a branch tag to non-branch
- # is potentially catastrophic.
- dotest tagf-8a "${testcvs} -q tag -F br" \
- "${PROG} tag: file1: Not moving branch tag .br. from 1\.1\.2\.1 to 1\.1\\.2\.1\.
- ${PROG} tag: file2: Not moving branch tag .br. from 1\.1\.2\.1 to 1\.1\.2\.1\."
- # however, if we *really* are sure we want to move a branch tag,
- # "-F -B" will do the trick
- dotest tagf-8 "${testcvs} -q tag -F -B br" "T file1
- T file2"
- echo moremod >> file1
- echo moremod >> file2
- dotest tagf-9 "${testcvs} -q status -v file1" \
- "===================================================================
- File: file1 Status: Locally Modified
- Working revision: 1\.1\.2\.1.*
- Repository revision: 1\.1\.2\.1 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: br (revision: 1\.1\.2\.1)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- br (revision: 1\.1\.2\.1)"
- # Now, how do we recover?
- dotest tagf-10 "${testcvs} -q tag -d br" "D file1
- D file2"
- # This creates a new branch, 1.1.4. See the code in RCS_magicrev
- # which will notice that there is a (non-magic) 1.1.2 and thus
- # skip that number.
- dotest tagf-11 "${testcvs} -q tag -r 1.1 -b br file1" "T file1"
- # Fix it with admin -n (cf admin-18, admin-26-4).
- dotest tagf-12 "${testcvs} -q admin -nbr:1.1.2 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
- # Another variation on the file2 test would be to use two working
- # directories so that the update -r br would need to
- # a merge to get from 1.1.2.1 to the head of the 1.1.2 branch.
- dotest tagf-13 "${testcvs} -q update -r br" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.1\.2\.1
- retrieving revision 1\.1
- Merging differences between 1\.1\.2\.1 and 1\.1 into file1
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in file1
- C file1
- M file2"
- # CVS is giving a conflict because we are trying to get back to
- # 1.1.4. I'm not sure why it is a conflict rather than just
- # "M file1".
- dotest tagf-14 "cat file1" \
- "<<<<<<< file1
- brmod
- moremod
- [=]======
- [>]>>>>>> 1\.1"
- echo resolve >file1
- dotest tagf-15 "${testcvs} -q ci -m recovered" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.4\.1; previous revision: 1\.1
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done"
- # try accidentally deleting branch tag, "tag -d"
- dotest_fail tagf-16 "${testcvs} tag -d br" \
- "${PROG} tag: Untagging \.
- ${PROG} tag: Not removing branch tag .br. from .${CVSROOT_DIRNAME}/first-dir/file1,v.\.
- ${PROG} tag: Not removing branch tag .br. from .${CVSROOT_DIRNAME}/first-dir/file2,v.\."
- # try accidentally deleting branch tag, "rtag -d"
- dotest_fail tagf-17 "${testcvs} rtag -d br first-dir" \
- "${PROG} rtag: Untagging first-dir
- ${PROG} rtag: Not removing branch tag .br. from .${CVSROOT_DIRNAME}/first-dir/file1,v.\.
- ${PROG} rtag: Not removing branch tag .br. from .${CVSROOT_DIRNAME}/first-dir/file2,v.\."
- # try accidentally converting branch tag to non-branch tag "tag -F"
- dotest tagf-18 "${testcvs} tag -r1.1 -F br file1" \
- "${PROG} tag: file1: Not moving branch tag .br. from 1\.1\.4\.1 to 1\.1\."
- # try accidentally converting branch tag to non-branch tag "rtag -F"
- dotest tagf-19 "${testcvs} rtag -r1.1 -F br first-dir" \
- "${PROG} rtag: Tagging first-dir
- ${PROG} rtag: first-dir/file1: Not moving branch tag .br. from 1\.1\.4\.1 to 1\.1\.
- ${PROG} rtag: first-dir/file2: Not moving branch tag .br. from 1\.1\.2\.2 to 1\.1\."
- # create a non-branch tag
- dotest tagf-20 "${testcvs} rtag regulartag first-dir" \
- "${PROG} rtag: Tagging first-dir"
- # try accidentally converting non-branch tag to branch tag (tag -F -B -b)
- dotest tagf-21 "${testcvs} tag -F -B -b regulartag file1" \
- "${PROG} tag: file1: Not moving non-branch tag .regulartag. from 1\.1 to 1\.1\.4\.1\.0\.2 due to .-B. option\."
- # try accidentally converting non-branch tag to branch rtag (rtag -F -B -b)
- dotest tagf-22 "${testcvs} rtag -F -B -b regulartag first-dir" \
- "${PROG} rtag: Tagging first-dir
- ${PROG} rtag: first-dir/file1: Not moving non-branch tag .regulartag. from 1\.1 to 1\.1\.0\.6 due to .-B. option\.
- ${PROG} rtag: first-dir/file2: Not moving non-branch tag .regulartag. from 1\.1 to 1\.1\.0\.4 due to .-B. option\."
- # Try accidentally deleting non-branch: (tag -d -B)
- dotest_fail tagf-23 "${testcvs} tag -d -B regulartag file1" \
- "${PROG} tag: Not removing non-branch tag .regulartag. from .${CVSROOT_DIRNAME}/first-dir/file1,v. due to .-B. option\."
- # Try accidentally deleting non-branch: (rtag -d -B)
- dotest_fail tagf-24 \
- "${testcvs} rtag -d -B regulartag first-dir" \
- "${PROG} rtag: Untagging first-dir
- ${PROG} rtag: Not removing non-branch tag .regulartag. from .${CVSROOT_DIRNAME}/first-dir/file1,v. due to .-B. option\.
- ${PROG} rtag: Not removing non-branch tag .regulartag. from .${CVSROOT_DIRNAME}/first-dir/file2,v. due to .-B. option\."
- # the following tests (throught the next commit) keep moving the same
- # tag back and forth between 1.1.6 & 1.1.8 in file1 and between
- # 1.1.4 and 1.1.6 in file2 since nothing was checked in on some of
- # these branches and CVS only tracks branches via tags unless they contain data.
- # try intentionally converting non-branch tag to branch tag (tag -F -b)
- dotest tagf-25a "${testcvs} tag -F -b regulartag file1" "T file1"
- # try intentionally moving a branch tag to a newly created branch (tag -F -b -B)
- dotest tagf-25b "${testcvs} tag -F -B -b -r1.1 regulartag file1" \
- "T file1"
- # try intentionally converting mixed tags to branch tags (rtag -F -b)
- dotest tagf-26a "${testcvs} rtag -F -b regulartag first-dir" \
- "${PROG} rtag: Tagging first-dir
- ${PROG} rtag: first-dir/file1: Not moving branch tag .regulartag. from 1\.1 to 1\.1\.0\.8\."
- # try intentionally converting a branch to a new branch tag (rtag -F -b -B)
- dotest tagf-26b "${testcvs} rtag -F -B -b -r1.1 regulartag first-dir" \
- "${PROG} rtag: Tagging first-dir"
- # update to our new branch
- dotest tagf-27 "${testcvs} update -r regulartag" \
- "${PROG} update: Updating \.
- U file1
- U file2"
- # commit some changes and see that all rev numbers look right
- echo changes >> file1
- echo changes >> file2
- dotest tagf-28 "${testcvs} ci -m changes" \
- "${PROG} [a-z]*: Examining \.
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.8\.1; previous revision: 1\.1
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.1\.6\.1; previous revision: 1\.1
- done"
- # try intentional branch to non-branch (tag -F -B)
- dotest tagf-29 "${testcvs} tag -F -B -r1.1 regulartag file1" \
- "T file1"
- # try non-branch to non-branch (tag -F -B)
- dotest tagf-29a "${testcvs} tag -F -B -r br regulartag file1" \
- "${PROG} tag: file1: Not moving non-branch tag .regulartag. from 1\.1 to 1\.1\.4\.1 due to .-B. option\."
- # try mixed-branch to non-branch (rtag -F -B )
- dotest tagf-29b "${testcvs} rtag -F -B -r br regulartag first-dir" \
- "${PROG} rtag: Tagging first-dir
- ${PROG} rtag: first-dir/file1: Not moving non-branch tag .regulartag. from 1\.1 to 1\.1\.4\.1 due to .-B. option\."
- # at this point, regulartag is a regular tag within
- # file1 and file2
- # try intentional branch to non-branch (rtag -F -B)
- dotest tagf-30 "${testcvs} rtag -F -B -r1.1 br first-dir" \
- "${PROG} rtag: Tagging first-dir"
- # create a branch tag so we can try to delete it.
- dotest tagf-31 "${testcvs} rtag -b brtag first-dir" \
- "${PROG} rtag: Tagging first-dir"
-
- # try intentinal deletion of branch tag (tag -d -B)
- dotest tagf-32 "${testcvs} tag -d -B brtag file1" "D file1"
- # try intentinal deletion of branch tag (rtag -d -B)
- dotest tagf-33 "${testcvs} rtag -d -B brtag first-dir" \
- "${PROG} rtag: Untagging first-dir"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- tag-log)
- # Test log output for tags
- mkdir 1; cd 1
- dotest tag-log-init-1 "$testcvs -q co -l ."
- mkdir first-dir
- dotest tag-log-init-2 "$testcvs add first-dir" \
- "Directory $CVSROOT_DIRNAME/first-dir added to the repository"
- cd first-dir
- touch file1
- dotest tag-log-init-3 "$testcvs add file1" \
- "${PROG}"' add: scheduling file `file1'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest tag-log-init-4 "$testcvs -Q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest tag-log-1 "$testcvs -Q tag mytag file1" ''
- dotest tag-log-2 "$testcvs log -N file1" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- add
- ============================================================================="
- dotest tag-log-3 "$testcvs log -N -n file1" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- mytag: 1\.1
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- add
- ============================================================================="
- dotest tag-log-4 "$testcvs log file1" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- mytag: 1\.1
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- add
- ============================================================================="
- dotest tag-log-5 "$testcvs log -n file1" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- mytag: 1\.1
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- add
- ============================================================================="
- cd ../..
- rm -fr 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- tag-space)
- # Test tags with spaces in the names.
- #
- # Prior to releases 1.11.18 & 1.12.10, some commands used with
- # tags with spaces in the names could hang CVS.
- # Setup; check in first-dir/file1
- mkdir 1; cd 1
- dotest tag-space-init-1 "$testcvs -q co -l ."
- mkdir first-dir
- dotest tag-space-init-2 "$testcvs add first-dir" \
- "Directory $CVSROOT_DIRNAME/first-dir added to the repository"
- cd first-dir
- touch file1
- dotest tag-space-init-3 "$testcvs add file1" \
- "$PROG add: scheduling file \`file1' for addition
- $PROG add: use '$PROG commit' to add this file permanently"
- dotest tag-space-init-4 "$testcvs -Q ci -m add" \
- "RCS file: $CVSROOT_DIRNAME/first-dir/file1,v
- done
- Checking in file1;
- $CVSROOT_DIRNAME/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- # Reportedly, the following two tags make it past WinCVS.
- dotest_fail tag-space-1 "$testcvs tag ' spacetag '" \
- "$PROG \[tag aborted\]: tag \` spacetag ' must start with a letter"
- dotest_fail tag-space-2 "$testcvs tag 'spacetag '" \
- "$PROG \[tag aborted\]: tag \`spacetag ' has non-visible graphic characters"
- if $remote; then
- # Verify that this isn't a client check.
- dotest tag-space-3 "$testcvs server" \
- "E $PROG \[tag aborted\]: tag \` spacetag ' must start with a letter
- error " <<EOF
- Root $CVSROOT_DIRNAME
- UseUnchanged
- Argument --
- Argument spacetag
- Directory .
- $CVSROOT_DIRNAME/first-dir
- Entry /file1/1.1///
- Unchanged file1
- tag
- EOF
- dotest tag-space-4 "$testcvs server" \
- "E $PROG \[tag aborted\]: tag \`spacetag ' has non-visible graphic characters
- error " <<EOF
- Root $CVSROOT_DIRNAME
- UseUnchanged
- Argument --
- Argument spacetag
- Directory .
- $CVSROOT_DIRNAME/first-dir
- Entry /file1/1.1///
- Unchanged file1
- tag
- EOF
- fi # $remote
- # Any number of normal tags and branches were handled correctly.
- dotest tag-space-5 "$testcvs -Q tag t1"
- dotest tag-space-5b "$testcvs -Q tag t2"
- dotest tag-space-5c "$testcvs -Q tag -b b1"
- cd ../..
- mkdir 2; cd 2
- # But once a vendor branch exists, it's all over.
- mkdir project; cd project
- touch file1
- dotest tag-space-init-4 \
- "$testcvs -Q import -mimport second-dir VENDOR RELEASE"
- cd ..
- dotest_fail tag-space-6 "$testcvs -Q co -r ' spacetag ' first-dir" \
- "$PROG \[checkout aborted\]: tag \` spacetag ' must start with a letter"
- # But when any files were imported, this test hung prior to CVS
- # versions 1.11.18 & 1.12.10.
- dotest_fail tag-space-7 "$testcvs -Q co -r ' spacetag ' second-dir" \
- "$PROG \[checkout aborted\]: tag \` spacetag ' must start with a letter"
- if $remote; then
- # I based the client input in the next two tests on actual input
- # from WinCVS 1.2.
- dotest tag-space-8 "$testcvs server" \
- "E $PROG \[checkout aborted\]: tag \` spacetag ' must start with a letter
- error " <<EOF
- Root $CVSROOT_DIRNAME
- Argument -P
- Argument -r
- Argument spacetag
- Argument first-dir
- Directory .
- $CVSROOT_DIRNAME
- co
- EOF
- # Verify the test is not on the client side.
- dotest tag-space-9 "$testcvs server" \
- "E $PROG \[checkout aborted\]: tag \` spacetag ' must start with a letter
- error " <<EOF
- Root $CVSROOT_DIRNAME
- Argument -P
- Argument -r
- Argument spacetag
- Argument second-dir
- Directory .
- $CVSROOT_DIRNAME
- co
- EOF
- fi # $remote
- dotest tag-space-10 "$testcvs -Q co second-dir"
- cd second-dir
- # This test would also hang.
- dotest_fail tag-space-11 "$testcvs -Q up -r ' spacetag '" \
- "$PROG \[update aborted\]: tag \` spacetag ' must start with a letter"
- if $remote; then
- dotest tag-space-12 "$testcvs server" \
- "E $PROG \[update aborted\]: tag \` spacetag ' must start with a letter
- error " <<EOF
- Root $CVSROOT_DIRNAME
- Argument -r
- Argument spacetag
- Argument -u
- Argument --
- Directory .
- $CVSROOT_DIRNAME
- Unchanged file1
- update
- EOF
- fi # $remote
- # I'm skipping tests for other commands that may have had the same
- # problem. Hopefully, if a new issue arises, one of the above tests
- # will catch the problem.
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -r 1 2
- rm -rf $CVSROOT_DIRNAME/first-dir $CVSROOT_DIRNAME/second-dir
- ;;
- rcslib)
- # Test librarification of RCS.
- # First: test whether `cvs diff' handles $Name expansion
- # correctly. We diff two revisions with their symbolic tags;
- # neither tag should be expanded in the output. Also diff
- # one revision with the working copy.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest rcsdiff-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- echo "I am the first foo, and my name is $""Name$." > foo.c
- dotest rcsdiff-2 "${testcvs} add -m new-file foo.c" \
- "${PROG} add: scheduling file .foo\.c. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest rcsdiff-3 "${testcvs} commit -m rev1 foo.c" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/foo\.c,v
- done
- Checking in foo\.c;
- ${CVSROOT_DIRNAME}/first-dir/foo.c,v <-- foo\.c
- initial revision: 1\.1
- done"
- dotest rcsdiff-4 "${testcvs} tag first foo.c" "T foo\.c"
- dotest rcsdiff-5 "${testcvs} update -p -r first foo.c" \
- "===================================================================
- Checking out foo\.c
- RCS: ${CVSROOT_DIRNAME}/first-dir/foo\.c,v
- VERS: 1\.1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- I am the first foo, and my name is \$""Name: first \$\."
- echo "I am the second foo, and my name is $""Name$." > foo.c
- dotest rcsdiff-6 "${testcvs} commit -m rev2 foo.c" \
- "Checking in foo\.c;
- ${CVSROOT_DIRNAME}/first-dir/foo\.c,v <-- foo\.c
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest rcsdiff-7 "${testcvs} tag second foo.c" "T foo\.c"
- dotest rcsdiff-8 "${testcvs} update -p -r second foo.c" \
- "===================================================================
- Checking out foo\.c
- RCS: ${CVSROOT_DIRNAME}/first-dir/foo\.c,v
- VERS: 1\.2
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- I am the second foo, and my name is \$""Name: second \$\."
- dotest_fail rcsdiff-9 "${testcvs} diff -r first -r second" \
- "${PROG} diff: Diffing \.
- Index: foo\.c
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/foo\.c,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- diff -r1\.1 -r1\.2
- 1c1
- < I am the first foo, and my name is \$""Name: \$\.
- ---
- > I am the second foo, and my name is \$""Name: \$\."
- echo "I am the once and future foo, and my name is $""Name$." > foo.c
- dotest_fail rcsdiff-10 "${testcvs} diff -r first" \
- "${PROG} diff: Diffing \.
- Index: foo\.c
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/foo\.c,v
- retrieving revision 1\.1
- diff -r1\.1 foo\.c
- 1c1
- < I am the first foo, and my name is \$""Name: \$\.
- ---
- > I am the once and future foo, and my name is \$""Name\$\."
- # Test handling of libdiff options. diff gets quite enough
- # of a workout elsewhere in sanity.sh, so we assume that it's
- # mostly working properly if it passes all the other tests.
- # The main one we want to try is regex handling, since we are
- # using CVS's regex matcher and not diff's.
- cat >rgx.c <<EOF
- test_regex (whiz, bang)
- {
- foo;
- bar;
- baz;
- grumble;
- }
- EOF
- dotest rcslib-diffrgx-1 "${testcvs} -q add -m '' rgx.c" \
- "${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest rcslib-diffrgx-2 "${testcvs} -q ci -m '' rgx.c" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/rgx\.c,v
- done
- Checking in rgx\.c;
- ${CVSROOT_DIRNAME}/first-dir/rgx\.c,v <-- rgx\.c
- initial revision: 1\.1
- done"
- cat >rgx.c <<EOF
- test_regex (whiz, bang)
- {
- foo;
- bar;
- baz;
- mumble;
- }
- EOF
- # Use dotest_fail because exit status from `cvs diff' must be 1.
- dotest_fail rcslib-diffrgx-3 "${testcvs} diff -c -F'.* (' rgx.c" \
- "Index: rgx\.c
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/rgx\.c,v
- retrieving revision 1\.1
- diff -c -F \.\* ( -r1\.1 rgx\.c
- \*\*\* rgx\.c ${RFCDATE} 1\.1
- --- rgx\.c ${RFCDATE}
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\* test_regex (whiz, bang)
- \*\*\* 3,7 \*\*\*\*
- foo;
- bar;
- baz;
- ! grumble;
- }
- --- 3,7 ----
- foo;
- bar;
- baz;
- ! mumble;
- }"
- # Tests of rcsmerge/diff3. Merge operations get a good general
- # workout elsewhere; we want to make sure that options are still
- # handled properly. Try merging two branches with -kv, to test
- # both -j and -k switches.
- cd ..
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -r first-dir
- mkdir 1; cd 1
- dotest rcslib-merge-1 "${testcvs} -q co -l ." ""
- mkdir first-dir
- dotest rcslib-merge-2 "${testcvs} -q add first-dir" \
- "Directory ${CVSROOT_DIRNAME}.*/first-dir added to the repository"
- cd ..; rm -r 1
- dotest rcslib-merge-3 "${testcvs} -q co first-dir" ""
- cd first-dir
- echo '$''Revision$' > file1
- echo '2' >> file1
- echo '3' >> file1
- dotest rcslib-merge-4 "${testcvs} -q add file1" \
- "${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest rcslib-merge-5 "${testcvs} -q commit -m '' file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- sed -e 's/2/two/' file1 > f; mv f file1
- dotest rcslib-merge-6 "${testcvs} -q commit -m '' file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest rcslib-merge-7 "${testcvs} -q tag -b -r 1.1 patch1" "T file1"
- dotest rcslib-merge-8 "${testcvs} -q update -r patch1" "[UP] file1"
- dotest rcslib-merge-9 "${testcvs} -q status" \
- "===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: patch1 (branch: 1\.1\.2)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest rcslib-merge-10 "cat file1" \
- '$''Revision: 1\.1 $
- 2
- 3'
- sed -e 's/3/three/' file1 > f; mv f file1
- dotest rcslib-merge-11 "${testcvs} -q commit -m '' file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest rcslib-merge-12 "${testcvs} -q update -kv -j1.2" \
- "U file1
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into file1
- rcsmerge: warning: conflicts during merge"
- dotest rcslib-merge-13 "cat file1" \
- "<<<<<<< file1
- 1\.1\.2\.1
- 2
- three
- [=]======
- 1\.2
- two
- 3
- [>]>>>>>> 1\.2"
- # Test behavior of symlinks in the repository.
- if test -n "$remotehost"; then
- # Create the link on the remote system. This is because Cygwin's
- # Windows support creates *.lnk files for Windows. When creating
- # these in an SMB share from UNIX, these links won't work from the
- # UNIX side.
- dotest rcslib-symlink-1remotehost "${CVS_RSH} $remotehost 'ln -s file1,v ${CVSROOT_DIRNAME}/first-dir/file2,v'"
- else
- dotest rcslib-symlink-1 "ln -s file1,v ${CVSROOT_DIRNAME}/first-dir/file2,v"
- fi
- dotest rcslib-symlink-2 "${testcvs} update file2" "U file2"
- echo "This is a change" >> file2
- dotest rcslib-symlink-3 "${testcvs} ci -m because file2" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file2
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done"
- # Switch as for rcslib-symlink-1
- if test -n "$remotehost"; then
- dotest rcslib-symlink-4 "$CVS_RSH $remotehost 'ls -l $CVSROOT_DIRNAME/first-dir/file2,v'" \
- ".*$CVSROOT_DIRNAME/first-dir/file2,v -> file1,v"
- else
- dotest rcslib-symlink-4 "ls -l $CVSROOT_DIRNAME/first-dir/file2,v" \
- ".*$CVSROOT_DIRNAME/first-dir/file2,v -> file1,v"
- fi
- # CVS was failing to check both the symlink and the file
- # for timestamp changes for a while. Test that.
- rm file1
- dotest rcslib-symlink-3a "${testcvs} -q up file1" \
- "${PROG} update: warning: file1 was lost
- U file1"
- echo "This is a change" >> file1
- dotest rcslib-symlink-3b "${testcvs} ci -m because file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.[0-9]*; previous revision: 1\.1\.2\.[0-9]*
- done"
- dotest rcslib-symlink-3c "${testcvs} update file2" "[UP] file2"
- echo some new text >file3
- dotest rcslib-symlink-3d "${testcvs} -Q add file3" ''
- dotest rcslib-symlink-3e "${testcvs} -Q ci -mtest file3" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v <-- file3
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- rm -f ${CVSROOT_DIRNAME}/first-dir/file2,v
- # As for rcslib-symlink-1
- if test -n "$remotehost"; then
- dotest rcslib-symlink-3f "$CVS_RSH $remotehost 'ln -s Attic/file3,v ${CVSROOT_DIRNAME}/first-dir/file2,v'"
- else
- dotest rcslib-symlink-3f "ln -s Attic/file3,v ${CVSROOT_DIRNAME}/first-dir/file2,v"
- fi
- dotest rcslib-symlink-3g "${testcvs} update file2" "U file2"
- # restore the link to file1 for the following tests
- dotest rcslib-symlink-3i "${testcvs} -Q rm -f file3" ''
- dotest rcslib-symlink-3j "${testcvs} -Q ci -mwhatever file3" \
- "Removing file3;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v <-- file3
- new revision: delete; previous revision: 1\.1\.2\.1
- done"
- rm -f ${CVSROOT_DIRNAME}/first-dir/file2,v
- rm -f ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- # As for rcslib-symlink-1
- if test -n "$remotehost"; then
- dotest rcslib-symlink-3h "$CVS_RSH $remotehost 'ln -s file1,v ${CVSROOT_DIRNAME}/first-dir/file2,v'"
- else
- dotest rcslib-symlink-3h "ln -s file1,v ${CVSROOT_DIRNAME}/first-dir/file2,v"
- fi
- # Test 5 reveals a problem with having symlinks in the
- # repository. CVS will try to tag both of the files
- # separately. After processing one, it will do the same
- # operation to the other, which is actually the same file,
- # so the tag will already be there. FIXME: do we bother
- # changing operations to notice cases like this? This
- # strikes me as a difficult problem. -Noel
- dotest rcslib-symlink-5 "${testcvs} tag the_tag" \
- "${PROG} tag: Tagging .
- T file1
- W file2 : the_tag already exists on version 1.1.2.3 : NOT MOVING tag to version 1.1.2.1"
- # As for rcslib-symlink-1
- if test -n "$remotehost"; then
- dotest rcslib-symlink-6 "$CVS_RSH $remotehost 'ls -l $CVSROOT_DIRNAME/first-dir/file2,v'" \
- ".*$CVSROOT_DIRNAME/first-dir/file2,v -> file1,v"
- else
- dotest rcslib-symlink-6 "ls -l $CVSROOT_DIRNAME/first-dir/file2,v" \
- ".*$CVSROOT_DIRNAME/first-dir/file2,v -> file1,v"
- fi
- # Symlinks tend to interact poorly with the Attic.
- cd ..
- mkdir 2; cd 2
- dotest rcslib-symlink-7 "${testcvs} -q co first-dir" \
- "U first-dir/file1
- U first-dir/file2"
- cd first-dir
- dotest rcslib-symlink-8 "${testcvs} rm -f file2" \
- "${PROG} remove: scheduling .file2. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest rcslib-symlink-9 "${testcvs} -q ci -m rm-it" \
- "Removing file2;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file2
- new revision: delete; previous revision: 1\.2
- done"
- # OK, why this message happens twice is relatively clear
- # (the check_* and rtag_* calls to start_recursion).
- # Why it happens a third time I didn't try to find out.
- dotest rcslib-symlink-10 \
- "${testcvs} -q rtag -b -r the_tag brtag first-dir" \
- "${PROG} rtag: could not read RCS file for file2
- ${PROG} rtag: could not read RCS file for first-dir/file2
- ${PROG} rtag: could not read RCS file for first-dir/file2"
- # Restore file1 for the next test.
- dotest rcslib-long-symlink-init-1 "$testcvs -Q up -A"
- dotest rcslib-long-symlink-init-2 "$testcvs -Q add file1"
- dotest rcslib-long-symlink-init-3 "$testcvs -Q ci -mback" \
- "Checking in file1;
- $CVSROOT_DIRNAME/first-dir/file1,v <-- file1
- new revision: 1\.4; previous revision: 1\.3
- done"
- cd ../.. # $TESTDIR
- # CVS has a hard-coded default link path size of 127 characters.
- # Make sure it knows how to exceed that.
- longpath=$CVSROOT_DIRNAME
- count=0
- while test $count -lt 10; do
- count=`expr $count + 1`
- longpath=$longpath/123456789012345678901234567890
- mkdir $longpath
- done
- cp $CVSROOT_DIRNAME/first-dir/file1,v $longpath
- mkdir $CVSROOT_DIRNAME/second-dir
- # Switch as for rcslib-symlink-1
- if test -n "$remotehost"; then
- dotest rcslib-long-symlink-1rh \
- "$CVS_RSH $remotehost 'ln -s $longpath/file1,v $CVSROOT_DIRNAME/second-dir/fileX,v'"
- else
- dotest rcslib-long-symlink-1 \
- "ln -s $longpath/file1,v $CVSROOT_DIRNAME/second-dir/fileX,v"
- fi
- dotest rcslib-long-symlink-2 "$testcvs co second-dir" \
- "$PROG checkout: Updating second-dir
- U second-dir/fileX"
- cd second-dir
- echo change-it >>fileX
- # Writes actually cause symlinks to be resolved.
- dotest rcslib-long-symlink-3 "$testcvs -q ci -mwrite-it" \
- "Checking in fileX;
- $CVSROOT_DIRNAME/123456789012345678901234567890/123456789012345678901234567890/123456789012345678901234567890/123456789012345678901234567890/123456789012345678901234567890/123456789012345678901234567890/123456789012345678901234567890/123456789012345678901234567890/123456789012345678901234567890/123456789012345678901234567890/file1,v <-- fileX
- new revision: 1\.5; previous revision: 1\.4
- done"
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ..
- # Must remove the symlink first. Samba doesn't appear to show
- # broken symlink across the SMB share, and rm -rf by itself
- # will remove file1,v first and leave file2,v a broken link and the
- # rm -rf will fail since it doesn't find file2,v and it still gets
- # directory not empty errors removing cvsroot/first-dir.
- #
- # I'm not sure why I need to do this on $remotehost. The rm above
- # rcslib-symlink-3j works fine, but the next one doesn't unless run
- # remotely under Cygwin and using a TESTDIR on a Samba share.
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost \
- "rm -f $CVSROOT_DIRNAME/first-dir/file2,v $CVSROOT_DIRNAME/second-dir/fileX,v"
- fi
- rm -rf $CVSROOT_DIRNAME/first-dir $CVSROOT_DIRNAME/second-dir \
- $CVSROOT_DIRNAME/123456789012345678901234567890
- rm -r first-dir second-dir 2
- ;;
- multibranch)
- # Test the ability to have several branchpoints coming off the
- # same revision.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest multibranch-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- echo 1:trunk-1 >file1
- dotest multibranch-2 "${testcvs} add file1" \
- "${PROG}"' add: scheduling file `file1'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest_lit multibranch-3 "${testcvs} -q ci -m add-it" <<HERE
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1.1
- done
- HERE
- dotest multibranch-4 "${testcvs} tag -b br1" \
- "${PROG} tag: Tagging \.
- T file1"
- dotest multibranch-5 "${testcvs} tag -b br2" \
- "${PROG} tag: Tagging \.
- T file1"
- dotest multibranch-6 "$testcvs -q update -r br1" '[UP] file1'
- echo on-br1 >file1
- dotest multibranch-7 "${testcvs} -q ci -m modify-on-br1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest multibranch-8 "${testcvs} -q update -r br2" '[UP] file1'
- echo br2 adds a line >>file1
- dotest multibranch-9 "${testcvs} -q ci -m modify-on-br2" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.4\.1; previous revision: 1\.1
- done"
- dotest multibranch-10 "${testcvs} -q update -r br1" '[UP] file1'
- dotest multibranch-11 "cat file1" 'on-br1'
- dotest multibranch-12 "${testcvs} -q update -r br2" '[UP] file1'
- dotest multibranch-13 "cat file1" '1:trunk-1
- br2 adds a line'
- dotest multibranch-14 "${testcvs} log file1" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- br2: 1\.1\.0\.4
- br1: 1\.1\.0\.2
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.2; 1\.1\.4;
- add-it
- ----------------------------
- revision 1\.1\.4\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- modify-on-br2
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -1
- modify-on-br1
- ============================================================================="
- cd ..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -r first-dir
- ;;
- import) # test death after import
- # Tests of "cvs import":
- # basic2
- # rdiff -- imports with keywords
- # import -- more tests of imports with keywords
- # importb -- -b option.
- # importc -- bunch o' files in bunch o' directories
- # modules3
- # mflag -- various -m messages
- # ignore -- import and cvsignore
- # binwrap -- import and -k wrappers
- # info -- imports which are rejected by verifymsg
- # head -- intended to test vendor branches and HEAD,
- # although it doesn't really do it yet.
- # import-CVS -- refuse to import directories named "CVS".
- # import-quirks -- short tests of import quirks.
- # import
- mkdir import-dir ; cd import-dir
- for i in 1 2 3 4 ; do
- echo imported file"$i" > imported-f"$i"
- done
- # This directory should be on the default ignore list,
- # so it shouldn't get imported.
- mkdir RCS
- echo ignore.me >RCS/ignore.me
- echo 'import should not expand $''Id$' >>imported-f2
- cp imported-f2 ../imported-f2-orig.tmp
- dotest_sort import-96 \
- "${testcvs} import -m first-import first-dir vendor-branch junk-1_0" \
- "
- I first-dir/RCS
- N first-dir/imported-f1
- N first-dir/imported-f2
- N first-dir/imported-f3
- N first-dir/imported-f4
- No conflicts created by this import"
- dotest import-96.5 "cmp ../imported-f2-orig.tmp imported-f2" ''
- cd ..
- # co
- dotest import-97 "${testcvs} -q co first-dir" \
- "U first-dir/imported-f1
- U first-dir/imported-f2
- U first-dir/imported-f3
- U first-dir/imported-f4"
- cd first-dir
- for i in 1 2 3 4 ; do
- dotest import-98-$i "test -f imported-f$i" ''
- done
- dotest_fail import-98.5 "test -d RCS" ''
- # remove
- rm imported-f1
- dotest import-99 "${testcvs} rm imported-f1" \
- "${PROG}"' remove: scheduling `imported-f1'\'' for removal
- '"${PROG}"' remove: use .'"${PROG}"' commit. to remove this file permanently'
- # change
- echo local-change >> imported-f2
- # commit
- dotest import-100 "${testcvs} ci -m local-changes" \
- "${PROG} [a-z]*: Examining .
- Removing imported-f1;
- ${CVSROOT_DIRNAME}/first-dir/imported-f1,v <-- imported-f1
- new revision: delete; previous revision: 1\.1\.1\.1
- done
- Checking in imported-f2;
- ${CVSROOT_DIRNAME}/first-dir/imported-f2,v <-- imported-f2
- new revision: 1\.2; previous revision: 1\.1
- done"
- # log
- dotest import-101 "${testcvs} log imported-f1" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/imported-f1,v
- Working file: imported-f1
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- junk-1_0: 1\.1\.1\.1
- vendor-branch: 1\.1\.1
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: dead; lines: ${PLUS}0 -0
- local-changes
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.1;
- Initial revision
- ----------------------------
- revision 1\.1\.1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}0 -0
- first-import
- ============================================================================="
- # update into the vendor branch.
- dotest import-102 "$testcvs update -rvendor-branch" \
- "$PROG update: Updating .
- U imported-f1
- [UP] imported-f2
- [UP] imported-f3
- [UP] imported-f4"
- # remove file4 on the vendor branch
- rm imported-f4
- dotest import-103 "${testcvs} rm imported-f4" \
- "${PROG}"' remove: scheduling `imported-f4'\'' for removal
- '"${PROG}"' remove: use .'"${PROG}"' commit. to remove this file permanently'
- # commit
- dotest import-104 \
- "${testcvs} ci -m vendor-removed imported-f4" \
- "Removing imported-f4;
- ${CVSROOT_DIRNAME}/first-dir/imported-f4,v <-- imported-f4
- new revision: delete; previous revision: 1\.1\.1\.1
- done"
- # update to main line
- dotest import-105 "$testcvs -q update -A" \
- "$PROG update: imported-f1 is no longer in the repository
- [UP] imported-f2
- [UP] imported-f3"
- # second import - file4 deliberately unchanged
- cd ../import-dir
- for i in 1 2 3 ; do
- echo rev 2 of file $i >> imported-f"$i"
- done
- cp imported-f2 ../imported-f2-orig.tmp
- dotest_sort import-106 \
- "${testcvs} import -m second-import first-dir vendor-branch junk-2_0" \
- "
- ${PROG} checkout -j<prev_rel_tag> -jjunk-2_0 first-dir
- 2 conflicts created by this import.
- C first-dir/imported-f1
- C first-dir/imported-f2
- I first-dir/RCS
- U first-dir/imported-f3
- U first-dir/imported-f4
- Use the following command to help the merge:"
- dotest import-106.5 "cmp ../imported-f2-orig.tmp imported-f2" \
- ''
- cd ..
- rm imported-f2-orig.tmp
- # co
- dotest import-107 "${testcvs} co first-dir" \
- "${PROG} checkout: Updating first-dir
- [UP] first-dir/imported-f3
- [UP] first-dir/imported-f4"
- cd first-dir
- dotest_fail import-108 "test -f imported-f1" ''
- for i in 2 3 ; do
- dotest import-109-$i "test -f imported-f$i" ''
- done
- # check vendor branch for file4
- dotest import-110 "$testcvs -q update -rvendor-branch" \
- 'U imported-f1
- [UP] imported-f2
- [UP] imported-f3
- [UP] imported-f4'
- dotest import-111 "test -f imported-f4" ''
- # update to main line
- dotest import-112 "$testcvs -q update -A" \
- "$PROG update: imported-f1 is no longer in the repository
- [UP] imported-f2
- [UP] imported-f3
- [UP] imported-f4"
- cd ..
- dotest import-113 \
- "${testcvs} -q co -jjunk-1_0 -jjunk-2_0 first-dir" \
- "${PROG} checkout: file first-dir/imported-f1 does not exist, but is present in revision junk-2_0
- RCS file: ${CVSROOT_DIRNAME}/first-dir/imported-f2,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.2
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.2 into imported-f2
- rcsmerge: warning: conflicts during merge
- first-dir/imported-f3 already contains the differences between 1\.1\.1\.1 and 1\.1\.1\.2
- first-dir/imported-f4 already contains the differences between 1\.1\.1\.1 and 1\.1\.1\.3"
- cd first-dir
- dotest_fail import-114 "test -f imported-f1" ''
- for i in 2 3 ; do
- dotest import-115-$i "test -f imported-f$i" ''
- done
- dotest import-116 'cat imported-f2' \
- 'imported file2
- [<]<<<<<< imported-f2
- import should not expand \$''Id: imported-f2,v 1\.2 [0-9/]* [0-9:]* '"${username}"' Exp \$
- local-change
- [=]======
- import should not expand \$''Id: imported-f2,v 1\.1\.1\.2 [0-9/]* [0-9:]* '"${username}"' Exp \$
- rev 2 of file 2
- [>]>>>>>> 1\.1\.1\.2'
- cd ..
- rm -r first-dir
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -r import-dir
- ;;
- importb)
- # More cvs import tests, especially -b option.
- # OK, first we get some sources from the NetMunger project, and
- # import them into the 1.1.1 vendor branch.
- mkdir imp-dir
- cd imp-dir
- echo 'OpenMunger sources' >file1
- echo 'OpenMunger sources' >file2
- dotest_sort importb-1 \
- "${testcvs} import -m add first-dir openmunger openmunger-1_0" \
- "
- N first-dir/file1
- N first-dir/file2
- No conflicts created by this import"
- cd ..
- rm -r imp-dir
- # Now we put the sources we get from FreeMunger into 1.1.3
- mkdir imp-dir
- cd imp-dir
- echo 'FreeMunger sources' >file1
- echo 'FreeMunger sources' >file2
- # Not completely sure how the conflict detection is supposed to
- # be working here (haven't really thought about it).
- # We use an explicit -d option to test that it is reflected
- # in the suggested checkout.
- dotest_sort importb-2 \
- "${testcvs} -d ${CVSROOT} import -m add -b 1.1.3 first-dir freemunger freemunger-1_0" \
- "
- ${PROG} -d ${CVSROOT} checkout -j<prev_rel_tag> -jfreemunger-1_0 first-dir
- 2 conflicts created by this import.
- C first-dir/file1
- C first-dir/file2
- Use the following command to help the merge:"
- cd ..
- rm -r imp-dir
- # Now a test of main branch import (into second-dir, not first-dir).
- mkdir imp-dir
- cd imp-dir
- echo 'my own stuff' >mine1.c
- echo 'my own stuff' >mine2.c
- dotest_fail importb-3 \
- "${testcvs} import -m add -b 1 second-dir dummy really_dumb_y" \
- "$PROG \[import aborted\]: Only numeric branch specifications with two dots are
- supported by import, not \`1'\. For example: \`1\.1\.1'\."
- : when we implement main-branch import, should be \
- "N second-dir/mine1\.c
- N second-dir/mine2\.c
- No conflicts created by this import"
- cd ..
- rm -r imp-dir
- mkdir 1
- cd 1
- # when we implement main branch import, will want to
- # add "second-dir" here.
- dotest importb-4 "${testcvs} -q co first-dir" \
- "U first-dir/file1
- U first-dir/file2"
- cd first-dir
- dotest importb-5 "${testcvs} -q log file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch: 1\.1\.1
- locks: strict
- access list:
- symbolic names:
- freemunger-1_0: 1\.1\.3\.1
- freemunger: 1\.1\.3
- openmunger-1_0: 1\.1\.1\.1
- openmunger: 1\.1\.1
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.1; 1\.1\.3;
- Initial revision
- ----------------------------
- revision 1\.1\.3\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -1
- add
- ----------------------------
- revision 1\.1\.1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}0 -0
- add
- ============================================================================="
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir ${CVSROOT_DIRNAME}/second-dir
- ;;
- importc)
- # Test importing a bunch o' files in a bunch o' directories.
- # Also the -d option.
- mkdir 1; cd 1
- mkdir adir bdir cdir
- mkdir adir/sub1 adir/sub2
- mkdir adir/sub1/ssdir
- mkdir bdir/subdir
- touch adir/sub1/file1 adir/sub2/file2 adir/sub1/ssdir/ssfile
- touch -t 197107040343 bdir/subdir/file1
- touch -t 203412251801 cdir/cfile
- dotest_sort importc-1 \
- "${testcvs} import -d -m import-it first-dir vendor release" \
- "
- N first-dir/adir/sub1/file1
- N first-dir/adir/sub1/ssdir/ssfile
- N first-dir/adir/sub2/file2
- N first-dir/bdir/subdir/file1
- N first-dir/cdir/cfile
- No conflicts created by this import
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/first-dir/adir
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/first-dir/adir/sub1
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/first-dir/adir/sub1/ssdir
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/first-dir/adir/sub2
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/first-dir/bdir
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/first-dir/bdir/subdir
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/first-dir/cdir"
- cd ..
- mkdir 2; cd 2
- dotest importc-2 "${testcvs} -q co first-dir" \
- "U first-dir/adir/sub1/file1
- U first-dir/adir/sub1/ssdir/ssfile
- U first-dir/adir/sub2/file2
- U first-dir/bdir/subdir/file1
- U first-dir/cdir/cfile"
- cd first-dir
- dotest importc-3 "${testcvs} update adir/sub1" \
- "${PROG} update: Updating adir/sub1
- ${PROG} update: Updating adir/sub1/ssdir"
- dotest importc-4 "${testcvs} update adir/sub1 bdir/subdir" \
- "${PROG} update: Updating adir/sub1
- ${PROG} update: Updating adir/sub1/ssdir
- ${PROG} update: Updating bdir/subdir"
- echo modify >>cdir/cfile
- dotest importc-5 \
- "${testcvs} -q rtag -b -r release wip_test first-dir" ""
- dotest importc-6 "$testcvs -q update -r wip_test" \
- 'U adir/sub1/file1
- U adir/sub1/ssdir/ssfile
- U adir/sub2/file2
- U bdir/subdir/file1
- M cdir/cfile'
- # This used to fail in local mode
- dotest importc-7 "${testcvs} -q ci -m modify -r wip_test" \
- "Checking in cdir/cfile;
- ${CVSROOT_DIRNAME}/first-dir/cdir/cfile,v <-- cfile
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done"
- # TODO: should also be testing "import -d" when we update
- # an existing file.
- dotest importc-8 "${testcvs} -q log cdir/cfile" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/cdir/cfile,v
- Working file: cdir/cfile
- head: 1\.1
- branch: 1\.1\.1
- locks: strict
- access list:
- symbolic names:
- wip_test: 1\.1\.1\.1\.0\.2
- release: 1\.1\.1\.1
- vendor: 1\.1\.1
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- ----------------------------
- revision 1\.1
- date: 2034/12/2[4-6] [0-9][0-9]:01:[0-9][0-9]; author: ${username}; state: Exp;
- branches: 1\.1\.1;
- Initial revision
- ----------------------------
- revision 1\.1\.1\.1
- date: 2034/12/2[4-6] [0-9][0-9]:01:[0-9][0-9]; author: ${username}; state: Exp; lines: ${PLUS}0 -0
- branches: 1\.1\.1\.1\.2;
- import-it
- ----------------------------
- revision 1\.1\.1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- modify
- ============================================================================="
- dotest importc-9 "${testcvs} -q log bdir/subdir/file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/bdir/subdir/file1,v
- Working file: bdir/subdir/file1
- head: 1\.1
- branch: 1\.1\.1
- locks: strict
- access list:
- symbolic names:
- wip_test: 1\.1\.1\.1\.0\.2
- release: 1\.1\.1\.1
- vendor: 1\.1\.1
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.1
- date: 1971/07/0[3-5] [0-9][0-9]:43:[0-9][0-9]; author: ${username}; state: Exp;
- branches: 1\.1\.1;
- Initial revision
- ----------------------------
- revision 1\.1\.1\.1
- date: 1971/07/0[3-5] [0-9][0-9]:43:[0-9][0-9]; author: ${username}; state: Exp; lines: ${PLUS}0 -0
- import-it
- ============================================================================="
- cd ..
- # Now tests of absolute pathnames and .. as repository directory.
- cd ../1
- dotest_fail importc-10 \
- "${testcvs} import -m imp ../other vendor release2" \
- "${PROG} \[[a-z]* aborted\]: directory \.\./other not relative within the repository"
- dotest_fail importc-11 \
- "${testcvs} import -m imp ${TESTDIR}/other vendor release3" \
- "${PROG} \[[a-z]* aborted\]: directory ${TESTDIR}/other not relative within the repository"
- dotest_fail importc-12 "test -d ${TESTDIR}/other" ""
- cd ..
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- import-CVS)
- mkdir import-CVS
- cd import-CVS
- touch file1 file2 file3
- dotest_fail import-CVS-1 "$testcvs import -mimport CVS vtag rtag" \
- "$PROG import: The word \`CVS' is reserved by CVS and may not be used
- $PROG \[import aborted\]: as a directory in a path or as a file name\."
- dotest_fail import-CVS-1b \
- "$testcvs import -mimport CVS-/CVS vtag rtag" \
- "$PROG import: The word \`CVS' is reserved by CVS and may not be used
- $PROG \[import aborted\]: as a directory in a path or as a file name\."
- mkdir sdir
- mkdir sdir/CVS
- touch CVS sdir/CVS/file4 sdir/CVS/file5 sdir/file6 sdir/file7
- # Calling the imported directory import-CVS is dual purpose in the
- # following test. It makes sure the path test which matched above
- # wasn't too strict.
- dotest_sort import-CVS-2 \
- "$testcvs import -I! -mimport import-CVS vtag rtag" \
- "
- I import-CVS/CVS
- I import-CVS/sdir/CVS
- N import-CVS/file1
- N import-CVS/file2
- N import-CVS/file3
- N import-CVS/sdir/file6
- N import-CVS/sdir/file7
- No conflicts created by this import
- $PROG import: Importing $CVSROOT_DIRNAME/import-CVS/sdir"
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ..
- rm -r import-CVS
- rm -rf $CVSROOT_DIRNAME/import-CVS
- ;;
- import-quirks)
- # Short tests of quirky import behavior.
- #
- # For a list of other import tests with short descriptions, see the
- # comment header of the "import" test.
- mkdir import-quirks
- cd import-quirks
- touch file1 file2 file3
- # CVS prior to 1.11.18 and 1.12.10 used to happily import to
- # "branch 1.1", creating RCS archives with revisions like,
- # "1.1..1". That double-dot is *not* a typo.
- dotest_fail import-quirks-1 \
- "$testcvs import -b1.1. -mbad-bad-bad import-quirks VB RT" \
- "$PROG \[import aborted\]: Only numeric branch specifications with two dots are
- supported by import, not \`1\.1\.'\. For example: \`1\.1\.1'\."
- dotest_fail import-quirks-2 \
- "$testcvs import -b1.1.1.. -mbad-bad-bad import-quirks VB RT" \
- "$PROG \[import aborted\]: Only numeric branch specifications with two dots are
- supported by import, not \`1\.1\.1\.\.'\. For example: \`1\.1\.1'\."
- # Try a few odd numbers. This is hardly comprehensive.
- dotest_sort import-quirks-2 \
- "$testcvs import -b10.10.101 -mthis-ones-ok import-quirks-2 VB RT" \
- "
- N import-quirks-2/file1
- N import-quirks-2/file2
- N import-quirks-2/file3
- No conflicts created by this import"
- dotest_sort import-quirks-3 \
- "$testcvs import -b2345678901.2345678901.2345678901 -mthis-ones-ok import-quirks-3 VB RT" \
- "
- N import-quirks-3/file1
- N import-quirks-3/file2
- N import-quirks-3/file3
- No conflicts created by this import"
- dotest_sort import-quirks-4 \
- "$testcvs import -b1.1.2 -mthis-ones-ok import-quirks-4 VB RT" \
- "
- N import-quirks-4/file1
- N import-quirks-4/file2
- N import-quirks-4/file3
- No conflicts created by this import"
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ..
- rm -r import-quirks
- rm -rf $CVSROOT_DIRNAME/import-quirks-2 \
- $CVSROOT_DIRNAME/import-quirks-3 \
- $CVSROOT_DIRNAME/import-quirks-4
- ;;
- import-after-initial)
- # Properly handle the case in which the first version of a
- # file is created by a regular cvs add and commit, and there
- # is a subsequent cvs import of the same file. cvs update with
- # a date tag must resort to searching the vendor branch only if
- # the initial version of the file was created at the same time
- # as the initial version on the vendor branch.
- mkdir 1; cd 1
- module=x
- echo > unused-file
- # Create the module.
- dotest import-after-initial-1 \
- "$testcvs -Q import -m. $module X Y" ''
- file=m
- # Check it out and add a file.
- dotest import-after-initial-2 "$testcvs -Q co $module" ''
- cd $module
- echo original > $file
- dotest import-after-initial-3 "${testcvs} -Q add $file" ""
- dotest import-after-initial-4 "${testcvs} -Q ci -m. $file" \
- "RCS file: ${CVSROOT_DIRNAME}/$module/$file,v
- done
- Checking in $file;
- ${CVSROOT_DIRNAME}/$module/$file,v <-- $file
- initial revision: 1\.1
- done"
- # Delay a little so the following import isn't done in the same
- # second as the preceding commit.
- sleep 2
- # Do the first import of $file *after* $file already has an
- # initial version.
- mkdir sub
- cd sub
- echo newer-via-import > $file
- dotest import-after-initial-5 \
- "$testcvs -Q import -m. $module X Y2" ''
- cd ..
- # Sleep a second so we're sure to be after the second of the import.
- sleep 1
- dotest import-after-initial-6 \
- "$testcvs -Q update -p -D now $file" 'original'
- cd ../..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/$module
- ;;
- branch-after-import)
- # Test branching after an import via both cvs tag -b and
- # cvs add to verify that the HEAD remains at 1.1.1.1
- # This was a FreeBSD bug documented at the URL:
- # http://www.freebsd.org/cgi/query-pr.cgi?pr=4033
- mkdir branch-after-import
- cd branch-after-import
- # OK, first we get some sources from the NetMunger project,
- # and import them into the 1.1.1 vendor branch.
- mkdir imp-dir
- cd imp-dir
- echo 'OpenMunger sources' >file1
- echo 'OpenMunger sources' >file2
- dotest_sort branch-after-import-1 \
- "${testcvs} import -m add first-dir openmunger openmunger-1_0" \
- '
- N first-dir/file1
- N first-dir/file2
- No conflicts created by this import'
- cd ..
- # Next checkout the new module
- dotest branch-after-import-2 \
- "${testcvs} -q co first-dir" \
- 'U first-dir/file1
- U first-dir/file2'
- cd first-dir
- # Branch tag the file1 and cvs add file2,
- # the branch should remain the same in both cases
- # such that a new import will not require a conflict
- # resolution.
- dotest branch-after-import-3 \
- "${testcvs} tag -b TESTTOTRON file1" \
- 'T file1'
- dotest branch-after-import-4 \
- "$testcvs -q update -r TESTTOTRON" \
- "[UP] file1
- $PROG update: file2 is no longer in the repository"
- cp ../imp-dir/file2 .
- dotest branch-after-import-5 \
- "${testcvs} add file2" \
- "${PROG} add: scheduling file .file2. for addition on branch .TESTTOTRON.
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest branch-after-import-6 \
- "${testcvs} commit -m cvs-add file2" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.1\.1\.1\.2\.2; previous revision: 1\.1\.1\.1\.2\.1
- done"
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -r branch-after-import
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- join)
- # Test doing joins which involve adding and removing files.
- # Variety of scenarios (see list below), in the context of:
- # * merge changes from T1 to T2 into the main line
- # * merge changes from branch 'branch' into the main line
- # * merge changes from branch 'branch' into branch 'br2'.
- # See also binfile2, which does similar things with binary files.
- # See also join2, which tests joining (and update -A) on only
- # a single file, rather than a directory.
- # See also rmadd2, which tests -j cases not involving branches
- # (e.g. undoing a commit)
- # See also join3, which tests some cases involving the greatest
- # common ancestor. Here is a list of tests according to branch
- # topology:
- #
- # --->bp---->trunk too many to mention
- # \----->branch
- #
- # /----->branch1
- # --->bp---->trunk multibranch, multibranch2
- # \----->branch2
- #
- # --->bp1----->bp2---->trunk join3
- # \->br1 \->br2
- #
- # --->bp1----->trunk
- # \----bp2---->branch branches
- # \------>branch-of-branch
- # We check merging changes from T1 to T2 into the main line.
- # Here are the interesting cases I can think of:
- # 1) File added between T1 and T2, not on main line.
- # File should be marked for addition.
- # 2) File added between T1 and T2, also added on main line.
- # Conflict.
- # 3) File removed between T1 and T2, unchanged on main line.
- # File should be marked for removal.
- # 4) File removed between T1 and T2, modified on main line.
- # If mod checked in, file should be marked for removal.
- # If mod still in working directory, conflict.
- # 5) File removed between T1 and T2, was never on main line.
- # Nothing should happen.
- # 6) File removed between T1 and T2, also removed on main line.
- # Nothing should happen.
- # 7) File not added between T1 and T2, added on main line.
- # Nothing should happen.
- # 8) File not modified between T1 and T2, removed on main line.
- # Nothing should happen.
- # 9) File modified between T1 and T2, removed on main line.
- # Conflict.
- # 10) File was never on branch, removed on main line.
- # Nothing should happen.
- # We also check merging changes from a branch into the main
- # line. Here are the interesting cases:
- # 1) File added on branch, not on main line.
- # File should be marked for addition.
- # 2) File added on branch, also added on main line.
- # Conflict.
- # 3) File removed on branch, unchanged on main line.
- # File should be marked for removal.
- # 4) File removed on branch, modified on main line.
- # Conflict.
- # 5) File removed on branch, was never on main line.
- # Nothing should happen.
- # 6) File removed on branch, also removed on main line.
- # Nothing should happen.
- # 7) File added on main line, not added on branch.
- # Nothing should happen.
- # 8) File removed on main line, not modified on branch.
- # Nothing should happen.
- # 9) File modified on branch, removed on main line.
- # Conflict.
- # 10) File was never on branch, removed on main line.
- # Nothing should happen.
- # In the tests below, fileN represents case N in the above
- # lists.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1
- cd 1
- dotest join-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- # Add two files.
- echo 'first revision of file3' > file3
- echo 'first revision of file4' > file4
- echo 'first revision of file6' > file6
- echo 'first revision of file8' > file8
- echo 'first revision of file9' > file9
- dotest join-2 "${testcvs} add file3 file4 file6 file8 file9" \
- "${PROG}"' add: scheduling file `file3'\'' for addition
- '"${PROG}"' add: scheduling file `file4'\'' for addition
- '"${PROG}"' add: scheduling file `file6'\'' for addition
- '"${PROG}"' add: scheduling file `file8'\'' for addition
- '"${PROG}"' add: scheduling file `file9'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add these files permanently'
- dotest join-3 "${testcvs} -q commit -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file4,v
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file6,v
- done
- Checking in file6;
- ${CVSROOT_DIRNAME}/first-dir/file6,v <-- file6
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file8,v
- done
- Checking in file8;
- ${CVSROOT_DIRNAME}/first-dir/file8,v <-- file8
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file9,v
- done
- Checking in file9;
- ${CVSROOT_DIRNAME}/first-dir/file9,v <-- file9
- initial revision: 1\.1
- done"
- # Make a branch.
- dotest join-4 "${testcvs} -q tag -b branch ." \
- 'T file3
- T file4
- T file6
- T file8
- T file9'
- # Add file2, file7, and file10, modify file4, and remove
- # file6, file8, and file9.
- echo 'first revision of file2' > file2
- echo 'second revision of file4' > file4
- echo 'first revision of file7' > file7
- rm file6 file8 file9
- echo 'first revision of file10' > file10
- dotest join-5 "${testcvs} add file2 file7 file10" \
- "${PROG}"' add: scheduling file `file2'\'' for addition
- '"${PROG}"' add: scheduling file `file7'\'' for addition
- '"${PROG}"' add: scheduling file `file10'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add these files permanently'
- dotest join-6 "${testcvs} rm file6 file8 file9" \
- "${PROG}"' remove: scheduling `file6'\'' for removal
- '"${PROG}"' remove: scheduling `file8'\'' for removal
- '"${PROG}"' remove: scheduling `file9'\'' for removal
- '"${PROG}"' remove: use .'"${PROG}"' commit. to remove these files permanently'
- dotest join-7 "${testcvs} -q ci -mx ." \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file10,v
- done
- Checking in file10;
- ${CVSROOT_DIRNAME}/first-dir/file10,v <-- file10
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: 1\.2; previous revision: 1\.1
- done
- Removing file6;
- ${CVSROOT_DIRNAME}/first-dir/file6,v <-- file6
- new revision: delete; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file7,v
- done
- Checking in file7;
- ${CVSROOT_DIRNAME}/first-dir/file7,v <-- file7
- initial revision: 1\.1
- done
- Removing file8;
- ${CVSROOT_DIRNAME}/first-dir/file8,v <-- file8
- new revision: delete; previous revision: 1\.1
- done
- Removing file9;
- ${CVSROOT_DIRNAME}/first-dir/file9,v <-- file9
- new revision: delete; previous revision: 1\.1
- done"
- # Remove file10
- dotest join-7a "${testcvs} rm -f file10" \
- "${PROG}"' remove: scheduling `file10'\'' for removal
- '"${PROG}"' remove: use .'"${PROG}"' commit. to remove this file permanently'
- dotest join-7b "${testcvs} -q ci -mx ." \
- "Removing file10;
- ${CVSROOT_DIRNAME}/first-dir/file10,v <-- file10
- new revision: delete; previous revision: 1\.1
- done"
- # Check out the branch.
- cd ../..
- mkdir 2
- cd 2
- dotest join-8 "${testcvs} -q co -r branch first-dir" \
- 'U first-dir/file3
- U first-dir/file4
- U first-dir/file6
- U first-dir/file8
- U first-dir/file9'
- cd first-dir
- # Modify the files on the branch, so that T1 is not an
- # ancestor of the main line, and add file5
- echo 'first branch revision of file3' > file3
- echo 'first branch revision of file4' > file4
- echo 'first branch revision of file5' > file5
- echo 'first branch revision of file6' > file6
- echo 'first branch revision of file9' > file9
- dotest join-9 "${testcvs} add file5" \
- "${PROG}"' add: scheduling file `file5'\'' for addition on branch `branch'\''
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest join-10 "${testcvs} -q ci -mx ." \
- "Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file5,v
- done
- Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file5,v <-- file5
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file6;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file6,v <-- file6
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file9;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file9,v <-- file9
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- # Tag the current revisions on the branch.
- dotest join-11 "${testcvs} -q tag T1 ." \
- 'T file3
- T file4
- T file5
- T file6
- T file8
- T file9'
- # Add file1 and file2, modify file9, and remove the other files.
- echo 'first branch revision of file1' > file1
- echo 'first branch revision of file2' > file2
- echo 'second branch revision of file9' > file9
- rm file3 file4 file5 file6
- dotest join-12 "${testcvs} add file1 file2" \
- "${PROG}"' add: scheduling file `file1'\'' for addition on branch `branch'\''
- '"${PROG}"' add: scheduling file `file2'\'' for addition on branch `branch'\''
- '"${PROG}"' add: use .'"${PROG}"' commit. to add these files permanently'
- dotest join-13 "${testcvs} rm file3 file4 file5 file6" \
- "${PROG}"' remove: scheduling `file3'\'' for removal
- '"${PROG}"' remove: scheduling `file4'\'' for removal
- '"${PROG}"' remove: scheduling `file5'\'' for removal
- '"${PROG}"' remove: scheduling `file6'\'' for removal
- '"${PROG}"' remove: use .'"${PROG}"' commit. to remove these files permanently'
- dotest join-14 "${testcvs} -q ci -mx ." \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done
- Removing file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- new revision: delete; previous revision: 1\.1\.2\.1
- done
- Removing file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: delete; previous revision: 1\.1\.2\.1
- done
- Removing file5;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file5,v <-- file5
- new revision: delete; previous revision: 1\.1\.2\.1
- done
- Removing file6;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file6,v <-- file6
- new revision: delete; previous revision: 1\.1\.2\.1
- done
- Checking in file9;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file9,v <-- file9
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done"
- # Tag the current revisions on the branch.
- dotest join-15 "${testcvs} -q tag T2 ." \
- 'T file1
- T file2
- T file8
- T file9'
- # Do a checkout with a merge.
- cd ../..
- mkdir 3
- cd 3
- dotest join-16 "$testcvs -q co -jT1 -jT2 first-dir" \
- "U first-dir/file1
- U first-dir/file2
- $PROG checkout: file first-dir/file2 exists, but has been added in revision T2
- U first-dir/file3
- $PROG checkout: scheduling first-dir/file3 for removal
- U first-dir/file4
- $PROG checkout: file first-dir/file4 has been removed in revision T2, but the destination is incompatibly modified
- C first-dir/file4
- U first-dir/file7
- $PROG checkout: file first-dir/file9 does not exist, but is present in revision T2"
- # Verify that the right changes have been scheduled.
- cd first-dir
- dotest_fail join-17 "$testcvs -q update" \
- 'A file1
- R file3
- C file4'
- # Modify file4 locally, and do an update with a merge.
- cd ../../1/first-dir
- echo 'third revision of file4' > file4
- dotest join-18 "$testcvs -q update -jT1 -jT2 ." \
- "U file1
- $PROG update: file file2 exists, but has been added in revision T2
- $PROG update: scheduling file3 for removal
- M file4
- $PROG update: file file4 has been removed in revision T2, but the destination is incompatibly modified
- C file4
- $PROG update: file file9 does not exist, but is present in revision T2"
- # Verify that the right changes have been scheduled.
- dotest_fail join-19 "$testcvs -q update" \
- 'A file1
- R file3
- C file4'
- # Do a checkout with a merge from a single revision.
- # FIXME: CVS currently gets this wrong. file2 has been
- # added on both the branch and the main line, and so should
- # be regarded as a conflict. However, given the way that
- # CVS sets up the RCS file, there is no way to distinguish
- # this case from the case of file2 having existed before the
- # branch was made. This could be fixed by reserving
- # a revision somewhere, perhaps 1.1, as an always dead
- # revision which can be used as the source for files added
- # on branches.
- cd ../../3
- rm -r first-dir
- dotest join-20 "$testcvs -q co -jbranch first-dir" \
- "U first-dir/file1
- U first-dir/file2
- RCS file: $CVSROOT_DIRNAME/first-dir/file2,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.2
- Merging differences between 1\.1 and 1\.1\.2\.2 into file2
- U first-dir/file3
- $PROG checkout: scheduling first-dir/file3 for removal
- U first-dir/file4
- $PROG checkout: file first-dir/file4 has been removed in revision branch, but the destination is incompatibly modified
- C first-dir/file4
- U first-dir/file7
- $PROG checkout: file first-dir/file9 does not exist, but is present in revision branch"
- # Verify that the right changes have been scheduled.
- # The M file2 line is a bug; see above join-20.
- cd first-dir
- dotest_fail join-21 "$testcvs -q update" \
- 'A file1
- M file2
- R file3
- C file4'
- # Checkout the main line again.
- cd ../../1
- rm -r first-dir
- dotest join-22 "${testcvs} -q co first-dir" \
- 'U first-dir/file2
- U first-dir/file3
- U first-dir/file4
- U first-dir/file7'
- # Modify file4 locally, and do an update with a merge from a
- # single revision.
- # The file2 handling is a bug; see above join-20.
- cd first-dir
- echo 'third revision of file4' > file4
- dotest join-23 "$testcvs -q update -jbranch ." \
- "U file1
- RCS file: $CVSROOT_DIRNAME/first-dir/file2,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.2
- Merging differences between 1\.1 and 1\.1\.2\.2 into file2
- $PROG update: scheduling file3 for removal
- M file4
- $PROG update: file file4 has been removed in revision branch, but the destination is incompatibly modified
- C file4
- $PROG update: file file9 does not exist, but is present in revision branch"
- # Verify that the right changes have been scheduled.
- # The M file2 line is a bug; see above join-20
- dotest_fail join-24 "$testcvs -q update" \
- 'A file1
- M file2
- R file3
- C file4'
- cd ..
- # Checkout the main line again and make a new branch which we
- # merge to.
- rm -r first-dir
- dotest join-25 "${testcvs} -q co first-dir" \
- 'U first-dir/file2
- U first-dir/file3
- U first-dir/file4
- U first-dir/file7'
- cd first-dir
- dotest join-26 "${testcvs} -q tag -b br2" \
- "T file2
- T file3
- T file4
- T file7"
- dotest join-27 "$testcvs -q update -r br2" \
- '[UP] file2
- [UP] file3
- [UP] file4
- [UP] file7'
- # The handling of file8 and file9 here look fishy to me. I don't
- # see why it should be different from the case where we merge to
- # the trunk (e.g. join-23).
- dotest join-28 "$testcvs -q update -j branch" \
- "U file1
- RCS file: $CVSROOT_DIRNAME/first-dir/file2,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.2
- Merging differences between 1\.1 and 1\.1\.2\.2 into file2
- $PROG update: scheduling file3 for removal
- $PROG update: file file4 has been removed in revision branch, but the destination is incompatibly modified
- C file4
- U file8
- U file9"
- # Verify that the right changes have been scheduled.
- dotest_fail join-29 "$testcvs -q update" \
- "A file1
- M file2
- R file3
- C file4
- A file8
- A file9"
- # Checkout the mainline again to try updating and merging between two
- # branches in the same step
- # this seems a likely scenario - the user finishes up on branch and
- # updates to br2 and merges in the same step - and there was a bug
- # once that if the file was removed in the update then it wouldn't be
- # readded in the merge
- cd ..
- rm -rf first-dir
- dotest join-twobranch-1 "${testcvs} -q co -rbranch first-dir" \
- 'U first-dir/file1
- U first-dir/file2
- U first-dir/file8
- U first-dir/file9'
- cd first-dir
- dotest join-twobranch-2 "$testcvs -q update -rbr2 -jbranch" \
- "$PROG update: file1 is no longer in the repository
- U file1
- U file2
- RCS file: $CVSROOT_DIRNAME/first-dir/file2,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.2
- Merging differences between 1\.1 and 1\.1\.2\.2 into file2
- U file3
- $PROG update: scheduling file3 for removal
- U file4
- $PROG update: file file4 has been removed in revision branch, but the destination is incompatibly modified
- C file4
- U file7
- $PROG update: file8 is no longer in the repository
- U file8
- $PROG update: file9 is no longer in the repository
- U file9"
- # Verify that the right changes have been scheduled.
- dotest_fail join-twobranch-3 "$testcvs -q update" \
- "A file1
- M file2
- R file3
- C file4
- A file8
- A file9"
- # Checkout the mainline again to try merging from the trunk
- # to a branch.
- cd ..
- rm -r first-dir
- dotest join-30 "${testcvs} -q co first-dir" \
- 'U first-dir/file2
- U first-dir/file3
- U first-dir/file4
- U first-dir/file7'
- cd first-dir
- # Tag the current revisions on the trunk.
- dotest join-31 "${testcvs} -q tag T3 ." \
- 'T file2
- T file3
- T file4
- T file7'
- # Modify file7.
- echo 'second revision of file7' > file7
- dotest join-32 "${testcvs} -q ci -mx ." \
- "Checking in file7;
- ${CVSROOT_DIRNAME}/first-dir/file7,v <-- file7
- new revision: 1\.2; previous revision: 1\.1
- done"
- # And Tag again.
- dotest join-33 "${testcvs} -q tag T4 ." \
- 'T file2
- T file3
- T file4
- T file7'
- # Now update branch to T3.
- cd ../../2/first-dir
- dotest join-34 "${testcvs} -q up -jT3" \
- "${PROG} update: file file4 does not exist, but is present in revision T3
- U file7"
- # Verify that the right changes have been scheduled.
- dotest join-35 "${testcvs} -q update" \
- 'A file7'
- # Now update to T4.
- # This is probably a bug, although in this particular case it just
- # happens to do the right thing; see above join-20.
- dotest join-36 "${testcvs} -q up -j T3 -j T4" \
- "A file7
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file7,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into file7"
- # Verify that the right changes have been scheduled.
- dotest join-37 "${testcvs} -q update" \
- 'A file7'
- cd ../..
- rm -r 1 2 3
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- join2)
- # More joining tests.
- # First the usual setup; create a directory first-dir, a file
- # first-dir/file1, and a branch br1.
- mkdir 1; cd 1
- dotest join2-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest join2-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo 'initial contents of file1' >file1
- dotest join2-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest join2-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest join2-5 "${testcvs} -q tag -b br1" "T file1"
- dotest join2-6 "$testcvs -q update -r br1" '[UP] file1'
- echo 'modify on branch' >>file1
- touch bradd
- dotest join2-6a "${testcvs} add bradd" \
- "${PROG} add: scheduling file .bradd. for addition on branch .br1.
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest join2-7 "${testcvs} -q ci -m modify" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/bradd,v
- done
- Checking in bradd;
- ${CVSROOT_DIRNAME}/first-dir/Attic/bradd,v <-- bradd
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- # Here is the unusual/pathological part. We switch back to
- # the trunk *for file1 only*, not for the whole directory.
- dotest join2-8 "${testcvs} -q update -A file1" '[UP] file1'
- dotest join2-9 "${testcvs} -q status file1" \
- "===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest join2-10 "cat CVS/Tag" "Tbr1"
- dotest join2-11 "${testcvs} -q update -j br1 file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.1
- Merging differences between 1\.1 and 1\.1\.2\.1 into file1"
- dotest join2-12 "cat file1" "initial contents of file1
- modify on branch"
- # We should have no sticky tag on file1
- dotest join2-13 "${testcvs} -q status file1" \
- "===================================================================
- File: file1 Status: Locally Modified
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest join2-14 "cat CVS/Tag" "Tbr1"
- # And the checkin should go to the trunk
- dotest join2-15 "${testcvs} -q ci -m modify file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- # OK, the above is all well and good and has worked for some
- # time. Now try the case where the file had been added on
- # the branch.
- dotest join2-16 "${testcvs} -q update -r br1" "[UP] file1"
- # The workaround is to update the whole directory.
- # The non-circumvented version won't work. The reason is that
- # update removes the entry from CVS/Entries, so of course we get
- # the tag from CVS/Tag and not Entries. I suppose maybe
- # we could invent some new format in Entries which would handle
- # this, but doing so, and handling it properly throughout
- # CVS, would be a lot of work and I'm not sure this case justifies
- # it.
- dotest join2-17-circumvent "${testcvs} -q update -A" \
- "${PROG} update: bradd is no longer in the repository
- [UP] file1"
- : dotest join2-17 "${testcvs} -q update -A bradd" \
- "${PROG} update: warning: bradd is not (any longer) pertinent"
- dotest join2-18 "${testcvs} -q update -j br1 bradd" "U bradd"
- dotest join2-19 "${testcvs} -q status bradd" \
- "===================================================================
- File: bradd Status: Locally Added
- Working revision: New file!
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/Attic/bradd,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest join2-20 "${testcvs} -q ci -m modify bradd" \
- "Checking in bradd;
- ${CVSROOT_DIRNAME}/first-dir/bradd,v <-- bradd
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- join3)
- # See "join" for a list of other joining/branching tests.
- # First the usual setup; create a directory first-dir, a file
- # first-dir/file1, and a branch br1.
- mkdir 1; cd 1
- dotest join3-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest join3-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo 'initial contents of file1' >file1
- dotest join3-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest join3-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest join3-5 "${testcvs} -q tag -b br1" "T file1"
- dotest join3-6 "$testcvs -q update -r br1" '[UP] file1'
- echo 'br1:line1' >>file1
- dotest join3-7 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- # Now back to the trunk for:
- # another revision and another branch for file1.
- # add file2, which will exist on trunk and br2 but not br1.
- dotest join3-8 "${testcvs} -q update -A" "[UP] file1"
- echo 'trunk:line1' > file2
- dotest join3-8a "${testcvs} add file2" \
- "${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- echo 'trunk:line1' >>file1
- dotest join3-9 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- dotest join3-10 "${testcvs} -q tag -b br2" "T file1
- T file2"
- # Before we actually have any revision on br2, let's try a join
- dotest join3-11 "${testcvs} -q update -r br1" "[UP] file1
- ${PROG} update: file2 is no longer in the repository"
- dotest join3-12 "${testcvs} -q update -j br2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into file1
- rcsmerge: warning: conflicts during merge
- U file2"
- dotest join3-13 "cat file1" \
- "initial contents of file1
- [<]<<<<<< file1
- br1:line1
- [=]======
- trunk:line1
- [>]>>>>>> 1\.2"
- rm file1
- # OK, we'll try the same thing with a revision on br2.
- dotest join3-14 "${testcvs} -q update -r br2 file1" \
- "${PROG} update: warning: file1 was lost
- U file1" "U file1"
- echo 'br2:line1' >>file1
- dotest join3-15 "${testcvs} -q ci -m modify file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2\.2\.1; previous revision: 1\.2
- done"
- # OK, now we can join br2 to br1
- dotest join3-16 "${testcvs} -q update -r br1 file1" "[UP] file1"
- # It may seem odd, to merge a higher branch into a lower
- # branch, but in fact CVS defines the ancestor as 1.1
- # and so it merges both the 1.1->1.2 and 1.2->1.2.2.1 changes.
- # This seems like a reasonably plausible behavior.
- dotest join3-17 "${testcvs} -q update -j br2 file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.1
- retrieving revision 1\.2\.2\.1
- Merging differences between 1\.1 and 1\.2\.2\.1 into file1
- rcsmerge: warning: conflicts during merge"
- dotest join3-18 "cat file1" \
- "initial contents of file1
- [<]<<<<<< file1
- br1:line1
- [=]======
- trunk:line1
- br2:line1
- [>]>>>>>> 1\.2\.2\.1"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- join4)
- # Like join, but with local (uncommitted) modifications.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1
- cd 1
- dotest join4-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- # Add two files.
- echo 'first revision of file3' > file3
- echo 'first revision of file4' > file4
- echo 'first revision of file6' > file6
- echo 'first revision of file8' > file8
- echo 'first revision of file9' > file9
- dotest join4-2 "${testcvs} add file3 file4 file6 file8 file9" \
- "${PROG}"' add: scheduling file `file3'\'' for addition
- '"${PROG}"' add: scheduling file `file4'\'' for addition
- '"${PROG}"' add: scheduling file `file6'\'' for addition
- '"${PROG}"' add: scheduling file `file8'\'' for addition
- '"${PROG}"' add: scheduling file `file9'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add these files permanently'
- dotest join4-3 "${testcvs} -q commit -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file4,v
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file6,v
- done
- Checking in file6;
- ${CVSROOT_DIRNAME}/first-dir/file6,v <-- file6
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file8,v
- done
- Checking in file8;
- ${CVSROOT_DIRNAME}/first-dir/file8,v <-- file8
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file9,v
- done
- Checking in file9;
- ${CVSROOT_DIRNAME}/first-dir/file9,v <-- file9
- initial revision: 1\.1
- done"
- # Make a branch.
- dotest join4-4 "${testcvs} -q tag -b branch ." \
- 'T file3
- T file4
- T file6
- T file8
- T file9'
- # Add file10
- echo 'first revision of file10' > file10
- dotest join4-7a "${testcvs} add file10" \
- "${PROG}"' add: scheduling file `file10'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest join4-7b "${testcvs} -q ci -mx ." \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file10,v
- done
- Checking in file10;
- ${CVSROOT_DIRNAME}/first-dir/file10,v <-- file10
- initial revision: 1\.1
- done"
- # Add file2 and file7, modify file4, and remove
- # file6, file8, file9, and file10.
- echo 'first revision of file2' > file2
- echo 'second revision of file4' > file4
- echo 'first revision of file7' > file7
- rm file6 file8 file9 file10
- dotest join4-5 "${testcvs} add file2 file7" \
- "${PROG}"' add: scheduling file `file2'\'' for addition
- '"${PROG}"' add: scheduling file `file7'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add these files permanently'
- dotest join4-6 "${testcvs} rm file6 file8 file9 file10" \
- "${PROG}"' remove: scheduling `file6'\'' for removal
- '"${PROG}"' remove: scheduling `file8'\'' for removal
- '"${PROG}"' remove: scheduling `file9'\'' for removal
- '"${PROG}"' remove: scheduling `file10'\'' for removal
- '"${PROG}"' remove: use .'"${PROG}"' commit. to remove these files permanently'
- # Check out the branch.
- cd ../..
- mkdir 2
- cd 2
- dotest join4-8 "${testcvs} -q co -r branch first-dir" \
- 'U first-dir/file3
- U first-dir/file4
- U first-dir/file6
- U first-dir/file8
- U first-dir/file9'
- cd first-dir
- # Modify the files on the branch, so that T1 is not an
- # ancestor of the main line, and add file5
- echo 'first branch revision of file3' > file3
- echo 'first branch revision of file4' > file4
- echo 'first branch revision of file5' > file5
- echo 'first branch revision of file6' > file6
- echo 'first branch revision of file9' > file9
- dotest join4-9 "${testcvs} add file5" \
- "${PROG}"' add: scheduling file `file5'\'' for addition on branch `branch'\''
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest join4-10 "${testcvs} -q ci -mx ." \
- "Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file5,v
- done
- Checking in file5;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file5,v <-- file5
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file6;
- ${CVSROOT_DIRNAME}/first-dir/file6,v <-- file6
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in file9;
- ${CVSROOT_DIRNAME}/first-dir/file9,v <-- file9
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- # Tag the current revisions on the branch.
- dotest join4-11 "${testcvs} -q tag T1 ." \
- 'T file3
- T file4
- T file5
- T file6
- T file8
- T file9'
- # Add file1 and file2, modify file9, and remove the other files.
- echo 'first branch revision of file1' > file1
- echo 'first branch revision of file2' > file2
- echo 'second branch revision of file9' > file9
- rm file3 file4 file5 file6
- dotest join4-12 "${testcvs} add file1 file2" \
- "${PROG}"' add: scheduling file `file1'\'' for addition on branch `branch'\''
- '"${PROG}"' add: scheduling file `file2'\'' for addition on branch `branch'\''
- '"${PROG}"' add: use .'"${PROG}"' commit. to add these files permanently'
- dotest join4-13 "${testcvs} rm file3 file4 file5 file6" \
- "${PROG}"' remove: scheduling `file3'\'' for removal
- '"${PROG}"' remove: scheduling `file4'\'' for removal
- '"${PROG}"' remove: scheduling `file5'\'' for removal
- '"${PROG}"' remove: scheduling `file6'\'' for removal
- '"${PROG}"' remove: use .'"${PROG}"' commit. to remove these files permanently'
- dotest join4-14 "${testcvs} -q ci -mx ." \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file2,v <-- file2
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Removing file3;
- ${CVSROOT_DIRNAME}/first-dir/file3,v <-- file3
- new revision: delete; previous revision: 1\.1\.2\.1
- done
- Removing file4;
- ${CVSROOT_DIRNAME}/first-dir/file4,v <-- file4
- new revision: delete; previous revision: 1\.1\.2\.1
- done
- Removing file5;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file5,v <-- file5
- new revision: delete; previous revision: 1\.1\.2\.1
- done
- Removing file6;
- ${CVSROOT_DIRNAME}/first-dir/file6,v <-- file6
- new revision: delete; previous revision: 1\.1\.2\.1
- done
- Checking in file9;
- ${CVSROOT_DIRNAME}/first-dir/file9,v <-- file9
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done"
- # Tag the current revisions on the branch.
- dotest join4-15 "${testcvs} -q tag T2 ." \
- 'T file1
- T file2
- T file8
- T file9'
- # Modify file4 locally, and do an update with a merge.
- cd ../../1/first-dir
- echo 'third revision of file4' > file4
- dotest join4-18 "$testcvs -q update -jT1 -jT2 ." \
- "U file1
- R file10
- A file2
- $PROG update: file file2 exists, but has been added in revision T2
- $PROG update: scheduling file3 for removal
- M file4
- $PROG update: file file4 has been removed in revision T2, but the destination is incompatibly modified
- C file4
- R file6
- A file7
- R file8
- R file9
- $PROG update: file file9 does not exist, but is present in revision T2"
- # Verify that the right changes have been scheduled.
- dotest_fail join4-19 "${testcvs} -q update" \
- 'A file1
- R file10
- A file2
- R file3
- C file4
- R file6
- A file7
- R file8
- R file9'
- cd ../..
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- join5)
- # This test verifies that CVS can handle filenames starting with a
- # dash (`-') properly. What used to happen was that CVS handled it
- # just fine, until it went to pass them as arguments to the diff
- # library, at which point it neglected to pass `--' before the file
- # list, causing the diff library to attempt to interpret the file
- # name as an argument.
- mkdir join5; cd join5
- mkdir 1; cd 1
- dotest join5-init-1 "${testcvs} -Q co -l ."
- mkdir join5
- dotest join5-init-2 "${testcvs} -Q add join5"
- cd join5
- echo "there once was a file from harrisburg" >-file
- echo "who's existance it seems was quiteabsurd" >>-file
- dotest join5-init-3 "${testcvs} -Q add -- -file"
- dotest join5-init-4 "${testcvs} -q ci -minitial" \
- "RCS file: ${CVSROOT_DIRNAME}/join5/-file,v
- done
- Checking in -file;
- ${CVSROOT_DIRNAME}/join5/-file,v <-- -file
- initial revision: 1\.1
- done"
- cd ../..
- mkdir 2; cd 2
- dotest join5-init-5 "${testcvs} -Q co join5"
- cd join5
- echo "it tested for free" >>-file
- echo "when paid it should be" >>-file
- dotest join5-init-4 "${testcvs} -q ci -msecond" \
- "Checking in -file;
- ${CVSROOT_DIRNAME}/join5/-file,v <-- -file
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../..
- cd 1/join5
- echo "but maybe it could charge bytheword" >>-file
- # This is the test that used to spew complaints from diff3:
- dotest join5 "${testcvs} up" \
- "${PROG} update: Updating \.
- RCS file: ${CVSROOT_DIRNAME}/join5/-file,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into -file
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in -file
- C -file"
- cd ../..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ..
- rm -r join5
- rm -rf ${CVSROOT_DIRNAME}/join5
- ;;
- join6)
- mkdir join6; cd join6
- mkdir 1; cd 1
- dotest join6-init-1 "${testcvs} -Q co -l ."
- mkdir join6
- dotest join6-init-2 "${testcvs} -Q add join6"
- cd join6
- echo aaa >temp.txt
- echo bbb >>temp.txt
- echo ccc >>temp.txt
- dotest join6-1 "${testcvs} -Q add temp.txt"
- dotest join6-2 "${testcvs} -q commit -minitial temp.txt" \
- "RCS file: ${CVSROOT_DIRNAME}/join6/temp\.txt,v
- done
- Checking in temp\.txt;
- ${CVSROOT_DIRNAME}/join6/temp.txt,v <-- temp\.txt
- initial revision: 1\.1
- done"
- cp temp.txt temp2.txt
- echo ddd >>temp.txt
- dotest join6-3 "${testcvs} -q commit -madd temp.txt" \
- "Checking in temp\.txt;
- ${CVSROOT_DIRNAME}/join6/temp.txt,v <-- temp\.txt
- new revision: 1\.2; previous revision: 1\.1
- done"
- # The case where the merge target is up-to-date and its base revision
- # matches the second argument to -j: CVS doesn't bother attempting
- # the merge since it already knows that the target contains the
- # change.
- dotest join6-3.3 "${testcvs} update -j1.1 -j1.2 temp.txt" \
- "temp\.txt already contains the differences between 1\.1 and 1\.2"
- dotest join6-3.4 "${testcvs} diff temp.txt" ""
- # The case where the merge target is modified but already contains
- # the change.
- echo bbb >temp.txt
- echo ccc >>temp.txt
- echo ddd >>temp.txt
- dotest join6-3.5 "${testcvs} update -j1.1 -j1.2 temp.txt" \
- "M temp\.txt
- RCS file: ${CVSROOT_DIRNAME}/join6/temp\.txt,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into temp\.txt
- temp\.txt already contains the differences between 1\.1 and 1\.2"
- dotest_fail join6-3.6 "${testcvs} diff temp.txt" \
- "Index: temp\.txt
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/join6/temp\.txt,v
- retrieving revision 1\.2
- diff -r1\.2 temp.txt
- 1d0
- < aaa"
- cp temp2.txt temp.txt
- dotest_fail join6-4 "${testcvs} diff temp.txt" \
- "Index: temp.txt
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/join6/temp\.txt,v
- retrieving revision 1\.2
- diff -r1\.2 temp\.txt
- 4d3
- < ddd"
- dotest join6-5 "${testcvs} update -j1.1 -j1.2 temp.txt" \
- "M temp\.txt
- RCS file: ${CVSROOT_DIRNAME}/join6/temp\.txt,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into temp\.txt"
- dotest join6-6 "${testcvs} diff temp.txt" ""
- mv temp.txt temp3.txt
- dotest join6-7 "sed 's/ddd/dddd/' < temp3.txt > temp.txt" ""
- dotest join6-8 "${testcvs} update -j1.1 -j1.2 temp.txt" \
- "M temp\.txt
- RCS file: ${CVSROOT_DIRNAME}/join6/temp\.txt,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into temp\.txt
- rcsmerge: warning: conflicts during merge"
- dotest_fail join6-9 "${testcvs} diff temp.txt" \
- "Index: temp\.txt
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/join6/temp.txt,v
- retrieving revision 1\.2
- diff -r1\.2 temp\.txt
- 3a4,6
- > <<<<<<< temp\.txt
- > dddd
- > =======
- 4a8
- > >>>>>>> 1\.2"
- cp temp2.txt temp.txt
- dotest join6-10 "${testcvs} -q ci -m del temp.txt" \
- "Checking in temp\.txt;
- ${CVSROOT_DIRNAME}/join6/temp.txt,v <-- temp\.txt
- new revision: 1\.3; previous revision: 1\.2
- done"
- cp temp3.txt temp.txt
- dotest_fail join6-11 "${testcvs} diff temp.txt" \
- "Index: temp\.txt
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/join6/temp.txt,v
- retrieving revision 1\.3
- diff -r1\.3 temp\.txt
- 3a4
- > ddd"
- dotest join6-12 "${testcvs} update -j1.2 -j1.3 temp.txt" \
- "M temp\.txt
- RCS file: ${CVSROOT_DIRNAME}/join6/temp\.txt,v
- retrieving revision 1\.2
- retrieving revision 1\.3
- Merging differences between 1\.2 and 1\.3 into temp\.txt"
- dotest join6-13 "${testcvs} diff temp.txt" ""
- # The case where the merge target wasn't created until after the
- # first tag was applied
- rm temp2.txt temp3.txt
- dotest join6-20 "${testcvs} -q tag -r1.1 t1" \
- "T temp.txt"
- echo xxx >temp2.txt
- dotest join6-21 "${testcvs} -Q add temp2.txt"
- dotest join6-22 "${testcvs} -q ci -m." \
- "RCS file: ${CVSROOT_DIRNAME}/join6/temp2.txt,v
- done
- Checking in temp2\.txt;
- ${CVSROOT_DIRNAME}/join6/temp2\.txt,v <-- temp2\.txt
- initial revision: 1\.1
- done"
- dotest join6-23 "${testcvs} -q tag t2" \
- "T temp.txt
- T temp2.txt"
- echo xxx >>temp.txt
- dotest join6-24 "${testcvs} -q ci -m." \
- "Checking in temp\.txt;
- ${CVSROOT_DIRNAME}/join6/temp.txt,v <-- temp\.txt
- new revision: 1\.4; previous revision: 1\.3
- done"
- dotest join6-25 "${testcvs} -q up -jt1 -jt2" \
- "RCS file: ${CVSROOT_DIRNAME}/join6/temp.txt,v
- retrieving revision 1\.1
- retrieving revision 1\.3
- Merging differences between 1\.1 and 1\.3 into temp.txt
- temp.txt already contains the differences between 1\.1 and 1\.3
- temp2.txt already contains the differences between creation and 1\.1"
- # Now for my next trick: delete the file, recreate it, and
- # try to merge
- dotest join6-30 "${testcvs} -q rm -f temp2.txt" \
- "${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest join6-31 "${testcvs} -q ci -m. temp2.txt" \
- "Removing temp2\.txt;
- ${CVSROOT_DIRNAME}/join6/temp2\.txt,v <-- temp2\.txt
- new revision: delete; previous revision: 1\.1
- done"
- echo new >temp2.txt
- # FIXCVS: Local and remote really shouldn't be different and there
- # really shouldn't be two different status lines for temp2.txt
- if $remote; then
- dotest_fail join6-32 "${testcvs} -q up -jt1 -jt2" \
- "? temp2\.txt
- RCS file: ${CVSROOT_DIRNAME}/join6/temp.txt,v
- retrieving revision 1\.1
- retrieving revision 1\.3
- Merging differences between 1\.1 and 1\.3 into temp.txt
- temp.txt already contains the differences between 1\.1 and 1\.3
- ${PROG} update: move away \./temp2\.txt; it is in the way
- C temp2\.txt"
- else
- dotest join6-32 "${testcvs} -q up -jt1 -jt2" \
- "RCS file: ${CVSROOT_DIRNAME}/join6/temp.txt,v
- retrieving revision 1\.1
- retrieving revision 1\.3
- Merging differences between 1\.1 and 1\.3 into temp.txt
- temp.txt already contains the differences between 1\.1 and 1\.3
- ${PROG} update: use .${PROG} add. to create an entry for temp2\.txt
- U temp2\.txt
- ? temp2\.txt"
- fi
- cd ../../..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -r join6
- rm -rf ${CVSROOT_DIRNAME}/join6
- ;;
- join7)
- # This test deals with joins that happen with the -n switch
- mkdir join7; cd join7
- mkdir impdir; cd impdir
- echo aaa >temp.txt
- echo bbb >>temp.txt
- echo ccc >>temp.txt
- dotest join7-1 \
- "${testcvs} -Q import -minitial join7 vendor vers-1" \
- ""
- cd ..
- dotest join7-2 "${testcvs} -Q co join7" ""
- cd join7
- echo ddd >> temp.txt
- dotest join7-3 "${testcvs} -Q ci -madded-line temp.txt" \
- "Checking in temp.txt;
- $CVSROOT_DIRNAME/join7/temp.txt,v <-- temp.txt
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../impdir
- echo aaaa >temp.txt
- echo bbbb >>temp.txt
- echo ccc >>temp.txt
- echo eee >>temp.txt
- dotest join7-4 \
- "${testcvs} -Q import -minitial join7 vendor vers-2" \
- ""
- cd ../join7
- dotest join7-5 \
- "${testcvs} -n update -jvers-1 -jvers-2 temp.txt" \
- "RCS file: $CVSROOT_DIRNAME/join7/temp.txt,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.2
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.2 into temp.txt
- rcsmerge: warning: conflicts during merge"
- touch temp.txt
- dotest join7-6 "${testcvs} -n update -jvers-1 -jvers-2 temp.txt" \
- "RCS file: $CVSROOT_DIRNAME/join7/temp.txt,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.2
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.2 into temp.txt
- rcsmerge: warning: conflicts during merge" \
- "RCS file: $CVSROOT_DIRNAME/join7/temp.txt,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.2
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.2 into temp.txt
- rcsmerge: warning: conflicts during merge"
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -r join7
- rm -rf $CVSROOT_DIRNAME/join7
- ;;
- join8)
- # In this test case, we have 2 projects, one called "pvcs" and one
- # called "project". The "pvcs" project has modified the file, while
- # the "project" project has caused a deletion. When "project" is
- # merged into "pvcs", we expect CVS to detect a conflict.
- mkdir join8; cd join8
- mkdir combine
- mkdir base
- mkdir pvcs
- mkdir project
-
- echo "aaa" >base/file.txt
- echo "bbb" >pvcs/file.txt
- echo "ccc" >project/xxx.txt
-
- cd base
- dotest join8-1 \
- "$testcvs import -b 1.1.101 -ko -m 'base import' join8 base base-1" \
- "N join8/file\.txt
- No conflicts created by this import"
-
- cd ../pvcs
- dotest join8-2 \
- "$testcvs import -b 1.1.201 -ko -m 'pvcs import' join8 pvcs pvcs-1" \
- "C join8/file\.txt
- 1 conflicts created by this import.
- Use the following command to help the merge:
- $PROG checkout -j<prev_rel_tag> -jpvcs-1 join8"
- cd ../project
- dotest join8-3 \
- "$testcvs import -b 1.1.301 -ko -m 'project import' join8 project project-1" \
- "N join8/xxx\.txt
- No conflicts created by this import"
- cd ..
- dotest join8-4 \
- "$testcvs checkout -r pvcs-1 -j base-1 -j project-1 -d combine join8" \
- "$PROG checkout: Updating combine
- U combine/file\.txt
- $PROG checkout: file combine/file\.txt has been removed in revision project-1, but the destination is incompatibly modified
- C combine/file.txt
- U combine/xxx\.txt"
- dotest join8-5 \
- "$testcvs -Q up -pr base-1 combine/file.txt >combine/file.txt"
- dotest join8-6 \
- "$testcvs up -j base-1 -j project-1 combine" \
- "$PROG update: Updating combine
- M combine/file\.txt
- $PROG update: scheduling combine/file\.txt for removal
- A combine/xxx\.txt
- $PROG update: file combine/xxx\.txt exists, but has been added in revision project-1"
- cd ..
-
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
-
- rm -r join8
- rm -rf $CVSROOT_DIRNAME/join8
- ;;
- join9)
- # In this test case, we have 2 projects, one called "pvcs" and one
- # called "project". The "pvcs" project has not modified the file,
- # while the "project" project has caused a deletion. When "project"
- # is merged into "pvcs", we expect CVS to remove the file without
- # fuss, as there is no conflict.
- mkdir join9; cd join9
- mkdir combine
- mkdir base
- mkdir pvcs
- mkdir project
-
- echo "aaa" >base/file.txt
- echo "aaa" >pvcs/file.txt
- echo "ccc" >project/xxx.txt
-
- cd base
- dotest join9-1 \
- "$testcvs import -b 1.1.101 -ko -m 'base import' join9 base base-1" \
- "N join9/file\.txt
- No conflicts created by this import"
- cd ../pvcs
- dotest join9-2 \
- "$testcvs import -b 1.1.201 -ko -m 'pvcs import' join9 pvcs pvcs-1" \
- "C join9/file\.txt
- 1 conflicts created by this import.
- Use the following command to help the merge:
- $PROG checkout -j<prev_rel_tag> -jpvcs-1 join9"
- cd ../project
- dotest join9-3 \
- "$testcvs import -b 1.1.301 -ko -m 'project import' join9 project project-1" \
- "N join9/xxx\.txt
- No conflicts created by this import"
- cd ..
- dotest join9-4 \
- "$testcvs checkout -r pvcs-1 -j base-1 -j project-1 -d combine join9" \
- "$PROG checkout: Updating combine
- U combine/file\.txt
- $PROG checkout: scheduling combine/file\.txt for removal
- U combine/xxx\.txt"
- cd ..
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- rm -r join9
- rm -rf $CVSROOT_DIRNAME/join9
- ;;
- join-readonly-conflict)
- # Previously, only tests 1 & 11 were being tested. I added the
- # intermediate dotest's to try and diagnose a different failure
- #
- # Demonstrate that cvs-1.9.29 can fail on 2nd and subsequent
- # conflict-evoking join attempts.
- # Even with that version of CVS, This test failed only in
- # client-server mode, and would have been noticed in normal
- # operation only for files that were read-only (either due to
- # use of cvs' global -r option, setting the CVSREAD envvar,
- # or use of watch lists).
- mkdir join-readonly-conflict; cd join-readonly-conflict
- dotest join-readonly-conflict-1 "$testcvs -q co -l ." ''
- module=join-readonly-conflict
- mkdir $module
- $testcvs -q add $module >>$LOGFILE 2>&1
- cd $module
- file=m
- echo trunk > $file
- dotest join-readonly-conflict-2 "$testcvs -Q add $file" ''
- dotest join-readonly-conflict-3 "$testcvs -q ci -m . $file" \
- "RCS file: $CVSROOT_DIRNAME/$module/$file,v
- done
- Checking in $file;
- $CVSROOT_DIRNAME/$module/$file,v <-- $file
- initial revision: 1\.1
- done"
- dotest join-readonly-conflict-4 "$testcvs tag -b B $file" "T $file"
- dotest join-readonly-conflict-5 "$testcvs -q update -rB $file" \
- "[UP] $file"
- echo branch B > $file
- dotest join-readonly-conflict-6 "$testcvs -q ci -m . $file" \
- "Checking in $file;
- $CVSROOT_DIRNAME/$module/$file,v <-- $file
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- rm $file
- dotest join-readonly-conflict-7 "$testcvs -Q update -A $file" ''
- # Make sure $file is read-only. This can happen more realistically
- # via patch -- which could be used to apply a delta, yet would
- # preserve a file's read-only permissions.
- echo conflict > $file; chmod u-w $file
- dotest join-readonly-conflict-8 "$testcvs update -r B $file" \
- "RCS file: $CVSROOT_DIRNAME/$module/$file,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.1
- Merging differences between 1\.1 and 1\.1\.2\.1 into $file
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in $file
- C $file"
- # restore to the trunk
- rm -f $file
- dotest join-readonly-conflict-9 "$testcvs -Q update -A $file" ''
- # This one would fail because cvs couldn't open the existing
- # (and read-only) .# file for writing.
- echo conflict > $file
- # verify that the backup file is not writable
- if test -w ".#$file.1.1"; then
- fail "join-readonly-conflict-10 : .#$file.1.1 is writable"
- else
- pass "join-readonly-conflict-10"
- fi
- dotest join-readonly-conflict-11 "$testcvs update -r B $file" \
- "RCS file: $CVSROOT_DIRNAME/$module/$file,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.1
- Merging differences between 1\.1 and 1\.1\.2\.1 into $file
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in $file
- C m"
- cd ../..
- if $keep; then :; else
- rm -rf join-readonly-conflict
- rm -rf $CVSROOT_DIRNAME/$module
- fi
- ;;
- join-admin)
- mkdir 1; cd 1
- dotest join-admin-1 "$testcvs -q co -l ." ''
- module=x
- mkdir $module
- $testcvs -q add $module >>$LOGFILE 2>&1
- cd $module
- # Create a file so applying the first tag works.
- echo foo > a
- $testcvs -Q add a > /dev/null 2>&1
- $testcvs -Q ci -m. a > /dev/null 2>&1
- $testcvs -Q tag -b B
- $testcvs -Q tag -b M1
- echo '$''Id$' > b
- $testcvs -Q add b > /dev/null 2>&1
- $testcvs -Q ci -m. b > /dev/null 2>&1
- $testcvs -Q tag -b M2
- $testcvs -Q update -r B
- $testcvs -Q update -kk -jM1 -jM2
- $testcvs -Q ci -m. b >/dev/null 2>&1
- $testcvs -Q update -A
- # Verify that the -kk flag from the update did not
- # propagate to the repository.
- dotest join-admin-1 "$testcvs status b" \
- "===================================================================
- File: b Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/x/b,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- cd ../..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/$module
- ;;
- join-admin-2)
- # Show that when a merge (via update -kk -jtag1 -jtag2) first
- # removes a file, then modifies another containing an $Id...$ line,
- # the resulting file contains the unexpanded `$Id.$' string, as
- # -kk requires.
- mkdir 1; cd 1
- dotest join-admin-2-1 "$testcvs -q co -l ." ''
- module=x
- mkdir $module
- dotest join-admin-2-2 "$testcvs -q add $module" \
- "Directory ${CVSROOT_DIRNAME}/x added to the repository"
- cd $module
- # Create a file so applying the first tag works.
- echo '$''Id$' > e0
- cp e0 e
- dotest join-admin-2-3 "$testcvs -Q add e" ''
- dotest join-admin-2-4 "$testcvs -Q ci -m. e" \
- "RCS file: ${CVSROOT_DIRNAME}/x/e,v
- done
- Checking in e;
- ${CVSROOT_DIRNAME}/x/e,v <-- e
- initial revision: 1\.1
- done"
- dotest join-admin-2-5 "$testcvs -Q tag -b T" '' "${QUESTION} e0"
- dotest join-admin-2-6 "$testcvs -Q update -r T" '' "${QUESTION} e0"
- cp e0 e
- dotest join-admin-2-7 "$testcvs -Q ci -m. e" \
- "Checking in e;
- ${CVSROOT_DIRNAME}/x/e,v <-- e
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest join-admin-2-8 "$testcvs -Q update -A" '' "${QUESTION} e0"
- dotest join-admin-2-9 "$testcvs -Q tag -b M1" '' "${QUESTION} e0"
- echo '$''Id$' > b
- dotest join-admin-2-10 "$testcvs -Q add b" ''
- cp e0 e
- dotest join-admin-2-11 "$testcvs -Q ci -m. b e" \
- "RCS file: ${CVSROOT_DIRNAME}/x/b,v
- done
- Checking in b;
- ${CVSROOT_DIRNAME}/x/b,v <-- b
- initial revision: 1\.1
- done
- Checking in e;
- ${CVSROOT_DIRNAME}/x/e,v <-- e
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest join-admin-2-12 "$testcvs -Q tag -b M2" '' "${QUESTION} e0"
- dotest join-admin-2-13 "$testcvs -Q update -r T" '' "${QUESTION} e0"
- dotest join-admin-2-14 "$testcvs update -kk -jM1 -jM2" \
- "${PROG} update: Updating .
- U b
- U e
- RCS file: ${CVSROOT_DIRNAME}/x/e,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into e
- e already contains the differences between 1\.1 and 1\.2
- ${QUESTION} e0" \
- "${QUESTION} e0
- ${PROG} update: Updating .
- U b
- U e
- RCS file: ${CVSROOT_DIRNAME}/x/e,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into e
- e already contains the differences between 1\.1 and 1\.2"
- # Verify that the $Id.$ string is not expanded.
- dotest join-admin-2-15 "cat e" '$''Id$'
- cd ../..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/$module
- ;;
- join-rm)
- # This first half of this test checks that a single-argument merge
- # from a branch is capable of removing files.
- #
- # The second half verifies that an update to another location with an
- # uncommitted removal will transfer the destination branch of the
- # removal.
- module=join-rm
- mkdir $module; cd $module
- dotest join-rm-init-1 "$testcvs -q co -l ." ''
- mkdir $module
- dotest join-rm-init-2 "$testcvs -q add $module" \
- "Directory $CVSROOT_DIRNAME/$module added to the repository"
- cd $module
- # add some files.
- touch a b c d e f g
- dotest join-rm-init-3 "$testcvs -Q add a b c d e f g"
- dotest join-rm-init-4 "$testcvs -Q ci -m add-em" \
- "RCS file: $CVSROOT_DIRNAME/join-rm/a,v
- done
- Checking in a;
- $CVSROOT_DIRNAME/join-rm/a,v <-- a
- initial revision: 1\.1
- done
- RCS file: $CVSROOT_DIRNAME/join-rm/b,v
- done
- Checking in b;
- $CVSROOT_DIRNAME/join-rm/b,v <-- b
- initial revision: 1\.1
- done
- RCS file: $CVSROOT_DIRNAME/join-rm/c,v
- done
- Checking in c;
- $CVSROOT_DIRNAME/join-rm/c,v <-- c
- initial revision: 1\.1
- done
- RCS file: $CVSROOT_DIRNAME/join-rm/d,v
- done
- Checking in d;
- $CVSROOT_DIRNAME/join-rm/d,v <-- d
- initial revision: 1\.1
- done
- RCS file: $CVSROOT_DIRNAME/join-rm/e,v
- done
- Checking in e;
- $CVSROOT_DIRNAME/join-rm/e,v <-- e
- initial revision: 1\.1
- done
- RCS file: $CVSROOT_DIRNAME/join-rm/f,v
- done
- Checking in f;
- $CVSROOT_DIRNAME/join-rm/f,v <-- f
- initial revision: 1\.1
- done
- RCS file: $CVSROOT_DIRNAME/join-rm/g,v
- done
- Checking in g;
- $CVSROOT_DIRNAME/join-rm/g,v <-- g
- initial revision: 1\.1
- done"
-
- # create the branch and update to it
- dotest join-rm-init-5 "$testcvs -Q tag -b br"
- dotest join-rm-init-6 "$testcvs -Q up -rbr"
- # remove a few files from the branch
- dotest join-rm-init-7 "$testcvs -Q rm -f b d g"
- dotest join-rm-init-8 "$testcvs -Q ci -mrm" \
- "Removing b;
- $CVSROOT_DIRNAME/join-rm/b,v <-- b
- new revision: delete; previous revision: 1\.1
- done
- Removing d;
- $CVSROOT_DIRNAME/join-rm/d,v <-- d
- new revision: delete; previous revision: 1\.1
- done
- Removing g;
- $CVSROOT_DIRNAME/join-rm/g,v <-- g
- new revision: delete; previous revision: 1\.1
- done"
- # update to the trunk
- dotest join-rm-init-9 "$testcvs -Q up -A"
- # now for the test - try and merge the removals.
- dotest join-rm-1 "$testcvs -q up -jbr" \
- "$PROG update: scheduling b for removal
- $PROG update: scheduling d for removal
- $PROG update: scheduling g for removal"
- # And make sure the merge took
- dotest join-rm-2 "$testcvs -qn up" \
- "R b
- R d
- R g"
- dotest join-rm-3 "$testcvs -q ci -m 'save the merge'" \
- "Removing b;
- $CVSROOT_DIRNAME/join-rm/b,v <-- b
- new revision: delete; previous revision: 1\.1
- done
- Removing d;
- $CVSROOT_DIRNAME/join-rm/d,v <-- d
- new revision: delete; previous revision: 1\.1
- done
- Removing g;
- $CVSROOT_DIRNAME/join-rm/g,v <-- g
- new revision: delete; previous revision: 1\.1
- done"
- # and verify that it was the head revision which was removed.
- dotest join-rm-4 "$testcvs -q log b" "
- RCS file: $CVSROOT_DIRNAME/join-rm/Attic/b,v
- Working file: b
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- br: 1\.1\.0\.2
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: $username; state: dead; lines: ${PLUS}0 -0
- save the merge
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- branches: 1.1.2;
- add-em
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: $username; state: dead; lines: ${PLUS}0 -0
- rm
- ============================================================================="
- # go back to the branch to set up for the second set of tests
- dotest join-rm-init-10 "$testcvs -Q up -rbr"
- dotest join-rm-init-11 "$testcvs -Q rm -f a"
- dotest join-rm-init-12 "$testcvs -Q ci -m rma" \
- "Removing a;
- $CVSROOT_DIRNAME/join-rm/a,v <-- a
- new revision: delete; previous revision: 1\.1
- done"
- # now the test: update to the trunk
- #
- # FIXCVS: This update should merge the removal to the trunk. It does
- # not.
- dotest join-rm-5 "$testcvs -q up -A" \
- 'U a
- U c
- U e
- U f'
- # and verify that there is no sticky tag
- dotest join-rm-6 "$testcvs status a" \
- "===================================================================
- File: a Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 $CVSROOT_DIRNAME/join-rm/a,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -rf $CVSROOT_DIRNAME/$module
- rm -r $module
- ;;
- new) # look for stray "no longer pertinent" messages.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- if ${CVS} co first-dir ; then
- pass 117
- else
- fail 117
- fi
- cd first-dir
- touch a
- if ${CVS} add a 2>>${LOGFILE}; then
- pass 118
- else
- fail 118
- fi
- if ${CVS} ci -m added >>${LOGFILE} 2>&1; then
- pass 119
- else
- fail 119
- fi
- rm a
- if ${CVS} rm a 2>>${LOGFILE}; then
- pass 120
- else
- fail 120
- fi
- if ${CVS} ci -m removed >>${LOGFILE} ; then
- pass 121
- else
- fail 121
- fi
- if ${CVS} update -A 2>&1 | grep longer ; then
- fail 122
- else
- pass 122
- fi
- if ${CVS} update -rHEAD 2>&1 | grep longer ; then
- fail 123
- else
- pass 123
- fi
- cd ..
- rm -r first-dir
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- newb)
- # Test removing a file on a branch and then checking it out.
- # We call this "newb" only because it, like the "new" tests,
- # has something to do with "no longer pertinent" messages.
- # Not necessarily the most brilliant nomenclature.
- # Create file 'a'.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest newb-123a "${testcvs} -q co first-dir" ''
- cd first-dir
- touch a
- dotest newb-123b "${testcvs} add a" \
- "${PROG} add: scheduling file .a. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest newb-123c "${testcvs} -q ci -m added" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/a,v
- done
- Checking in a;
- ${CVSROOT_DIRNAME}/first-dir/a,v <-- a
- initial revision: 1\.1
- done"
- # Make a branch.
- dotest newb-123d "${testcvs} -q tag -b branch" "T a"
- # Check out the branch.
- cd ..
- rm -r first-dir
- mkdir 1
- cd 1
- dotest newb-123e "${testcvs} -q co -r branch first-dir" \
- "U first-dir/a"
- # Remove 'a' on another copy of the branch.
- cd ..
- mkdir 2
- cd 2
- dotest newb-123f "${testcvs} -q co -r branch first-dir" \
- "U first-dir/a"
- cd first-dir
- rm a
- dotest newb-123g "${testcvs} rm a" \
- "${PROG} remove: scheduling .a. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest newb-123h "${testcvs} -q ci -m removed" \
- "Removing a;
- ${CVSROOT_DIRNAME}/first-dir/a,v <-- a
- new revision: delete; previous revision: 1\.1
- done"
- # Check out the file on the branch. This should report
- # that the file is not pertinent, but it should not
- # say anything else.
- cd ..
- rm -r first-dir
- dotest newb-123i "${testcvs} -q co -r branch first-dir/a" \
- "${PROG} checkout: warning: first-dir/a is not (any longer) pertinent"
- # Update the other copy, and make sure that a is removed.
- cd ../1/first-dir
- # "Entry Invalid" is a rather strange output here. Something like
- # "Removed in Repository" would make more sense.
- dotest newb-123j0 "${testcvs} status a" \
- "${PROG} status: a is no longer in the repository
- ===================================================================
- File: a Status: Entry Invalid
- Working revision: 1\.1.*
- Repository revision: 1\.1\.2\.1 ${CVSROOT_DIRNAME}/first-dir/a,v
- Sticky Tag: branch (branch: 1\.1\.2)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest newb-123j "${testcvs} -q update" \
- "${PROG} update: a is no longer in the repository"
- if test -f a; then
- fail newb-123k
- else
- pass newb-123k
- fi
- cd ../..
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- conflicts)
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1
- cd 1
- dotest conflicts-124 "${testcvs} -q co first-dir" ''
- cd first-dir
- touch a
- dotest conflicts-125 "${testcvs} add a" \
- "${PROG} add: scheduling file .a. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest conflicts-126 "${testcvs} -q ci -m added" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/a,v
- done
- Checking in a;
- ${CVSROOT_DIRNAME}/first-dir/a,v <-- a
- initial revision: 1\.1
- done"
- cd ../..
- mkdir 2
- cd 2
- dotest conflicts-126.5 "${testcvs} co -p first-dir" \
- "${PROG} checkout: Updating first-dir
- ===================================================================
- Checking out first-dir/a
- RCS: ${CVSROOT_DIRNAME}/first-dir/a,v
- VERS: 1\.1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*"
- if ${CVS} co first-dir ; then
- pass 127
- else
- fail 127
- fi
- cd first-dir
- if test -f a; then
- pass 127a
- else
- fail 127a
- fi
- cd ../../1/first-dir
- echo add a line >>a
- mkdir dir1
- dotest conflicts-127b "${testcvs} add dir1" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir1 added to the repository"
- dotest conflicts-128 "${testcvs} -q ci -m changed" \
- "Checking in a;
- ${CVSROOT_DIRNAME}/first-dir/a,v <-- a
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../..
- # Similar to conflicts-126.5, but now the file has nonempty
- # contents.
- mkdir 3
- cd 3
- dotest conflicts-128.5 "${testcvs} co -p -l first-dir" \
- "${PROG} checkout: Updating first-dir
- ===================================================================
- Checking out first-dir/a
- RCS: ${CVSROOT_DIRNAME}/first-dir/a,v
- VERS: 1\.2
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- add a line"
- cd ..
- rmdir 3
- # Now go over the to the other working directory and
- # start testing conflicts
- cd 2/first-dir
- echo add a conflicting line >>a
- dotest_fail conflicts-129 "${testcvs} -q ci -m changed" \
- "${PROG}"' commit: Up-to-date check failed for `a'\''
- '"${PROG}"' \[commit aborted\]: correct above errors first!'
- mkdir dir1
- mkdir sdir
- dotest conflicts-status-0 "${testcvs} status a" \
- "===================================================================
- File: a Status: Needs Merge
- Working revision: 1\.1.*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/a,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest conflicts-129a "${testcvs} -nq update a" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/a,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into a
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in a
- C a"
- dotest conflicts-130 "${testcvs} -q update" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/a,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into a
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in a
- C a
- ${QUESTION} dir1
- ${QUESTION} sdir" \
- "${QUESTION} dir1
- ${QUESTION} sdir
- RCS file: ${CVSROOT_DIRNAME}/first-dir/a,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into a
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in a
- C a"
- rmdir dir1 sdir
- dotest conflicts-status-1 "${testcvs} status a" \
- "===================================================================
- File: a Status: Unresolved Conflict
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/a,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest_fail conflicts-131 "${testcvs} -q ci -m try" \
- "${PROG} commit: file .a. had a conflict and has not been modified
- ${PROG} \[commit aborted\]: correct above errors first!"
- # Try to check in the file with the conflict markers in it.
- # Make sure we detect any one of the three conflict markers
- mv a aa
- grep '^<<<<<<<' aa >a
- dotest conflicts-status-2 "${testcvs} -nq ci -m try a" \
- "${PROG} commit: warning: file .a. seems to still contain conflict indicators"
- grep '^=======' aa >a
- dotest conflicts-status-3 "${testcvs} -nq ci -m try a" \
- "${PROG} commit: warning: file .a. seems to still contain conflict indicators"
- grep '^>>>>>>>' aa >a
- dotest conflicts-status-4 "${testcvs} -qn ci -m try a" \
- "${PROG} commit: warning: file .a. seems to still contain conflict indicators"
- mv aa a
- echo lame attempt at resolving it >>a
- dotest conflicts-status-5 "${testcvs} status a" \
- "===================================================================
- File: a Status: File had conflicts on merge
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/a,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest conflicts-132 "${testcvs} -q ci -m try" \
- "${PROG} commit: warning: file .a. seems to still contain conflict indicators
- Checking in a;
- ${CVSROOT_DIRNAME}/first-dir/a,v <-- a
- new revision: 1\.3; previous revision: 1\.2
- done"
- # OK, the user saw the warning (good user), and now
- # resolves it for real.
- echo resolve conflict >a
- dotest conflicts-status-6 "${testcvs} status a" \
- "===================================================================
- File: a Status: Locally Modified
- Working revision: 1\.3.*
- Repository revision: 1\.3 ${CVSROOT_DIRNAME}/first-dir/a,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest conflicts-133 "${testcvs} -q ci -m resolved" \
- "Checking in a;
- ${CVSROOT_DIRNAME}/first-dir/a,v <-- a
- new revision: 1\.4; previous revision: 1\.3
- done"
- dotest conflicts-status-7 "${testcvs} status a" \
- "===================================================================
- File: a Status: Up-to-date
- Working revision: 1\.4.*
- Repository revision: 1\.4 ${CVSROOT_DIRNAME}/first-dir/a,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- # Now test that we can add a file in one working directory
- # and have an update in another get it.
- cd ../../1/first-dir
- echo abc >abc
- if ${testcvs} add abc >>${LOGFILE} 2>&1; then
- pass 134
- else
- fail 134
- fi
- if ${testcvs} ci -m 'add abc' abc >>${LOGFILE} 2>&1; then
- pass 135
- else
- fail 135
- fi
- cd ../../2
- mkdir first-dir/dir1 first-dir/sdir
- dotest conflicts-136 "${testcvs} -q update first-dir" \
- '[UP] first-dir/abc
- '"${QUESTION}"' first-dir/dir1
- '"${QUESTION}"' first-dir/sdir' \
- ''"${QUESTION}"' first-dir/dir1
- '"${QUESTION}"' first-dir/sdir
- [UP] first-dir/abc'
- dotest conflicts-137 'test -f first-dir/abc' ''
- rmdir first-dir/dir1 first-dir/sdir
- # Now test something similar, but in which the parent directory
- # (not the directory in question) has the Entries.Static flag
- # set.
- cd ../1/first-dir
- mkdir subdir
- if ${testcvs} add subdir >>${LOGFILE}; then
- pass 138
- else
- fail 138
- fi
- cd ../..
- mkdir 3
- cd 3
- if ${testcvs} -q co first-dir/abc first-dir/subdir \
- >>${LOGFILE}; then
- pass 139
- else
- fail 139
- fi
- cd ../1/first-dir/subdir
- echo sss >sss
- if ${testcvs} add sss >>${LOGFILE} 2>&1; then
- pass 140
- else
- fail 140
- fi
- if ${testcvs} ci -m adding sss >>${LOGFILE} 2>&1; then
- pass 140
- else
- fail 140
- fi
- cd ../../../3/first-dir
- if ${testcvs} -q update >>${LOGFILE}; then
- pass 141
- else
- fail 141
- fi
- if test -f subdir/sss; then
- pass 142
- else
- fail 142
- fi
- cd ../..
- rm -r 1 2 3 ; rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- conflicts2)
- # More conflicts tests; separate from conflicts to keep each
- # test a manageable size.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1
- cd 1
- dotest conflicts2-142a1 "${testcvs} -q co first-dir" ''
- cd first-dir
- touch a abc
- dotest conflicts2-142a2 "${testcvs} add a abc" \
- "${PROG} add: scheduling file .a. for addition
- ${PROG} add: scheduling file .abc. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest conflicts2-142a3 "${testcvs} -q ci -m added" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/a,v
- done
- Checking in a;
- ${CVSROOT_DIRNAME}/first-dir/a,v <-- a
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- done
- Checking in abc;
- ${CVSROOT_DIRNAME}/first-dir/abc,v <-- abc
- initial revision: 1\.1
- done"
- cd ../..
- mkdir 2
- cd 2
- dotest conflicts2-142a4 "${testcvs} -q co first-dir" 'U first-dir/a
- U first-dir/abc'
- cd ..
- # BEGIN TESTS USING THE FILE A
- # FIXME: would be cleaner to separate them out into their own
- # tests; conflicts2 is getting long.
- # Now test that if one person modifies and commits a
- # file and a second person removes it, it is a
- # conflict
- cd 1/first-dir
- echo modify a >>a
- dotest conflicts2-142b2 "${testcvs} -q ci -m modify-a" \
- "Checking in a;
- ${CVSROOT_DIRNAME}/first-dir/a,v <-- a
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../../2/first-dir
- rm a
- dotest conflicts2-142b3 "${testcvs} rm a" \
- "${PROG} remove: scheduling .a. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest_fail conflicts2-142b4 "${testcvs} -q update" \
- "${PROG} update: conflict: removed a was modified by second party
- C a"
- # Resolve the conflict by deciding not to remove the file
- # after all.
- dotest_sort conflicts2-142b5 "${testcvs} add a" "U a
- ${PROG} add: a, version 1\.1, resurrected"
- dotest conflicts2-142b5b1 "$testcvs status a" \
- "===================================================================
- File: a Status: Needs Patch
- Working revision: 1\.1.*
- Repository revision: 1\.2 $CVSROOT_DIRNAME/first-dir/a,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest conflicts2-142b6 "${testcvs} -q update" 'U a'
- # Now one level up.
- cd ..
- dotest conflicts2-142b7 "${testcvs} rm -f first-dir/a" \
- "${PROG} remove: scheduling .first-dir/a. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- if $remote; then
- # Haven't investigated this one.
- dotest_fail conflicts2-142b8r "$testcvs add first-dir/a" \
- "${PROG} add: in directory \.:
- ${PROG} \[add aborted\]: there is no version here; do '${PROG} checkout' first"
- cd first-dir
- else
- dotest conflicts2-142b8 "${testcvs} add first-dir/a" \
- "U first-dir/a
- ${PROG} add: first-dir/a, version 1\.2, resurrected"
- cd first-dir
- # Now recover from the damage that the 142b8 test did.
- dotest conflicts2-142b9 "${testcvs} rm -f a" \
- "${PROG} remove: scheduling .a. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- fi
- dotest_sort conflicts2-142b10 "${testcvs} add a" "U a
- ${PROG} add: a, version 1\.2, resurrected"
- # As with conflicts2-142b6, check that things are normal again.
- dotest conflicts2-142b11 "${testcvs} -q update" ''
- cd ../..
- # END TESTS USING THE FILE A
- # Now test that if one person removes a file and
- # commits it, and a second person removes it, is it
- # not a conflict.
- cd 1/first-dir
- rm abc
- dotest conflicts2-142c0 "${testcvs} rm abc" \
- "${PROG} remove: scheduling .abc. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest conflicts2-142c1 "${testcvs} -q ci -m remove-abc" \
- "Removing abc;
- ${CVSROOT_DIRNAME}/first-dir/abc,v <-- abc
- new revision: delete; previous revision: 1\.1
- done"
- cd ../../2/first-dir
- rm abc
- dotest conflicts2-142c2 "${testcvs} rm abc" \
- "${PROG} remove: scheduling .abc. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest conflicts2-142c3 "${testcvs} update" \
- "${PROG} update: Updating \."
- cd ../..
- # conflicts2-142d*: test that if one party adds a file, and another
- # party has a file of the same name, cvs notices
- cd 1/first-dir
- touch aa.c
- echo 'contents unchanged' >same.c
- dotest conflicts2-142d0 "${testcvs} add aa.c same.c" \
- "${PROG} add: scheduling file .aa\.c. for addition
- ${PROG} add: scheduling file .same\.c. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest conflicts2-142d1 "${testcvs} -q ci -m added" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aa\.c,v
- done
- Checking in aa\.c;
- ${CVSROOT_DIRNAME}/first-dir/aa\.c,v <-- aa\.c
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/same\.c,v
- done
- Checking in same\.c;
- ${CVSROOT_DIRNAME}/first-dir/same\.c,v <-- same\.c
- initial revision: 1\.1
- done"
- cd ../../2/first-dir
- echo "don't you dare obliterate this text" >aa.c
- echo 'contents unchanged' >same.c
- # Note the discrepancy between local and remote in the handling
- # of same.c. I kind
- # of suspect that the local CVS behavior is the more useful one
- # although I do sort of wonder whether we should make people run
- # cvs add just to get them in that habit (also, trying to implement
- # the local CVS behavior for remote without the cvs add seems
- # pretty difficult).
- if $remote; then
- dotest_fail conflicts2-142d2 "${testcvs} -q update" \
- "${QUESTION} aa\.c
- ${QUESTION} same\.c
- ${PROG} update: move away \./aa\.c; it is in the way
- C aa\.c
- ${PROG} update: move away \./same\.c; it is in the way
- C same\.c"
- else
- dotest_fail conflicts2-142d2 "${testcvs} -q update" \
- "${PROG} [a-z]*: move away aa\.c; it is in the way
- C aa\.c
- U same\.c"
- fi
- dotest conflicts2-142d3 "${testcvs} -q status aa.c" \
- "${PROG} status: move away aa\.c; it is in the way
- ===================================================================
- File: aa\.c Status: Unresolved Conflict
- Working revision: No entry for aa\.c
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/aa\.c,v"
- # Could also be testing the case in which the cvs add happened
- # before the commit by the other user.
- # This message seems somewhat bogus. I mean, parallel development
- # means that we get to work in parallel if we choose, right? And
- # then at commit time it would be a conflict.
- dotest_fail conflicts2-142d4 "${testcvs} -q add aa.c" \
- "${PROG} add: aa.c added independently by second party"
- # The user might want to see just what the conflict is.
- # Don't bother, diff seems to kind of lose its mind, with or
- # without -N. This is a CVS bug(s).
- #dotest conflicts2-142d5 "${testcvs} -q diff -r HEAD -N aa.c" fixme
- # Now: "how can the user resolve this conflict", I hear you cry.
- # Well, one way is to forget about the file in the working
- # directory.
- # Since it didn't let us do the add in conflicts2-142d4, there
- # is no need to run cvs rm here.
- #dotest conflicts2-142d6 "${testcvs} -q rm -f aa.c" fixme
- dotest conflicts2-142d6 "rm aa.c" ''
- dotest conflicts2-142d7 "${testcvs} -q update aa.c" "U aa\.c"
- dotest conflicts2-142d8 "cat aa.c" ''
- # The other way is to use the version from the working directory
- # instead of the version from the repository. Unfortunately,
- # there doesn't seem to be any particularly clear way to do
- # this (?).
- cd ../..
- rm -r 1 2; rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- conflicts3)
- # More tests of conflicts and/or multiple working directories
- # in general.
- mkdir 1; cd 1
- dotest conflicts3-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest conflicts3-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd ..
- mkdir 2; cd 2
- dotest conflicts3-3 "${testcvs} -q co -l first-dir" ''
- cd ../1/first-dir
- touch file1 file2
- dotest conflicts3-4 "${testcvs} add file1 file2" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest conflicts3-5 "${testcvs} -q ci -m add-them" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- cd ../../2/first-dir
- # Check that -n doesn't make CVS lose its mind as it creates
- # (or rather, doesn't) a new file.
- dotest conflicts3-6 "${testcvs} -nq update" \
- "U file1
- U file2"
- dotest_fail conflicts3-7 "test -f file1" ''
- dotest conflicts3-8 "${testcvs} -q update" \
- "U file1
- U file2"
- dotest conflicts3-9 "test -f file2" ''
- # OK, now remove two files at once
- dotest conflicts3-10 "${testcvs} rm -f file1 file2" \
- "${PROG} remove: scheduling .file1. for removal
- ${PROG} remove: scheduling .file2. for removal
- ${PROG} remove: use .${PROG} commit. to remove these files permanently"
- dotest conflicts3-11 "${testcvs} -q ci -m remove-them" \
- "Removing file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done
- Removing file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: delete; previous revision: 1\.1
- done"
- cd ../../1/first-dir
- dotest conflicts3-12 "${testcvs} -n -q update" \
- "${PROG} update: file1 is no longer in the repository
- ${PROG} update: file2 is no longer in the repository"
- dotest conflicts3-13 "${testcvs} -q update" \
- "${PROG} update: file1 is no longer in the repository
- ${PROG} update: file2 is no longer in the repository"
- # OK, now add a directory to both working directories
- # and see that CVS doesn't lose its mind.
- mkdir sdir
- dotest conflicts3-14 "${testcvs} add sdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/sdir added to the repository"
- touch sdir/sfile
- dotest conflicts3-14a "${testcvs} add sdir/sfile" \
- "${PROG} add: scheduling file .sdir/sfile. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest conflicts3-14b "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/sfile,v
- done
- Checking in sdir/sfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/sfile,v <-- sfile
- initial revision: 1\.1
- done"
- cd ../../2/first-dir
- # Create a CVS directory without the proper administrative
- # files in it. This can happen for example if you hit ^C
- # in the middle of a checkout.
- mkdir sdir
- mkdir sdir/CVS
- # OK, in the local case CVS sees that the directory exists
- # in the repository and recurses into it. In the remote case
- # CVS can't see the repository and has no way of knowing
- # that sdir is even a directory (stat'ing everything would be
- # too slow). The remote behavior makes more sense to me (but
- # would this affect other cases?).
- if $remote; then
- dotest conflicts3-15 "${testcvs} -q update" \
- "${QUESTION} sdir"
- else
- dotest conflicts3-15 "${testcvs} -q update" \
- "${QUESTION} sdir
- ${PROG} update: ignoring sdir (CVS/Repository missing)"
- touch sdir/CVS/Repository
- dotest conflicts3-16 "${testcvs} -q update" \
- "${QUESTION} sdir
- ${PROG} update: ignoring sdir (CVS/Entries missing)"
- cd ..
- dotest conflicts3-16a "${testcvs} -q update first-dir" \
- "${QUESTION} first-dir/sdir
- ${PROG} update: ignoring first-dir/sdir (CVS/Entries missing)"
- cd first-dir
- fi
- rm -r sdir
- # OK, now the same thing, but the directory doesn't exist
- # in the repository.
- mkdir newdir
- mkdir newdir/CVS
- dotest conflicts3-17 "${testcvs} -q update" "${QUESTION} newdir"
- echo "D/newdir////" >> CVS/Entries
- dotest conflicts3-18 "${testcvs} -q update" \
- "${PROG} [a-z]*: ignoring newdir (CVS/Repository missing)"
- touch newdir/CVS/Repository
- dotest conflicts3-19 "${testcvs} -q update" \
- "${PROG} [a-z]*: ignoring newdir (CVS/Entries missing)"
- cd ..
- dotest conflicts3-20 "${testcvs} -q update first-dir" \
- "${PROG} [a-z]*: ignoring first-dir/newdir (CVS/Entries missing)"
- cd first-dir
- rm -r newdir
- # The previous tests have left CVS/Entries in something of a mess.
- # While we "should" be able to deal with that (maybe), for now
- # we just start over.
- cd ..
- rm -r first-dir
- dotest conflicts3-20a "${testcvs} -q co -l first-dir" ''
- cd first-dir
- dotest conflicts3-21 "${testcvs} -q update -d sdir" "U sdir/sfile"
- rm -r sdir/CVS
- dotest conflicts3-22 "${testcvs} -q update" "${QUESTION} sdir"
- if $remote; then
- dotest_fail conflicts3-23 "${testcvs} -q update -PdA" \
- "${QUESTION} sdir
- ${PROG} update: move away sdir/sfile; it is in the way
- C sdir/sfile"
- else
- dotest conflicts3-23 "${testcvs} -q update -PdA" \
- "${QUESTION} sdir"
- fi
- # Not that it should really affect much, but let's do the case
- # where sfile has been removed. For example, suppose that sdir
- # had been a CVS-controlled directory which was then removed
- # by removing each file (and using update -P or some such). Then
- # suppose that the build process creates an sdir directory which
- # is not supposed to be under CVS.
- rm -r sdir
- dotest conflicts3-24 "${testcvs} -q update -d sdir" "U sdir/sfile"
- rm sdir/sfile
- dotest conflicts3-25 "${testcvs} rm sdir/sfile" \
- "${PROG} remove: scheduling .sdir/sfile. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest conflicts3-26 "${testcvs} ci -m remove sdir/sfile" \
- "Removing sdir/sfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir/sfile,v <-- sfile
- new revision: delete; previous revision: 1\.1
- done"
- rm -r sdir/CVS
- dotest conflicts3-27 "${testcvs} -q update" "${QUESTION} sdir"
- dotest conflicts3-28 "${testcvs} -q update -PdA" \
- "${QUESTION} sdir"
- cd ../..
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- conflicts4)
- mkdir conflicts4; cd conflicts4
- mkdir 1; cd 1
- dotest conflicts4-1 "$testcvs -q co -l ."
- mkdir first-dir
- dotest conflicts4-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd ..
- mkdir 2; cd 2
- dotest conflicts4-3 "${testcvs} -q co -l first-dir" ''
- cd ../1/first-dir
- echo baseline >file1
- dotest conflicts4-4 "${testcvs} -q add file1" \
- "$PROG add: use .$PROG commit. to add this file permanently"
- dotest conflicts4-5 "${testcvs} -q ci -m add-it" \
- "RCS file: $CVSROOT_DIRNAME/first-dir/file1,v
- done
- Checking in file1;
- $CVSROOT_DIRNAME/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- cd ../../2/first-dir
- dotest conflicts4-6 "${testcvs} -q update" "U file1"
- # Make a local change
- echo wibble2 >> file1
- dotest conflicts4-7 "${testcvs} -q ci -m update2" \
- "Checking in file1;
- $CVSROOT_DIRNAME/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../../1/first-dir
- echo wibble1 >>file1
- dotest conflicts4-8 "${testcvs} -Q update" \
- "RCS file: $CVSROOT_DIRNAME/first-dir/file1,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into file1
- rcsmerge: warning: conflicts during merge
- cvs update: conflicts found in file1"
- dotest_fail conflicts4-9 "${testcvs} -q update" \
- "C file1"
- if $remote; then
- cat >$TESTDIR/conflicts4/serveme <<EOF
- #!$TESTSHELL
- # This is admittedly a bit cheezy, in the sense that we make lots
- # of assumptions about what the client is going to send us.
- # We don't mention Repository, because current clients don't require it.
- # Sending these at our own pace, rather than waiting for the client to
- # make the requests, is bogus, but hopefully we can get away with it.
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update Global_option"
- echo "ok"
- echo "MT text C "
- echo "MT fname file1"
- echo "MT newline"
- echo "error "
- cat >$TESTDIR/conflicts4/client.out
- EOF
- # Cygwin. Pthffffffffft!
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod +x $TESTDIR/conflicts4/serveme"
- else
- chmod +x $TESTDIR/conflicts4/serveme
- fi
- save_CVS_SERVER=$CVS_SERVER
- CVS_SERVER=$TESTDIR/conflicts4/serveme; export CVS_SERVER
- dotest_fail conflicts4-10r "$testcvs -q up" "C file1"
- dotest conflicts4-11r "cat $TESTDIR/conflicts4/client.out" \
- "$DOTSTAR
- Argument --
- Directory .
- $CVSROOT_DIRNAME/first-dir
- Entry /file1/1.2/$PLUS=//
- Modified file1
- u=.*,g=.*,o=.*
- 59
- baseline
- ""<<<<<<< file1
- wibble1
- ""=======
- wibble2
- "">>>>>>> 1.2
- update"
- cat >$TESTDIR/conflicts4/serveme <<EOF
- #!$TESTSHELL
- # This is admittedly a bit cheezy, in the sense that we make lots
- # of assumptions about what the client is going to send us.
- # We don't mention Repository, because current clients don't require it.
- # Sending these at our own pace, rather than waiting for the client to
- # make the requests, is bogus, but hopefully we can get away with it.
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update Global_option Empty-conflicts"
- echo "ok"
- echo "MT text C "
- echo "MT fname file1"
- echo "MT newline"
- echo "error "
- cat >$TESTDIR/conflicts4/client.out
- EOF
- dotest_fail conflicts4-12r "$testcvs -q up" "C file1"
- dotest conflicts4-13r "cat $TESTDIR/conflicts4/client.out" \
- "$DOTSTAR
- Argument --
- Directory .
- $CVSROOT_DIRNAME/first-dir
- Entry /file1/1.2/$PLUS=//
- Unchanged file1
- update"
- CVS_SERVER=$save_CVS_SERVER; export CVS_SERVER
- fi
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../../..
- rm -rf conflicts4
- rm -rf $CVSROOT_DIRNAME/first-dir
- ;;
- clean)
- # Test update -C (overwrite local mods w/ repository copies)
- mkdir 1; cd 1
- dotest clean-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest clean-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo "The usual boring test text." > cleanme.txt
- dotest clean-3 "${testcvs} add cleanme.txt" \
- "${PROG} add: scheduling file .cleanme\.txt. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest clean-4 "${testcvs} -q ci -m clean-3" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/cleanme\.txt,v
- done
- Checking in cleanme\.txt;
- ${CVSROOT_DIRNAME}/first-dir/cleanme\.txt,v <-- cleanme\.txt
- initial revision: 1\.1
- done"
- # Okay, preparation is done, now test.
- # Check that updating an unmodified copy works.
- dotest clean-5 "${testcvs} -q update" ''
- # Check that updating -C an unmodified copy works.
- dotest clean-6 "${testcvs} -q update -C" ''
- # Check that updating a modified copy works.
- echo "fish" >> cleanme.txt
- dotest clean-7 "${testcvs} -q update" 'M cleanme\.txt'
- # Check that updating -C a modified copy works.
- dotest clean-8 "${testcvs} -q update -C" \
- "(Locally modified cleanme\.txt moved to \.#cleanme\.txt\.1\.1)
- U cleanme\.txt"
- # And check that the backup copy really was made.
- dotest clean-9 "cat .#cleanme.txt.1.1" \
- "The usual boring test text\.
- fish"
- # Do it all again, this time naming the file explicitly.
- rm .#cleanme.txt.1.1
- dotest clean-10 "${testcvs} -q update cleanme.txt" ''
- dotest clean-11 "${testcvs} -q update -C cleanme.txt" ''
- echo "bluegill" >> cleanme.txt
- dotest clean-12 "${testcvs} -q update cleanme.txt" 'M cleanme\.txt'
- dotest clean-13 "${testcvs} -q update -C cleanme.txt" \
- "(Locally modified cleanme\.txt moved to \.#cleanme\.txt\.1\.1)
- U cleanme\.txt"
- # And check that the backup copy really was made.
- dotest clean-14 "cat .#cleanme.txt.1.1" \
- "The usual boring test text\.
- bluegill"
- # Now try with conflicts
- cd ..
- dotest clean-15 "${testcvs} -q co -d second-dir first-dir" \
- 'U second-dir/cleanme\.txt'
- cd second-dir
- echo "conflict test" >> cleanme.txt
- dotest clean-16 "${testcvs} -q ci -m." \
- "Checking in cleanme\.txt;
- ${CVSROOT_DIRNAME}/first-dir/cleanme\.txt,v <-- cleanme\.txt
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../first-dir
- echo "fish" >> cleanme.txt
- dotest clean-17 "${testcvs} -nq update" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/cleanme\.txt,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into cleanme\.txt
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in cleanme\.txt
- C cleanme\.txt"
- dotest clean-18 "${testcvs} -q update -C" \
- "(Locally modified cleanme\.txt moved to \.#cleanme\.txt\.1\.1)
- U cleanme\.txt"
- dotest clean-19 "cat .#cleanme.txt.1.1" \
- "The usual boring test text\.
- fish"
-
- # Done. Clean up.
- cd ../..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- modules)
- # Tests of various ways to define and use modules.
- # Roadmap to various modules tests:
- # -a:
- # error on incorrect placement: modules
- # error combining with other options: modules2-a*
- # infinite loops: modules148a1.1 - modules148a1.2
- # use to specify a file more than once: modules3
- # use with ! feature: modules4
- # regular modules: modules, modules2, cvsadm
- # ampersand modules: modules2
- # -s: modules.
- # -d: modules, modules3, cvsadm
- # -i, -o, -u, -e, -t: modules5
- # slashes in module names: modules3
- # invalid module definitions: modules6
- ############################################################
- # These tests are to make sure that administrative files get
- # rebuilt, regardless of how and where files are checked
- # out.
- ############################################################
- # Check out the whole repository
- mkdir 1; cd 1
- dotest modules-1 "${testcvs} -q co ." 'U CVSROOT/checkoutlist
- U CVSROOT/commitinfo
- U CVSROOT/config
- U CVSROOT/cvswrappers
- U CVSROOT/editinfo
- U CVSROOT/loginfo
- U CVSROOT/modules
- U CVSROOT/notify
- U CVSROOT/rcsinfo
- U CVSROOT/taginfo
- U CVSROOT/verifymsg'
- echo "# made a change" >>CVSROOT/modules
- dotest modules-1d "${testcvs} -q ci -m add-modules" \
- "Checking in CVSROOT/modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- rm -rf 1
- ############################################################
- # Check out CVSROOT
- mkdir 1; cd 1
- dotest modules-2 "${testcvs} -q co CVSROOT" 'U CVSROOT/checkoutlist
- U CVSROOT/commitinfo
- U CVSROOT/config
- U CVSROOT/cvswrappers
- U CVSROOT/editinfo
- U CVSROOT/loginfo
- U CVSROOT/modules
- U CVSROOT/notify
- U CVSROOT/rcsinfo
- U CVSROOT/taginfo
- U CVSROOT/verifymsg'
- echo "# made a change" >>CVSROOT/modules
- dotest modules-2d "${testcvs} -q ci -m add-modules" \
- "Checking in CVSROOT/modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- rm -rf 1
- ############################################################
- # Check out CVSROOT in some other directory
- mkdir ${CVSROOT_DIRNAME}/somedir
- mkdir 1; cd 1
- dotest modules-3 "${testcvs} -q co somedir" ''
- cd somedir
- dotest modules-3d "${testcvs} -q co CVSROOT" 'U CVSROOT/checkoutlist
- U CVSROOT/commitinfo
- U CVSROOT/config
- U CVSROOT/cvswrappers
- U CVSROOT/editinfo
- U CVSROOT/loginfo
- U CVSROOT/modules
- U CVSROOT/notify
- U CVSROOT/rcsinfo
- U CVSROOT/taginfo
- U CVSROOT/verifymsg'
- echo "# made a change" >>CVSROOT/modules
- dotest modules-3g "${testcvs} -q ci -m add-modules" \
- "Checking in CVSROOT/modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/somedir
- ############################################################
- # end rebuild tests
- ############################################################
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1
- cd 1
- dotest modules-143 "${testcvs} -q co first-dir" ""
- cd first-dir
- mkdir subdir
- dotest modules-143a "${testcvs} add subdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/subdir added to the repository"
- cd subdir
- mkdir ssdir
- dotest modules-143b "${testcvs} add ssdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/subdir/ssdir added to the repository"
- touch a b
- dotest modules-144 "${testcvs} add a b" \
- "${PROG} add: scheduling file .a. for addition
- ${PROG} add: scheduling file .b. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest modules-145 "${testcvs} ci -m added" \
- "${PROG} [a-z]*: Examining .
- ${PROG} [a-z]*: Examining ssdir
- RCS file: ${CVSROOT_DIRNAME}/first-dir/subdir/a,v
- done
- Checking in a;
- ${CVSROOT_DIRNAME}/first-dir/subdir/a,v <-- a
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/subdir/b,v
- done
- Checking in b;
- ${CVSROOT_DIRNAME}/first-dir/subdir/b,v <-- b
- initial revision: 1\.1
- done"
- cd ..
- dotest modules-146 "${testcvs} -q co CVSROOT" \
- "U CVSROOT/checkoutlist
- U CVSROOT/commitinfo
- U CVSROOT/config
- U CVSROOT/cvswrappers
- U CVSROOT/editinfo
- U CVSROOT/loginfo
- U CVSROOT/modules
- U CVSROOT/notify
- U CVSROOT/rcsinfo
- U CVSROOT/taginfo
- U CVSROOT/verifymsg"
- # Here we test that CVS can deal with CVSROOT (whose repository
- # is at top level) in the same directory as subdir (whose repository
- # is a subdirectory of first-dir). TODO: Might want to check that
- # files can actually get updated in this state.
- dotest modules-147 "${testcvs} -q update" ""
- cat >CVSROOT/modules <<EOF
- realmodule first-dir/subdir a
- dirmodule first-dir/subdir
- namedmodule -d nameddir first-dir/subdir
- aliasmodule -a first-dir/subdir/a
- aliasnested -a first-dir/subdir/ssdir
- topfiles -a first-dir/file1 first-dir/file2
- world -a .
- statusmod -s Mungeable
- # Check for ability to block infinite loops.
- infinitealias -a infinitealias
- # Prior to 1.11.12 & 1.12.6, the infinite alias loop check didn't strip
- # slashes or work if a module called a module which then called itself
- # (A -> A was blocked, but not A -> B -> A or deeper).
- infinitealias2 -a infinitealias2/
- infinitealias3 -a infinitealias4/
- infinitealias4 -a aliasmodule infinitealias5
- infinitealias5 -a infinitealias3/
- # Options must come before arguments. It is possible this should
- # be relaxed at some point (though the result would be bizarre for
- # -a); for now test the current behavior.
- bogusalias first-dir/subdir/a -a
- EOF
- dotest modules-148 "${testcvs} ci -m 'add modules' CVSROOT/modules" \
- "Checking in CVSROOT/modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- # The "statusmod" module contains an error; trying to use it
- # will produce "modules file missing directory" I think.
- # However, that shouldn't affect the ability of "cvs co -c" or
- # "cvs co -s" to do something reasonable with it.
- dotest modules-148a0 "${testcvs} co -c" 'aliasmodule -a first-dir/subdir/a
- aliasnested -a first-dir/subdir/ssdir
- bogusalias first-dir/subdir/a -a
- dirmodule first-dir/subdir
- infinitealias -a infinitealias
- infinitealias2 -a infinitealias2/
- infinitealias3 -a infinitealias4/
- infinitealias4 -a aliasmodule infinitealias5
- infinitealias5 -a infinitealias3/
- namedmodule -d nameddir first-dir/subdir
- realmodule first-dir/subdir a
- statusmod -s Mungeable
- topfiles -a first-dir/file1 first-dir/file2
- world -a \.'
- # There is code in modules.c:save_d which explicitly skips
- # modules defined with -a, which is why aliasmodule is not
- # listed.
- dotest modules-148a1 "${testcvs} co -s" \
- 'statusmod Mungeable
- bogusalias NONE first-dir/subdir/a -a
- dirmodule NONE first-dir/subdir
- namedmodule NONE first-dir/subdir
- realmodule NONE first-dir/subdir a'
- # Check that infinite loops are avoided
- dotest modules-148a1.1 "${testcvs} co infinitealias" \
- "$PROG checkout: module \`infinitealias' in modules file contains infinite loop" \
- "$PROG server: module \`infinitealias' in modules file contains infinite loop
- $PROG checkout: module \`infinitealias' in modules file contains infinite loop"
- # Prior to 1.11.12 & 1.12.6, the inifinte alias loop check did not
- # strip slashes.
- dotest modules-148a1.2 "${testcvs} co infinitealias2" \
- "$PROG checkout: module \`infinitealias2' in modules file contains infinite loop" \
- "$PROG server: module \`infinitealias2' in modules file contains infinite loop
- $PROG checkout: module \`infinitealias2' in modules file contains infinite loop"
- # Prior to 1.11.12 & 1.12.6, the inifinte alias loop check did not
- # notice when A -> B -> A, it only noticed A -> A.
- dotest modules-148a1.3 "${testcvs} co infinitealias3/" \
- "$PROG checkout: module \`infinitealias3' in modules file contains infinite loop" \
- "$PROG server: module \`infinitealias3' in modules file contains infinite loop
- $PROG checkout: module \`infinitealias3' in modules file contains infinite loop"
- # Test that real modules check out to realmodule/a, not subdir/a.
- dotest modules-149a1 "${testcvs} co realmodule" "U realmodule/a"
- dotest modules-149a2 "test -d realmodule && test -f realmodule/a" ""
- dotest_fail modules-149a3 "test -f realmodule/b" ""
- dotest modules-149a4 "${testcvs} -q co realmodule" ""
- dotest modules-149a5 "echo yes | ${testcvs} release -d realmodule" \
- "You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .realmodule.: "
- dotest_fail modules-149b1 "${testcvs} co realmodule/a" \
- "${PROG}"' checkout: module `realmodule/a'\'' is a request for a file in a module which is not a directory' \
- "${PROG}"' server: module `realmodule/a'\'' is a request for a file in a module which is not a directory
- '"${PROG}"' \[checkout aborted\]: cannot expand modules'
- # Now test the ability to check out a single file from a directory
- dotest modules-150c "${testcvs} co dirmodule/a" "U dirmodule/a"
- dotest modules-150d "test -d dirmodule && test -f dirmodule/a" ""
- dotest_fail modules-150e "test -f dirmodule/b" ""
- dotest modules-150f "echo yes | ${testcvs} release -d dirmodule" \
- "You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .dirmodule.: "
- # Now test the ability to correctly reject a non-existent filename.
- # For maximum studliness we would check that an error message is
- # being output.
- # We accept a zero exit status because it is what CVS does
- # (Dec 95). Probably the exit status should be nonzero,
- # however.
- dotest modules-150g1 "${testcvs} co dirmodule/nonexist" \
- "${PROG} checkout: warning: new-born dirmodule/nonexist has disappeared"
- # We tolerate the creation of the dirmodule directory, since that
- # is what CVS does, not because we view that as preferable to not
- # creating it.
- dotest_fail modules-150g2 "test -f dirmodule/a || test -f dirmodule/b" ""
- rm -r dirmodule
- # Now test that a module using -d checks out to the specified
- # directory.
- dotest modules-150h1 "${testcvs} -q co namedmodule" \
- 'U nameddir/a
- U nameddir/b'
- dotest modules-150h2 "test -f nameddir/a && test -f nameddir/b" ""
- echo add line >>nameddir/a
- dotest modules-150h3 "${testcvs} -q co namedmodule" 'M nameddir/a'
- rm nameddir/a
- dotest modules-150h4 "${testcvs} -q co namedmodule" 'U nameddir/a'
- dotest modules-150h99 "echo yes | ${testcvs} release -d nameddir" \
- "You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .nameddir.: "
- # Now test that alias modules check out to subdir/a, not
- # aliasmodule/a.
- dotest modules-151 "${testcvs} co aliasmodule" ""
- dotest_fail modules-152 "test -d aliasmodule" ""
- echo abc >>first-dir/subdir/a
- dotest modules-153 "${testcvs} -q co aliasmodule" "M first-dir/subdir/a"
- cd ..
- rm -r 1
- mkdir 2
- cd 2
- dotest modules-155a0 "${testcvs} co aliasnested" \
- "${PROG} checkout: Updating first-dir/subdir/ssdir"
- dotest modules-155a1 "test -d first-dir" ''
- dotest modules-155a2 "test -d first-dir/subdir" ''
- dotest modules-155a3 "test -d first-dir/subdir/ssdir" ''
- # Test that nothing extraneous got created.
- dotest modules-155a4 "ls" "first-dir" \
- "CVS
- first-dir"
- cd ..
- rm -r 2
- # Test checking out everything.
- mkdir 1
- cd 1
- dotest modules-155b "${testcvs} -q co world" \
- "U CVSROOT/${DOTSTAR}
- U first-dir/subdir/a
- U first-dir/subdir/b"
- cd ..
- rm -r 1
- # Test checking out a module which lists at least two
- # specific files twice. At one time, this failed over
- # remote CVS.
- mkdir 1
- cd 1
- dotest modules-155c1 "${testcvs} -q co first-dir" \
- "U first-dir/subdir/a
- U first-dir/subdir/b"
- cd first-dir
- echo 'first revision' > file1
- echo 'first revision' > file2
- dotest modules-155c2 "${testcvs} add file1 file2" \
- "${PROG}"' add: scheduling file `file1'\'' for addition
- '"${PROG}"' add: scheduling file `file2'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add these files permanently'
- dotest modules-155c3 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- cd ..
- rm -r first-dir
- dotest modules-155c4 "${testcvs} -q co topfiles" \
- "U first-dir/file1
- U first-dir/file2"
- dotest modules-155c5 "${testcvs} -q co topfiles" ""
- # Make sure the right thing happens if we remove a file.
- cd first-dir
- dotest modules-155c6 "${testcvs} -q rm -f file1" \
- "${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest modules-155c7 "${testcvs} -q ci -m remove-it" \
- "Removing file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done"
- cd ..
- rm -r first-dir
- dotest modules-155c8 "${testcvs} -q co topfiles" \
- "${PROG} checkout: warning: first-dir/file1 is not (any longer) pertinent
- U first-dir/file2"
- cd ..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- modules2)
- # More tests of modules, in particular the & feature.
- mkdir 1; cd 1
- dotest modules2-setup-1 "${testcvs} -q co -l ." ''
- mkdir first-dir second-dir third-dir
- dotest modules2-setup-2 \
- "${testcvs} add first-dir second-dir third-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository
- Directory ${CVSROOT_DIRNAME}/second-dir added to the repository
- Directory ${CVSROOT_DIRNAME}/third-dir added to the repository"
- cd third-dir
- touch file3
- dotest modules2-setup-3 "${testcvs} add file3" \
- "${PROG} add: scheduling file .file3. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest modules2-setup-4 "${testcvs} -q ci -m add file3" \
- "RCS file: ${CVSROOT_DIRNAME}/third-dir/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/third-dir/file3,v <-- file3
- initial revision: 1\.1
- done"
- cd ../..
- rm -r 1
- mkdir 1
- cd 1
- dotest modules2-1 "${testcvs} -q co CVSROOT/modules" \
- 'U CVSROOT/modules'
- cd CVSROOT
- cat >> modules << EOF
- ampermodule &first-dir &second-dir
- combmodule third-dir file3 &first-dir
- ampdirmod -d newdir &first-dir &second-dir
- badmod -d newdir
- messymod first-dir &messymodchild
- messymodchild -d sdir/child second-dir
- EOF
- # Depending on whether the user also ran the modules test
- # we will be checking in revision 1.2 or 1.3.
- dotest modules2-2 "${testcvs} -q ci -m add-modules" \
- "Checking in modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- dotest modules2-3 "${testcvs} -q co ampermodule" ''
- dotest modules2-4 "test -d ampermodule/first-dir" ''
- dotest modules2-5 "test -d ampermodule/second-dir" ''
- # Test ability of cvs release to handle multiple arguments
- # See comment at "release" for list of other cvs release tests.
- cd ampermodule
- if ${testcvs} release -d first-dir second-dir <<EOF >>${LOGFILE}
- yes
- yes
- EOF
- then
- pass modules2-6
- else
- fail modules2-6
- fi
- dotest_fail modules2-7 "test -d first-dir" ''
- dotest_fail modules2-8 "test -d second-dir" ''
- cd ..
- # There used to be a nasty-hack that made CVS skip creation of the
- # module dir (in this case ampermodule) when -n was specified
- dotest modules2-ampermod-1 "${testcvs} -q co -n ampermodule" ''
- dotest modules2-ampermod-2 "test -d ampermodule/first-dir" ''
- dotest modules2-ampermod-3 "test -d ampermodule/second-dir" ''
- # Test release of a module
- if echo yes |${testcvs} release -d ampermodule >>${LOGFILE}; then
- pass modules2-ampermod-release-1
- else
- fail modules2-ampermod-release-1
- fi
- dotest_fail modules2-ampermod-release-2 "test -d ampermodule" ''
- # and the '-n' test again, but in conjunction with '-d'
- dotest modules2-ampermod-4 "${testcvs} -q co -n -d newname ampermodule" ''
- dotest modules2-ampermod-5 "test -d newname/first-dir" ''
- dotest modules2-ampermod-6 "test -d newname/second-dir" ''
- rm -rf newname
- # Now we create another directory named first-dir and make
- # sure that CVS doesn't get them mixed up.
- mkdir first-dir
- # Note that this message should say "Updating ampermodule/first-dir"
- # I suspect. This is a long-standing behavior/bug....
- dotest modules2-9 "${testcvs} co ampermodule" \
- "${PROG} checkout: Updating first-dir
- ${PROG} checkout: Updating second-dir"
- touch ampermodule/first-dir/amper1
- cd ampermodule
- dotest modules2-10 "${testcvs} add first-dir/amper1" \
- "${PROG} add: scheduling file .first-dir/amper1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- cd ..
- # As with the "Updating xxx" message, the "U first-dir/amper1"
- # message (instead of "U ampermodule/first-dir/amper1") is
- # rather fishy.
- dotest modules2-12 "${testcvs} co ampermodule" \
- "${PROG} checkout: Updating first-dir
- A first-dir/amper1
- ${PROG} checkout: Updating second-dir"
- if $remote; then
- dotest modules2-13 "${testcvs} -q ci -m add-it ampermodule" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/amper1,v
- done
- Checking in ampermodule/first-dir/amper1;
- ${CVSROOT_DIRNAME}/first-dir/amper1,v <-- amper1
- initial revision: 1\.1
- done"
- else
- # Trying this as above led to a "protocol error" message.
- # Work around this bug.
- cd ampermodule
- dotest modules2-13 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/amper1,v
- done
- Checking in first-dir/amper1;
- ${CVSROOT_DIRNAME}/first-dir/amper1,v <-- amper1
- initial revision: 1\.1
- done"
- cd ..
- fi
- cd ..
- rm -r 1
- # Now test the "combmodule" module (combining regular modules
- # and ampersand modules in the same module definition).
- mkdir 1; cd 1
- dotest modules2-14 "${testcvs} co combmodule" \
- "U combmodule/file3
- ${PROG} checkout: Updating first-dir
- U first-dir/amper1"
- dotest modules2-15 "test -f combmodule/file3" ""
- dotest modules2-16 "test -f combmodule/first-dir/amper1" ""
- cd combmodule
- rm -r first-dir
- # At least for now there is no way to tell CVS that
- # some files/subdirectories come from one repository directory,
- # and others from another.
- # This seems like a pretty sensible behavior to me, in the
- # sense that first-dir doesn't "really" exist within
- # third-dir, so CVS just acts as if there is nothing there
- # to do.
- dotest modules2-17 "${testcvs} update -d" \
- "${PROG} update: Updating \."
- cd ..
- dotest modules2-18 "${testcvs} -q co combmodule" \
- "U first-dir/amper1"
- dotest modules2-19 "test -f combmodule/first-dir/amper1" ""
- cd ..
- rm -r 1
- # Now test the "ampdirmod" and "badmod" modules to be sure that
- # options work with ampersand modules but don't prevent the
- # "missing directory" error message.
- mkdir 1; cd 1
- dotest modules2-20 "${testcvs} co ampdirmod" \
- "${PROG} checkout: Updating first-dir
- U first-dir/amper1
- ${PROG} checkout: Updating second-dir"
- dotest modules2-21 "test -f newdir/first-dir/amper1" ""
- dotest modules2-22 "test -d newdir/second-dir" ""
- dotest_fail modules2-23 "${testcvs} co badmod" \
- "${PROG} checkout: modules file missing directory for module badmod" \
- "${PROG} server: modules file missing directory for module badmod
- ${PROG} \[checkout aborted\]: cannot expand modules"
- cd ..
- rm -r 1
- # Confirm that a rename with added depth nested in an ampersand
- # module works.
- mkdir 1; cd 1
- dotest modules2-nestedrename-1 "${testcvs} -q co messymod" \
- "U messymod/amper1"
- dotest modules2-nestedrename-2 "test -d messymod/sdir" ''
- dotest modules2-nestedrename-3 "test -d messymod/sdir/CVS" ''
- dotest modules2-nestedrename-4 "test -d messymod/sdir/child" ''
- dotest modules2-nestedrename-5 "test -d messymod/sdir/child/CVS" ''
- cd ..; rm -r 1
- # FIXME: client/server has a bug. It should be working like a local
- # repository in this case, but fails to check out the second module
- # in the list when a branch is specified.
- mkdir 1; cd 1
- dotest modules2-ampertag-setup-1 \
- "${testcvs} -Q rtag tag first-dir second-dir third-dir" \
- ''
- dotest modules2-ampertag-1 "${testcvs} -q co -rtag ampermodule" \
- "U first-dir/amper1"
- if $remote; then
- dotest_fail modules2-ampertag-2 "test -d ampermodule/second-dir" ''
- dotest_fail modules2-ampertag-3 "test -d ampermodule/second-dir/CVS" ''
- else
- dotest modules2-ampertag-2 "test -d ampermodule/second-dir" ''
- dotest modules2-ampertag-3 "test -d ampermodule/second-dir/CVS" ''
- fi
- cd ..; rm -r 1
- # Test for tag files when an ampermod is renamed with more path
- # elements than it started with.
- #
- # FIXME: This is currently broken in the remote case, possibly only
- # because the messymodchild isn't being checked out at all.
- mkdir 1; cd 1
- # dotest modules2-tagfiles-setup-1 \
- #"${testcvs} -Q rtag -b branch first-dir second-dir" \
- #''
- dotest modules2-tagfiles-1 "${testcvs} -q co -rtag messymod" \
- "U messymod/amper1"
- if $remote; then
- dotest_fail modules2-tagfiles-2r "test -d messymod/sdir" ''
- else
- dotest modules2-tagfiles-2 "cat messymod/sdir/CVS/Tag" 'Ttag'
- fi
- cd ..; rm -r 1
- # Test that CVS gives an error if one combines -a with
- # other options.
- # Probably would be better to break this out into a separate
- # test. Although it is short, it shares no files/state with
- # the rest of the modules2 tests.
- mkdir 1; cd 1
- dotest modules2-a0.5 "${testcvs} -q co CVSROOT/modules" \
- 'U CVSROOT/modules'
- cd CVSROOT
- echo 'aliasopt -a -d onedir first-dir' >modules
- dotest modules2-a0 "${testcvs} -q ci -m add-modules" \
- "Checking in modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- dotest_fail modules2-a1 "${testcvs} -q co aliasopt" \
- "${PROG} checkout: -a cannot be specified in the modules file along with other options" \
- "${PROG} server: -a cannot be specified in the modules file along with other options
- ${PROG} \[checkout aborted\]: cannot expand modules"
- cd ..; rm -r 1
- # Clean up.
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -rf ${CVSROOT_DIRNAME}/second-dir
- rm -rf ${CVSROOT_DIRNAME}/third-dir
- ;;
- modules3)
- # More tests of modules, in particular what happens if several
- # modules point to the same file.
- # First just set up a directory first-dir and a file file1 in it.
- mkdir 1; cd 1
- dotest modules3-0 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest modules3-1 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo file1 >file1
- dotest modules3-2 "${testcvs} add file1" \
- "${PROG} add: scheduling file \`file1' for addition
- ${PROG} add: use '${PROG} commit' to add this file permanently"
- dotest modules3-3 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- cd ..
- dotest modules3-4 "${testcvs} -q update -d CVSROOT" \
- "U CVSROOT${DOTSTAR}"
- cd CVSROOT
- cat >modules <<EOF
- mod1 -a first-dir/file1
- bigmod -a mod1 first-dir/file1
- namednest -d src/sub/dir first-dir
- nestdeeper -d src/sub1/sub2/sub3/dir first-dir
- nestshallow -d src/dir second-dir/suba/subb
- path/in/modules &mod1
- another/path/test -d another/path/test first-dir
- EOF
- dotest modules3-5 "${testcvs} -q ci -m add-modules" \
- "Checking in modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- dotest modules3-6 "${testcvs} -q co bigmod" ''
- rm -r first-dir
- dotest modules3-7 "${testcvs} -q co bigmod" 'U first-dir/file1'
- cd ..
- rm -r 1
- mkdir 1; cd 1
- mkdir suba
- mkdir suba/subb
- # This fails to work remote (it doesn't notice the directories,
- # I suppose because they contain no files). Bummer, especially
- # considering this is a documented technique and everything.
- dotest modules3-7a \
- "${testcvs} import -m add-dirs second-dir tag1 tag2" \
- "${PROG} import: Importing ${CVSROOT_DIRNAME}/second-dir/suba
- ${PROG} import: Importing ${CVSROOT_DIRNAME}/second-dir/suba/subb
- No conflicts created by this import" "
- No conflicts created by this import"
- cd ..; rm -r 1
- mkdir 1; cd 1
- dotest modules3-7b "${testcvs} co second-dir" \
- "${PROG} checkout: Updating second-dir
- ${PROG} checkout: Updating second-dir/suba
- ${PROG} checkout: Updating second-dir/suba/subb" \
- "${PROG} checkout: Updating second-dir"
- if $remote; then
- cd second-dir
- mkdir suba
- dotest modules3-7-workaround1 "${testcvs} add suba" \
- "Directory ${CVSROOT_DIRNAME}/second-dir/suba added to the repository"
- cd suba
- mkdir subb
- dotest modules3-7-workaround2 "${testcvs} add subb" \
- "Directory ${CVSROOT_DIRNAME}/second-dir/suba/subb added to the repository"
- cd ../..
- fi
- cd second-dir/suba/subb
- touch fileb
- dotest modules3-7c "${testcvs} add fileb" \
- "${PROG} add: scheduling file .fileb. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest modules3-7d "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/second-dir/suba/subb/fileb,v
- done
- Checking in fileb;
- ${CVSROOT_DIRNAME}/second-dir/suba/subb/fileb,v <-- fileb
- initial revision: 1\.1
- done"
- cd ../../..
- cd ..; rm -r 1
- mkdir 1
- cd 1
- dotest modules3-8 "${testcvs} -q co namednest" \
- 'U src/sub/dir/file1'
- dotest modules3-9 "test -f src/sub/dir/file1" ''
- cd ..
- rm -r 1
- # Try the same thing, but with the directories nested even
- # deeper (deeply enough so they are nested more deeply than
- # the number of directories from / to ${TESTDIR}).
- mkdir 1
- cd 1
- dotest modules3-10 "${testcvs} -q co nestdeeper" \
- 'U src/sub1/sub2/sub3/dir/file1'
- dotest modules3-11 "test -f src/sub1/sub2/sub3/dir/file1" ''
- # While we are doing things like twisted uses of '/' (e.g.
- # modules3-12), try this one.
- if $remote; then
- dotest_fail modules3-11b \
- "${testcvs} -q update ${TESTDIR}/1/src/sub1/sub2/sub3/dir/file1" \
- "absolute pathname .${TESTDIR}/1/src/sub1/sub2/sub3/dir. illegal for server"
- fi # end of remote-only tests
- cd ..
- rm -r 1
- # This one is almost too twisted for words. The pathname output
- # in the message from "co" doesn't include the "path/in/modules",
- # but those directories do get created (with no CVSADM except
- # in "modules" which has a CVSNULLREPOS).
- # I'm not sure anyone is relying on this nonsense or whether we
- # need to keep doing it, but it is what CVS currently does...
- # Skip it for remote; the remote code has the good sense to
- # not deal with it (on the minus side it gives
- # "internal error: repository string too short." (CVS 1.9) or
- # "warning: server is not creating directories one at a time" (now)
- # instead of a real error).
- # I'm tempted to just make it a fatal error to have '/' in a
- # module name. But see comments at modules3-16.
- if $remote; then :; else
- mkdir 1; cd 1
- dotest modules3-12 "${testcvs} -q co path/in/modules" \
- "U first-dir/file1"
- dotest modules3-13 "test -f path/in/modules/first-dir/file1" ''
- cd ..; rm -r 1
- fi # end of tests skipped for remote
- # Now here is where it used to get seriously bogus.
- mkdir 1; cd 1
- dotest modules3-14 \
- "${testcvs} -q rtag tag1 path/in/modules" ''
- # CVS used to create this even though rtag should *never* affect
- # the directory current when it is called!
- dotest_fail modules3-15 "test -d path/in/modules" ''
- # Just for trivia's sake, rdiff was not similarly vulnerable
- # because it passed 0 for run_module_prog to do_module.
- cd ..; rm -r 1
- # Some people seem to want this to work. I still suspect there
- # are dark corners in slashes in module names. This probably wants
- # more thought before we start hacking on CVS (one way or the other)
- # or documenting this.
- mkdir 2; cd 2
- dotest modules3-16 "${testcvs} -q co another/path/test" \
- "U another/path/test/file1"
- dotest modules3-17 "cat another/path/test/file1" 'file1'
- cd ..; rm -r 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -rf ${CVSROOT_DIRNAME}/second-dir
- ;;
- modules4)
- # Some tests using the modules file with aliases that
- # exclude particular directories.
- mkdir 1; cd 1
- dotest modules4-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest modules4-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- mkdir subdir subdir_long
- dotest modules4-3 "${testcvs} add subdir subdir_long" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/subdir added to the repository
- Directory ${CVSROOT_DIRNAME}/first-dir/subdir_long added to the repository"
- echo file1 > file1
- dotest modules4-4 "${testcvs} add file1" \
- "${PROG}"' add: scheduling file `file1'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- echo file2 > subdir/file2
- dotest modules4-5 "${testcvs} add subdir/file2" \
- "${PROG}"' add: scheduling file `subdir/file2'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- echo file3 > subdir_long/file3
- dotest modules4-6 "${testcvs} add subdir_long/file3" \
- "${PROG}"' add: scheduling file `subdir_long/file3'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest modules4-7 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/subdir/file2,v
- done
- Checking in subdir/file2;
- ${CVSROOT_DIRNAME}/first-dir/subdir/file2,v <-- file2
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/subdir_long/file3,v
- done
- Checking in subdir_long/file3;
- ${CVSROOT_DIRNAME}/first-dir/subdir_long/file3,v <-- file3
- initial revision: 1\.1
- done"
- cd ..
- dotest modules4-8 "${testcvs} -q update -d CVSROOT" \
- "U CVSROOT${DOTSTAR}"
- cd CVSROOT
- cat >modules <<EOF
- all -a first-dir
- some -a !first-dir/subdir first-dir
- other -a !first-dir/subdir !first-dir/subdir_long first-dir
- somewhat -a first-dir !first-dir/subdir
- EOF
- dotest modules4-9 "${testcvs} -q ci -m add-modules" \
- "Checking in modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- cd ..
- mkdir 2; cd 2
- dotest modules4-10 "${testcvs} -q co all" \
- "U first-dir/file1
- U first-dir/subdir/file2
- U first-dir/subdir_long/file3"
- rm -r first-dir
- dotest modules4-11 "${testcvs} -q co some" \
- "U first-dir/file1
- U first-dir/subdir_long/file3"
- dotest_fail modules4-12 "test -d first-dir/subdir" ''
- dotest modules4-13 "test -d first-dir/subdir_long" ''
- rm -r first-dir
- if $remote; then
- # But remote seems to do it the other way.
- dotest modules4-14r-1 "${testcvs} -q co somewhat" \
- "U first-dir/file1
- U first-dir/subdir_long/file3"
- dotest_fail modules4-14r-2 "test -d first-dir/subdir" ''
- dotest modules4-14r-3 "test -d first-dir/subdir_long" ''
- else
- # This is strange behavior, in that the order of the
- # "!first-dir/subdir" and "first-dir" matter, and it isn't
- # clear that they should. I suspect it is long-standing
- # strange behavior but I haven't verified that.
- dotest modules4-14-1 "${testcvs} -q co somewhat" \
- "U first-dir/file1
- U first-dir/subdir/file2
- U first-dir/subdir_long/file3"
- dotest modules4-14-2 "test -d first-dir/subdir" ''
- dotest modules4-14-3 "test -d first-dir/subdir_long" ''
- fi
- rm -r first-dir
- dotest modules4-15 "${testcvs} -q co other" \
- "U first-dir/file1"
- dotest_fail modules4-16 "test -d first-dir/subdir" ''
- dotest_fail modules4-17 "test -d first-dir/subdir_long" ''
- rm -r first-dir
- cd ..
- rm -r 2
- dotest modules4-18 "${testcvs} rtag tag some" \
- "${PROG} rtag: Tagging first-dir
- ${PROG} rtag: Ignoring first-dir/subdir
- ${PROG} rtag: Tagging first-dir/subdir_long"
- cd 1/first-dir/subdir
- dotest modules4-19 "${testcvs} log file2" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/subdir/file2,v
- Working file: file2
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- add-it
- ============================================================================="
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- modules5)
- # Test module programs
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1
- cd 1
- dotest modules5-1 "${testcvs} -q co first-dir" ""
- cd first-dir
- mkdir subdir
- dotest modules5-2 "${testcvs} add subdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/subdir added to the repository"
- cd subdir
- mkdir ssdir
- dotest modules5-3 "${testcvs} add ssdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/subdir/ssdir added to the repository"
- touch a b
- dotest modules5-4 "${testcvs} add a b" \
- "${PROG} add: scheduling file .a. for addition
- ${PROG} add: scheduling file .b. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest modules5-5 "${testcvs} ci -m added" \
- "${PROG} [a-z]*: Examining .
- ${PROG} [a-z]*: Examining ssdir
- RCS file: ${CVSROOT_DIRNAME}/first-dir/subdir/a,v
- done
- Checking in a;
- ${CVSROOT_DIRNAME}/first-dir/subdir/a,v <-- a
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/subdir/b,v
- done
- Checking in b;
- ${CVSROOT_DIRNAME}/first-dir/subdir/b,v <-- b
- initial revision: 1\.1
- done"
- cd ..
- dotest modules5-6 "${testcvs} -q co CVSROOT" \
- "U CVSROOT/checkoutlist
- U CVSROOT/commitinfo
- U CVSROOT/config
- U CVSROOT/cvswrappers
- U CVSROOT/editinfo
- U CVSROOT/loginfo
- U CVSROOT/modules
- U CVSROOT/notify
- U CVSROOT/rcsinfo
- U CVSROOT/taginfo
- U CVSROOT/verifymsg"
- # FIXCVS: The sleep in the following script helps avoid out of
- # order messages, but we really need to figure out how to fix
- # cvs to prevent them in the first place.
- for i in checkout export tag; do
- cat >> ${CVSROOT_DIRNAME}/$i.sh <<EOF
- #! /bin/sh
- sleep 1
- echo "$i script invoked in \`pwd\`"
- echo "args: \$@"
- EOF
- # Cygwin doesn't set premissions correctly over the Samba share.
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod +x ${CVSROOT_DIRNAME}/$i.sh"
- else
- chmod +x ${CVSROOT_DIRNAME}/$i.sh
- fi
- done
- OPTS="-o${CVSROOT_DIRNAME}/checkout.sh -e ${CVSROOT_DIRNAME}/export.sh -t${CVSROOT_DIRNAME}/tag.sh"
- cat >CVSROOT/modules <<EOF
- realmodule ${OPTS} first-dir/subdir a
- dirmodule ${OPTS} first-dir/subdir
- namedmodule -d nameddir ${OPTS} first-dir/subdir
- EOF
- dotest modules5-7 "${testcvs} ci -m 'add modules' CVSROOT/modules" \
- "" \
- "Checking in CVSROOT/modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- rm -rf first-dir
- # Test that real modules check out to realmodule/a, not subdir/a.
- if $remote; then
- # FIXCVS?
- # Mac OSX 10.3 (Darwin ppc-osx1 5.5) fails here when $TMPDIR
- # contains a symlink (it does not fail the local modules5-8).
- # Since no other platforms are exhibiting the same problem, I
- # suspect an issue with OSX and fork() or the like dereferencing
- # the symlink, but it is possible it is something that could be
- # fixed or worked around in CVS.
- dotest modules5-8r "$testcvs co realmodule" \
- "U realmodule/a
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .realmodule..
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: realmodule"
- else
- dotest modules5-8 "${testcvs} co realmodule" \
- "U realmodule/a
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .realmodule..
- checkout script invoked in ${TESTDIR}/1
- args: realmodule"
- fi
- dotest modules5-9 "test -d realmodule && test -f realmodule/a" ""
- dotest_fail modules5-10 "test -f realmodule/b" ""
- if $remote; then
- dotest modules5-11 "${testcvs} -q co realmodule" \
- "checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: realmodule"
- dotest modules5-12 "${testcvs} -q update" ''
- echo "change" >>realmodule/a
- dotest modules5-13 "${testcvs} -q ci -m." \
- "Checking in realmodule/a;
- ${CVSROOT_DIRNAME}/first-dir/subdir/a,v <-- a
- new revision: 1\.2; previous revision: 1\.1
- done"
- else
- dotest modules5-11 "${testcvs} -q co realmodule" \
- "checkout script invoked in ${TESTDIR}/1
- args: realmodule"
- dotest modules5-12 "${testcvs} -q update" ''
- echo "change" >>realmodule/a
- dotest modules5-13 "${testcvs} -q ci -m." \
- "Checking in realmodule/a;
- ${CVSROOT_DIRNAME}/first-dir/subdir/a,v <-- a
- new revision: 1\.2; previous revision: 1\.1
- done"
- fi
- dotest modules5-14 "echo yes | ${testcvs} release -d realmodule" \
- "You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .realmodule.: "
- dotest modules5-15 "${testcvs} -q rtag -Dnow MYTAG realmodule" \
- "tag script invoked in ${TESTDIR}/1
- args: realmodule MYTAG" \
- "tag script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: realmodule MYTAG"
- if $remote; then
- dotest modules5-16 "${testcvs} -q export -r MYTAG realmodule" \
- "U realmodule/a
- export script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: realmodule"
- else
- dotest modules5-16 "${testcvs} -q export -r MYTAG realmodule" \
- "U realmodule/a
- export script invoked in ${TESTDIR}/1
- args: realmodule"
- fi
- rm -r realmodule
- dotest_fail modules5-17 "${testcvs} co realmodule/a" \
- "${PROG}"' checkout: module `realmodule/a'\'' is a request for a file in a module which is not a directory' \
- "${PROG}"' server: module `realmodule/a'\'' is a request for a file in a module which is not a directory
- '"${PROG}"' \[checkout aborted\]: cannot expand modules'
- # Now test the ability to check out a single file from a directory
- if $remote; then
- dotest modules5-18 "${testcvs} co dirmodule/a" \
- "U dirmodule/a
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .dirmodule..
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: dirmodule"
- else
- dotest modules5-18 "${testcvs} co dirmodule/a" \
- "U dirmodule/a
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .dirmodule..
- checkout script invoked in ${TESTDIR}/1
- args: dirmodule"
- fi
- dotest modules5-19 "test -d dirmodule && test -f dirmodule/a" ""
- dotest_fail modules5-20 "test -f dirmodule/b" ""
- dotest modules5-21 "echo yes | ${testcvs} release -d dirmodule" \
- "You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .dirmodule.: "
- # Now test the ability to correctly reject a non-existent filename.
- # For maximum studliness we would check that an error message is
- # being output.
- # We accept a zero exit status because it is what CVS does
- # (Dec 95). Probably the exit status should be nonzero,
- # however.
- if $remote; then
- dotest modules5-22 "${testcvs} co dirmodule/nonexist" \
- "${PROG} checkout: warning: new-born dirmodule/nonexist has disappeared
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .dirmodule..
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: dirmodule"
- else
- dotest modules5-22 "${testcvs} co dirmodule/nonexist" \
- "${PROG} checkout: warning: new-born dirmodule/nonexist has disappeared
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .dirmodule..
- checkout script invoked in ${TESTDIR}/1
- args: dirmodule"
- fi
- # We tolerate the creation of the dirmodule directory, since that
- # is what CVS does, not because we view that as preferable to not
- # creating it.
- dotest_fail modules5-23 "test -f dirmodule/a || test -f dirmodule/b" ""
- rm -r dirmodule
- # Now test that a module using -d checks out to the specified
- # directory.
- if $remote; then
- dotest modules5-24 "${testcvs} -q co namedmodule" \
- "U nameddir/a
- U nameddir/b
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: nameddir"
- else
- dotest modules5-24 "${testcvs} -q co namedmodule" \
- "U nameddir/a
- U nameddir/b
- checkout script invoked in ${TESTDIR}/1
- args: nameddir"
- fi
- dotest modules5-25 "test -f nameddir/a && test -f nameddir/b" ""
- echo add line >>nameddir/a
- # This seems suspicious: when we checkout an existing directory,
- # the checkout script gets executed in addition to the update
- # script. Is that by design or accident?
- if $remote; then
- dotest modules5-26 "${testcvs} -q co namedmodule" \
- "M nameddir/a
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: nameddir"
- else
- dotest modules5-26 "${testcvs} -q co namedmodule" \
- "M nameddir/a
- checkout script invoked in ${TESTDIR}/1
- args: nameddir"
- fi
- rm nameddir/a
- if $remote; then
- dotest modules5-27 "${testcvs} -q co namedmodule" \
- "U nameddir/a
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: nameddir"
- else
- dotest modules5-27 "${testcvs} -q co namedmodule" \
- "U nameddir/a
- checkout script invoked in ${TESTDIR}/1
- args: nameddir"
- fi
- dotest modules5-28 "echo yes | ${testcvs} release -d nameddir" \
- "You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .nameddir.: "
- # Now try the same tests with -d on command line
- # FIXCVS? The manual says the modules programs get the module name,
- # but they really get the directory name.
- if $remote; then
- dotest modules5-29 "${testcvs} co -d mydir realmodule" \
- "U mydir/a
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .mydir..
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: mydir"
- else
- dotest modules5-29 "${testcvs} co -d mydir realmodule" \
- "U mydir/a
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .mydir..
- checkout script invoked in ${TESTDIR}/1
- args: mydir"
- fi
- dotest modules5-30 "test -d mydir && test -f mydir/a" ""
- dotest_fail modules5-31 "test -d realmodule || test -f mydir/b" ""
- if $remote; then
- dotest modules5-32 "${testcvs} -q co -d mydir realmodule" \
- "checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: mydir"
- dotest modules5-33 "${testcvs} -q update" ''
- echo "change" >>mydir/a
- dotest modules5-34 "${testcvs} -q ci -m." \
- "Checking in mydir/a;
- ${CVSROOT_DIRNAME}/first-dir/subdir/a,v <-- a
- new revision: 1\.3; previous revision: 1\.2
- done"
- else
- dotest modules5-32 "${testcvs} -q co -d mydir realmodule" \
- "checkout script invoked in ${TESTDIR}/1
- args: mydir"
- dotest modules5-33 "${testcvs} -q update" ''
- echo "change" >>mydir/a
- dotest modules5-34 "${testcvs} -q ci -m." \
- "Checking in mydir/a;
- ${CVSROOT_DIRNAME}/first-dir/subdir/a,v <-- a
- new revision: 1\.3; previous revision: 1\.2
- done"
- fi
- dotest modules5-35 "echo yes | ${testcvs} release -d mydir" \
- "You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .mydir.: "
- if $remote; then
- dotest modules5-36 "${testcvs} -q rtag -Dnow MYTAG2 realmodule" \
- "tag script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: realmodule MYTAG2"
- dotest modules5-37 "${testcvs} -q export -r MYTAG2 -d mydir realmodule" \
- "U mydir/a
- export script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: mydir"
- else
- dotest modules5-36 "${testcvs} -q rtag -Dnow MYTAG2 realmodule" \
- "tag script invoked in ${TESTDIR}/1
- args: realmodule MYTAG2"
- dotest modules5-37 "${testcvs} -q export -r MYTAG2 -d mydir realmodule" \
- "U mydir/a
- export script invoked in ${TESTDIR}/1
- args: mydir"
- fi
- rm -r mydir
- # Now test the ability to check out a single file from a directory
- if $remote; then
- dotest modules5-38 "${testcvs} co -d mydir dirmodule/a" \
- "U mydir/a
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .mydir..
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: mydir"
- else
- dotest modules5-38 "${testcvs} co -d mydir dirmodule/a" \
- "U mydir/a
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .mydir..
- checkout script invoked in ${TESTDIR}/1
- args: mydir"
- fi
- dotest modules5-39 "test -d mydir && test -f mydir/a" ""
- dotest_fail modules5-40 "test -d dirmodule || test -f mydir/b" ""
- dotest modules5-41 "echo yes | ${testcvs} release -d mydir" \
- "You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .mydir.: "
- # Now test the ability to correctly reject a non-existent filename.
- # For maximum studliness we would check that an error message is
- # being output.
- # We accept a zero exit status because it is what CVS does
- # (Dec 95). Probably the exit status should be nonzero,
- # however.
- if $remote; then
- dotest modules5-42 "${testcvs} co -d mydir dirmodule/nonexist" \
- "${PROG} checkout: warning: new-born mydir/nonexist has disappeared
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .mydir..
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: mydir"
- else
- dotest modules5-42 "${testcvs} co -d mydir dirmodule/nonexist" \
- "${PROG} checkout: warning: new-born mydir/nonexist has disappeared
- ${PROG} checkout: Executing ..${CVSROOT_DIRNAME}/checkout\.sh. .mydir..
- checkout script invoked in ${TESTDIR}/1
- args: mydir"
- fi
- # We tolerate the creation of the mydir directory, since that
- # is what CVS does, not because we view that as preferable to not
- # creating it.
- dotest_fail modules5-43 "test -f mydir/a || test -f mydir/b" ""
- rm -r mydir
- if $remote; then
- dotest modules5-44 "${testcvs} -q co -d mydir namedmodule" \
- "U mydir/a
- U mydir/b
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: mydir"
- else
- dotest modules5-44 "${testcvs} -q co -d mydir namedmodule" \
- "U mydir/a
- U mydir/b
- checkout script invoked in ${TESTDIR}/1
- args: mydir"
- fi
- dotest modules5-45 "test -f mydir/a && test -f mydir/b" ""
- dotest_fail modules5-46 "test -d namedir"
- echo add line >>mydir/a
- # This seems suspicious: when we checkout an existing directory,
- # the checkout script gets executed in addition to the update
- # script. Is that by design or accident?
- if $remote; then
- dotest modules5-47 "${testcvs} -q co -d mydir namedmodule" \
- "M mydir/a
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: mydir"
- else
- dotest modules5-47 "${testcvs} -q co -d mydir namedmodule" \
- "M mydir/a
- checkout script invoked in ${TESTDIR}/1
- args: mydir"
- fi
- rm mydir/a
- if $remote; then
- dotest modules5-48 "${testcvs} -q co -d mydir namedmodule" \
- "U mydir/a
- checkout script invoked in ${TMPDIR}/cvs-serv[0-9a-z]*
- args: mydir"
- else
- dotest modules5-48 "${testcvs} -q co -d mydir namedmodule" \
- "U mydir/a
- checkout script invoked in ${TESTDIR}/1
- args: mydir"
- fi
- dotest modules5-49 "echo yes | ${testcvs} release -d mydir" \
- "You have \[0\] altered files in this repository\.
- Are you sure you want to release (and delete) directory .mydir.: "
- cd ..
- rm -rf 1 ${CVSROOT_DIRNAME}/first-dir ${CVSROOT_DIRNAME}/*.sh
- ;;
- modules6)
- #
- # Test invalid module definitions
- #
- # See the header comment for the `modules' test for an index of
- # the complete suite of modules tests.
- #
- #
- # There was a bug in CVS through 1.11.1p1 where a bad module name
- # would cause the previous line to be parsed as the module
- # definition. This test proves this doesn't happen anymore.
- #
- mkdir modules6
- cd modules6
- dotest module6-setup-1 "${testcvs} -Q co CVSROOT" ""
- cd CVSROOT
- echo "longmodulename who cares" >modules
- echo "badname" >>modules
- # This test almost isn't setup since it generates the error message
- # we are looking for if `-Q' isn't specified, but I want to test the
- # filename in the message later.
- dotest modules6-setup-2 "${testcvs} -Q ci -mbad-modules" \
- "Checking in modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: [0-9.]*; previous revision: [0-9.]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- # Here's where CVS would report not being able to find `lename'
- cd ..
- dotest_fail modules6-1 "${testcvs} -q co badname" \
- "${PROG} checkout: warning: NULL value for key .badname. at line 2 of .${CVSROOT_DIRNAME}/CVSROOT/modules.
- ${PROG} checkout: cannot find module .badname. - ignored" \
- "${PROG} server: warning: NULL value for key .badname. at line 2 of .${CVSROOT_DIRNAME}/CVSROOT/modules.
- ${PROG} server: cannot find module .badname. - ignored
- ${PROG} \[checkout aborted\]: cannot expand modules"
- # cleanup
- cd CVSROOT
- echo "# empty modules file" >modules
- dotest modules6-cleanup-1 "${testcvs} -Q ci -mempty-modules" \
- "Checking in modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: [0-9.]*; previous revision: [0-9.]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../..
- if $keep; then :; else
- rm -r modules6
- fi
- ;;
- modules7)
- #
- # Test tag problems vs an empty CVSROOT/val-tags file
- #
- # See the header comment for the `modules' test for an index of
- # the complete suite of modules tests.
- #
- mkdir modules7
- cd modules7
- dotest modules7-1 "$testcvs -Q co -d top ."
- cd top
- mkdir zero one
- dotest modules7-2 "$testcvs -Q add zero one"
- cd one
- echo 'file1 contents' > file1
- dotest modules7-2 "$testcvs -Q add file1"
- dotest modules7-3 "$testcvs -Q ci -mnew file1" \
- "RCS file: $CVSROOT_DIRNAME/one/file1,v
- done
- Checking in file1;
- $CVSROOT_DIRNAME/one/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest modules7-4 "$testcvs -Q tag mytag file1"
- cd ../CVSROOT
- echo 'all -a zero one' > modules
- dotest modules7-5 "$testcvs -Q ci -mall-module" \
- "Checking in modules;
- $CVSROOT_DIRNAME/CVSROOT/modules,v <-- modules
- new revision: [0-9.]*; previous revision: [0-9.]*
- done
- $PROG commit: Rebuilding administrative file database"
- cd ../..
- mkdir myexport
- cd myexport
- # FIXCVS: The export should NOT be aborted here
- dotest_fail modules7-6 "$testcvs export -rmytag all" \
- "$PROG \[export aborted\]: no such tag mytag"
- cd ..
- rm -fr myexport
- mkdir myexport
- cd myexport
- # FIXCVS: Workaround is to have mytag listed in val-tags
- echo 'mytag y' > $CVSROOT_DIRNAME/CVSROOT/val-tags
- dotest modules7-7 "$testcvs export -rmytag all" \
- "$PROG export: Updating zero
- $PROG export: Updating one
- U one/file1"
- dotest modules7-8 'cat one/file1' 'file1 contents'
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- # cleanup
- cd ../top/CVSROOT
- echo "# empty modules file" >modules
- dotest modules7-cleanup-1 "$testcvs -Q ci -mempty-modules" \
- "Checking in modules;
- $CVSROOT_DIRNAME/CVSROOT/modules,v <-- modules
- new revision: [0-9.]*; previous revision: [0-9.]*
- done
- $PROG commit: Rebuilding administrative file database"
- cd ../../..
- rm -fr modules7
- rm -rf $CVSROOT_DIRNAME/zero $CVSROOT_DIRNAME/one
- ;;
- mkmodules)
- # When a file listed in checkoutlist doesn't exist, cvs-1.10.4
- # would fail to remove the CVSROOT/.#[0-9]* temporary file it
- # creates while mkmodules is in the process of trying to check
- # out the missing file.
- mkdir 1; cd 1
- dotest mkmodules-temp-file-removal-1 "${testcvs} -Q co CVSROOT" ''
- cd CVSROOT
- echo no-such-file >> checkoutlist
- dotest mkmodules-temp-file-removal-2 "${testcvs} -Q ci -m. checkoutlist" \
- "Checking in checkoutlist;
- $CVSROOT_DIRNAME/CVSROOT/checkoutlist,v <-- checkoutlist
- new revision: 1\.2; previous revision: 1\.1
- done
- ${PROG} commit: Rebuilding administrative file database"
- dotest mkmodules-temp-file-removal-3 "echo $CVSROOT_DIRNAME/CVSROOT/.#[0-9]*" \
- "$CVSROOT_DIRNAME/CVSROOT/\.#\[0-9\]\*"
- # Versions 1.11.6 & 1.12.1 and earlier of CVS printed most of the
- # white space included before error messages in checkoutlist.
- echo "no-such-file Failed to update no-such-file." >checkoutlist
- dotest mkmodules-error-message-1 "${testcvs} -Q ci -m. checkoutlist" \
- "Checking in checkoutlist;
- $CVSROOT_DIRNAME/CVSROOT/checkoutlist,v <-- checkoutlist
- new revision: 1\.3; previous revision: 1\.2
- done
- ${PROG} commit: Rebuilding administrative file database
- ${PROG} commit: Failed to update no-such-file\."
- # Versions 1.11.6 & 1.12.1 and earlier of CVS used the error string
- # from the checkoutlist file as the format string passed to error()'s
- # printf. Check that this is no longer the case by verifying that
- # printf format patterns remain unchanged.
- echo "no-such-file Failed to update %s %lx times because %s happened %d times." >checkoutlist
- dotest mkmodules-error-message-2 "${testcvs} -Q ci -m. checkoutlist" \
- "Checking in checkoutlist;
- $CVSROOT_DIRNAME/CVSROOT/checkoutlist,v <-- checkoutlist
- new revision: 1\.4; previous revision: 1\.3
- done
- ${PROG} commit: Rebuilding administrative file database
- ${PROG} commit: Failed to update %s %lx times because %s happened %d times\."
- dotest mkmodules-cleanup-1 "${testcvs} -Q up -pr1.1 checkoutlist >checkoutlist"
- dotest mkmodules-cleanup-2 "${testcvs} -Q ci -m. checkoutlist" \
- "Checking in checkoutlist;
- $CVSROOT_DIRNAME/CVSROOT/checkoutlist,v <-- checkoutlist
- new revision: 1\.5; previous revision: 1\.4
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../..
- rm -rf 1
- ;;
- co-d)
- # Some tests of various permutations of co-d when directories exist
- # and checkouts lengthen.
- #
- # Interestingly enough, these same tests pass when the directory
- # lengthening happens via the modules file. Go figure.
- module=co-d
- mkdir $module; cd $module
- mkdir top; cd top
- dotest co-d-init-1 "$testcvs -Q co -l ."
- mkdir $module
- dotest co-d-init-2 "$testcvs -Q add $module"
- cd $module
- echo content >file1
- echo different content >file2
- dotest co-d-init-3 "$testcvs -Q add file1 file2"
- dotest co-d-init-4 "$testcvs -Q ci -madd-em" \
- "RCS file: $CVSROOT_DIRNAME/co-d/file1,v
- done
- Checking in file1;
- $CVSROOT_DIRNAME/co-d/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: $CVSROOT_DIRNAME/co-d/file2,v
- done
- Checking in file2;
- $CVSROOT_DIRNAME/co-d/file2,v <-- file2
- initial revision: 1\.1
- done"
- cd ../..
- mkdir 2; cd 2
- dotest co-d-1 "$testcvs -q co -d dir $module" \
- "U dir/file1
- U dir/file2"
- dotest co-d-1.2 "cat dir/CVS/Repository" "$module"
- # FIXCVS: This should work. Correct expected result:
- #
- #"U dir2/sdir/file1
- #U dir2/sdir/file2"
- dotest_fail co-d-2 "$testcvs -q co -d dir2/sdir $module" \
- "$PROG \[checkout aborted\]: could not change directory to requested checkout directory \`dir2': No such file or directory"
- # FIXCVS:
- # dotest co-d-2.2 "cat dir4/CVS/Repository" "CVSROOT/Emptydir"
- # dotest co-d-2.3 "cat dir5/CVS/Repository" "$module"
- mkdir dir3
- dotest co-d-3 "$testcvs -q co -d dir3 $module" \
- "U dir3/file1
- U dir3/file2"
- dotest co-d-3.2 "cat dir3/CVS/Repository" "$module"
- if $remote; then
- # FIXCVS: As for co-d-2.
- mkdir dir4
- dotest_fail co-d-4r "$testcvs -q co -d dir4/sdir $module" \
- "$PROG \[checkout aborted\]: could not change directory to requested checkout directory \`dir4': No such file or directory"
- # FIXCVS: As for co-d-2.
- mkdir dir5
- mkdir dir5/sdir
- dotest_fail co-d-5r "$testcvs -q co -d dir5/sdir $module" \
- "$PROG \[checkout aborted\]: could not change directory to requested checkout directory \`dir5': No such file or directory"
- else
- mkdir dir4
- dotest co-d-4 "$testcvs -q co -d dir4/sdir $module" \
- "U dir4/sdir/file1
- U dir4/sdir/file2"
- # CVS only creates administration directories for directories it
- # creates, and the last portion of the path passed to -d
- # regardless.
- dotest_fail co-d-4.2 "test -d dir4/CVS"
- dotest co-d-4.3 "cat dir4/sdir/CVS/Repository" "$module"
- mkdir dir5
- mkdir dir5/sdir
- dotest co-d-5 "$testcvs -q co -d dir5/sdir $module" \
- "U dir5/sdir/file1
- U dir5/sdir/file2"
- # CVS only creates administration directories for directories it
- # creates, and the last portion of the path passed to -d
- # regardless.
- dotest_fail co-d-5.2 "test -d dir5/CVS"
- dotest co-d-5.3 "cat dir5/sdir/CVS/Repository" "$module"
- fi
- # clean up
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -rf $CVSROOT_DIRNAME/$module
- rm -r $module
- ;;
- cvsadm)
- # These test check the content of CVS' administrative
- # files as they are checked out in various configurations.
- # (As a side note, I'm not using the "-q" flag in any of
- # this code, which should provide some extra checking for
- # those messages which don't seem to be checked thoroughly
- # anywhere else.) To do a thorough test, we need to make
- # a bunch of modules in various configurations.
- #
- # <1mod> is a directory at the top level of cvsroot
- # ``foo bar''
- # <2mod> is a directory at the second level of cvsroot
- # ``foo bar/baz''
- # <1d1mod> is a directory at the top level which is
- # checked out into another directory
- # ``foo -d bar baz''
- # <1d2mod> is a directory at the second level which is
- # checked out into another directory
- # ``foo -d bar baz/quux''
- # <2d1mod> is a directory at the top level which is
- # checked out into a directory that is two deep
- # ``foo -d bar/baz quux''
- # <2d2mod> is a directory at the second level which is
- # checked out into a directory that is two deep
- # ``foo -d bar/baz quux''
- #
- # The tests do each of these types separately and in twos.
- # We also repeat each test -d flag for 1-deep and 2-deep
- # directories.
- #
- # Each test should check the output for the Repository
- # file, since that is the one which varies depending on
- # the directory and how it was checked out.
- #
- # Yes, this is verbose, but at least it's very thorough.
- # convenience variables
- REP=${CVSROOT}
- # First, set TopLevelAdmin=yes so we're sure to get
- # top-level CVS directories.
- mkdir 1; cd 1
- dotest cvsadm-setup-1 "${testcvs} -q co CVSROOT/config" \
- "U CVSROOT/config"
- cd CVSROOT
- echo "TopLevelAdmin=yes" >config
- dotest cvsadm-setup-2 "${testcvs} -q ci -m yes-top-level" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../..
- rm -r 1
- # Second, check out the modules file and edit it.
- mkdir 1; cd 1
- dotest cvsadm-1 "${testcvs} co CVSROOT/modules" \
- "U CVSROOT/modules"
- # Test CVS/Root once. Since there is only one part of
- # the code which writes CVS/Root files (Create_Admin),
- # there is no point in testing this every time.
- dotest cvsadm-1a "cat CVS/Root" ${REP}
- dotest cvsadm-1b "cat CVS/Repository" "\."
- dotest cvsadm-1c "cat CVSROOT/CVS/Root" ${REP}
- dotest cvsadm-1d "cat CVSROOT/CVS/Repository" "CVSROOT"
- # All of the defined module names begin with a number.
- # All of the top-level directory names begin with "dir".
- # All of the subdirectory names begin with "sub".
- # All of the top-level modules begin with "mod".
- echo "# Module defs for cvsadm tests" > CVSROOT/modules
- echo "1mod mod1" >> CVSROOT/modules
- echo "1mod-2 mod1-2" >> CVSROOT/modules
- echo "2mod mod2/sub2" >> CVSROOT/modules
- echo "2mod-2 mod2-2/sub2-2" >> CVSROOT/modules
- echo "1d1mod -d dir1d1 mod1" >> CVSROOT/modules
- echo "1d1mod-2 -d dir1d1-2 mod1-2" >> CVSROOT/modules
- echo "1d2mod -d dir1d2 mod2/sub2" >> CVSROOT/modules
- echo "1d2mod-2 -d dir1d2-2 mod2-2/sub2-2" >> CVSROOT/modules
- echo "2d1mod -d dir2d1/sub2d1 mod1" >> CVSROOT/modules
- echo "2d1mod-2 -d dir2d1-2/sub2d1-2 mod1-2" >> CVSROOT/modules
- echo "2d2mod -d dir2d2/sub2d2 mod2/sub2" >> CVSROOT/modules
- echo "2d2mod-2 -d dir2d2-2/sub2d2-2 mod2-2/sub2-2" >> CVSROOT/modules
- dotest cvsadm-1e "${testcvs} ci -m add-modules" \
- "${PROG} [a-z]*: Examining .
- ${PROG} [a-z]*: Examining CVSROOT
- Checking in CVSROOT/modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database" \
- "${PROG} commit: Examining .
- ${PROG} commit: Examining CVSROOT"
- rm -rf CVS CVSROOT;
- # Create the various modules
- dotest cvsadm-2 "${testcvs} -q co -l ." ''
- mkdir mod1
- mkdir mod1-2
- mkdir mod2
- mkdir mod2/sub2
- mkdir mod2-2
- mkdir mod2-2/sub2-2
- dotest cvsadm-2a "${testcvs} add mod1 mod1-2 mod2 mod2/sub2 mod2-2 mod2-2/sub2-2" \
- "Directory ${CVSROOT_DIRNAME}/mod1 added to the repository
- Directory ${CVSROOT_DIRNAME}/mod1-2 added to the repository
- Directory ${CVSROOT_DIRNAME}/mod2 added to the repository
- Directory ${CVSROOT_DIRNAME}/mod2/sub2 added to the repository
- Directory ${CVSROOT_DIRNAME}/mod2-2 added to the repository
- Directory ${CVSROOT_DIRNAME}/mod2-2/sub2-2 added to the repository"
- # Populate the directories for the halibut
- echo "file1" > mod1/file1
- echo "file1-2" > mod1-2/file1-2
- echo "file2" > mod2/sub2/file2
- echo "file2-2" > mod2-2/sub2-2/file2-2
- dotest cvsadm-2aa "${testcvs} add mod1/file1 mod1-2/file1-2 mod2/sub2/file2 mod2-2/sub2-2/file2-2" \
- "${PROG} add: scheduling file .mod1/file1. for addition
- ${PROG} add: scheduling file .mod1-2/file1-2. for addition
- ${PROG} add: scheduling file .mod2/sub2/file2. for addition
- ${PROG} add: scheduling file .mod2-2/sub2-2/file2-2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest cvsadm-2b "${testcvs} ci -m yup mod1 mod1-2 mod2 mod2-2" \
- "${PROG} [a-z]*: Examining mod1
- ${PROG} [a-z]*: Examining mod1-2
- ${PROG} [a-z]*: Examining mod2
- ${PROG} [a-z]*: Examining mod2/sub2
- ${PROG} [a-z]*: Examining mod2-2
- ${PROG} [a-z]*: Examining mod2-2/sub2-2
- RCS file: ${CVSROOT_DIRNAME}/mod1/file1,v
- done
- Checking in mod1/file1;
- ${CVSROOT_DIRNAME}/mod1/file1,v <-- file1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/mod1-2/file1-2,v
- done
- Checking in mod1-2/file1-2;
- ${CVSROOT_DIRNAME}/mod1-2/file1-2,v <-- file1-2
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/mod2/sub2/file2,v
- done
- Checking in mod2/sub2/file2;
- ${CVSROOT_DIRNAME}/mod2/sub2/file2,v <-- file2
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/mod2-2/sub2-2/file2-2,v
- done
- Checking in mod2-2/sub2-2/file2-2;
- ${CVSROOT_DIRNAME}/mod2-2/sub2-2/file2-2,v <-- file2-2
- initial revision: 1.1
- done"
- # Finished creating the modules -- clean up.
- rm -rf CVS mod1 mod1-2 mod2 mod2-2
- # Done.
- ##################################################
- ## Start the dizzying array of possibilities.
- ## Begin with each module type separately.
- ##################################################
-
- # Pattern -- after each checkout, first check the top-level
- # CVS directory. Then, check the directories in numerical
- # order.
- dotest cvsadm-3 "${testcvs} co 1mod" \
- "${PROG} checkout: Updating 1mod
- U 1mod/file1"
- dotest cvsadm-3b "cat CVS/Repository" "\."
- dotest cvsadm-3d "cat 1mod/CVS/Repository" "mod1"
- rm -rf CVS 1mod
- dotest cvsadm-4 "${testcvs} co 2mod" \
- "${PROG} checkout: Updating 2mod
- U 2mod/file2"
- dotest cvsadm-4b "cat CVS/Repository" "\."
- dotest cvsadm-4d "cat 2mod/CVS/Repository" "mod2/sub2"
- rm -rf CVS 2mod
- dotest cvsadm-5 "${testcvs} co 1d1mod" \
- "${PROG} checkout: Updating dir1d1
- U dir1d1/file1"
- dotest cvsadm-5b "cat CVS/Repository" "\."
- dotest cvsadm-5d "cat dir1d1/CVS/Repository" "mod1"
- rm -rf CVS dir1d1
- dotest cvsadm-6 "${testcvs} co 1d2mod" \
- "${PROG} checkout: Updating dir1d2
- U dir1d2/file2"
- dotest cvsadm-6b "cat CVS/Repository" "\."
- dotest cvsadm-6d "cat dir1d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir1d2
- dotest cvsadm-7 "${testcvs} co 2d1mod" \
- "${PROG} checkout: Updating dir2d1/sub2d1
- U dir2d1/sub2d1/file1"
- dotest cvsadm-7b "cat CVS/Repository" "\."
- dotest cvsadm-7d "cat dir2d1/CVS/Repository" "\."
- dotest cvsadm-7f "cat dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS dir2d1
- dotest cvsadm-8 "${testcvs} co 2d2mod" \
- "${PROG} checkout: Updating dir2d2/sub2d2
- U dir2d2/sub2d2/file2"
- dotest cvsadm-8b "cat CVS/Repository" "\."
- dotest cvsadm-8d "cat dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-8f "cat dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir2d2
- ##################################################
- ## You are in a shell script of twisted little
- ## module combination statements, all alike.
- ##################################################
- ### 1mod
-
- dotest cvsadm-9 "${testcvs} co 1mod 1mod-2" \
- "${PROG} checkout: Updating 1mod
- U 1mod/file1
- ${PROG} checkout: Updating 1mod-2
- U 1mod-2/file1-2"
- # the usual for the top level
- dotest cvsadm-9b "cat CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-9d "cat 1mod/CVS/Repository" "mod1"
- # the usual for 1mod copy
- dotest cvsadm-9f "cat 1mod-2/CVS/Repository" "mod1-2"
- rm -rf CVS 1mod 1mod-2
- # 1mod 2mod redmod bluemod
- dotest cvsadm-10 "${testcvs} co 1mod 2mod" \
- "${PROG} checkout: Updating 1mod
- U 1mod/file1
- ${PROG} checkout: Updating 2mod
- U 2mod/file2"
- # the usual for the top level
- dotest cvsadm-10b "cat CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-10d "cat 1mod/CVS/Repository" "mod1"
- # the usual for 2dmod
- dotest cvsadm-10f "cat 2mod/CVS/Repository" "mod2/sub2"
- rm -rf CVS 1mod 2mod
- dotest cvsadm-11 "${testcvs} co 1mod 1d1mod" \
- "${PROG} checkout: Updating 1mod
- U 1mod/file1
- ${PROG} checkout: Updating dir1d1
- U dir1d1/file1"
- # the usual for the top level
- dotest cvsadm-11b "cat CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-11d "cat 1mod/CVS/Repository" "mod1"
- # the usual for 1d1mod
- dotest cvsadm-11f "cat dir1d1/CVS/Repository" "mod1"
- rm -rf CVS 1mod dir1d1
- dotest cvsadm-12 "${testcvs} co 1mod 1d2mod" \
- "${PROG} checkout: Updating 1mod
- U 1mod/file1
- ${PROG} checkout: Updating dir1d2
- U dir1d2/file2"
- # the usual for the top level
- dotest cvsadm-12b "cat CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-12d "cat 1mod/CVS/Repository" "mod1"
- # the usual for 1d2mod
- dotest cvsadm-12f "cat dir1d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS 1mod dir1d2
- dotest cvsadm-13 "${testcvs} co 1mod 2d1mod" \
- "${PROG} checkout: Updating 1mod
- U 1mod/file1
- ${PROG} checkout: Updating dir2d1/sub2d1
- U dir2d1/sub2d1/file1"
- # the usual for the top level
- dotest cvsadm-13b "cat CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-13d "cat 1mod/CVS/Repository" "mod1"
- # the usual for 2d1mod
- dotest cvsadm-13f "cat dir2d1/CVS/Repository" "\."
- dotest cvsadm-13h "cat dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS 1mod dir2d1
- dotest cvsadm-14 "${testcvs} co 1mod 2d2mod" \
- "${PROG} checkout: Updating 1mod
- U 1mod/file1
- ${PROG} checkout: Updating dir2d2/sub2d2
- U dir2d2/sub2d2/file2"
- # the usual for the top level
- dotest cvsadm-14b "cat CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-14d "cat 1mod/CVS/Repository" "mod1"
- # the usual for 2d2mod
- dotest cvsadm-14f "cat dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-14h "cat dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS 1mod dir2d2
- ### 2mod
-
- dotest cvsadm-15 "${testcvs} co 2mod 2mod-2" \
- "${PROG} checkout: Updating 2mod
- U 2mod/file2
- ${PROG} checkout: Updating 2mod-2
- U 2mod-2/file2-2"
- # the usual for the top level
- dotest cvsadm-15b "cat CVS/Repository" "\."
- # the usual for 2mod
- dotest cvsadm-15d "cat 2mod/CVS/Repository" "mod2/sub2"
- # the usual for 2mod copy
- dotest cvsadm-15f "cat 2mod-2/CVS/Repository" "mod2-2/sub2-2"
- rm -rf CVS 2mod 2mod-2
- dotest cvsadm-16 "${testcvs} co 2mod 1d1mod" \
- "${PROG} checkout: Updating 2mod
- U 2mod/file2
- ${PROG} checkout: Updating dir1d1
- U dir1d1/file1"
- # the usual for the top level
- dotest cvsadm-16b "cat CVS/Repository" "\."
- # the usual for 2mod
- dotest cvsadm-16d "cat 2mod/CVS/Repository" "mod2/sub2"
- # the usual for 1d1mod
- dotest cvsadm-16f "cat dir1d1/CVS/Repository" "mod1"
- rm -rf CVS 2mod dir1d1
- dotest cvsadm-17 "${testcvs} co 2mod 1d2mod" \
- "${PROG} checkout: Updating 2mod
- U 2mod/file2
- ${PROG} checkout: Updating dir1d2
- U dir1d2/file2"
- # the usual for the top level
- dotest cvsadm-17b "cat CVS/Repository" "\."
- # the usual for 2mod
- dotest cvsadm-17d "cat 2mod/CVS/Repository" "mod2/sub2"
- # the usual for 1d2mod
- dotest cvsadm-17f "cat dir1d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS 2mod dir1d2
- dotest cvsadm-18 "${testcvs} co 2mod 2d1mod" \
- "${PROG} checkout: Updating 2mod
- U 2mod/file2
- ${PROG} checkout: Updating dir2d1/sub2d1
- U dir2d1/sub2d1/file1"
- # the usual for the top level
- dotest cvsadm-18b "cat CVS/Repository" "\."
- # the usual for 2mod
- dotest cvsadm-18d "cat 2mod/CVS/Repository" "mod2/sub2"
- # the usual for 2d1mod
- dotest cvsadm-18f "cat dir2d1/CVS/Repository" "\."
- dotest cvsadm-18h "cat dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS 2mod dir2d1
- dotest cvsadm-19 "${testcvs} co 2mod 2d2mod" \
- "${PROG} checkout: Updating 2mod
- U 2mod/file2
- ${PROG} checkout: Updating dir2d2/sub2d2
- U dir2d2/sub2d2/file2"
- # the usual for the top level
- dotest cvsadm-19b "cat CVS/Repository" "\."
- # the usual for 2mod
- dotest cvsadm-19d "cat 2mod/CVS/Repository" "mod2/sub2"
- # the usual for 2d2mod
- dotest cvsadm-19f "cat dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-19h "cat dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS 2mod dir2d2
- ### 1d1mod
- dotest cvsadm-20 "${testcvs} co 1d1mod 1d1mod-2" \
- "${PROG} checkout: Updating dir1d1
- U dir1d1/file1
- ${PROG} checkout: Updating dir1d1-2
- U dir1d1-2/file1-2"
- # the usual for the top level
- dotest cvsadm-20b "cat CVS/Repository" "\."
- # the usual for 1d1mod
- dotest cvsadm-20d "cat dir1d1/CVS/Repository" "mod1"
- # the usual for 1d1mod copy
- dotest cvsadm-20f "cat dir1d1-2/CVS/Repository" "mod1-2"
- rm -rf CVS dir1d1 dir1d1-2
- dotest cvsadm-21 "${testcvs} co 1d1mod 1d2mod" \
- "${PROG} checkout: Updating dir1d1
- U dir1d1/file1
- ${PROG} checkout: Updating dir1d2
- U dir1d2/file2"
- # the usual for the top level
- dotest cvsadm-21b "cat CVS/Repository" "\."
- # the usual for 1d1mod
- dotest cvsadm-21d "cat dir1d1/CVS/Repository" "mod1"
- # the usual for 1d2mod
- dotest cvsadm-21f "cat dir1d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir1d1 dir1d2
- dotest cvsadm-22 "${testcvs} co 1d1mod 2d1mod" \
- "${PROG} checkout: Updating dir1d1
- U dir1d1/file1
- ${PROG} checkout: Updating dir2d1/sub2d1
- U dir2d1/sub2d1/file1"
- # the usual for the top level
- dotest cvsadm-22b "cat CVS/Repository" "\."
- # the usual for 1d1mod
- dotest cvsadm-22d "cat dir1d1/CVS/Repository" "mod1"
- # the usual for 2d1mod
- dotest cvsadm-22f "cat dir2d1/CVS/Repository" "\."
- dotest cvsadm-22h "cat dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS dir1d1 dir2d1
- dotest cvsadm-23 "${testcvs} co 1d1mod 2d2mod" \
- "${PROG} checkout: Updating dir1d1
- U dir1d1/file1
- ${PROG} checkout: Updating dir2d2/sub2d2
- U dir2d2/sub2d2/file2"
- # the usual for the top level
- dotest cvsadm-23b "cat CVS/Repository" "\."
- # the usual for 1d1mod
- dotest cvsadm-23d "cat dir1d1/CVS/Repository" "mod1"
- # the usual for 2d2mod
- dotest cvsadm-23f "cat dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-23h "cat dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir1d1 dir2d2
- ### 1d2mod
- dotest cvsadm-24 "${testcvs} co 1d2mod 1d2mod-2" \
- "${PROG} checkout: Updating dir1d2
- U dir1d2/file2
- ${PROG} checkout: Updating dir1d2-2
- U dir1d2-2/file2-2"
- # the usual for the top level
- dotest cvsadm-24b "cat CVS/Repository" "\."
- # the usual for 1d2mod
- dotest cvsadm-24d "cat dir1d2/CVS/Repository" "mod2/sub2"
- # the usual for 1d2mod copy
- dotest cvsadm-24f "cat dir1d2-2/CVS/Repository" "mod2-2/sub2-2"
- rm -rf CVS dir1d2 dir1d2-2
- dotest cvsadm-25 "${testcvs} co 1d2mod 2d1mod" \
- "${PROG} checkout: Updating dir1d2
- U dir1d2/file2
- ${PROG} checkout: Updating dir2d1/sub2d1
- U dir2d1/sub2d1/file1"
- # the usual for the top level
- dotest cvsadm-25b "cat CVS/Repository" "\."
- # the usual for 1d2mod
- dotest cvsadm-25d "cat dir1d2/CVS/Repository" "mod2/sub2"
- # the usual for 2d1mod
- dotest cvsadm-25f "cat dir2d1/CVS/Repository" "\."
- dotest cvsadm-25h "cat dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS dir1d2 dir2d1
- dotest cvsadm-26 "${testcvs} co 1d2mod 2d2mod" \
- "${PROG} checkout: Updating dir1d2
- U dir1d2/file2
- ${PROG} checkout: Updating dir2d2/sub2d2
- U dir2d2/sub2d2/file2"
- # the usual for the top level
- dotest cvsadm-26b "cat CVS/Repository" "\."
- # the usual for 1d2mod
- dotest cvsadm-26d "cat dir1d2/CVS/Repository" "mod2/sub2"
- # the usual for 2d2mod
- dotest cvsadm-26f "cat dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-26h "cat dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir1d2 dir2d2
- # 2d1mod
- dotest cvsadm-27 "${testcvs} co 2d1mod 2d1mod-2" \
- "${PROG} checkout: Updating dir2d1/sub2d1
- U dir2d1/sub2d1/file1
- ${PROG} checkout: Updating dir2d1-2/sub2d1-2
- U dir2d1-2/sub2d1-2/file1-2"
- # the usual for the top level
- dotest cvsadm-27b "cat CVS/Repository" "\."
- # the usual for 2d1mod
- dotest cvsadm-27d "cat dir2d1/CVS/Repository" "\."
- dotest cvsadm-27f "cat dir2d1/sub2d1/CVS/Repository" "mod1"
- # the usual for 2d1mod
- dotest cvsadm-27h "cat dir2d1-2/CVS/Repository" "\."
- dotest cvsadm-27j "cat dir2d1-2/sub2d1-2/CVS/Repository" "mod1-2"
- rm -rf CVS dir2d1 dir2d1-2
- dotest cvsadm-28 "${testcvs} co 2d1mod 2d2mod" \
- "${PROG} checkout: Updating dir2d1/sub2d1
- U dir2d1/sub2d1/file1
- ${PROG} checkout: Updating dir2d2/sub2d2
- U dir2d2/sub2d2/file2"
- # the usual for the top level
- dotest cvsadm-28b "cat CVS/Repository" "\."
- # the usual for 2d1mod
- dotest cvsadm-28d "cat dir2d1/CVS/Repository" "\."
- dotest cvsadm-28f "cat dir2d1/sub2d1/CVS/Repository" "mod1"
- # the usual for 2d2mod
- dotest cvsadm-28h "cat dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-28j "cat dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir2d1 dir2d2
-
- # 2d2mod
- dotest cvsadm-29 "${testcvs} co 2d2mod 2d2mod-2" \
- "${PROG} checkout: Updating dir2d2/sub2d2
- U dir2d2/sub2d2/file2
- ${PROG} checkout: Updating dir2d2-2/sub2d2-2
- U dir2d2-2/sub2d2-2/file2-2"
- # the usual for the top level
- dotest cvsadm-29b "cat CVS/Repository" "\."
- # the usual for 2d2mod
- dotest cvsadm-29d "cat dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-29f "cat dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- # the usual for 2d2mod
- dotest cvsadm-29h "cat dir2d2-2/CVS/Repository" "mod2-2"
- dotest cvsadm-29j "cat dir2d2-2/sub2d2-2/CVS/Repository" \
- "mod2-2/sub2-2"
- rm -rf CVS dir2d2 dir2d2-2
- ##################################################
- ## And now, all of that again using the "-d" flag
- ## on the command line.
- ##################################################
- dotest cvsadm-1d3 "${testcvs} co -d dir 1mod" \
- "${PROG} checkout: Updating dir
- U dir/file1"
- dotest cvsadm-1d3b "cat CVS/Repository" "\."
- dotest cvsadm-1d3d "cat dir/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-1d4 "${testcvs} co -d dir 2mod" \
- "${PROG} checkout: Updating dir
- U dir/file2"
- dotest cvsadm-1d4b "cat CVS/Repository" "\."
- dotest cvsadm-1d4d "cat dir/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- dotest cvsadm-1d5 "${testcvs} co -d dir 1d1mod" \
- "${PROG} checkout: Updating dir
- U dir/file1"
- dotest cvsadm-1d5b "cat CVS/Repository" "\."
- dotest cvsadm-1d5d "cat dir/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-1d6 "${testcvs} co -d dir 1d2mod" \
- "${PROG} checkout: Updating dir
- U dir/file2"
- dotest cvsadm-1d6b "cat CVS/Repository" "\."
- dotest cvsadm-1d6d "cat dir/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- dotest cvsadm-1d7 "${testcvs} co -d dir 2d1mod" \
- "${PROG} checkout: Updating dir
- U dir/file1"
- dotest cvsadm-1d7b "cat CVS/Repository" "\."
- dotest cvsadm-1d7d "cat dir/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-1d8 "${testcvs} co -d dir 2d2mod" \
- "${PROG} checkout: Updating dir
- U dir/file2"
- dotest cvsadm-1d8b "cat CVS/Repository" "\."
- dotest cvsadm-1d8d "cat dir/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- ##################################################
- ## Los Combonaciones
- ##################################################
- ### 1mod
- dotest cvsadm-1d9 "${testcvs} co -d dir 1mod 1mod-2" \
- "${PROG} checkout: Updating dir/1mod
- U dir/1mod/file1
- ${PROG} checkout: Updating dir/1mod-2
- U dir/1mod-2/file1-2"
- # the usual for the top level
- dotest cvsadm-1d9b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d9d "cat dir/CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-1d9f "cat dir/1mod/CVS/Repository" "mod1"
- # the usual for 1mod copy
- dotest cvsadm-1d9h "cat dir/1mod-2/CVS/Repository" "mod1-2"
- rm -rf CVS dir
- # 1mod 2mod redmod bluemod
- dotest cvsadm-1d10 "${testcvs} co -d dir 1mod 2mod" \
- "${PROG} checkout: Updating dir/1mod
- U dir/1mod/file1
- ${PROG} checkout: Updating dir/2mod
- U dir/2mod/file2"
- dotest cvsadm-1d10b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d10d "cat dir/CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-1d10f "cat dir/1mod/CVS/Repository" "mod1"
- # the usual for 2dmod
- dotest cvsadm-1d10h "cat dir/2mod/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- dotest cvsadm-1d11 "${testcvs} co -d dir 1mod 1d1mod" \
- "${PROG} checkout: Updating dir/1mod
- U dir/1mod/file1
- ${PROG} checkout: Updating dir/dir1d1
- U dir/dir1d1/file1"
- dotest cvsadm-1d11b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d11d "cat dir/CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-1d11f "cat dir/1mod/CVS/Repository" "mod1"
- # the usual for 1d1mod
- dotest cvsadm-1d11h "cat dir/dir1d1/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-1d12 "${testcvs} co -d dir 1mod 1d2mod" \
- "${PROG} checkout: Updating dir/1mod
- U dir/1mod/file1
- ${PROG} checkout: Updating dir/dir1d2
- U dir/dir1d2/file2"
- dotest cvsadm-1d12b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d12d "cat dir/CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-1d12f "cat dir/1mod/CVS/Repository" "mod1"
- # the usual for 1d2mod
- dotest cvsadm-1d12h "cat dir/dir1d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- dotest cvsadm-1d13 "${testcvs} co -d dir 1mod 2d1mod" \
- "${PROG} checkout: Updating dir/1mod
- U dir/1mod/file1
- ${PROG} checkout: Updating dir/dir2d1/sub2d1
- U dir/dir2d1/sub2d1/file1"
- dotest cvsadm-1d13b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d13d "cat dir/CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-1d13f "cat dir/1mod/CVS/Repository" "mod1"
- # the usual for 2d1mod
- dotest cvsadm-1d13h "cat dir/dir2d1/CVS/Repository" "\."
- dotest cvsadm-1d13j "cat dir/dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-1d14 "${testcvs} co -d dir 1mod 2d2mod" \
- "${PROG} checkout: Updating dir/1mod
- U dir/1mod/file1
- ${PROG} checkout: Updating dir/dir2d2/sub2d2
- U dir/dir2d2/sub2d2/file2"
- dotest cvsadm-1d14b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d14d "cat dir/CVS/Repository" "\."
- # the usual for 1mod
- dotest cvsadm-1d14f "cat dir/1mod/CVS/Repository" "mod1"
- # the usual for 2d2mod
- dotest cvsadm-1d14h "cat dir/dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-1d14j "cat dir/dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- ### 2mod
- dotest cvsadm-1d15 "${testcvs} co -d dir 2mod 2mod-2" \
- "${PROG} checkout: Updating dir/2mod
- U dir/2mod/file2
- ${PROG} checkout: Updating dir/2mod-2
- U dir/2mod-2/file2-2"
- dotest cvsadm-1d15b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d15d "cat dir/CVS/Repository" "mod2"
- # the usual for 2mod
- dotest cvsadm-1d15f "cat dir/2mod/CVS/Repository" "mod2/sub2"
- # the usual for 2mod copy
- dotest cvsadm-1d15h "cat dir/2mod-2/CVS/Repository" "mod2-2/sub2-2"
- rm -rf CVS dir
- dotest cvsadm-1d16 "${testcvs} co -d dir 2mod 1d1mod" \
- "${PROG} checkout: Updating dir/2mod
- U dir/2mod/file2
- ${PROG} checkout: Updating dir/dir1d1
- U dir/dir1d1/file1"
- dotest cvsadm-1d16b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d16d "cat dir/CVS/Repository" "mod2"
- # the usual for 2mod
- dotest cvsadm-1d16f "cat dir/2mod/CVS/Repository" "mod2/sub2"
- # the usual for 1d1mod
- dotest cvsadm-1d16h "cat dir/dir1d1/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-1d17 "${testcvs} co -d dir 2mod 1d2mod" \
- "${PROG} checkout: Updating dir/2mod
- U dir/2mod/file2
- ${PROG} checkout: Updating dir/dir1d2
- U dir/dir1d2/file2"
- dotest cvsadm-1d17b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d17d "cat dir/CVS/Repository" "mod2"
- # the usual for 2mod
- dotest cvsadm-1d17f "cat dir/2mod/CVS/Repository" "mod2/sub2"
- # the usual for 1d2mod
- dotest cvsadm-1d17h "cat dir/dir1d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- dotest cvsadm-1d18 "${testcvs} co -d dir 2mod 2d1mod" \
- "${PROG} checkout: Updating dir/2mod
- U dir/2mod/file2
- ${PROG} checkout: Updating dir/dir2d1/sub2d1
- U dir/dir2d1/sub2d1/file1"
- dotest cvsadm-1d18b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d18d "cat dir/CVS/Repository" "mod2"
- # the usual for 2mod
- dotest cvsadm-1d18f "cat dir/2mod/CVS/Repository" "mod2/sub2"
- # the usual for 2d1mod
- dotest cvsadm-1d18h "cat dir/dir2d1/CVS/Repository" "\."
- dotest cvsadm-1d18j "cat dir/dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-1d19 "${testcvs} co -d dir 2mod 2d2mod" \
- "${PROG} checkout: Updating dir/2mod
- U dir/2mod/file2
- ${PROG} checkout: Updating dir/dir2d2/sub2d2
- U dir/dir2d2/sub2d2/file2"
- dotest cvsadm-1d19b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d19d "cat dir/CVS/Repository" "mod2"
- # the usual for 2mod
- dotest cvsadm-1d19f "cat dir/2mod/CVS/Repository" "mod2/sub2"
- # the usual for 2d2mod
- dotest cvsadm-1d19h "cat dir/dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-1d19j "cat dir/dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- ### 1d1mod
- dotest cvsadm-1d20 "${testcvs} co -d dir 1d1mod 1d1mod-2" \
- "${PROG} checkout: Updating dir/dir1d1
- U dir/dir1d1/file1
- ${PROG} checkout: Updating dir/dir1d1-2
- U dir/dir1d1-2/file1-2"
- dotest cvsadm-1d20b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d20d "cat dir/CVS/Repository" "\."
- # the usual for 1d1mod
- dotest cvsadm-1d20f "cat dir/dir1d1/CVS/Repository" "mod1"
- # the usual for 1d1mod copy
- dotest cvsadm-1d20h "cat dir/dir1d1-2/CVS/Repository" "mod1-2"
- rm -rf CVS dir
- dotest cvsadm-1d21 "${testcvs} co -d dir 1d1mod 1d2mod" \
- "${PROG} checkout: Updating dir/dir1d1
- U dir/dir1d1/file1
- ${PROG} checkout: Updating dir/dir1d2
- U dir/dir1d2/file2"
- dotest cvsadm-1d21b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d21d "cat dir/CVS/Repository" "\."
- # the usual for 1d1mod
- dotest cvsadm-1d21f "cat dir/dir1d1/CVS/Repository" "mod1"
- # the usual for 1d2mod
- dotest cvsadm-1d21h "cat dir/dir1d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- dotest cvsadm-1d22 "${testcvs} co -d dir 1d1mod 2d1mod" \
- "${PROG} checkout: Updating dir/dir1d1
- U dir/dir1d1/file1
- ${PROG} checkout: Updating dir/dir2d1/sub2d1
- U dir/dir2d1/sub2d1/file1"
- dotest cvsadm-1d22b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d22d "cat dir/CVS/Repository" "\."
- # the usual for 1d1mod
- dotest cvsadm-1d22f "cat dir/dir1d1/CVS/Repository" "mod1"
- # the usual for 2d1mod
- dotest cvsadm-1d22h "cat dir/dir2d1/CVS/Repository" "\."
- dotest cvsadm-1d22j "cat dir/dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-1d23 "${testcvs} co -d dir 1d1mod 2d2mod" \
- "${PROG} checkout: Updating dir/dir1d1
- U dir/dir1d1/file1
- ${PROG} checkout: Updating dir/dir2d2/sub2d2
- U dir/dir2d2/sub2d2/file2"
- dotest cvsadm-1d23b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d23d "cat dir/CVS/Repository" "\."
- # the usual for 1d1mod
- dotest cvsadm-1d23f "cat dir/dir1d1/CVS/Repository" "mod1"
- # the usual for 2d2mod
- dotest cvsadm-1d23h "cat dir/dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-1d23j "cat dir/dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- ### 1d2mod
- dotest cvsadm-1d24 "${testcvs} co -d dir 1d2mod 1d2mod-2" \
- "${PROG} checkout: Updating dir/dir1d2
- U dir/dir1d2/file2
- ${PROG} checkout: Updating dir/dir1d2-2
- U dir/dir1d2-2/file2-2"
- dotest cvsadm-1d24b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d24d "cat dir/CVS/Repository" "mod2"
- # the usual for 1d2mod
- dotest cvsadm-1d24f "cat dir/dir1d2/CVS/Repository" "mod2/sub2"
- # the usual for 1d2mod copy
- dotest cvsadm-1d24h "cat dir/dir1d2-2/CVS/Repository" "mod2-2/sub2-2"
- rm -rf CVS dir
- dotest cvsadm-1d25 "${testcvs} co -d dir 1d2mod 2d1mod" \
- "${PROG} checkout: Updating dir/dir1d2
- U dir/dir1d2/file2
- ${PROG} checkout: Updating dir/dir2d1/sub2d1
- U dir/dir2d1/sub2d1/file1"
- dotest cvsadm-1d25b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d25d "cat dir/CVS/Repository" "mod2"
- # the usual for 1d2mod
- dotest cvsadm-1d25f "cat dir/dir1d2/CVS/Repository" "mod2/sub2"
- # the usual for 2d1mod
- dotest cvsadm-1d25h "cat dir/dir2d1/CVS/Repository" "\."
- dotest cvsadm-1d25j "cat dir/dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-1d26 "${testcvs} co -d dir 1d2mod 2d2mod" \
- "${PROG} checkout: Updating dir/dir1d2
- U dir/dir1d2/file2
- ${PROG} checkout: Updating dir/dir2d2/sub2d2
- U dir/dir2d2/sub2d2/file2"
- dotest cvsadm-1d26b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d26d "cat dir/CVS/Repository" "mod2"
- # the usual for 1d2mod
- dotest cvsadm-1d26f "cat dir/dir1d2/CVS/Repository" "mod2/sub2"
- # the usual for 2d2mod
- dotest cvsadm-1d26h "cat dir/dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-1d26j "cat dir/dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- # 2d1mod
- dotest cvsadm-1d27 "${testcvs} co -d dir 2d1mod 2d1mod-2" \
- "${PROG} checkout: Updating dir/dir2d1/sub2d1
- U dir/dir2d1/sub2d1/file1
- ${PROG} checkout: Updating dir/dir2d1-2/sub2d1-2
- U dir/dir2d1-2/sub2d1-2/file1-2"
- dotest cvsadm-1d27b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d27d "cat dir/CVS/Repository" "CVSROOT/Emptydir"
- # the usual for 2d1mod
- dotest cvsadm-1d27f "cat dir/dir2d1/CVS/Repository" "\."
- dotest cvsadm-1d27h "cat dir/dir2d1/sub2d1/CVS/Repository" "mod1"
- # the usual for 2d1mod
- dotest cvsadm-1d27j "cat dir/dir2d1-2/CVS/Repository" "\."
- dotest cvsadm-1d27l "cat dir/dir2d1-2/sub2d1-2/CVS/Repository" \
- "mod1-2"
- rm -rf CVS dir
- dotest cvsadm-1d28 "${testcvs} co -d dir 2d1mod 2d2mod" \
- "${PROG} checkout: Updating dir/dir2d1/sub2d1
- U dir/dir2d1/sub2d1/file1
- ${PROG} checkout: Updating dir/dir2d2/sub2d2
- U dir/dir2d2/sub2d2/file2"
- dotest cvsadm-1d28b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d28d "cat dir/CVS/Repository" "CVSROOT/Emptydir"
- # the usual for 2d1mod
- dotest cvsadm-1d28f "cat dir/dir2d1/CVS/Repository" "\."
- dotest cvsadm-1d28h "cat dir/dir2d1/sub2d1/CVS/Repository" "mod1"
- # the usual for 2d2mod
- dotest cvsadm-1d28j "cat dir/dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-1d28l "cat dir/dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
-
- # 2d2mod
- dotest cvsadm-1d29 "${testcvs} co -d dir 2d2mod 2d2mod-2" \
- "${PROG} checkout: Updating dir/dir2d2/sub2d2
- U dir/dir2d2/sub2d2/file2
- ${PROG} checkout: Updating dir/dir2d2-2/sub2d2-2
- U dir/dir2d2-2/sub2d2-2/file2-2"
- dotest cvsadm-1d29b "cat CVS/Repository" "\."
- # the usual for the dir level
- dotest cvsadm-1d29d "cat dir/CVS/Repository" "\."
- # the usual for 2d2mod
- dotest cvsadm-1d29f "cat dir/dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-1d29h "cat dir/dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- # the usual for 2d2mod
- dotest cvsadm-1d29j "cat dir/dir2d2-2/CVS/Repository" "mod2-2"
- dotest cvsadm-1d29l "cat dir/dir2d2-2/sub2d2-2/CVS/Repository" \
- "mod2-2/sub2-2"
- rm -rf CVS dir
- ##################################################
- ## And now, some of that again using the "-d" flag
- ## on the command line, but use a longer path.
- ##################################################
- dotest_fail cvsadm-2d3-1 "${testcvs} co -d dir/dir2 1mod" \
- "${PROG} \[checkout aborted\]: could not change directory to requested checkout directory .dir.: No such file or directory"
- if $remote; then :; else
- # Remote can't handle this, even with the "mkdir dir".
- # This was also true of CVS 1.9.
- mkdir dir
- dotest cvsadm-2d3 "${testcvs} co -d dir/dir2 1mod" \
- "${PROG} checkout: Updating dir/dir2
- U dir/dir2/file1"
- dotest cvsadm-2d3b "cat CVS/Repository" "\."
- dotest_fail cvsadm-2d3d "test -f dir/CVS/Repository" ""
- dotest cvsadm-2d3f "cat dir/dir2/CVS/Repository" "mod1"
- rm -rf CVS dir
- mkdir dir
- dotest cvsadm-2d4 "${testcvs} co -d dir/dir2 2mod" \
- "${PROG} checkout: Updating dir/dir2
- U dir/dir2/file2"
- dotest cvsadm-2d4b "cat CVS/Repository" "\."
- dotest cvsadm-2d4f "cat dir/dir2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- mkdir dir
- dotest cvsadm-2d5 "${testcvs} co -d dir/dir2 1d1mod" \
- "${PROG} checkout: Updating dir/dir2
- U dir/dir2/file1"
- dotest cvsadm-2d5b "cat CVS/Repository" "\."
- dotest cvsadm-2d5f "cat dir/dir2/CVS/Repository" "mod1"
- rm -rf CVS dir
- mkdir dir
- dotest cvsadm-2d6 "${testcvs} co -d dir/dir2 1d2mod" \
- "${PROG} checkout: Updating dir/dir2
- U dir/dir2/file2"
- dotest cvsadm-2d6b "cat CVS/Repository" "\."
- dotest cvsadm-2d6f "cat dir/dir2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- mkdir dir
- dotest cvsadm-2d7 "${testcvs} co -d dir/dir2 2d1mod" \
- "${PROG} checkout: Updating dir/dir2
- U dir/dir2/file1"
- dotest cvsadm-2d7b "cat CVS/Repository" "\."
- dotest cvsadm-2d7f "cat dir/dir2/CVS/Repository" "mod1"
- rm -rf CVS dir
- mkdir dir
- dotest cvsadm-2d8 "${testcvs} co -d dir/dir2 2d2mod" \
- "${PROG} checkout: Updating dir/dir2
- U dir/dir2/file2"
- dotest cvsadm-2d8b "cat CVS/Repository" "\."
- dotest cvsadm-2d8f "cat dir/dir2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- ##################################################
- ## And now, a few of those tests revisited to
- ## test the behavior of the -N flag.
- ##################################################
- dotest cvsadm-N3 "${testcvs} co -N 1mod" \
- "${PROG} checkout: Updating 1mod
- U 1mod/file1"
- dotest cvsadm-N3b "cat CVS/Repository" "\."
- dotest cvsadm-N3d "cat 1mod/CVS/Repository" "mod1"
- rm -rf CVS 1mod
- dotest cvsadm-N4 "${testcvs} co -N 2mod" \
- "${PROG} checkout: Updating 2mod
- U 2mod/file2"
- dotest cvsadm-N4b "cat CVS/Repository" "\."
- dotest cvsadm-N4d "cat 2mod/CVS/Repository" "mod2/sub2"
- rm -rf CVS 2mod
- dotest cvsadm-N5 "${testcvs} co -N 1d1mod" \
- "${PROG} checkout: Updating dir1d1
- U dir1d1/file1"
- dotest cvsadm-N5b "cat CVS/Repository" "\."
- dotest cvsadm-N5d "cat dir1d1/CVS/Repository" "mod1"
- rm -rf CVS dir1d1
- dotest cvsadm-N6 "${testcvs} co -N 1d2mod" \
- "${PROG} checkout: Updating dir1d2
- U dir1d2/file2"
- dotest cvsadm-N6b "cat CVS/Repository" "\."
- dotest cvsadm-N6d "cat dir1d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir1d2
- dotest cvsadm-N7 "${testcvs} co -N 2d1mod" \
- "${PROG} checkout: Updating dir2d1/sub2d1
- U dir2d1/sub2d1/file1"
- dotest cvsadm-N7b "cat CVS/Repository" "\."
- dotest cvsadm-N7d "cat dir2d1/CVS/Repository" "\."
- dotest cvsadm-N7f "cat dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS dir2d1
- dotest cvsadm-N8 "${testcvs} co -N 2d2mod" \
- "${PROG} checkout: Updating dir2d2/sub2d2
- U dir2d2/sub2d2/file2"
- dotest cvsadm-N8b "cat CVS/Repository" "\."
- dotest cvsadm-N8d "cat dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-N8f "cat dir2d2/sub2d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir2d2
- ## the ones in one-deep directories
- dotest cvsadm-N1d3 "${testcvs} co -N -d dir 1mod" \
- "${PROG} checkout: Updating dir/1mod
- U dir/1mod/file1"
- dotest cvsadm-N1d3b "cat CVS/Repository" "\."
- dotest cvsadm-N1d3d "cat dir/CVS/Repository" "\."
- dotest cvsadm-N1d3f "cat dir/1mod/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-N1d4 "${testcvs} co -N -d dir 2mod" \
- "${PROG} checkout: Updating dir/2mod
- U dir/2mod/file2"
- dotest cvsadm-N1d4b "cat CVS/Repository" "\."
- dotest cvsadm-N1d4d "cat dir/CVS/Repository" "mod2"
- dotest cvsadm-N1d4f "cat dir/2mod/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- dotest cvsadm-N1d5 "${testcvs} co -N -d dir 1d1mod" \
- "${PROG} checkout: Updating dir/dir1d1
- U dir/dir1d1/file1"
- dotest cvsadm-N1d5b "cat CVS/Repository" "\."
- dotest cvsadm-N1d5d "cat dir/CVS/Repository" "\."
- dotest cvsadm-N1d5d "cat dir/dir1d1/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-N1d6 "${testcvs} co -N -d dir 1d2mod" \
- "${PROG} checkout: Updating dir/dir1d2
- U dir/dir1d2/file2"
- dotest cvsadm-N1d6b "cat CVS/Repository" "\."
- dotest cvsadm-N1d6d "cat dir/CVS/Repository" "mod2"
- dotest cvsadm-N1d6f "cat dir/dir1d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- dotest cvsadm-N1d7 "${testcvs} co -N -d dir 2d1mod" \
- "${PROG} checkout: Updating dir/dir2d1/sub2d1
- U dir/dir2d1/sub2d1/file1"
- dotest cvsadm-N1d7b "cat CVS/Repository" "\."
- dotest cvsadm-N1d7d "cat dir/CVS/Repository" "CVSROOT/Emptydir"
- dotest cvsadm-N1d7f "cat dir/dir2d1/CVS/Repository" "\."
- dotest cvsadm-N1d7h "cat dir/dir2d1/sub2d1/CVS/Repository" "mod1"
- rm -rf CVS dir
- dotest cvsadm-N1d8 "${testcvs} co -N -d dir 2d2mod" \
- "${PROG} checkout: Updating dir/dir2d2/sub2d2
- U dir/dir2d2/sub2d2/file2"
- dotest cvsadm-N1d8b "cat CVS/Repository" "\."
- dotest cvsadm-N1d8d "cat dir/CVS/Repository" "\."
- dotest cvsadm-N1d8d "cat dir/dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-N1d8d "cat dir/dir2d2/sub2d2/CVS/Repository" \
- "mod2/sub2"
- rm -rf CVS dir
- ## the ones in two-deep directories
- mkdir dir
- dotest cvsadm-N2d3 "${testcvs} co -N -d dir/dir2 1mod" \
- "${PROG} checkout: Updating dir/dir2/1mod
- U dir/dir2/1mod/file1"
- dotest cvsadm-N2d3b "cat CVS/Repository" "\."
- dotest cvsadm-N2d3f "cat dir/dir2/CVS/Repository" "\."
- dotest cvsadm-N2d3h "cat dir/dir2/1mod/CVS/Repository" "mod1"
- rm -rf CVS dir
- mkdir dir
- dotest cvsadm-N2d4 "${testcvs} co -N -d dir/dir2 2mod" \
- "${PROG} checkout: Updating dir/dir2/2mod
- U dir/dir2/2mod/file2"
- dotest cvsadm-N2d4b "cat CVS/Repository" "\."
- dotest cvsadm-N2d4f "cat dir/dir2/CVS/Repository" "mod2"
- dotest cvsadm-N2d4h "cat dir/dir2/2mod/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- mkdir dir
- dotest cvsadm-N2d5 "${testcvs} co -N -d dir/dir2 1d1mod" \
- "${PROG} checkout: Updating dir/dir2/dir1d1
- U dir/dir2/dir1d1/file1"
- dotest cvsadm-N2d5b "cat CVS/Repository" "\."
- dotest cvsadm-N2d5f "cat dir/dir2/CVS/Repository" "\."
- dotest cvsadm-N2d5h "cat dir/dir2/dir1d1/CVS/Repository" "mod1"
- rm -rf CVS dir
- mkdir dir
- dotest cvsadm-N2d6 "${testcvs} co -N -d dir/dir2 1d2mod" \
- "${PROG} checkout: Updating dir/dir2/dir1d2
- U dir/dir2/dir1d2/file2"
- dotest cvsadm-N2d6b "cat CVS/Repository" "\."
- dotest cvsadm-N2d6f "cat dir/dir2/CVS/Repository" "mod2"
- dotest cvsadm-N2d6h "cat dir/dir2/dir1d2/CVS/Repository" "mod2/sub2"
- rm -rf CVS dir
- mkdir dir
- dotest cvsadm-N2d7 "${testcvs} co -N -d dir/dir2 2d1mod" \
- "${PROG} checkout: Updating dir/dir2/dir2d1/sub2d1
- U dir/dir2/dir2d1/sub2d1/file1"
- dotest cvsadm-N2d7b "cat CVS/Repository" "\."
- dotest cvsadm-N2d7f "cat dir/dir2/CVS/Repository" "CVSROOT/Emptydir"
- dotest cvsadm-N2d7g "cat dir/dir2/dir2d1/CVS/Repository" "\."
- dotest cvsadm-N2d7h "cat dir/dir2/dir2d1/sub2d1/CVS/Repository" \
- "mod1"
- rm -rf CVS dir
- mkdir dir
- dotest cvsadm-N2d8 "${testcvs} co -N -d dir/dir2 2d2mod" \
- "${PROG} checkout: Updating dir/dir2/dir2d2/sub2d2
- U dir/dir2/dir2d2/sub2d2/file2"
- dotest cvsadm-N2d8b "cat CVS/Repository" "\."
- dotest cvsadm-N2d8f "cat dir/dir2/CVS/Repository" "\."
- dotest cvsadm-N2d8h "cat dir/dir2/dir2d2/CVS/Repository" "mod2"
- dotest cvsadm-N2d8j "cat dir/dir2/dir2d2/sub2d2/CVS/Repository" \
- "mod2/sub2"
- rm -rf CVS dir
- fi # end of tests to be skipped for remote
- ##################################################
- ## That's enough of that, thank you very much.
- ##################################################
- dotest cvsadm-cleanup-1 "${testcvs} -q co CVSROOT/config" \
- "U CVSROOT/config"
- cd CVSROOT
- echo "# empty file" >config
- dotest cvsadm-cleanup-2 "${testcvs} -q ci -m cvsadm-cleanup" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- rm -rf CVSROOT CVS
- # remove our junk
- cd ..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/1mod
- rm -rf ${CVSROOT_DIRNAME}/1mod-2
- rm -rf ${CVSROOT_DIRNAME}/2mod
- rm -rf ${CVSROOT_DIRNAME}/2mod-2
- rm -rf ${CVSROOT_DIRNAME}/mod1
- rm -rf ${CVSROOT_DIRNAME}/mod1-2
- rm -rf ${CVSROOT_DIRNAME}/mod2
- rm -rf ${CVSROOT_DIRNAME}/mod2-2
- ;;
- emptydir)
- # Various tests of the Emptydir (CVSNULLREPOS) code. See also:
- # cvsadm: tests of Emptydir in various module definitions
- # basicb: Test that "Emptydir" is non-special in ordinary contexts
- mkdir 1; cd 1
- dotest emptydir-1 "${testcvs} co CVSROOT/modules" \
- "U CVSROOT/modules"
- echo "# Module defs for emptydir tests" > CVSROOT/modules
- echo "2d1mod -d dir2d1/sub/sub2d1 mod1" >> CVSROOT/modules
- echo "2d1moda -d dir2d1/suba moda/modasub" >> CVSROOT/modules
- echo "2d1modb -d dir2d1/suba mod1" >> CVSROOT/modules
- echo "comb -a 2d1modb 2d1moda" >> CVSROOT/modules
- dotest emptydir-2 "${testcvs} ci -m add-modules" \
- "${PROG} [a-z]*: Examining CVSROOT
- Checking in CVSROOT/modules;
- ${CVSROOT_DIRNAME}/CVSROOT/modules,v <-- modules
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database" \
- "${PROG} commit: Examining CVSROOT"
- rm -rf CVS CVSROOT
- mkdir ${CVSROOT_DIRNAME}/mod1 ${CVSROOT_DIRNAME}/moda
- # Populate. Not sure we really need to do this.
- dotest emptydir-3 "${testcvs} -q co -l ." ""
- dotest emptydir-3a "${testcvs} co mod1 moda" \
- "${PROG} checkout: Updating mod1
- ${PROG} checkout: Updating moda"
- echo "file1" > mod1/file1
- mkdir moda/modasub
- dotest emptydir-3b "${testcvs} add moda/modasub" \
- "Directory ${CVSROOT_DIRNAME}/moda/modasub added to the repository"
- echo "filea" > moda/modasub/filea
- dotest emptydir-4 "${testcvs} add mod1/file1 moda/modasub/filea" \
- "${PROG} add: scheduling file .mod1/file1. for addition
- ${PROG} add: scheduling file .moda/modasub/filea. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest emptydir-5 "${testcvs} -q ci -m yup" \
- "RCS file: ${CVSROOT_DIRNAME}/mod1/file1,v
- done
- Checking in mod1/file1;
- ${CVSROOT_DIRNAME}/mod1/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/moda/modasub/filea,v
- done
- Checking in moda/modasub/filea;
- ${CVSROOT_DIRNAME}/moda/modasub/filea,v <-- filea
- initial revision: 1\.1
- done"
- rm -rf mod1 moda CVS
- # End Populate.
- dotest emptydir-6 "${testcvs} co 2d1mod" \
- "${PROG} checkout: Updating dir2d1/sub/sub2d1
- U dir2d1/sub/sub2d1/file1"
- cd dir2d1
- touch emptyfile
- # It doesn't make any sense to add a file (or do much of anything
- # else) in Emptydir; Emptydir is a placeholder indicating that
- # the working directory doesn't correspond to anything in
- # the repository.
- dotest_fail emptydir-7 "${testcvs} add emptyfile" \
- "${PROG} \[add aborted\]: cannot add to ${CVSROOT_DIRNAME}/CVSROOT/Emptydir"
- mkdir emptydir
- dotest_fail emptydir-8 "${testcvs} add emptydir" \
- "${PROG} \[[a-z]* aborted\]: cannot add to ${CVSROOT_DIRNAME}/CVSROOT/Emptydir"
- cd ..
- rm -rf CVS dir2d1
- # OK, while we have an Emptydir around, test a few obscure
- # things about it.
- mkdir edir; cd edir
- dotest emptydir-9 "${testcvs} -q co -l CVSROOT" \
- "U CVSROOT${DOTSTAR}"
- cd CVSROOT
- dotest_fail emptydir-10 "test -d Emptydir" ''
- # This tests the code in find_dirs which skips Emptydir.
- dotest emptydir-11 "${testcvs} -q -n update -d -P" ''
- cd ../..
- rm -r edir
- cd ..
- # Now start playing with moda.
- mkdir 2; cd 2
- dotest emptydir-12 "${testcvs} -q co 2d1moda" \
- "U dir2d1/suba/filea"
- # OK, this is the crux of the matter. This used to show "Emptydir",
- # but everyone seemed to think it should show "moda". This
- # usually works better, but not always as shown by the following
- # test.
- dotest emptydir-13 "cat dir2d1/CVS/Repository" "moda"
- dotest_fail emptydir-14 "${testcvs} co comb" \
- "${PROG} checkout: existing repository ${CVSROOT_DIRNAME}/moda/modasub does not match ${CVSROOT_DIRNAME}/mod1
- ${PROG} checkout: ignoring module 2d1modb
- ${PROG} checkout: Updating dir2d1/suba"
- dotest emptydir-15 "cat dir2d1/CVS/Repository" "moda"
- cd ..
- # Test the effect of a non-cvs directory already existing with the
- # same name as one in the modules file.
- mkdir 3; cd 3
- mkdir dir2d1
- dotest emptydir-16 "${testcvs} co 2d1mod" \
- "${PROG} checkout: Updating dir2d1/sub/sub2d1
- U dir2d1/sub/sub2d1/file1"
- dotest emptydir-17 "test -d dir2d1/CVS"
- # clean up
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ..
- rm -r 1 2 3
- rm -rf ${CVSROOT_DIRNAME}/mod1 ${CVSROOT_DIRNAME}/moda
- # I guess for the moment the convention is going to be
- # that we don't need to remove ${CVSROOT_DIRNAME}/CVSROOT/Emptydir
- ;;
- abspath)
-
- # These tests test the thituations thin thwitch thoo theck
- # things thout twith thabsolute thaths. Threally.
- #
- # CHECKOUTS
- #
- # Create a few modules to use
- mkdir ${CVSROOT_DIRNAME}/mod1 ${CVSROOT_DIRNAME}/mod2
- dotest abspath-1a "${testcvs} co mod1 mod2" \
- "${PROG} checkout: Updating mod1
- ${PROG} checkout: Updating mod2"
- # Populate the module
- echo "file1" > mod1/file1
- echo "file2" > mod2/file2
- cd mod1
- dotest abspath-1ba "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- cd ..
- cd mod2
- dotest abspath-1bb "${testcvs} add file2" \
- "${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- cd ..
- dotest abspath-1c "${testcvs} ci -m yup mod1 mod2" \
- "${PROG} [a-z]*: Examining mod1
- ${PROG} [a-z]*: Examining mod2
- RCS file: ${CVSROOT_DIRNAME}/mod1/file1,v
- done
- Checking in mod1/file1;
- ${CVSROOT_DIRNAME}/mod1/file1,v <-- file1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT_DIRNAME}/mod2/file2,v
- done
- Checking in mod2/file2;
- ${CVSROOT_DIRNAME}/mod2/file2,v <-- file2
- initial revision: 1.1
- done"
- # Finished creating the module -- clean up.
- rm -rf CVS mod1 mod2
- # Done.
-
- # Try checking out the module in a local directory
- if $remote; then
- dotest_fail abspath-2a "${testcvs} co -d ${TESTDIR}/1 mod1" \
- "${PROG} \[checkout aborted\]: absolute pathname .${TESTDIR}/1. illegal for server"
- dotest abspath-2a-try2 "${testcvs} co -d 1 mod1" \
- "${PROG} checkout: Updating 1
- U 1/file1"
- else
- dotest abspath-2a "${testcvs} co -d ${TESTDIR}/1 mod1" \
- "${PROG} checkout: Updating ${TESTDIR}/1
- U ${TESTDIR}/1/file1"
- fi # remote workaround
- dotest abspath-2b "cat ${TESTDIR}/1/CVS/Repository" "mod1"
- # Done. Clean up.
- rm -rf ${TESTDIR}/1
- # Now try in a subdirectory. We're not covering any more
- # code here, but we might catch a future error if someone
- # changes the checkout code.
- # Note that for the same reason that the shell command
- # "touch 1/2/3" requires directories 1 and 1/2 to already
- # exist, we expect ${TESTDIR}/1 to already exist. I believe
- # this is the behavior of CVS 1.9 and earlier.
- if $remote; then :; else
- dotest_fail abspath-3.1 "${testcvs} co -d ${TESTDIR}/1/2 mod1" \
- "${PROG} \[checkout aborted\]: could not change directory to requested checkout directory .${TESTDIR}/1.: No such file or directory"
- fi
- dotest_fail abspath-3.2 "${testcvs} co -d 1/2 mod1" \
- "${PROG} \[checkout aborted\]: could not change directory to requested checkout directory .1.: No such file or directory"
- mkdir 1
- if $remote; then
- # The server wants the directory to exist, but that is
- # a bug, it should only need to exist on the client side.
- # See also cvsadm-2d3.
- dotest_fail abspath-3a "${testcvs} co -d 1/2 mod1" \
- "${PROG} \[checkout aborted\]: could not change directory to requested checkout directory .1.: No such file or directory"
- cd 1
- dotest abspath-3a-try2 "${testcvs} co -d 2 mod1" \
- "${PROG} checkout: Updating 2
- U 2/file1"
- cd ..
- rm -rf 1/CVS
- else
- dotest abspath-3a "${testcvs} co -d ${TESTDIR}/1/2 mod1" \
- "${PROG} checkout: Updating ${TESTDIR}/1/2
- U ${TESTDIR}/1/2/file1"
- fi # remote workaround
- dotest abspath-3b "cat ${TESTDIR}/1/2/CVS/Repository" "mod1"
- # For all the same reasons that we want "1" to already
- # exist, we don't to mess with it to traverse it, for
- # example by creating a CVS directory.
- dotest_fail abspath-3c "test -d ${TESTDIR}/1/CVS" ''
- # Done. Clean up.
- rm -rf ${TESTDIR}/1
- # Now try someplace where we don't have permission.
- mkdir ${TESTDIR}/barf
- chmod -w ${TESTDIR}/barf
- dotest_fail abspath-4r "${testcvs} co -d ${TESTDIR}/barf/sub mod1" \
- "${PROG} \[checkout aborted\]: absolute pathname .${TESTDIR}/barf/sub. illegal for server" \
- "${PROG} \[checkout aborted\]: cannot make directory sub: Permission denied"
- chmod +w ${TESTDIR}/barf
- rmdir ${TESTDIR}/barf
- # Done. Nothing to clean up.
- # Try checking out two modules into the same directory.
- if $remote; then
- dotest abspath-5ar "${testcvs} co -d 1 mod1 mod2" \
- "${PROG} checkout: Updating 1/mod1
- U 1/mod1/file1
- ${PROG} checkout: Updating 1/mod2
- U 1/mod2/file2"
- else
- dotest abspath-5a "${testcvs} co -d ${TESTDIR}/1 mod1 mod2" \
- "${PROG} checkout: Updating ${TESTDIR}/1/mod1
- U ${TESTDIR}/1/mod1/file1
- ${PROG} checkout: Updating ${TESTDIR}/1/mod2
- U ${TESTDIR}/1/mod2/file2"
- fi # end remote workaround
- dotest abspath-5b "cat ${TESTDIR}/1/CVS/Repository" "\."
- dotest abspath-5c "cat ${TESTDIR}/1/mod1/CVS/Repository" "mod1"
- dotest abspath-5d "cat ${TESTDIR}/1/mod2/CVS/Repository" "mod2"
- # Done. Clean up.
- rm -rf ${TESTDIR}/1
- # Try checking out the top-level module.
- if $remote; then
- dotest abspath-6ar "${testcvs} co -d 1 ." \
- "${PROG} checkout: Updating 1
- ${PROG} checkout: Updating 1/CVSROOT
- ${DOTSTAR}
- ${PROG} checkout: Updating 1/mod1
- U 1/mod1/file1
- ${PROG} checkout: Updating 1/mod2
- U 1/mod2/file2"
- else
- dotest abspath-6a "${testcvs} co -d ${TESTDIR}/1 ." \
- "${PROG} checkout: Updating ${TESTDIR}/1
- ${PROG} checkout: Updating ${TESTDIR}/1/CVSROOT
- ${DOTSTAR}
- ${PROG} checkout: Updating ${TESTDIR}/1/mod1
- U ${TESTDIR}/1/mod1/file1
- ${PROG} checkout: Updating ${TESTDIR}/1/mod2
- U ${TESTDIR}/1/mod2/file2"
- fi # end of remote workaround
- dotest abspath-6b "cat ${TESTDIR}/1/CVS/Repository" "\."
- dotest abspath-6c "cat ${TESTDIR}/1/CVSROOT/CVS/Repository" "CVSROOT"
- dotest abspath-6c "cat ${TESTDIR}/1/mod1/CVS/Repository" "mod1"
- dotest abspath-6d "cat ${TESTDIR}/1/mod2/CVS/Repository" "mod2"
- # Done. Clean up.
- rm -rf ${TESTDIR}/1
- # Test that an absolute pathname to some other directory
- # doesn't mess with the current working directory.
- mkdir 1
- cd 1
- if $remote; then
- dotest_fail abspath-7ar "${testcvs} -q co -d ../2 mod2" \
- "${PROG} checkout: protocol error: .\.\./2. contains more leading \.\.
- ${PROG} \[checkout aborted\]: than the 0 which Max-dotdot specified"
- cd ..
- dotest abspath-7a-try2r "${testcvs} -q co -d 2 mod2" \
- "U 2/file2"
- cd 1
- else
- dotest abspath-7a "${testcvs} -q co -d ${TESTDIR}/2 mod2" \
- "U ${TESTDIR}/2/file2"
- fi # remote workaround
- dotest abspath-7b "ls" ""
- dotest abspath-7c "${testcvs} -q co mod1" \
- "U mod1/file1"
- cd mod1
- if $remote; then
- cd ../..
- dotest abspath-7dr "${testcvs} -q co -d 3 mod2" \
- "U 3/file2"
- cd 1/mod1
- else
- dotest abspath-7d "${testcvs} -q co -d ${TESTDIR}/3 mod2" \
- "U ${TESTDIR}/3/file2"
- fi # remote workaround
- dotest abspath-7e "${testcvs} -q update -d" ""
- cd ../..
- rm -r 1 2 3
- #
- # FIXME: do other functions here (e.g. update /tmp/foo)
- #
- # Finished with all tests. Remove the module.
- rm -rf ${CVSROOT_DIRNAME}/mod1 ${CVSROOT_DIRNAME}/mod2
- ;;
- abspath2)
- # More absolute path checks. The following used to attempt to create
- # directories in /:
- #
- # $ cvs -d:fork:/cvsroot co /foo
- # cvs checkout: warning: cannot make directory CVS in /: Permission denied
- # cvs [checkout aborted]: cannot make directory /foo: Permission denied
- # $
- #
- # The -z9 in this test also checks for an old server bug where the
- # server would block indefinitely attempting to read an EOF from the
- # client in the compression buffer shutdown routine.
- dotest_fail abspath2-1 "$testcvs -z9 co /foo" \
- "$PROG \[checkout aborted\]: Absolute module reference invalid: \`/foo'" \
- "$PROG \[server aborted\]: Absolute module reference invalid: \`/foo'
- $PROG \[checkout aborted\]: end of file from server (consult above messages if any)"
- ;;
- toplevel)
- # test the feature that cvs creates a CVS subdir also for
- # the toplevel directory
- # First set the TopLevelAdmin setting.
- mkdir 1; cd 1
- dotest toplevel-1a "${testcvs} -q co CVSROOT/config" \
- "U CVSROOT/config"
- cd CVSROOT
- echo "TopLevelAdmin=yes" >config
- dotest toplevel-1b "${testcvs} -q ci -m yes-top-level" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../..
- rm -r 1
- mkdir 1; cd 1
- dotest toplevel-1 "${testcvs} -q co -l ." ''
- mkdir top-dir second-dir
- dotest toplevel-2 "${testcvs} add top-dir second-dir" \
- "Directory ${CVSROOT_DIRNAME}/top-dir added to the repository
- Directory ${CVSROOT_DIRNAME}/second-dir added to the repository"
- cd top-dir
- touch file1
- dotest toplevel-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest toplevel-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/top-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/top-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- cd ..
- cd second-dir
- touch file2
- dotest toplevel-3s "${testcvs} add file2" \
- "${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest toplevel-4s "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/second-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/second-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- cd ../..
- rm -r 1; mkdir 1; cd 1
- dotest toplevel-5 "${testcvs} co top-dir" \
- "${PROG} checkout: Updating top-dir
- U top-dir/file1"
- dotest toplevel-6 "${testcvs} update top-dir" \
- "${PROG} update: Updating top-dir"
- dotest toplevel-7 "${testcvs} update" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating top-dir"
- dotest toplevel-8 "${testcvs} update -d top-dir" \
- "${PROG} update: Updating top-dir"
- # There is some sentiment that
- # "${PROG} update: Updating \.
- # ${PROG} update: Updating top-dir"
- # is correct but it isn't clear why that would be correct instead
- # of the remote CVS behavior (which also updates CVSROOT).
- #
- # The DOTSTAR matches of a bunch of lines like
- # "U CVSROOT/checkoutlist". Trying to match them more precisely
- # seemed to cause trouble. For example CVSROOT/cvsignore will
- # be present or absent depending on whether we ran the "ignore"
- # test or not.
- dotest toplevel-9 "${testcvs} update -d" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating CVSROOT
- ${DOTSTAR}
- ${PROG} update: Updating top-dir"
- cd ..
- rm -r 1; mkdir 1; cd 1
- dotest toplevel-10 "${testcvs} co top-dir" \
- "${PROG} checkout: Updating top-dir
- U top-dir/file1"
- # This tests more or less the same thing, in a particularly
- # "real life" example.
- dotest toplevel-11 "${testcvs} -q update -d second-dir" \
- "U second-dir/file2"
- # Now remove the CVS directory (people may do this manually,
- # especially if they formed their habits with CVS
- # 1.9 and older, which didn't create it. Or perhaps the working
- # directory itself was created with 1.9 or older).
- rm -r CVS
- # Now set the permissions so we can't recreate it.
- if test -n "$remotehost"; then
- # Cygwin again.
- $CVS_RSH $remotehost "chmod -w $TESTDIR/1"
- else
- chmod -w ../1
- fi
- # Now see whether CVS has trouble because it can't create CVS.
- # First string is for local, second is for remote.
- dotest toplevel-12 "${testcvs} co top-dir" \
- "${PROG} checkout: warning: cannot make directory CVS in \.: Permission denied
- ${PROG} checkout: Updating top-dir" \
- "${PROG} checkout: warning: cannot make directory CVS in \.: Permission denied
- ${PROG} checkout: in directory \.:
- ${PROG} checkout: cannot open CVS/Entries for reading: No such file or directory
- ${PROG} checkout: Updating top-dir"
- chmod +w ../1
- dotest toplevel-cleanup-1 "${testcvs} -q co CVSROOT/config" \
- "U CVSROOT/config"
- cd CVSROOT
- echo "# empty file" >config
- dotest toplevel-cleanup-2 "${testcvs} -q ci -m toplevel-cleanup" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/top-dir ${CVSROOT_DIRNAME}/second-dir
- ;;
- toplevel2)
- # Similar to toplevel, but test the case where TopLevelAdmin=no.
- # First set the TopLevelAdmin setting.
- mkdir 1; cd 1
- dotest toplevel2-1a "${testcvs} -q co CVSROOT/config" \
- "U CVSROOT/config"
- cd CVSROOT
- echo "TopLevelAdmin=no" >config
- dotest toplevel2-1b "${testcvs} -q ci -m no-top-level" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../..
- rm -r 1
- # Now set up some directories and subdirectories
- mkdir 1; cd 1
- dotest toplevel2-1 "${testcvs} -q co -l ." ''
- mkdir top-dir second-dir
- dotest toplevel2-2 "${testcvs} add top-dir second-dir" \
- "Directory ${CVSROOT_DIRNAME}/top-dir added to the repository
- Directory ${CVSROOT_DIRNAME}/second-dir added to the repository"
- cd top-dir
- touch file1
- dotest toplevel2-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest toplevel2-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/top-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/top-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- cd ..
- cd second-dir
- touch file2
- dotest toplevel2-3s "${testcvs} add file2" \
- "${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest toplevel2-4s "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/second-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/second-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- cd ../..
- rm -r 1; mkdir 1; cd 1
- dotest toplevel2-5 "${testcvs} co top-dir" \
- "${PROG} checkout: Updating top-dir
- U top-dir/file1"
- dotest toplevel2-6 "${testcvs} update top-dir" \
- "${PROG} update: Updating top-dir"
- dotest toplevel2-7 "${testcvs} update" \
- "${PROG} update: Updating top-dir"
- dotest toplevel2-8 "${testcvs} update -d top-dir" \
- "${PROG} update: Updating top-dir"
- # Contrast this with toplevel-9, which has TopLevelAdmin=yes.
- dotest toplevel2-9 "${testcvs} update -d" \
- "${PROG} update: Updating top-dir"
- cd ..
- rm -r 1; mkdir 1; cd 1
- dotest toplevel2-10 "${testcvs} co top-dir" \
- "${PROG} checkout: Updating top-dir
- U top-dir/file1"
- # This tests more or less the same thing, in a particularly
- # "real life" example. With TopLevelAdmin=yes, this command
- # would give us second-dir and CVSROOT directories too.
- dotest toplevel2-11 "${testcvs} -q update -d" ""
- dotest toplevel2-cleanup-1 "${testcvs} -q co CVSROOT/config" \
- "U CVSROOT/config"
- cd CVSROOT
- echo "# empty file" >config
- dotest toplevel2-cleanup-2 "${testcvs} -q ci -m toplevel2-cleanup" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/top-dir ${CVSROOT_DIRNAME}/second-dir
- ;;
- rstar-toplevel)
- # This test used to confirm a bug that existed in the r* commands
- # run against the top-level project prior to CVS 1.11.18 & 1.12.10.
- #
- # The assertion failure was something like:
- # do_recursion: Assertion \`strstr (repository, \"/\./\") == ((void \*)0)' failed\..*"
- dotest rstar-toplevel-1 "$testcvs -q rlog ." \
- "
- RCS file: $CVSROOT_DIRNAME/CVSROOT$DOTSTAR"
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- ;;
- trailingslashes)
- # Some tests of CVS's reactions to path specifications containing
- # trailing slashes.
- mkdir trailingslashes; cd trailingslashes
- dotest trailingslashes-init-1 "$testcvs -Q co -ldt ."
- dotest trailingslashes-init-2 "$testcvs -Q co -dt2 ."
- cd t
- echo "Ahh'll be baaack." >topfile
- dotest trailingslashes-init-3 "$testcvs -Q add topfile"
- dotest trailingslashes-init-4 "$testcvs -Q ci -mto-top" \
- "RCS file: $CVSROOT_DIRNAME/topfile,v
- done
- Checking in topfile;
- $CVSROOT_DIRNAME/topfile,v <-- topfile
- initial revision: 1\.1
- done"
- # First, demonstrate the usual case.
- cd ../t2
- dotest trailingslashes-1 "$testcvs -q up CVSROOT"
- dotest_fail trailingslashes-1a "test -f topfile"
- # Now the one that used to fail in remote mode prior to 1.11.24
- # & 1.12.14. Formerly TODO item #205.
- dotest trailingslashes-2 "$testcvs -q up CVSROOT/"
- dotest_fail trailingslashes-2a "test -f topfile"
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -rf trailingslashes $CVSROOT_DIRNAME/topfile,v
- ;;
- checkout_repository)
- dotest_fail checkout_repository-1 \
- "${testcvs} co -d ${CVSROOT_DIRNAME} CVSROOT" \
- "${PROG} \[checkout aborted\]: Cannot check out files into the repository itself" \
- "${PROG} \[checkout aborted\]: absolute pathname \`${CVSROOT_DIRNAME}' illegal for server"
- # The behavior of the client/server test below should be correct.
- # The CVS client currently has no way of knowing that the client and
- # server are the same machine and thus skips the $CVSROOT checks.
- # I think checking for this case in CVS would be bloat since this
- # should be a fairly rare occurance.
- cd ${CVSROOT_DIRNAME}
- dotest_fail checkout_repository-2 "${testcvs} co CVSROOT" \
- "${PROG} \[checkout aborted\]: Cannot check out files into the repository itself" \
- "${PROG} checkout: Updating CVSROOT
- ${PROG} checkout: move away CVSROOT/checkoutlist; it is in the way
- C CVSROOT/checkoutlist
- ${PROG} checkout: move away CVSROOT/commitinfo; it is in the way
- C CVSROOT/commitinfo
- ${PROG} checkout: move away CVSROOT/config; it is in the way
- C CVSROOT/config
- ${PROG} checkout: move away CVSROOT/cvswrappers; it is in the way
- C CVSROOT/cvswrappers
- ${PROG} checkout: move away CVSROOT/editinfo; it is in the way
- C CVSROOT/editinfo
- ${PROG} checkout: move away CVSROOT/loginfo; it is in the way
- C CVSROOT/loginfo
- ${PROG} checkout: move away CVSROOT/modules; it is in the way
- C CVSROOT/modules
- ${PROG} checkout: move away CVSROOT/notify; it is in the way
- C CVSROOT/notify
- ${PROG} checkout: move away CVSROOT/rcsinfo; it is in the way
- C CVSROOT/rcsinfo
- ${PROG} checkout: move away CVSROOT/taginfo; it is in the way
- C CVSROOT/taginfo
- ${PROG} checkout: move away CVSROOT/verifymsg; it is in the way
- C CVSROOT/verifymsg"
- dotest checkout_repository-3 \
- "${testcvs} co -p CVSROOT/modules >/dev/null" \
- "===================================================================
- Checking out CVSROOT/modules
- RCS: ${CVSROOT_DIRNAME}/CVSROOT/modules,v
- VERS: 1\.[0-9]*
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*"
- cd ${TESTDIR}
- ;;
- mflag)
- for message in '' ' ' '
- ' ' test' ; do
- # Set up
- mkdir a-dir; cd a-dir
- # Test handling of -m during import
- echo testa >>test
- if ${testcvs} import -m "$message" a-dir A A1 >>${LOGFILE} 2>&1;then
- pass 156
- else
- fail 156
- fi
- # Must import twice since the first time uses inline code that
- # avoids RCS call.
- echo testb >>test
- if ${testcvs} import -m "$message" a-dir A A2 >>${LOGFILE} 2>&1;then
- pass 157
- else
- fail 157
- fi
- # Test handling of -m during ci
- cd ..; rm -r a-dir
- if ${testcvs} co a-dir >>${LOGFILE} 2>&1; then
- pass 158
- else
- fail 158
- fi
- cd a-dir
- echo testc >>test
- if ${testcvs} ci -m "$message" >>${LOGFILE} 2>&1; then
- pass 159
- else
- fail 159
- fi
- # Test handling of -m during rm/ci
- rm test;
- if ${testcvs} rm test >>${LOGFILE} 2>&1; then
- pass 160
- else
- fail 160
- fi
- if ${testcvs} ci -m "$message" >>${LOGFILE} 2>&1; then
- pass 161
- else
- fail 161
- fi
- # Clean up
- cd ..
- rm -r a-dir
- rm -rf ${CVSROOT_DIRNAME}/a-dir
- done
- ;;
- editor)
- # More tests of log messages, in this case the ability to
- # run an external editor.
- # TODO:
- # * also test $EDITOR, $CVSEDITOR, &c.
- # * test what happens if up-to-date check fails.
- # Our "editor" puts "x" at the start of each line, so we
- # can see the "CVS:" lines.
- cat >${TESTDIR}/editme <<EOF
- #!${TESTSHELL}
- sleep 1
- sed <\$1 -e 's/^/x/' >${TESTDIR}/edit.new
- mv ${TESTDIR}/edit.new \$1
- exit 0
- EOF
- chmod +x ${TESTDIR}/editme
- mkdir 1; cd 1
- dotest editor-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest editor-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch file1 file2
- dotest editor-3 "${testcvs} add file1 file2" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest editor-4 "${testcvs} -e ${TESTDIR}/editme -q ci" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- dotest editor-5 "${testcvs} -q tag -b br" "T file1
- T file2"
- dotest editor-6 "$testcvs -q update -r br" \
- 'U file1
- U file2'
- echo modify >>file1
- dotest editor-7 "${testcvs} -e ${TESTDIR}/editme -q ci" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- # OK, now we want to make sure "ci -r" puts in the branch
- # where appropriate. Note that we can check in on the branch
- # without being on the branch, because there is not a revision
- # already on the branch. If there were a revision on the branch,
- # CVS would correctly give an up-to-date check failed.
- dotest editor-8 "$testcvs -q update -A" \
- 'U file1
- U file2'
- echo add a line >>file2
- dotest editor-9 "${testcvs} -q -e ${TESTDIR}/editme ci -rbr file2" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest editor-log-file1 "${testcvs} log -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.2;
- xCVS: ----------------------------------------------------------------------
- xCVS: Enter Log. Lines beginning with .CVS:. are removed automatically
- xCVS:
- xCVS: Committing in .
- xCVS:
- xCVS: Added Files:
- xCVS: file1 file2
- xCVS: ----------------------------------------------------------------------
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- xCVS: ----------------------------------------------------------------------
- xCVS: Enter Log. Lines beginning with .CVS:. are removed automatically
- xCVS:
- xCVS: Committing in .
- xCVS:
- xCVS: Modified Files:
- xCVS: Tag: br
- xCVS: file1
- xCVS: ----------------------------------------------------------------------
- ============================================================================="
- # The only difference between the two expect strings is the
- # presence or absence of "Committing in ." for 1.1.2.1.
- dotest editor-log-file2 "${testcvs} log -N file2" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- Working file: file2
- head: 1\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.2;
- xCVS: ----------------------------------------------------------------------
- xCVS: Enter Log. Lines beginning with .CVS:. are removed automatically
- xCVS:
- xCVS: Committing in .
- xCVS:
- xCVS: Added Files:
- xCVS: file1 file2
- xCVS: ----------------------------------------------------------------------
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- xCVS: ----------------------------------------------------------------------
- xCVS: Enter Log. Lines beginning with .CVS:. are removed automatically
- xCVS:
- xCVS: Modified Files:
- xCVS: Tag: br
- xCVS: file2
- xCVS: ----------------------------------------------------------------------
- =============================================================================" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- Working file: file2
- head: 1\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.2;
- xCVS: ----------------------------------------------------------------------
- xCVS: Enter Log. Lines beginning with .CVS:. are removed automatically
- xCVS:
- xCVS: Committing in .
- xCVS:
- xCVS: Added Files:
- xCVS: file1 file2
- xCVS: ----------------------------------------------------------------------
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- xCVS: ----------------------------------------------------------------------
- xCVS: Enter Log. Lines beginning with .CVS:. are removed automatically
- xCVS:
- xCVS: Committing in .
- xCVS:
- xCVS: Modified Files:
- xCVS: Tag: br
- xCVS: file2
- xCVS: ----------------------------------------------------------------------
- ============================================================================="
- # Test CVS's response to an unchanged log message
- cat >${TESTDIR}/editme <<EOF
- #!${TESTSHELL}
- sleep 1
- exit 0
- EOF
- chmod +x ${TESTDIR}/editme
- dotest_fail editor-emptylog-1 "echo a |${testcvs} -e ${TESTDIR}/editme ci -f file1" \
- "
- Log message unchanged or not specified
- a)bort, c)ontinue, e)dit, !)reuse this message unchanged for remaining dirs
- Action: (continue) ${PROG} \[[a-z]* aborted\]: aborted by user"
- # Test CVS's response to an empty log message
- cat >${TESTDIR}/editme <<EOF
- #!${TESTSHELL}
- sleep 1
- cat /dev/null >\$1
- exit 0
- EOF
- chmod +x ${TESTDIR}/editme
- dotest_fail editor-emptylog-1 "echo a |${testcvs} -e ${TESTDIR}/editme ci -f file1" \
- "
- Log message unchanged or not specified
- a)bort, c)ontinue, e)dit, !)reuse this message unchanged for remaining dirs
- Action: (continue) ${PROG} \[[a-z]* aborted\]: aborted by user"
- # Test CVS's response to a log message with one blank line
- cat >${TESTDIR}/editme <<EOF
- #!${TESTSHELL}
- sleep 1
- echo >\$1
- exit 0
- EOF
- chmod +x ${TESTDIR}/editme
- dotest_fail editor-emptylog-1 "echo a |${testcvs} -e ${TESTDIR}/editme ci -f file1" \
- "
- Log message unchanged or not specified
- a)bort, c)ontinue, e)dit, !)reuse this message unchanged for remaining dirs
- Action: (continue) ${PROG} \[[a-z]* aborted\]: aborted by user"
- # Test CVS's response to a log message with only comments
- cat >${TESTDIR}/editme <<EOF
- #!${TESTSHELL}
- sleep 1
- cat \$1 >${TESTDIR}/edit.new
- mv ${TESTDIR}/edit.new \$1
- exit 0
- EOF
- chmod +x ${TESTDIR}/editme
- dotest_fail editor-emptylog-1 "echo a |${testcvs} -e ${TESTDIR}/editme ci -f file1" \
- "
- Log message unchanged or not specified
- a)bort, c)ontinue, e)dit, !)reuse this message unchanged for remaining dirs
- Action: (continue) ${PROG} \[[a-z]* aborted\]: aborted by user"
- # Test CVS's response to a log message that is zero bytes
- # in length. This caused core dumps in cvs 1.11.5 on Solaris
- # hosts.
- cd ..
- dotest editor-emptylog-continue-1 "${testcvs} -q co CVSROOT/loginfo" \
- "U CVSROOT/loginfo"
- cd CVSROOT
- echo 'DEFAULT (echo Start-Log;cat;echo End-Log) >> \$CVSROOT/CVSROOT/commitlog' > loginfo
- dotest editor-emptylog-continue-2 "${testcvs} commit -m add loginfo" \
- "Checking in loginfo;
- ${CVSROOT_DIRNAME}/CVSROOT/loginfo,v <-- loginfo
- new revision: 1\.2; previous revision: 1\.1
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../first-dir
- cat >${TESTDIR}/editme <<EOF
- #!${TESTSHELL}
- sleep 1
- cp /dev/null \$1
- exit 1
- EOF
- chmod +x ${TESTDIR}/editme
- dotest editor-emptylog-continue-3 "echo c |${testcvs} -e ${TESTDIR}/editme ci -f file1" \
- "${PROG} [a-z]*: warning: editor session failed
- Log message unchanged or not specified
- a)bort, c)ontinue, e)dit, !)reuse this message unchanged for remaining dirs
- Action: (continue) Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- # The loginfo Log message should be an empty line and not "(null)"
- # which is what some fprintf() implementations do with "%s"
- # format and a NULL pointer...
- if $remote; then
- dotest editor-emptylog-continue-4r \
- "cat ${CVSROOT_DIRNAME}/CVSROOT/commitlog" \
- "Start-Log
- Update of ${CVSROOT_DIRNAME}/first-dir
- In directory ${hostname}:${TMPDIR}/cvs-serv[0-9a-z]*
- Modified Files:
- file1
- Log Message:
- End-Log"
- else
- dotest editor-emptylog-continue-4 \
- "cat ${CVSROOT_DIRNAME}/CVSROOT/commitlog" \
- "Start-Log
- Update of ${CVSROOT_DIRNAME}/first-dir
- In directory ${hostname}:${TESTDIR}/1/first-dir
- Modified Files:
- file1
- Log Message:
- End-Log"
- fi
- # There should have an empty log message at this point
- dotest editor-emptylog-continue-5 "${testcvs} log -N -r1.2 file1" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.2
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 3; selected revisions: 1
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: +0 -0
- \*\*\* empty log message \*\*\*
- ============================================================================="
- # clean up
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- restore_adm
- cd ../..
- rm -r 1
- rm ${TESTDIR}/editme
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- errmsg1)
- mkdir ${CVSROOT_DIRNAME}/1dir
- mkdir 1
- cd 1
- if ${testcvs} -q co 1dir; then
- pass 162
- else
- fail 162
- fi
- cd 1dir
- touch foo
- if ${testcvs} add foo 2>>${LOGFILE}; then
- pass 163
- else
- fail 163
- fi
- if ${testcvs} ci -m added >>${LOGFILE} 2>&1; then
- pass 164
- else
- fail 164
- fi
- cd ../..
- mkdir 2
- cd 2
- if ${testcvs} -q co 1dir >>${LOGFILE}; then
- pass 165
- else
- fail 165
- fi
- chmod a-w 1dir
- cd ../1/1dir
- rm foo;
- if ${testcvs} rm foo >>${LOGFILE} 2>&1; then
- pass 166
- else
- fail 166
- fi
- if ${testcvs} ci -m removed >>${LOGFILE} 2>&1; then
- pass 167
- else
- fail 167
- fi
- cd ../../2/1dir
- # The second case in the local and remote versions of errmsg1-168
- # below happens on Cygwin under Windows, where write privileges
- # aren't enforced properly.
- if $remote; then
- dotest errmsg1-168r "${testcvs} -q update" \
- "${PROG} update: foo is no longer in the repository
- ${PROG} update: unable to remove \./foo: Permission denied" \
- "${PROG} update: foo is no longer in the repository"
- else
- dotest errmsg1-168 "${testcvs} -q update" \
- "${PROG} update: foo is no longer in the repository
- ${PROG} update: unable to remove foo: Permission denied" \
- "${PROG} update: foo is no longer in the repository"
- fi
- cd ..
- chmod u+w 1dir
- cd ..
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/1dir
- ;;
- errmsg2)
- # More tests of various miscellaneous error handling,
- # and cvs add behavior in general.
- # See also test basicb-4a, concerning "cvs ci CVS".
- # Too many tests to mention test the simple cases of
- # adding files and directories.
- # Test basicb-2a10 tests cvs -n add.
- # First the usual setup; create a directory first-dir.
- mkdir 1; cd 1
- dotest errmsg2-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest errmsg2-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- dotest_fail errmsg2-3 "${testcvs} add CVS" \
- "${PROG} [a-z]*: cannot add special file .CVS.; skipping"
- touch file1
- # For the most part add returns a failure exitstatus if
- # there are any errors, even if the remaining files are
- # processed without incident. The "cannot add
- # special file" message fits this pattern, at
- # least currently.
- dotest_fail errmsg2-4 "${testcvs} add CVS file1" \
- "${PROG} add: cannot add special file .CVS.; skipping
- ${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- # I'm not sure these tests completely convey the various strange
- # behaviors that CVS had before it specially checked for "." and
- # "..". Suffice it to say that these are unlikely to work right
- # without a special case.
- dotest_fail errmsg2-5 "${testcvs} add ." \
- "${PROG} [a-z]*: cannot add special file .\..; skipping"
- dotest_fail errmsg2-6 "${testcvs} add .." \
- "${PROG} [a-z]*: cannot add special file .\.\..; skipping"
- # Make sure that none of the error messages left droppings
- # which interfere with normal operation.
- dotest errmsg2-7 "${testcvs} -q ci -m add-file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- mkdir sdir
- cd ..
- dotest errmsg2-8 "${testcvs} add first-dir/sdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/sdir added to the repository"
- # while we're here... check commit with no CVS directory
- dotest_fail errmsg2-8a "${testcvs} -q ci first-dir nonexistant" \
- "${PROG} [a-z]*: nothing known about .nonexistant'
- ${PROG} \[[a-z]* aborted\]: correct above errors first!"
- dotest_fail errmsg2-8b "${testcvs} -q ci nonexistant first-dir" \
- "${PROG} [a-z]*: nothing known about .nonexistant'
- ${PROG} \[[a-z]* aborted\]: correct above errors first!"
- dotest errmsg2-8c "${testcvs} -q ci first-dir" ""
- cd first-dir
- touch file10
- mkdir sdir10
- dotest errmsg2-10 "${testcvs} add file10 sdir10" \
- "${PROG} add: scheduling file .file10. for addition
- Directory ${CVSROOT_DIRNAME}/first-dir/sdir10 added to the repository
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest errmsg2-11 "${testcvs} -q ci -m add-file10" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file10,v
- done
- Checking in file10;
- ${CVSROOT_DIRNAME}/first-dir/file10,v <-- file10
- initial revision: 1\.1
- done"
- # Try to see that there are no droppings left by
- # any of the previous tests.
- dotest errmsg2-12 "${testcvs} -q update" ""
- # Now test adding files with '/' in the name, both one level
- # down and more than one level down.
- cd ..
- mkdir first-dir/sdir10/ssdir
- dotest errmsg2-13 "${testcvs} add first-dir/sdir10/ssdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/sdir10/ssdir added to the repository"
- touch first-dir/sdir10/ssdir/ssfile
- dotest errmsg2-14 \
- "${testcvs} add first-dir/sdir10/ssdir/ssfile" \
- "${PROG} add: scheduling file .first-dir/sdir10/ssdir/ssfile. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- touch first-dir/file15
- dotest errmsg2-15 "${testcvs} add first-dir/file15" \
- "${PROG} add: scheduling file .first-dir/file15. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- # Now the case where we try to give it a directory which is not
- # under CVS control.
- mkdir bogus-dir
- touch bogus-dir/file16
- # The first message, from local CVS, is nice. The second one
- # is not nice; would be good to fix remote CVS to give a clearer
- # message (e.g. the one from local CVS). But at least it is an
- # error message.
- dotest_fail errmsg2-16 "${testcvs} add bogus-dir/file16" \
- "${PROG} add: in directory bogus-dir:
- ${PROG} \[add aborted\]: there is no version here; do .${PROG} checkout. first" \
- "${PROG} add: cannot open CVS/Entries for reading: No such file or directory
- ${PROG} \[add aborted\]: no repository"
- rm -r bogus-dir
- # One error condition we don't test for is trying to add a file
- # or directory which already is there.
- dotest errmsg2-17 "${testcvs} -q ci -m checkin" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file15,v
- done
- Checking in first-dir/file15;
- ${CVSROOT_DIRNAME}/first-dir/file15,v <-- file15
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir10/ssdir/ssfile,v
- done
- Checking in first-dir/sdir10/ssdir/ssfile;
- ${CVSROOT_DIRNAME}/first-dir/sdir10/ssdir/ssfile,v <-- ssfile
- initial revision: 1\.1
- done"
- dotest errmsg2-18 "${testcvs} -Q tag test" ''
- # trying to import the repository
- if $remote; then :; else
- cd ${CVSROOT_DIRNAME}
- dotest_fail errmsg2-20 "${testcvs} import -mtest . A B" \
- "${PROG} \[import aborted\]: attempt to import the repository"
- dotest_fail errmsg2-21 "${testcvs} import -mtest first-dir A B" \
- "${PROG} \[import aborted\]: attempt to import the repository"
- fi
- cd ..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- adderrmsg)
- # Test some of the error messages the 'add' command can return and
- # their reactions to '-q'.
- # First the usual setup; create a directory first-dir.
- mkdir 1; cd 1
- dotest adderrmsg-init1 "${testcvs} -q co -l ." ''
- mkdir adderrmsg-dir
- dotest adderrmsg-init2 "${testcvs} add adderrmsg-dir" \
- "Directory ${CVSROOT_DIRNAME}/adderrmsg-dir added to the repository"
- cd adderrmsg-dir
- # try to add the admin dir
- dotest_fail adderrmsg-1 "${testcvs} add CVS" \
- "${PROG} [a-z]*: cannot add special file .CVS.; skipping"
- # might not want to see this message when you 'cvs add *'
- dotest_fail adderrmsg-2 "${testcvs} -q add CVS" ""
- # to test some other messages
- touch file1
- dotest adderrmsg-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- # add it twice
- dotest_fail adderrmsg-4 "${testcvs} add file1" \
- "${PROG} add: file1 has already been entered"
- dotest_fail adderrmsg-5 "${testcvs} -q add file1" ""
- dotest adderrmsg-6 "${testcvs} -q ci -madd" \
- "RCS file: ${CVSROOT_DIRNAME}/adderrmsg-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/adderrmsg-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- # file in Entries & repository
- dotest_fail adderrmsg-7 "${testcvs} add file1" \
- "${PROG} add: file1 already exists, with version number 1\.1"
- dotest_fail adderrmsg-8 "${testcvs} -q add file1" ""
- # clean up
- cd ../..
- if $keep; then :; else
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/adderrmsg-dir
- fi
- ;;
- opterrmsg)
- # Test some option parsing error messages
- # No init is necessary since these error messages are printed b4
- # CVS looks for a sandbox or repository
- # -z used to accept non-numeric arguments. This bit someone who
- # attempted `cvs -z -n up' when the -n was read as the argument to
- # -z.
- dotest_fail opterrmsg-1 "${testcvs} -z -n up" \
- "${PROG}: gzip compression level must be between 0 and 9"
- # Some general -z checks
- dotest_fail opterrmsg-2 "${testcvs} -z -1 up" \
- "${PROG}: gzip compression level must be between 0 and 9"
- dotest_fail opterrmsg-3 "${testcvs} -z10 up" \
- "${PROG}: gzip compression level must be between 0 and 9"
- ;;
- devcom)
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1
- cd 1
- dotest devcom-1 "${testcvs} -q co first-dir"
- cd first-dir
- echo abb >abb
- dotest devcom-2 "${testcvs} add abb" \
- "$PROG add: scheduling file \`abb' for addition
- $PROG add: use '$PROG commit' to add this file permanently"
- dotest devcom-3 "${testcvs} -q ci -m added" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/abb,v
- done
- Checking in abb;
- ${CVSROOT_DIRNAME}/first-dir/abb,v <-- abb
- initial revision: 1\.1
- done"
- dotest_fail devcom-4 "${testcvs} watch" "Usage${DOTSTAR}"
- dotest devcom-5 "${testcvs} watch on"
- echo abc >abc
- dotest devcom-6 "${testcvs} add abc" \
- "$PROG add: scheduling file \`abc' for addition
- $PROG add: use '$PROG commit' to add this file permanently"
- dotest devcom-7 "${testcvs} -q ci -m added" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/abc,v
- done
- Checking in abc;
- ${CVSROOT_DIRNAME}/first-dir/abc,v <-- abc
- initial revision: 1\.1
- done"
- cd ../..
- mkdir 2
- cd 2
- dotest devcom-8 "${testcvs} -q co first-dir" \
- "U first-dir/abb
- U first-dir/abc"
- cd first-dir
- dotest_fail devcom-9 "test -w abb"
- dotest_fail devcom-9 "test -w abc"
- dotest devcom-10 "${testcvs} editors" ""
- dotest devcom-11 "${testcvs} edit abb"
- # Here we test for the traditional ISO C ctime() date format.
- # We assume the C locale; I guess that works provided we set
- # LC_ALL at the start of this script but whether these
- # strings should vary based on locale does not strike me as
- # self-evident.
- dotest devcom-12 "${testcvs} editors" \
- "abb ${username} [SMTWF][uoehra][neduit] [JFAMSOND][aepuco][nbrylgptvc] [0-9 ][0-9] [0-9:]* [0-9][0-9][0-9][0-9] GMT [-a-zA-Z_.0-9]* ${TESTDIR}/2/first-dir"
- echo aaaa >>abb
- dotest devcom-13 "${testcvs} ci -m modify abb" \
- "Checking in abb;
- ${CVSROOT_DIRNAME}/first-dir/abb,v <-- abb
- new revision: 1\.2; previous revision: 1\.1
- done"
- # Unedit of a file not being edited should be a noop.
- dotest devcom-14 "${testcvs} unedit abb" ''
- dotest devcom-15 "${testcvs} editors" ""
- dotest_fail devcom-16 "test -w abb"
- dotest devcom-17 "${testcvs} edit abc"
- # Unedit of an unmodified file.
- dotest devcom-18 "${testcvs} unedit abc"
- dotest devcom-19 "${testcvs} edit abc"
- echo changedabc >abc
- # Try to unedit a modified file; cvs should ask for confirmation
- dotest devcom-20 "echo no | ${testcvs} unedit abc" \
- "abc has been modified; revert changes? "
- dotest devcom-21 "echo changedabc | cmp - abc"
- # OK, now confirm the unedit
- dotest devcom-22 "echo yes | ${testcvs} unedit abc" \
- "abc has been modified; revert changes? "
- dotest devcom-23 "echo abc | cmp - abc"
- dotest devcom-24 "${testcvs} watchers" ''
- # FIXME: This probably should be an error message instead
- # of silently succeeding and printing nothing.
- dotest devcom-a-nonexist "${testcvs} watchers nonexist" ''
- dotest devcom-a1 "${testcvs} watch add" ''
- dotest devcom-a2 "${testcvs} watchers" \
- "abb ${username} edit unedit commit
- abc ${username} edit unedit commit"
- dotest devcom-a3 "${testcvs} watch remove -a unedit abb" ''
- dotest devcom-a4 "${testcvs} watchers abb" \
- "abb ${username} edit commit"
- # Check tagging and checking out while we have a CVS
- # directory in the repository.
- dotest devcom-t0 "${testcvs} -q tag tag" \
- 'T abb
- T abc'
- cd ../..
- mkdir 3
- cd 3
- # Test commented out because the bug it tests for is not fixed
- # The error is:
- # cvs watchers: cannot open CVS/Entries for reading: No such file or directory
- # cvs: ../../work/ccvs/src/fileattr.c:75: fileattr_read: Assertion `fileattr_stored_repos != ((void *)0)' failed.
- : dotest devcom-t-nonexist "${testcvs} watchers nonexist" fixme
- dotest devcom-t1 "${testcvs} -q co -rtag first-dir/abb" \
- 'U first-dir/abb'
- cd ..
- # Since first-dir/abb is readonly, use -f.
- rm -rf 3
- # Test checking out the directory rather than the file.
- mkdir 3
- cd 3
- dotest devcom-t2 "${testcvs} -q co -rtag first-dir" \
- 'U first-dir/abb
- U first-dir/abc'
- cd ..
- # Since the files are readonly, use -f.
- rm -rf 3
- # Now do it again, after removing the val-tags file created
- # by devcom-t1 to force CVS to search the repository
- # containing CVS directories.
- rm -f ${CVSROOT_DIRNAME}/CVSROOT/val-tags
- mkdir 3
- cd 3
- dotest devcom-t3 "${testcvs} -q co -rtag first-dir" \
- 'U first-dir/abb
- U first-dir/abc'
- cd ..
- # Since the files are readonly, use -f.
- rm -rf 3
- # Now remove all the file attributes
- cd 2/first-dir
- dotest devcom-b0 "${testcvs} watch off" ''
- dotest devcom-b1 "${testcvs} watch remove" ''
- # Test that CVS 1.6 and earlier can handle the repository.
- dotest_fail devcom-b2 "test -d ${CVSROOT_DIRNAME}/first-dir/CVS"
- # Now test watching just some, not all, files.
- dotest devcom-some0 "${testcvs} watch on abc" ''
- cd ../..
- mkdir 3
- cd 3
- dotest devcom-some1 "${testcvs} -q co first-dir" 'U first-dir/abb
- U first-dir/abc'
- dotest devcom-some2 "test -w first-dir/abb" ''
- dotest_fail devcom-some3 "test -w first-dir/abc" ''
- cd ..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- # Use -f because of the readonly files.
- rm -rf 1 2 3
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- devcom2)
- # More watch tests, most notably setting watches on
- # files in various different states.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1
- cd 1
- dotest devcom2-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- # This should probably be an error; setting a watch on a totally
- # unknown file is more likely to be a typo than intentional.
- # But that isn't the currently implemented behavior.
- dotest devcom2-2 "${testcvs} watch on w1" ''
- touch w1 w2 w3 nw1
- dotest devcom2-3 "${testcvs} add w1 w2 w3 nw1" "${DOTSTAR}"
- # Letting the user set the watch here probably can be considered
- # a feature--although it leads to a few potentially strange
- # consequences like one user can set the watch and another actually
- # adds the file.
- dotest devcom2-4 "${testcvs} watch on w2" ''
- dotest devcom2-5 "${testcvs} -q ci -m add-them" "${DOTSTAR}"
- # Note that this test differs in a subtle way from devcom-some0;
- # in devcom-some0 the watch is creating a new fileattr file, and
- # here we are modifying an existing one.
- dotest devcom2-6 "${testcvs} watch on w3" ''
- # Now test that all the watches got set on the correct files
- # FIXME: CVS should have a way to report whether watches are
- # set, I think. The "check it out and see if it read-only" is
- # sort of OK, but is complicated by CVSREAD and doesn't help
- # if the file is added and not yet committed or some such.
- # Probably "cvs status" should report "watch: on" if watch is on
- # (and nothing if watch is off, so existing behavior is preserved).
- cd ../..
- mkdir 2
- cd 2
- dotest devcom2-7 "${testcvs} -q co first-dir" 'U first-dir/nw1
- U first-dir/w1
- U first-dir/w2
- U first-dir/w3'
- dotest devcom2-8 "test -w first-dir/nw1" ''
- dotest_fail devcom2-9 "test -w first-dir/w1" ''
- dotest_fail devcom2-10 "test -w first-dir/w2" ''
- dotest_fail devcom2-11 "test -w first-dir/w3" ''
- cd first-dir
- # OK, now we want to try files in various states with cvs edit.
- dotest devcom2-12 "${testcvs} edit w4" \
- "${PROG} edit: no such file w4; ignored"
- # Try the same thing with a per-directory watch set.
- dotest devcom2-13 "${testcvs} watch on" ''
- dotest devcom2-14 "${testcvs} edit w5" \
- "${PROG} edit: no such file w5; ignored"
- dotest devcom2-15 "${testcvs} editors" ''
- dotest devcom2-16 "${testcvs} editors w4" ''
- # Make sure there are no droppings lying around
- dotest devcom2-17 "cat ${CVSROOT_DIRNAME}/first-dir/CVS/fileattr" \
- "Fw1 _watched=
- Fw2 _watched=
- Fw3 _watched=
- Fnw1 _watched=
- D _watched="
- cd ..
- # Do a little error testing
- dotest devcom2-18 "${testcvs} -q co -d first+dir first-dir" \
- "U first${PLUS}dir/nw1
- U first${PLUS}dir/w1
- U first${PLUS}dir/w2
- U first${PLUS}dir/w3"
- cd first+dir
- dotest_fail devcom2-19 "${testcvs} edit" \
- "${PROG} \[[a-z]* aborted\]: current directory (${TESTDIR}/2/first${PLUS}dir) contains an invalid character (${PLUS},>;=\\\\t\\\\n)"
- # Make sure there are no droppings lying around
- dotest devcom2-20 "cat ${CVSROOT_DIRNAME}/first-dir/CVS/fileattr" \
- "Fw1 _watched=
- Fw2 _watched=
- Fw3 _watched=
- Fnw1 _watched=
- D _watched="
- cd ../..
- # Use -f because of the readonly files.
- rm -rf 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- devcom3)
- # More watch tests, most notably handling of features designed
- # for future expansion.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1
- cd 1
- dotest devcom3-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- touch w1 w2
- dotest devcom3-2 "${testcvs} add w1 w2" "${DOTSTAR}"
- dotest devcom3-3 "${testcvs} watch on w1 w2" ''
- dotest devcom3-4 "${testcvs} -q ci -m add-them" "${DOTSTAR}"
- # OK, since we are about to delve into CVS's internals, make
- # sure that we seem to be correct about how they work.
- dotest devcom3-5 "cat ${CVSROOT_DIRNAME}/first-dir/CVS/fileattr" \
- "Fw1 _watched=
- Fw2 _watched="
- # Now write a few more lines, just as if we were a newer version
- # of CVS implementing some new feature.
- cat <<'EOF' >>${CVSROOT_DIRNAME}/first-dir/CVS/fileattr
- Enew line here
- G@#$^!@#=&
- EOF
- # Now get CVS to write to the fileattr file....
- dotest devcom3-6 "${testcvs} watch off w1" ''
- # ...and make sure that it hasn't clobbered our new lines.
- # Note that writing these lines in another order would be OK
- # too.
- dotest devcom3-7 "cat ${CVSROOT_DIRNAME}/first-dir/CVS/fileattr" \
- "Fw2 _watched=
- G@#..!@#=&
- Enew line here"
- # See what CVS does when a file name is duplicated. The
- # behavior of all versions of CVS since file attributes were
- # implemented is that it nukes the duplications. This seems
- # reasonable enough, although it means it isn't clear how
- # useful duplicates would be for purposes of future
- # expansion. But in the interests of keeping behaviors
- # predictable, might as well test for it, I guess.
- echo 'Fw2 duplicate=' >>${CVSROOT_DIRNAME}/first-dir/CVS/fileattr
- dotest devcom3-8 "${testcvs} watch on w1" ''
- dotest devcom3-9 "cat ${CVSROOT_DIRNAME}/first-dir/CVS/fileattr" \
- "Fw2 _watched=
- Fw1 _watched=
- Enew line here
- G@#..!@#=&"
- # Now test disconnected "cvs edit" and the format of the
- # CVS/Notify file.
- if $remote; then
- CVS_SERVER_save=${CVS_SERVER}
- CVS_SERVER=${TESTDIR}/cvs-none; export CVS_SERVER
- # The ${DOTSTAR} below matches the exact CVS server error message,
- # which in :fork: mode is:
- # "$PROG \[edit aborted\]: cannot exec $TESTDIR/cvs-none: ${DOTSTAR}",
- # but which is:
- # "bash2: line 1: $TESTDIR/cvs-none: No such file or directory"
- # when testing across an :ext:/ssh link to my Linux 2.4 box.
- #
- # I can't even test for the second part of the error message,
- # from the client, which varies more consistently, usually either
- # "end of file from server" (if the process doing the exec exits
- # before the parent gets around to sending data to it) or
- # "received broken pipe signal" (if it is the other way around),
- # since HP-UX fails to output it.
- dotest_fail devcom3-9ar "${testcvs} edit w1 2>/dev/null"
- dotest devcom3-9br "test -w w1" ""
- dotest devcom3-9cr "cat CVS/Notify" \
- "Ew1 [SMTWF][uoehra][neduit] [JFAMSOND][aepuco][nbrylgptvc] [0-9 ][0-9] [0-9:]* [0-9][0-9][0-9][0-9] GMT [-a-zA-Z_.0-9]* ${TESTDIR}/1/first-dir EUC"
- CVS_SERVER=${CVS_SERVER_save}; export CVS_SERVER
- dotest devcom3-9dr "${testcvs} -q update" ""
- dotest_fail devcom3-9er "test -f CVS/Notify" ""
- dotest devcom3-9fr "${testcvs} watchers w1" \
- "w1 ${username} tedit tunedit tcommit"
- dotest devcom3-9gr "${testcvs} unedit w1" ""
- dotest devcom3-9hr "${testcvs} watchers w1" ""
- fi
- cd ../..
- # OK, now change the tab to a space, and see that CVS gives
- # a reasonable error (this is database corruption but CVS should
- # not lose its mind).
- sed -e 's/Fw2 /Fw2 /' <${CVSROOT_DIRNAME}/first-dir/CVS/fileattr \
- >${CVSROOT_DIRNAME}/first-dir/CVS/fileattr.new
- mv ${CVSROOT_DIRNAME}/first-dir/CVS/fileattr.new \
- ${CVSROOT_DIRNAME}/first-dir/CVS/fileattr
- mkdir 2; cd 2
- dotest_fail devcom3-10 "${testcvs} -Q co ." \
- "${PROG} \[checkout aborted\]: file attribute database corruption: tab missing in ${CVSROOT_DIRNAME}/first-dir/CVS/fileattr"
- cd ..
- # Use -f because of the readonly files.
- rm -rf 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- watch4)
- # More watch tests, including adding directories.
- mkdir 1; cd 1
- dotest watch4-0a "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest watch4-0b "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- dotest watch4-1 "${testcvs} watch on" ''
- # This is just like the 173 test
- touch file1
- dotest watch4-2 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest watch4-3 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- # Now test the analogous behavior for directories.
- mkdir subdir
- dotest watch4-4 "${testcvs} add subdir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/subdir added to the repository"
- cd subdir
- touch sfile
- dotest watch4-5 "${testcvs} add sfile" \
- "${PROG} add: scheduling file .sfile. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest watch4-6 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/subdir/sfile,v
- done
- Checking in sfile;
- ${CVSROOT_DIRNAME}/first-dir/subdir/sfile,v <-- sfile
- initial revision: 1\.1
- done"
- cd ../../..
- mkdir 2; cd 2
- dotest watch4-7 "${testcvs} -q co first-dir" "U first-dir/file1
- U first-dir/subdir/sfile"
- dotest_fail watch4-8 "test -w first-dir/file1" ''
- dotest_fail watch4-9 "test -w first-dir/subdir/sfile" ''
- cd first-dir
- dotest watch4-10 "${testcvs} edit file1" ''
- echo 'edited in 2' >file1
- cd ../..
- cd 1/first-dir
- dotest watch4-11 "${testcvs} edit file1" ''
- echo 'edited in 1' >file1
- dotest watch4-12 "${testcvs} -q ci -m edit-in-1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../..
- cd 2/first-dir
- dotest watch4-13 "${testcvs} -q update" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1 and 1\.2 into file1
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in file1
- C file1"
- if (echo yes | ${testcvs} unedit file1) >>${LOGFILE}; then
- pass watch4-14
- else
- fail watch4-15
- fi
- # This could plausibly be defined to either go back to the revision
- # which was cvs edit'd (the status quo), or back to revision 1.2
- # (that is, the merge could update CVS/Base/file1). We pick the
- # former because it is easier to implement, not because we have
- # thought much about which is better.
- dotest watch4-16 "cat file1" ''
- # Make sure CVS really thinks we are at 1.1.
- dotest watch4-17 "${testcvs} -q update" "U file1"
- dotest watch4-18 "cat file1" "edited in 1"
- cd ../..
- # As a sanity check, make sure we are in the right place.
- dotest watch4-cleanup-1 "test -d 1" ''
- dotest watch4-cleanup-1 "test -d 2" ''
- # Specify -f because of the readonly files.
- rm -rf 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- watch5)
- # This test was designed to catch a problem in server
- # mode where an 'cvs edit'd file disappeared from the
- # CVS/Base directory when 'cvs status' or 'cvs update'
- # was called on the file after the file was touched.
- #
- # This test is still here to prevent the bug from
- # being reintroduced.
- #
- # The rationale for having CVS/Base stay around is that
- # CVS/Base should be there if "cvs edit" has been run (this
- # may be helpful as a "cvs editors" analogue, it is
- # client-side and based on working directory not username;
- # but more importantly, it isn't clear why a "cvs status"
- # would act like an unedit, and even if it does, it would
- # need to make the file read-only again).
- mkdir watch5; cd watch5
- dotest watch5-0a "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest watch5-0b "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- dotest watch5-1 "${testcvs} watch on" ''
- # This is just like the 173 test
- touch file1
- dotest watch5-2 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest watch5-3 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest watch5-4 "${testcvs} edit file1" ''
- dotest watch5-5 "test -f CVS/Base/file1" ''
- if ${testcvs} status file1 >>${LOGFILE} 2>&1; then
- pass watch5-6
- else
- fail watch5-6
- fi
- dotest watch5-7 "test -f CVS/Base/file1" ''
- # Here's where the file used to dissappear
- touch file1
- if ${testcvs} status file1 >>${LOGFILE} 2>&1; then
- pass watch5-8
- else
- fail watch5-8
- fi
- dotest watch5-10 "test -f CVS/Base/file1" ''
- # Make sure update won't remove the file either
- touch file1
- dotest watch5-11 "${testcvs} -q up" ''
- dotest watch5-12 "test -f CVS/Base/file1" ''
- cd ../..
- rm -r watch5
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- watch6)
- # Check that `cvs watch on' does not reset the fileattr file.
- mkdir watch6; cd watch6
- dotest watch6-setup-1 "$testcvs -Q co -ldtop ."
- cd top
- mkdir watch6
- dotest watch6-setup-2 "$testcvs -Q add watch6"
- cd ..
- dotest watch6-setup-3 "$testcvs -Q co watch6"
- cd watch6
- mkdir subdir
- dotest watch6-setup-4 "$testcvs -Q add subdir"
- cd subdir
- # START watch add/remove sequence
- dotest watch6-1 "$testcvs -Q watch add"
- dotest watch6-2 \
- "grep '_watchers' $CVSROOT_DIRNAME/watch6/subdir/CVS/fileattr >/dev/null"
- dotest watch6-3 "$testcvs watch on"
- dotest watch6-4 \
- "grep '_watchers' $CVSROOT_DIRNAME/watch6/subdir/CVS/fileattr >/dev/null"
- dotest watch6-5 \
- "grep '_watched' $CVSROOT_DIRNAME/watch6/subdir/CVS/fileattr >/dev/null"
- dotest watch6-6 "$testcvs watch off"
- dotest watch6-7 \
- "grep '_watchers' $CVSROOT_DIRNAME/watch6/subdir/CVS/fileattr >/dev/null"
- dotest_fail watch6-8 \
- "grep '_watched' $CVSROOT_DIRNAME/watch6/subdir/CVS/fileattr >/dev/null"
- dotest watch6-9 "$testcvs watch remove"
- dotest_fail watch6-10 \
- "test -d $CVSROOT_DIRNAME/test-directory/subdir/CVS"
- dotest_fail watch6-11 \
- "test -f $CVSROOT_DIRNAME/test-directory/subdir/CVS/fileattr"
- # END watch add/remove sequence
- echo Hi there >afile
- dotest watch6-12 "$testcvs -Q add afile"
- dotest watch6-13 "$testcvs ci -m 'A file' afile" \
- "RCS file: $CVSROOT_DIRNAME/watch6/subdir/afile,v
- done
- Checking in afile;
- $CVSROOT_DIRNAME/watch6/subdir/afile,v <-- afile
- initial revision: 1\.1
- done"
- # START watch add/remove sequence
- dotest watch6-14 "$testcvs -Q watch add"
- dotest watch6-15 \
- "grep '_watchers' $CVSROOT_DIRNAME/watch6/subdir/CVS/fileattr >/dev/null"
- dotest watch6-16 "$testcvs watch on"
- dotest watch6-17 \
- "grep '_watchers' $CVSROOT_DIRNAME/watch6/subdir/CVS/fileattr >/dev/null"
- dotest watch6-18 \
- "grep '_watched' $CVSROOT_DIRNAME/watch6/subdir/CVS/fileattr >/dev/null"
- dotest watch6-19 "$testcvs watch off"
- dotest watch6-20 \
- "grep '_watchers' $CVSROOT_DIRNAME/watch6/subdir/CVS/fileattr >/dev/null"
- dotest_fail watch6-21 \
- "grep '_watched' $CVSROOT_DIRNAME/watch6/subdir/CVS/fileattr >/dev/null"
- dotest watch6-22 "$testcvs watch remove"
- dotest_fail watch6-23 \
- "test -d $CVSROOT_DIRNAME/test-directory/subdir/CVS"
- dotest_fail watch6-24 \
- "test -f $CVSROOT_DIRNAME/test-directory/subdir/CVS/fileattr"
- # END watch add/remove sequence
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../../..
- rm -r watch6
- rm -rf $CVSROOT_DIRNAME/watch6
- ;;
- unedit-without-baserev)
- mkdir 1; cd 1
- module=x
- file=m
- echo foo > $file
- dotest unedit-without-baserev-1 \
- "$testcvs -Q import -m . $module X Y" ''
- dotest unedit-without-baserev-2 "$testcvs -Q co $module" ''
- cd $module
- dotest unedit-without-baserev-3 "$testcvs -Q edit $file" ''
- echo add a line >> $file
- rm -f CVS/Baserev
- # This will fail on most systems.
- echo "yes" | dotest unedit-without-baserev-4 "${testcvs} -Q unedit $file" \
- "m has been modified; revert changes${QUESTION} ${PROG} unedit: m not mentioned in CVS/Baserev
- ${PROG} unedit: run update to complete the unedit"
- # SunOS4.1.4 systems make it this far, but with a corrupted
- # CVS/Entries file. Demonstrate the corruption!
- dotest unedit-without-baserev-5 "cat CVS/Entries" \
- "/$file/1\.1\.1\.1/${DOTSTAR}"
- dotest unedit-without-baserev-6 "${testcvs} -q update" \
- "${PROG} update: warning: m was lost
- U m"
- # OK, those were the easy cases. Now tackle the hard one
- # (the reason that CVS/Baserev was invented rather than just
- # getting the revision from CVS/Entries). This is very
- # similar to watch4-10 through watch4-18 but with Baserev
- # missing.
- cd ../..
- mkdir 2; cd 2
- dotest unedit-without-baserev-7 "${testcvs} -Q co x" ''
- cd x
- dotest unedit-without-baserev-10 "${testcvs} edit m" ''
- echo 'edited in 2' >m
- cd ../..
- cd 1/x
- dotest unedit-without-baserev-11 "${testcvs} edit m" ''
- echo 'edited in 1' >m
- dotest unedit-without-baserev-12 "${testcvs} -q ci -m edit-in-1" \
- "Checking in m;
- ${CVSROOT_DIRNAME}/x/m,v <-- m
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../..
- cd 2/x
- dotest unedit-without-baserev-13 "${testcvs} -q update" \
- "RCS file: ${CVSROOT_DIRNAME}/x/m,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.2
- Merging differences between 1\.1\.1\.1 and 1\.2 into m
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in m
- C m"
- rm CVS/Baserev
- dotest unedit-without-baserev-14 "echo yes | ${testcvs} unedit m" \
- "m has been modified; revert changes${QUESTION} ${PROG} unedit: m not mentioned in CVS/Baserev
- ${PROG} unedit: run update to complete the unedit"
- dotest unedit-without-baserev-15 "${testcvs} -q update" \
- "${PROG} update: warning: m was lost
- U m"
- # The following tests are kind of degenerate compared with
- # watch4-16 through watch4-18 but might as well make sure that
- # nothing seriously wrong has happened to the working directory.
- dotest unedit-without-baserev-16 "cat m" 'edited in 1'
- # Make sure CVS really thinks we are at 1.2.
- dotest unedit-without-baserev-17 "${testcvs} -q update" ""
- dotest unedit-without-baserev-18 "cat m" "edited in 1"
- cd ../..
- rm -rf 1
- rm -r 2
- rm -rf ${CVSROOT_DIRNAME}/$module
- ;;
- ignore)
- # On Windows, we can't check out CVSROOT, because the case
- # insensitivity means that this conflicts with cvsroot.
- mkdir ignore
- cd ignore
- dotest ignore-1 "${testcvs} -q co CVSROOT" "U CVSROOT/${DOTSTAR}"
- cd CVSROOT
- echo rootig.c >cvsignore
- dotest ignore-2 "${testcvs} add cvsignore" \
- "${PROG}"' add: scheduling file `cvsignore'"'"' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- # As of Jan 96, local CVS prints "Examining ." and remote doesn't.
- # Accept either.
- dotest ignore-3 " ${testcvs} ci -m added" \
- "${PROG} [a-z]*: Examining \.
- RCS file: ${CVSROOT_DIRNAME}/CVSROOT/cvsignore,v
- done
- Checking in cvsignore;
- ${CVSROOT_DIRNAME}/CVSROOT/cvsignore,v <-- cvsignore
- initial revision: 1\.1
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- if echo "yes" | ${testcvs} release -d CVSROOT >>${LOGFILE} ; then
- pass ignore-4
- else
- fail ignore-4
- fi
- # CVS looks at the home dir from getpwuid, not HOME (is that correct
- # behavior?), so this is hard to test and we won't try.
- # echo foobar.c >${HOME}/.cvsignore
- CVSIGNORE=envig.c; export CVSIGNORE
- mkdir dir-to-import
- cd dir-to-import
- touch foobar.c bar.c rootig.c defig.o envig.c optig.c
- # We use sort because we can't predict the order in which
- # the files will be listed.
- dotest_sort ignore-5 "${testcvs} import -m m -I optig.c ignore/first-dir tag1 tag2" \
- '
- I ignore/first-dir/defig.o
- I ignore/first-dir/envig.c
- I ignore/first-dir/optig.c
- I ignore/first-dir/rootig.c
- N ignore/first-dir/bar.c
- N ignore/first-dir/foobar.c
- No conflicts created by this import'
- dotest_sort ignore-6 "${testcvs} import -m m -I ! ignore/second-dir tag3 tag4" \
- '
- N ignore/second-dir/bar.c
- N ignore/second-dir/defig.o
- N ignore/second-dir/envig.c
- N ignore/second-dir/foobar.c
- N ignore/second-dir/optig.c
- N ignore/second-dir/rootig.c
- No conflicts created by this import'
- cd ..
- rm -r dir-to-import
- mkdir 1
- cd 1
- dotest ignore-7 "${testcvs} -q co -dsecond-dir ignore/second-dir" \
- 'U second-dir/bar.c
- U second-dir/defig.o
- U second-dir/envig.c
- U second-dir/foobar.c
- U second-dir/optig.c
- U second-dir/rootig.c'
- dotest ignore-8 "${testcvs} -q co -dfirst-dir ignore/first-dir" 'U first-dir/bar.c
- U first-dir/foobar.c'
- cd first-dir
- touch rootig.c defig.o envig.c optig.c notig.c
- dotest ignore-9 "${testcvs} -q update -I optig.c" "${QUESTION} notig.c"
- # The fact that CVS requires us to specify -I CVS here strikes me
- # as a bug.
- dotest_sort ignore-10 "${testcvs} -q update -I ! -I CVS" \
- "${QUESTION} defig.o
- ${QUESTION} envig.c
- ${QUESTION} notig.c
- ${QUESTION} optig.c
- ${QUESTION} rootig.c"
- # Now test that commands other than update also print "? notig.c"
- # where appropriate. Only test this for remote, because local
- # CVS only prints it on update.
- rm optig.c
- if $remote; then
- dotest ignore-11r "${testcvs} -q diff" "${QUESTION} notig.c"
- # Force the server to be contacted. Ugh. Having CVS
- # contact the server for the sole purpose of checking
- # the CVSROOT/cvsignore file does not seem like such a
- # good idea, so I imagine this will continue to be
- # necessary. Oh well, at least we test CVS's ablity to
- # handle a file with a modified timestamp but unmodified
- # contents.
- touch bar.c
- dotest ignore-11r "${testcvs} -q ci -m commit-it" "${QUESTION} notig.c"
- fi
- # now test .cvsignore files
- cd ..
- echo notig.c >first-dir/.cvsignore
- echo foobar.c >second-dir/.cvsignore
- touch first-dir/notig.c second-dir/notig.c second-dir/foobar.c
- dotest_sort ignore-12 "${testcvs} -qn update" \
- "${QUESTION} first-dir/.cvsignore
- ${QUESTION} second-dir/.cvsignore
- ${QUESTION} second-dir/notig.c"
- dotest_sort ignore-13 "${testcvs} -qn update -I! -I CVS" \
- "${QUESTION} first-dir/.cvsignore
- ${QUESTION} first-dir/defig.o
- ${QUESTION} first-dir/envig.c
- ${QUESTION} first-dir/rootig.c
- ${QUESTION} second-dir/.cvsignore
- ${QUESTION} second-dir/notig.c"
- echo yes | dotest ignore-14 "${testcvs} release -d first-dir" \
- "${QUESTION} \.cvsignore
- You have \[0\] altered files in this repository.
- Are you sure you want to release (and delete) directory .first-dir': "
- echo add a line >>second-dir/foobar.c
- rm second-dir/notig.c second-dir/.cvsignore
- echo yes | dotest ignore-15 "${testcvs} release -d second-dir" \
- "M foobar.c
- You have \[1\] altered files in this repository.
- Are you sure you want to release (and delete) directory .second-dir': "
- cd ../..
- if $keep; then :; else
- rm -r ignore
- rm -rf ${CVSROOT_DIRNAME}/ignore
- fi
- ;;
- ignore-on-branch)
- # Test that CVS _doesn't_ ignore files on branches because they were
- # added to the trunk.
- mkdir ignore-on-branch; cd ignore-on-branch
- mkdir $CVSROOT_DIRNAME/ignore-on-branch
- # create file1 & file2 on trunk
- dotest ignore-on-branch-setup-1 "$testcvs -q co -dsetup ignore-on-branch" ''
- cd setup
- echo file1 >file1
- dotest ignore-on-branch-setup-2 "$testcvs -q add file1" \
- "${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest ignore-on-branch-setup-3 "$testcvs -q ci -mfile1 file1" \
- "RCS file: $CVSROOT_DIRNAME/ignore-on-branch/file1,v
- done
- Checking in file1;
- $CVSROOT_DIRNAME/ignore-on-branch/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest ignore-on-branch-setup-4 "$testcvs -q tag -b branch" 'T file1'
- echo file2 >file2
- dotest ignore-on-branch-setup-5 "$testcvs -q add file2" \
- "${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest ignore-on-branch-setup-6 "$testcvs -q ci -mtrunk file2" \
- "RCS file: $CVSROOT_DIRNAME/ignore-on-branch/file2,v
- done
- Checking in file2;
- $CVSROOT_DIRNAME/ignore-on-branch/file2,v <-- file2
- initial revision: 1\.1
- done"
- cd ..
- # Check out branch.
- #
- # - This was the original failure case - file2 would not be flagged
- # with a '?'
- dotest ignore-on-branch-1 "$testcvs -q co -rbranch ignore-on-branch" \
- 'U ignore-on-branch/file1'
- cd ignore-on-branch
- echo file2 on branch >file2
- dotest ignore-on-branch-2 "$testcvs -nq update" '? file2'
- # Now set up for a join. One of the original fixes for this would
- # print out a 'U' and a '?' during a join which added a file.
- if $remote; then
- dotest ignore-on-branch-3 "$testcvs -q tag -b branch2" \
- '? file2
- T file1'
- else
- dotest ignore-on-branch-3 "$testcvs -q tag -b branch2" 'T file1'
- fi
- dotest ignore-on-branch-4 "$testcvs -q add file2" \
- "${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest ignore-on-branch-5 "$testcvs -q ci -mbranch file2" \
- "Checking in file2;
- $CVSROOT_DIRNAME/ignore-on-branch/file2,v <-- file2
- new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
- done"
- dotest ignore-on-branch-6 "$testcvs -q up -rbranch2" \
- "[UP] file1
- $PROG update: file2 is no longer in the repository"
- dotest ignore-on-branch-7 "$testcvs -q up -jbranch" 'U file2'
- cd ../..
- if $keep; then :; else
- rm -r ignore-on-branch
- rm -rf $CVSROOT_DIRNAME/ignore-on-branch
- fi
- ;;
- binfiles)
- # Test cvs's ability to handle binary files.
- # List of binary file tests:
- # * conflicts, "cvs admin": binfiles
- # * branching and joining: binfiles2
- # * adding and removing files: binfiles3
- # * -k wrappers: binwrap, binwrap2, binwrap3
- # * "cvs import" and wrappers: binwrap, binwrap2, binwrap3
- # * -k option to "cvs import": none yet, as far as I know.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1; cd 1
- dotest binfiles-1 "${testcvs} -q co first-dir" ''
- ${AWK} 'BEGIN { printf "%c%c%c@%c%c", 2, 10, 137, 13, 10 }' \
- </dev/null | ${TR} '@' '\000' >binfile.dat
- cat binfile.dat binfile.dat >binfile2.dat
- cd first-dir
- cp ../binfile.dat binfile
- dotest binfiles-2 "${testcvs} add -kb binfile" \
- "${PROG}"' add: scheduling file `binfile'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest binfiles-3 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/binfile,v
- done
- Checking in binfile;
- ${CVSROOT_DIRNAME}/first-dir/binfile,v <-- binfile
- initial revision: 1\.1
- done"
- cd ../..
- mkdir 2; cd 2
- dotest binfiles-4 "${testcvs} -q co first-dir" 'U first-dir/binfile'
- cd first-dir
- dotest binfiles-5 "cmp ../../1/binfile.dat binfile" ''
- # Testing that sticky options is -kb is the closest thing we have
- # to testing that binary files work right on non-unix machines
- # (until there is automated testing for such machines, of course).
- dotest binfiles-5.5 "${testcvs} status binfile" \
- "===================================================================
- File: binfile Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/binfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kb"
- # Test that "-kk" does not override "-kb"
- cd ../..
- mkdir 2a; cd 2a
- dotest binfiles-5.5a0 "${testcvs} -q co -kk first-dir" 'U first-dir/binfile'
- cd first-dir
- # Testing that sticky options is -kb is the closest thing we have
- # to testing that binary files work right on non-unix machines
- # (until there is automated testing for such machines, of course).
- dotest binfiles-5.5a1 "${testcvs} status binfile" \
- "===================================================================
- File: binfile Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/binfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kb"
- # Test whether the default options from the RCS file are
- # also used when operating on files instead of whole
- # directories
- cd ../..
- mkdir 3; cd 3
- dotest binfiles-5.5b0 "${testcvs} -q co first-dir/binfile" \
- 'U first-dir/binfile'
- cd first-dir
- dotest binfiles-5.5b1 "${testcvs} status binfile" \
- "===================================================================
- File: binfile Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/binfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kb"
- cd ../..
- rm -r 3
- # test that "-kk" does not override "-kb"
- mkdir 3; cd 3
- dotest binfiles-5.5c0 "${testcvs} -q co -kk first-dir/binfile" \
- 'U first-dir/binfile'
- cd first-dir
- dotest binfiles-5.5c1 "${testcvs} status binfile" \
- "===================================================================
- File: binfile Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/binfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kb"
- cd ../..
- rm -r 3
- cd 2/first-dir
- cp ../../1/binfile2.dat binfile
- dotest binfiles-6 "${testcvs} -q ci -m modify-it" \
- "Checking in binfile;
- ${CVSROOT_DIRNAME}/first-dir/binfile,v <-- binfile
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../../1/first-dir
- dotest binfiles-7 "${testcvs} -q update" '[UP] binfile'
- dotest binfiles-8 "cmp ../binfile2.dat binfile" ''
- # Now test handling of conflicts with binary files.
- cp ../binfile.dat binfile
- dotest binfiles-con0 "${testcvs} -q ci -m modify-it" \
- "Checking in binfile;
- ${CVSROOT_DIRNAME}/first-dir/binfile,v <-- binfile
- new revision: 1\.3; previous revision: 1\.2
- done"
- cd ../../2/first-dir
- echo 'edits in dir 2' >binfile
- dotest binfiles-con1 "${testcvs} -q update" \
- "$PROG update: nonmergeable file needs merge
- ${PROG} update: revision 1\.3 from repository is now in binfile
- ${PROG} update: file from working directory is now in \.#binfile\.1\.2
- C binfile"
- dotest_fail binfiles-con1b "$testcvs -q up" "C binfile"
- dotest binfiles-con2 "cmp binfile ../../1/binfile.dat" ''
- dotest binfiles-con3 "cat .#binfile.1.2" 'edits in dir 2'
- cp ../../1/binfile2.dat binfile
- dotest binfiles-con4 "${testcvs} -q ci -m resolve-it" \
- "Checking in binfile;
- ${CVSROOT_DIRNAME}/first-dir/binfile,v <-- binfile
- new revision: 1\.4; previous revision: 1\.3
- done"
- cd ../../1/first-dir
- dotest binfiles-con5 "${testcvs} -q update" '[UP] binfile'
- dotest binfiles-9 "${testcvs} -q update -A" ''
- # "-kk" no longer does anything with "-kb"
- dotest binfiles-10 "${testcvs} -q update -kk" ''
- dotest binfiles-11 "${testcvs} -q update" ''
- # "-kk" no longer does anything with "-kb"
- dotest binfiles-12 "${testcvs} -q update -A" ''
- dotest binfiles-13 "${testcvs} -q update -A" ''
- cd ../..
- mkdir 3
- cd 3
- dotest binfiles-13a0 "${testcvs} -q co -r HEAD first-dir" \
- 'U first-dir/binfile'
- cd first-dir
- dotest binfiles-13a1 "${testcvs} status binfile" \
- "===================================================================
- File: binfile Status: Up-to-date
- Working revision: 1\.4.*
- Repository revision: 1\.4 ${CVSROOT_DIRNAME}/first-dir/binfile,v
- Sticky Tag: HEAD (revision: 1\.4)
- Sticky Date: (none)
- Sticky Options: -kb"
- cd ../..
- rm -r 3
- cd 2/first-dir
- echo 'this file is $''RCSfile$' >binfile
- dotest binfiles-14a "${testcvs} -q ci -m modify-it" \
- "Checking in binfile;
- ${CVSROOT_DIRNAME}/first-dir/binfile,v <-- binfile
- new revision: 1\.5; previous revision: 1\.4
- done"
- dotest binfiles-14b "cat binfile" 'this file is $''RCSfile$'
- # See binfiles-5.5 for discussion of -kb.
- dotest binfiles-14c "${testcvs} status binfile" \
- "===================================================================
- File: binfile Status: Up-to-date
- Working revision: 1\.5.*
- Repository revision: 1\.5 ${CVSROOT_DIRNAME}/first-dir/binfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kb"
- dotest binfiles-14d "${testcvs} admin -kv binfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/binfile,v
- done"
- # cvs admin doesn't change the checked-out file or its sticky
- # kopts. There probably should be a way which does (but
- # what if the file is modified? And do we try to version
- # control the kopt setting?)
- dotest binfiles-14e "cat binfile" 'this file is $''RCSfile$'
- dotest binfiles-14f "${testcvs} status binfile" \
- "===================================================================
- File: binfile Status: Up-to-date
- Working revision: 1\.5.*
- Repository revision: 1\.5 ${CVSROOT_DIRNAME}/first-dir/binfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kb"
- dotest binfiles-14g "${testcvs} -q update -A" '[UP] binfile'
- dotest binfiles-14h "cat binfile" 'this file is binfile,v'
- dotest binfiles-14i "${testcvs} status binfile" \
- "===================================================================
- File: binfile Status: Up-to-date
- Working revision: 1\.5.*
- Repository revision: 1\.5 ${CVSROOT_DIRNAME}/first-dir/binfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kv"
- # Do sticky options work when used with 'cvs update'?
- echo "Not a binary file." > nibfile
- dotest binfiles-sticky1 "${testcvs} -q add nibfile" \
- "${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest binfiles-sticky2 "${testcvs} -q ci -m add-it nibfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/nibfile,v
- done
- Checking in nibfile;
- ${CVSROOT_DIRNAME}/first-dir/nibfile,v <-- nibfile
- initial revision: 1\.1
- done"
- dotest binfiles-sticky3 "${testcvs} -q update -kb nibfile" \
- '[UP] nibfile'
- dotest binfiles-sticky4 "${testcvs} -q status nibfile" \
- "===================================================================
- File: nibfile Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/nibfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kb"
- # Now test that -A can clear the sticky option.
- dotest binfiles-sticky5 "${testcvs} -q update -A nibfile" \
- "[UP] nibfile"
- dotest binfiles-sticky6 "${testcvs} -q status nibfile" \
- "===================================================================
- File: nibfile Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/nibfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest binfiles-15 "${testcvs} -q admin -kb nibfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/nibfile,v
- done"
- dotest binfiles-16 "${testcvs} -q update nibfile" "[UP] nibfile"
- dotest binfiles-17 "${testcvs} -q status nibfile" \
- "===================================================================
- File: nibfile Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/nibfile,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kb"
- dotest binfiles-o1 "${testcvs} admin -o1.3:: binfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/binfile,v
- deleting revision 1\.5
- deleting revision 1\.4
- done"
- dotest binfiles-o2 "${testcvs} admin -o::1.3 binfile" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/binfile,v
- deleting revision 1\.2
- deleting revision 1\.1
- done"
- dotest binfiles-o3 "${testcvs} -q log -h -N binfile" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/binfile,v
- Working file: binfile
- head: 1\.3
- branch:
- locks: strict
- access list:
- keyword substitution: v
- total revisions: 1
- ============================================================================="
- # Check that the contents were right. This isn't the hard case
- # (in which RCS_delete_revs does a diff), but might as well.
- dotest binfiles-o4 "${testcvs} -q update binfile" "U binfile"
- dotest binfiles-o5 "cmp binfile ../../1/binfile.dat" ""
- cd ../..
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -r 1
- rm -r 2
- ;;
- binfiles2)
- # Test cvs's ability to handle binary files, particularly branching
- # and joining. The key thing we are worrying about is that CVS
- # doesn't print "cannot merge binary files" or some such, in
- # situations where no merging is required.
- # See also "join" which does this with non-binary files.
- #
- # Cases (we are merging from the branch to the trunk):
- # binfile.dat) File added on branch, not on trunk.
- # File should be marked for addition.
- # brmod) File modified on branch, not on trunk.
- # File should be copied over to trunk (no merging is needed).
- # brmod-trmod) File modified on branch, also on trunk.
- # This is a conflict. Present the user with both files and
- # let them figure it out.
- # brmod-wdmod) File modified on branch, not modified in the trunk
- # repository, but modified in the (trunk) working directory.
- # This is also a conflict.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1; cd 1
- dotest binfiles2-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- # The most important thing here is that binfile, binfile2, &c
- # each be distinct from each other. We also make sure to include
- # a few likely end-of-line patterns to make sure nothing is
- # being munged as if in text mode.
- ${AWK} 'BEGIN { printf "%c%c%c@%c%c", 2, 10, 137, 13, 10 }' \
- </dev/null | ${TR} '@' '\000' >../binfile
- cat ../binfile ../binfile >../binfile2
- cat ../binfile2 ../binfile >../binfile3
- # FIXCVS: unless a branch has at least one file on it,
- # tag_check_valid won't know it exists. So if brmod didn't
- # exist, we would have to invent it.
- cp ../binfile brmod
- cp ../binfile brmod-trmod
- cp ../binfile brmod-wdmod
- dotest binfiles2-1a \
- "${testcvs} add -kb brmod brmod-trmod brmod-wdmod" \
- "${PROG} add: scheduling file .brmod. for addition
- ${PROG} add: scheduling file .brmod-trmod. for addition
- ${PROG} add: scheduling file .brmod-wdmod. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest binfiles2-1b "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/brmod,v
- done
- Checking in brmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod,v <-- brmod
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v
- done
- Checking in brmod-trmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v <-- brmod-trmod
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/brmod-wdmod,v
- done
- Checking in brmod-wdmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-wdmod,v <-- brmod-wdmod
- initial revision: 1\.1
- done"
- dotest binfiles2-2 "${testcvs} -q tag -b br" 'T brmod
- T brmod-trmod
- T brmod-wdmod'
- dotest binfiles2-3 "$testcvs -q update -r br" \
- 'U brmod
- U brmod-trmod
- U brmod-wdmod'
- cp ../binfile binfile.dat
- dotest binfiles2-4 "${testcvs} add -kb binfile.dat" \
- "${PROG} add: scheduling file .binfile\.dat. for addition on branch .br.
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- cp ../binfile2 brmod
- cp ../binfile2 brmod-trmod
- cp ../binfile2 brmod-wdmod
- dotest binfiles2-5 "${testcvs} -q ci -m br-changes" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/binfile\.dat,v
- done
- Checking in binfile\.dat;
- ${CVSROOT_DIRNAME}/first-dir/Attic/binfile\.dat,v <-- binfile\.dat
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in brmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod,v <-- brmod
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in brmod-trmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v <-- brmod-trmod
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in brmod-wdmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-wdmod,v <-- brmod-wdmod
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest binfiles2-6 "${testcvs} -q update -A" \
- "${PROG} update: binfile\.dat is no longer in the repository
- [UP] brmod
- [UP] brmod-trmod
- [UP] brmod-wdmod"
- dotest_fail binfiles2-7 "test -f binfile.dat" ''
- dotest binfiles2-7-brmod "cmp ../binfile brmod"
- cp ../binfile3 brmod-trmod
- dotest binfiles2-7a "${testcvs} -q ci -m tr-modify" \
- "Checking in brmod-trmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v <-- brmod-trmod
- new revision: 1\.2; previous revision: 1\.1
- done"
- cp ../binfile3 brmod-wdmod
- dotest binfiles2-8 "${testcvs} -q update -j br" \
- "U binfile\.dat
- U brmod
- ${PROG} update: nonmergeable file needs merge
- ${PROG} update: revision 1.1.2.1 from repository is now in brmod-trmod
- ${PROG} update: file from working directory is now in .#brmod-trmod.1.2
- C brmod-trmod
- M brmod-wdmod
- ${PROG} update: nonmergeable file needs merge
- ${PROG} update: revision 1.1.2.1 from repository is now in brmod-wdmod
- ${PROG} update: file from working directory is now in .#brmod-wdmod.1.1
- C brmod-wdmod"
- dotest binfiles2-9 "cmp ../binfile binfile.dat"
- dotest binfiles2-9-brmod "cmp ../binfile2 brmod"
- dotest binfiles2-9-brmod-trmod "cmp ../binfile2 brmod-trmod"
- dotest binfiles2-9-brmod-trmod "cmp ../binfile2 brmod-wdmod"
- dotest binfiles2-9a-brmod-trmod "cmp ../binfile3 .#brmod-trmod.1.2"
- dotest binfiles2-9a-brmod-wdmod "cmp ../binfile3 .#brmod-wdmod.1.1"
- # Test that everything was properly scheduled.
- dotest binfiles2-10 "${testcvs} -q ci -m checkin" \
- "Checking in binfile\.dat;
- ${CVSROOT_DIRNAME}/first-dir/binfile\.dat,v <-- binfile\.dat
- new revision: 1\.2; previous revision: 1\.1
- done
- Checking in brmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod,v <-- brmod
- new revision: 1\.2; previous revision: 1\.1
- done
- Checking in brmod-trmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v <-- brmod-trmod
- new revision: 1\.3; previous revision: 1\.2
- done
- Checking in brmod-wdmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-wdmod,v <-- brmod-wdmod
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest_fail binfiles2-o1 "${testcvs} -q admin -o :1.2 brmod-trmod" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v
- deleting revision 1\.2
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v: can't remove branch point 1\.1
- ${PROG} admin: RCS file for .brmod-trmod. not modified\."
- dotest binfiles2-o2 "${testcvs} -q admin -o 1.1.2.1: brmod-trmod" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v
- deleting revision 1\.1\.2\.1
- done"
- dotest binfiles2-o3 "${testcvs} -q admin -o :1.2 brmod-trmod" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v
- deleting revision 1\.2
- deleting revision 1\.1
- done"
- dotest binfiles2-o4 "${testcvs} -q log -N brmod-trmod" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v
- Working file: brmod-trmod
- head: 1\.3
- branch:
- locks: strict
- access list:
- keyword substitution: b
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.3
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- checkin
- ============================================================================="
- cd ..
- cd ..
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -r 1
- ;;
- binfiles3)
- # More binary file tests, especially removing, adding, &c.
- # See "binfiles" for a list of binary file tests.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1; cd 1
- dotest binfiles3-1 "${testcvs} -q co first-dir" ''
- ${AWK} 'BEGIN { printf "%c%c%c@%c%c", 2, 10, 137, 13, 10 }' \
- </dev/null | ${TR} '@' '\000' >binfile.dat
- cd first-dir
- echo hello >file1
- dotest binfiles3-2 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest binfiles3-3 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- rm file1
- dotest binfiles3-4 "${testcvs} rm file1" \
- "${PROG} remove: scheduling .file1. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest binfiles3-5 "${testcvs} -q ci -m remove-it" \
- "Removing file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: delete; previous revision: 1\.1
- done"
- cp ../binfile.dat file1
- dotest binfiles3-6 "${testcvs} add -kb file1" \
- "${PROG} add: Re-adding file .file1. (in place of dead revision 1\.2)\.
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- # The idea behind this test is to make sure that the file
- # gets opened in binary mode to send to "cvs ci".
- dotest binfiles3-6a "cat CVS/Entries" \
- "/file1/0/[A-Za-z0-9 :]*/-kb/
- D"
- # TODO: This just tests the case where the old keyword
- # expansion mode is the default (RCS_getexpand == NULL
- # in checkaddfile()); should also test the case in which
- # we are changing it from one non-default value to another.
- dotest binfiles3-7 "${testcvs} -q ci -m readd-it" \
- "${PROG} commit: changing keyword expansion mode to -kb
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done"
- dotest binfiles3-8 "${testcvs} -q log -h -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.3
- branch:
- locks: strict
- access list:
- keyword substitution: b
- total revisions: 3
- ============================================================================="
- # OK, now test admin -o on a binary file. See "admin"
- # test for a more complete list of admin -o tests.
- cp ${TESTDIR}/1/binfile.dat ${TESTDIR}/1/binfile4.dat
- echo '%%$$##@@!!jjiiuull' | ${TR} j '\000' >>${TESTDIR}/1/binfile4.dat
- cp ${TESTDIR}/1/binfile4.dat ${TESTDIR}/1/binfile5.dat
- echo 'aawwee%$$##@@!!jjil' | ${TR} w '\000' >>${TESTDIR}/1/binfile5.dat
- cp ../binfile4.dat file1
- dotest binfiles3-9 "${testcvs} -q ci -m change" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.4; previous revision: 1\.3
- done"
- cp ../binfile5.dat file1
- dotest binfiles3-10 "${testcvs} -q ci -m change" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.5; previous revision: 1\.4
- done"
- dotest binfiles3-11 "${testcvs} admin -o 1.3::1.5 file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- deleting revision 1\.4
- done"
- dotest binfiles3-12 "${testcvs} -q update -r 1.3 file1" "U file1"
- dotest binfiles3-13 "cmp file1 ${TESTDIR}/1/binfile.dat" ""
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- mcopy)
- # See comment at "mwrap" test for list of other wrappers tests.
- # Test cvs's ability to handle nonmergeable files specified with
- # -m 'COPY' in wrappers. Similar to the binfiles2 test,
- # which tests the same thing for binary files
- # (which are non-mergeable in the same sense).
- #
- # Cases (we are merging from the branch to the trunk):
- # brmod) File modified on branch, not on trunk.
- # File should be copied over to trunk (no merging is needed).
- # brmod-trmod) File modified on branch, also on trunk.
- # This is a conflict. Present the user with both files and
- # let them figure it out.
- # brmod-wdmod) File modified on branch, not modified in the trunk
- # repository, but modified in the (trunk) working directory.
- # This is also a conflict.
- # For the moment, remote CVS can't pass wrappers from CVSWRAPPERS
- # (see wrap_send). So skip these tests for remote.
- if $remote; then :; else
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1; cd 1
- dotest mcopy-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- # FIXCVS: unless a branch has at least one file on it,
- # tag_check_valid won't know it exists. So if brmod didn't
- # exist, we would have to invent it.
- echo 'brmod initial contents' >brmod
- echo 'brmod-trmod initial contents' >brmod-trmod
- echo 'brmod-wdmod initial contents' >brmod-wdmod
- echo "* -m 'COPY'" >.cvswrappers
- dotest mcopy-1a \
- "${testcvs} add .cvswrappers brmod brmod-trmod brmod-wdmod" \
- "${PROG} add: scheduling file .\.cvswrappers. for addition
- ${PROG} add: scheduling file .brmod. for addition
- ${PROG} add: scheduling file .brmod-trmod. for addition
- ${PROG} add: scheduling file .brmod-wdmod. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest mcopy-1b "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/\.cvswrappers,v
- done
- Checking in \.cvswrappers;
- ${CVSROOT_DIRNAME}/first-dir/\.cvswrappers,v <-- \.cvswrappers
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/brmod,v
- done
- Checking in brmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod,v <-- brmod
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v
- done
- Checking in brmod-trmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v <-- brmod-trmod
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/brmod-wdmod,v
- done
- Checking in brmod-wdmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-wdmod,v <-- brmod-wdmod
- initial revision: 1\.1
- done"
- # NOTE: .cvswrappers files are broken (see comment in
- # src/wrapper.c). So doing everything via the environment
- # variable is a workaround. Better would be to test them
- # both.
- CVSWRAPPERS="* -m 'COPY'"
- export CVSWRAPPERS
- dotest mcopy-2 "${testcvs} -q tag -b br" 'T \.cvswrappers
- T brmod
- T brmod-trmod
- T brmod-wdmod'
- dotest mcopy-3 "$testcvs -q update -r br" \
- 'U .cvswrappers
- U brmod
- U brmod-trmod
- U brmod-wdmod'
- echo 'modify brmod on br' >brmod
- echo 'modify brmod-trmod on br' >brmod-trmod
- echo 'modify brmod-wdmod on br' >brmod-wdmod
- dotest mcopy-5 "${testcvs} -q ci -m br-changes" \
- "Checking in brmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod,v <-- brmod
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in brmod-trmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v <-- brmod-trmod
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- Checking in brmod-wdmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-wdmod,v <-- brmod-wdmod
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest mcopy-6 "$testcvs -q update -A" \
- 'U .cvswrappers
- U brmod
- U brmod-trmod
- U brmod-wdmod'
- dotest mcopy-7 "cat brmod brmod-trmod brmod-wdmod" \
- "brmod initial contents
- brmod-trmod initial contents
- brmod-wdmod initial contents"
- echo 'modify brmod-trmod again on trunk' >brmod-trmod
- dotest mcopy-7a "${testcvs} -q ci -m tr-modify" \
- "Checking in brmod-trmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v <-- brmod-trmod
- new revision: 1\.2; previous revision: 1\.1
- done"
- echo 'modify brmod-wdmod in working dir' >brmod-wdmod
- dotest mcopy-8 "${testcvs} -q update -j br" \
- "U brmod
- ${PROG} update: nonmergeable file needs merge
- ${PROG} update: revision 1.1.2.1 from repository is now in brmod-trmod
- ${PROG} update: file from working directory is now in .#brmod-trmod.1.2
- C brmod-trmod
- M brmod-wdmod
- ${PROG} update: nonmergeable file needs merge
- ${PROG} update: revision 1.1.2.1 from repository is now in brmod-wdmod
- ${PROG} update: file from working directory is now in .#brmod-wdmod.1.1
- C brmod-wdmod"
- dotest mcopy-9 "cat brmod brmod-trmod brmod-wdmod" \
- "modify brmod on br
- modify brmod-trmod on br
- modify brmod-wdmod on br"
- dotest mcopy-9a "cat .#brmod-trmod.1.2 .#brmod-wdmod.1.1" \
- "modify brmod-trmod again on trunk
- modify brmod-wdmod in working dir"
- # Test that everything was properly scheduled.
- dotest mcopy-10 "${testcvs} -q ci -m checkin" \
- "Checking in brmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod,v <-- brmod
- new revision: 1\.2; previous revision: 1\.1
- done
- Checking in brmod-trmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-trmod,v <-- brmod-trmod
- new revision: 1\.3; previous revision: 1\.2
- done
- Checking in brmod-wdmod;
- ${CVSROOT_DIRNAME}/first-dir/brmod-wdmod,v <-- brmod-wdmod
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ..
- cd ..
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -r 1
- unset CVSWRAPPERS
- fi # end of tests to be skipped for remote
- ;;
- binwrap)
- # Test the ability to specify binary-ness based on file name.
- # See "mwrap" for a list of other wrappers tests.
- mkdir dir-to-import
- cd dir-to-import
- touch foo.c foo.exe
- # While we're here, test for rejection of duplicate tag names.
- dotest_fail binwrap-0 \
- "${testcvs} import -m msg -I ! first-dir dup dup" \
- "${PROG} \[[a-z]* aborted\]: tag .dup. was specified more than once"
- if ${testcvs} import -m message -I ! -W "*.exe -k 'b'" \
- first-dir tag1 tag2 >>${LOGFILE}; then
- pass binwrap-1
- else
- fail binwrap-1
- fi
- cd ..
- rm -r dir-to-import
- dotest binwrap-2 "${testcvs} -q co first-dir" 'U first-dir/foo.c
- U first-dir/foo.exe'
- dotest binwrap-3 "${testcvs} -q status first-dir" \
- "===================================================================
- File: foo\.c Status: Up-to-date
- Working revision: 1\.1\.1\.1.*
- Repository revision: 1\.1\.1\.1 ${CVSROOT_DIRNAME}/first-dir/foo\.c,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: foo\.exe Status: Up-to-date
- Working revision: 1\.1\.1\.1.*
- Repository revision: 1\.1\.1\.1 ${CVSROOT_DIRNAME}/first-dir/foo\.exe,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kb"
- rm -r first-dir
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- binwrap2)
- # Test the ability to specify binary-ness based on file name.
- # See "mwrap" for a list of other wrappers tests.
- mkdir dir-to-import
- cd dir-to-import
- touch foo.c foo.exe
- # Specify that all files are binary except *.c.
- # The order seems to matter, with the earlier rules taking
- # precedence. I'm not sure whether that is good or not,
- # but it is the current behavior.
- if ${testcvs} import -m message -I ! \
- -W "*.c -k 'o'" -W "* -k 'b'" \
- first-dir tag1 tag2 >>${LOGFILE}; then
- pass binwrap2-1
- else
- fail binwrap2-1
- fi
- cd ..
- rm -r dir-to-import
- dotest binwrap2-2 "${testcvs} -q co first-dir" 'U first-dir/foo.c
- U first-dir/foo.exe'
- dotest binwrap2-3 "${testcvs} -q status first-dir" \
- "===================================================================
- File: foo\.c Status: Up-to-date
- Working revision: 1\.1\.1\.1.*
- Repository revision: 1\.1\.1\.1 ${CVSROOT_DIRNAME}/first-dir/foo\.c,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -ko
- ===================================================================
- File: foo\.exe Status: Up-to-date
- Working revision: 1\.1\.1\.1.*
- Repository revision: 1\.1\.1\.1 ${CVSROOT_DIRNAME}/first-dir/foo\.exe,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: -kb"
- rm -r first-dir
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- binwrap3)
- # Test communication of file-specified -k wrappers between
- # client and server, in `import':
- #
- # 1. Set up a directory tree, populate it with files.
- # 2. Give each directory a different .cvswrappers file.
- # 3. Give the server its own .cvswrappers file.
- # 4. Import the whole tree, see if the right files got set
- # to binary.
- #
- # The tree has a top ("0th") level, and two subdirs, sub1/
- # and sub2/; sub2/ contains directory subsub/. Every
- # directory has a .cvswrappers file as well as regular
- # files.
- #
- # In the file names, "foo-b.*" should end up binary, and
- # "foo-t.*" should end up text. Don't worry about the two
- # letter extensions; they're just there to help me keep
- # things straight.
- #
- # Here's the directory tree:
- #
- # ./
- # .cvswrappers
- # foo-b.c0
- # foo-b.sb
- # foo-t.c1
- # foo-t.st
- #
- # sub1/ sub2/
- # .cvswrappers .cvswrappers
- # foo-b.c1 foo-b.sb
- # foo-b.sb foo-b.st
- # foo-t.c0 foo-t.c0
- # foo-t.st foo-t.c1
- # foo-t.c2
- # foo-t.c3
- #
- # subsub/
- # .cvswrappers
- # foo-b.c3
- # foo-b.sb
- # foo-t.c0
- # foo-t.c1
- # foo-t.c2
- # foo-t.st
- binwrap3_line1="This is a test file "
- binwrap3_line2="containing little of use "
- binwrap3_line3="except this non-haiku"
- binwrap3_text="${binwrap3_line1}${binwrap3_line2}${binwrap3_line3}"
- cd ${TESTDIR}
- # On Windows, we can't check out CVSROOT, because the case
- # insensitivity means that this conflicts with cvsroot.
- mkdir wnt
- cd wnt
- mkdir binwrap3 # the 0th dir
- mkdir binwrap3/sub1
- mkdir binwrap3/sub2
- mkdir binwrap3/sub2/subsub
-
- echo "bar*" > binwrap3/.cvswrappers
- echo "*.c0 -k 'b'" >> binwrap3/.cvswrappers
- echo "whatever -k 'b'" >> binwrap3/.cvswrappers
- echo ${binwrap3_text} > binwrap3/foo-b.c0
- echo ${binwrap3_text} > binwrap3/bar-t.c0
- echo ${binwrap3_text} > binwrap3/foo-b.sb
- echo ${binwrap3_text} > binwrap3/foo-t.sb
- echo ${binwrap3_text} > binwrap3/foo-t.c1
- echo ${binwrap3_text} > binwrap3/foo-t.st
- echo "bar* -k 'kv'" > binwrap3/sub1/.cvswrappers
- echo "*.c1 -k 'b'" >> binwrap3/sub1/.cvswrappers
- echo "whatever -k 'b'" >> binwrap3/sub1/.cvswrappers
- echo ${binwrap3_text} > binwrap3/sub1/foo-b.c1
- echo ${binwrap3_text} > binwrap3/sub1/bar-t.c1
- echo ${binwrap3_text} > binwrap3/sub1/foo-b.sb
- echo ${binwrap3_text} > binwrap3/sub1/foo-t.sb
- echo ${binwrap3_text} > binwrap3/sub1/foo-t.c0
- echo ${binwrap3_text} > binwrap3/sub1/foo-t.st
- echo "bar*" > binwrap3/sub2/.cvswrappers
- echo "*.st -k 'b'" >> binwrap3/sub2/.cvswrappers
- echo ${binwrap3_text} > binwrap3/sub2/foo-b.sb
- echo ${binwrap3_text} > binwrap3/sub2/foo-t.sb
- echo ${binwrap3_text} > binwrap3/sub2/foo-b.st
- echo ${binwrap3_text} > binwrap3/sub2/bar-t.st
- echo ${binwrap3_text} > binwrap3/sub2/foo-t.c0
- echo ${binwrap3_text} > binwrap3/sub2/foo-t.c1
- echo ${binwrap3_text} > binwrap3/sub2/foo-t.c2
- echo ${binwrap3_text} > binwrap3/sub2/foo-t.c3
- echo "bar* -k 'kv'" > binwrap3/sub2/subsub/.cvswrappers
- echo "*.c3 -k 'b'" >> binwrap3/sub2/subsub/.cvswrappers
- echo "foo -k 'b'" >> binwrap3/sub2/subsub/.cvswrappers
- echo "c0* -k 'b'" >> binwrap3/sub2/subsub/.cvswrappers
- echo ${binwrap3_text} > binwrap3/sub2/subsub/foo-b.c3
- echo ${binwrap3_text} > binwrap3/sub2/subsub/bar-t.c3
- echo ${binwrap3_text} > binwrap3/sub2/subsub/foo-b.sb
- echo ${binwrap3_text} > binwrap3/sub2/subsub/foo-t.sb
- echo ${binwrap3_text} > binwrap3/sub2/subsub/foo-t.c0
- echo ${binwrap3_text} > binwrap3/sub2/subsub/foo-t.c1
- echo ${binwrap3_text} > binwrap3/sub2/subsub/foo-t.c2
- echo ${binwrap3_text} > binwrap3/sub2/subsub/foo-t.st
- # Now set up CVSROOT/cvswrappers, the easy way:
- dotest binwrap3-1 "${testcvs} -q co CVSROOT" "[UP] CVSROOT${DOTSTAR}"
- cd CVSROOT
- # This destroys anything currently in cvswrappers, but
- # presumably other tests will take care of it themselves if
- # they use cvswrappers:
- echo "foo-t.sb" > cvswrappers
- echo "foo*.sb -k 'b'" >> cvswrappers
- dotest binwrap3-2 "${testcvs} -q ci -m cvswrappers-mod" \
- "Checking in cvswrappers;
- ${CVSROOT_DIRNAME}/CVSROOT/cvswrappers,v <-- cvswrappers
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- # Avoid environmental interference
- CVSWRAPPERS_save=${CVSWRAPPERS}
- unset CVSWRAPPERS
- # Do the import
- cd binwrap3
- # Not importing .cvswrappers tests whether the client is really
- # letting the server know "honestly" whether the file is binary,
- # rather than just letting the server see the .cvswrappers file.
- dotest binwrap3-2a \
- "${testcvs} import -m . -I .cvswrappers binwrap3 tag1 tag2" \
- "[NI] ${DOTSTAR}"
- # OK, now test "cvs add".
- cd ..
- rm -r binwrap3
- dotest binwrap3-2b "${testcvs} co binwrap3" "${DOTSTAR}"
- cd binwrap3
- cd sub2
- echo "*.newbin -k 'b'" > .cvswrappers
- echo .cvswrappers >.cvsignore
- echo .cvsignore >>.cvsignore
- touch file1.newbin file1.txt
- dotest binwrap3-2c "${testcvs} add file1.newbin file1.txt" \
- "${PROG} add: scheduling file .file1\.newbin. for addition
- ${PROG} add: scheduling file .file1\.txt. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest binwrap3-2d "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/binwrap3/sub2/file1\.newbin,v
- done
- Checking in file1\.newbin;
- ${CVSROOT_DIRNAME}/binwrap3/sub2/file1\.newbin,v <-- file1\.newbin
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/binwrap3/sub2/file1\.txt,v
- done
- Checking in file1\.txt;
- ${CVSROOT_DIRNAME}/binwrap3/sub2/file1\.txt,v <-- file1\.txt
- initial revision: 1\.1
- done"
- cd ..
- # Now check out the module and see which files are binary.
- cd ..
- rm -r binwrap3
- dotest binwrap3-3 "${testcvs} co binwrap3" "${DOTSTAR}"
- cd binwrap3
- # Running "cvs status" and matching output is too
- # error-prone, too likely to falsely fail. Instead, we'll
- # just grep the Entries lines:
- dotest binwrap3-top1 "grep foo-b.c0 ./CVS/Entries" \
- "/foo-b.c0/1.1.1.1/[A-Za-z0-9 :]*/-kb/"
- dotest binwrap3-top2 "grep foo-b.sb ./CVS/Entries" \
- "/foo-b.sb/1.1.1.1/[A-Za-z0-9 :]*/-kb/"
- dotest binwrap3-top3 "grep foo-t.c1 ./CVS/Entries" \
- "/foo-t.c1/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-top4 "grep foo-t.st ./CVS/Entries" \
- "/foo-t.st/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-top5 "grep foo-t.sb ./CVS/Entries" \
- "/foo-t.sb/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-top6 "grep bar-t.c0 ./CVS/Entries" \
- "/bar-t.c0/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub1-1 "grep foo-b.c1 sub1/CVS/Entries" \
- "/foo-b.c1/1.1.1.1/[A-Za-z0-9 :]*/-kb/"
- dotest binwrap3-sub1-2 "grep foo-b.sb sub1/CVS/Entries" \
- "/foo-b.sb/1.1.1.1/[A-Za-z0-9 :]*/-kb/"
- dotest binwrap3-sub1-3 "grep foo-t.c0 sub1/CVS/Entries" \
- "/foo-t.c0/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub1-4 "grep foo-t.st sub1/CVS/Entries" \
- "/foo-t.st/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub1-5 "grep foo-t.sb sub1/CVS/Entries" \
- "/foo-t.sb/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub1-6 "grep bar-t.c1 sub1/CVS/Entries" \
- "/bar-t.c1/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub2-1 "grep foo-b.sb sub2/CVS/Entries" \
- "/foo-b.sb/1.1.1.1/[A-Za-z0-9 :]*/-kb/"
- dotest binwrap3-sub2-2 "grep foo-b.st sub2/CVS/Entries" \
- "/foo-b.st/1.1.1.1/[A-Za-z0-9 :]*/-kb/"
- dotest binwrap3-sub2-3 "grep foo-t.c0 sub2/CVS/Entries" \
- "/foo-t.c0/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub2-4 "grep foo-t.c1 sub2/CVS/Entries" \
- "/foo-t.c1/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub2-5 "grep foo-t.c2 sub2/CVS/Entries" \
- "/foo-t.c2/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub2-6 "grep foo-t.c3 sub2/CVS/Entries" \
- "/foo-t.c3/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub2-7 "grep foo-t.sb sub2/CVS/Entries" \
- "/foo-t.sb/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub2-8 "grep bar-t.st sub2/CVS/Entries" \
- "/bar-t.st/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-subsub1 "grep foo-b.c3 sub2/subsub/CVS/Entries" \
- "/foo-b.c3/1.1.1.1/[A-Za-z0-9 :]*/-kb/"
- dotest binwrap3-subsub2 "grep foo-b.sb sub2/subsub/CVS/Entries" \
- "/foo-b.sb/1.1.1.1/[A-Za-z0-9 :]*/-kb/"
- dotest binwrap3-subsub3 "grep foo-t.c0 sub2/subsub/CVS/Entries" \
- "/foo-t.c0/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-subsub4 "grep foo-t.c1 sub2/subsub/CVS/Entries" \
- "/foo-t.c1/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-subsub5 "grep foo-t.c2 sub2/subsub/CVS/Entries" \
- "/foo-t.c2/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-subsub6 "grep foo-t.st sub2/subsub/CVS/Entries" \
- "/foo-t.st/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-subsub7 "grep foo-t.sb sub2/subsub/CVS/Entries" \
- "/foo-t.sb/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-subsub8 "grep bar-t.c3 sub2/subsub/CVS/Entries" \
- "/bar-t.c3/1.1.1.1/[A-Za-z0-9 :]*//"
- dotest binwrap3-sub2-add1 "grep file1.newbin sub2/CVS/Entries" \
- "/file1.newbin/1.1/[A-Za-z0-9 :]*/-kb/"
- dotest binwrap3-sub2-add2 "grep file1.txt sub2/CVS/Entries" \
- "/file1.txt/1.1/[A-Za-z0-9 :]*//"
- # Restore and clean up
- cd ..
- rm -r binwrap3 CVSROOT
- cd ..
- rm -r wnt
- rm -rf ${CVSROOT_DIRNAME}/binwrap3
- CVSWRAPPERS=${CVSWRAPPERS_save}
- ;;
- mwrap)
- # Tests of various wrappers features:
- # -m 'COPY' and cvs update: mwrap
- # -m 'COPY' and joining: mcopy
- # -k: binwrap, binwrap2
- # -t/-f: hasn't been written yet.
- #
- # Tests of different ways of specifying wrappers:
- # CVSROOT/cvswrappers: mwrap
- # -W: binwrap, binwrap2
- # .cvswrappers in working directory, local: mcopy
- # CVSROOT/cvswrappers, .cvswrappers remote: binwrap3
- # CVSWRAPPERS environment variable: mcopy
- # This test is similar to binfiles-con1; -m 'COPY' specifies
- # non-mergeableness the same way that -kb does.
- # On Windows, we can't check out CVSROOT, because the case
- # insensitivity means that this conflicts with cvsroot.
- mkdir wnt
- cd wnt
- dotest mwrap-c1 "${testcvs} -q co CVSROOT" "[UP] CVSROOT${DOTSTAR}"
- cd CVSROOT
- echo "* -m 'COPY'" >>cvswrappers
- dotest mwrap-c2 "${testcvs} -q ci -m wrapper-mod" \
- "Checking in cvswrappers;
- ${CVSROOT_DIRNAME}/CVSROOT/cvswrappers,v <-- cvswrappers
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- mkdir m1; cd m1
- dotest mwrap-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest mwrap-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch aa
- dotest mwrap-3 "${testcvs} add aa" \
- "${PROG} add: scheduling file .aa. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest mwrap-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aa,v
- done
- Checking in aa;
- ${CVSROOT_DIRNAME}/first-dir/aa,v <-- aa
- initial revision: 1\.1
- done"
- cd ../..
- mkdir m2; cd m2
- dotest mwrap-5 "${testcvs} -q co first-dir" "U first-dir/aa"
- cd first-dir
- echo "changed in m2" >aa
- dotest mwrap-6 "${testcvs} -q ci -m m2-mod" \
- "Checking in aa;
- ${CVSROOT_DIRNAME}/first-dir/aa,v <-- aa
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../..
- cd m1/first-dir
- echo "changed in m1" >aa
- dotest mwrap-7 "$testcvs -nq update" \
- "${PROG} update: nonmergeable file needs merge
- ${PROG} update: revision 1\.2 from repository is now in aa
- ${PROG} update: file from working directory is now in \.#aa\.1\.1
- C aa"
- dotest mwrap-8 "${testcvs} -q update" \
- "$PROG update: nonmergeable file needs merge
- ${PROG} update: revision 1\.2 from repository is now in aa
- ${PROG} update: file from working directory is now in \.#aa\.1\.1
- C aa"
- dotest mwrap-9 "cat aa" "changed in m2"
- dotest mwrap-10 "cat .#aa.1.1" "changed in m1"
- cd ../..
- cd CVSROOT
- echo '# comment out' >cvswrappers
- dotest mwrap-ce "${testcvs} -q ci -m wrapper-mod" \
- "Checking in cvswrappers;
- ${CVSROOT_DIRNAME}/CVSROOT/cvswrappers,v <-- cvswrappers
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- rm -r CVSROOT
- rm -r m1 m2
- cd ..
- rm -r wnt
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- info)
- # Administrative file tests.
- # Here is a list of where each administrative file is tested:
- # loginfo: info
- # modules: modules, modules2, modules3
- # cvsignore: ignore
- # verifymsg: info
- # cvswrappers: mwrap
- # taginfo: taginfo
- # config: config
- # On Windows, we can't check out CVSROOT, because the case
- # insensitivity means that this conflicts with cvsroot.
- mkdir wnt
- cd wnt
- dotest info-1 "${testcvs} -q co CVSROOT" "[UP] CVSROOT${DOTSTAR}"
- cd CVSROOT
- rm -f $TESTDIR/testlog $TESTDIR/testlog2
- echo "ALL sh -c \"echo x\${=MYENV}\${=OTHER}y\${=ZEE}=\$USER=\$CVSROOT= >>$TESTDIR/testlog; cat >/dev/null\"" > loginfo
- # The following cases test the format string substitution
- echo "ALL echo %{sVv} >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
- echo "ALL echo %{v} >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
- echo "ALL echo %s >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
- echo "ALL echo %{V}AX >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
- echo "first-dir echo %sux >>$TESTDIR/testlog2; cat >/dev/null" \
- >> loginfo
- # Might be nice to move this to crerepos tests; it should
- # work to create a loginfo file if you didn't create one
- # with "cvs init".
- : dotest info-2 "${testcvs} add loginfo" \
- "${PROG}"' add: scheduling file `loginfo'"'"' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest info-3 "${testcvs} -q ci -m new-loginfo" \
- "Checking in loginfo;
- ${CVSROOT_DIRNAME}/CVSROOT/loginfo,v <-- loginfo
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest info-5 "${testcvs} -q co first-dir" ''
- cd first-dir
- touch file1
- dotest info-6 "${testcvs} add file1" \
- "${PROG}"' add: scheduling file `file1'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- echo "cvs -s OTHER=not-this -s MYENV=env-" >>$HOME/.cvsrc
- dotest info-6a "${testcvs} -q -s OTHER=value ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- ${PROG} commit: loginfo:1: no such user variable \${=ZEE}"
- echo line0 >>file1
- dotest info-6b "${testcvs} -q -sOTHER=foo ci -m mod-it" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done
- ${PROG} commit: loginfo:1: no such user variable \${=ZEE}"
- echo line1 >>file1
- dotest info-7 "${testcvs} -q -s OTHER=value -s ZEE=z ci -m mod-it" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done"
- cd ..
- dotest info-9 "cat $TESTDIR/testlog" "xenv-valueyz=${username}=${CVSROOT_DIRNAME}="
- dotest info-10 "cat $TESTDIR/testlog2" \
- 'first-dir file1,NONE,1.1
- first-dir 1.1
- first-dir file1
- first-dir NONEAX
- first-dir file1ux
- first-dir file1,1.1,1.2
- first-dir 1.2
- first-dir file1
- first-dir 1.1AX
- first-dir file1ux
- first-dir file1,1.2,1.3
- first-dir 1.3
- first-dir file1
- first-dir 1.2AX
- first-dir file1ux'
- cd CVSROOT
- echo '# do nothing' >loginfo
- dotest info-11 "${testcvs} -q -s ZEE=garbage ci -m nuke-loginfo" \
- "Checking in loginfo;
- ${CVSROOT_DIRNAME}/CVSROOT/loginfo,v <-- loginfo
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- # Now test verifymsg
- cat >${TESTDIR}/vscript <<EOF
- #!${TESTSHELL}
- if sed 1q < \$1 | grep '^BugId:[ ]*[0-9][0-9]*$' > /dev/null; then
- exit 0
- elif sed 1q < \$1 | grep '^BugId:[ ]*new$' > /dev/null; then
- echo A new bugid was found. >> \$1
- exit 0
- else
- echo "No BugId found."
- sleep 1
- exit 1
- fi
- EOF
- cat >${TESTDIR}/vscript2 <<EOF
- #!${TESTSHELL}
- if test -f CVS/Repository; then
- repo=\`cat CVS/Repository\`
- else
- repo=\`pwd\`
- fi
- echo \$repo
- if echo "\$repo" |grep yet-another/ >/dev/null 2>&1; then
- exit 1
- else
- exit 0
- fi
- EOF
- # Grumble, grumble, mumble, search for "Cygwin".
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod +x ${TESTDIR}/vscript*"
- else
- chmod +x ${TESTDIR}/vscript*
- fi
- echo "^first-dir/yet-another\\(/\\|\$\\) ${TESTDIR}/vscript2" >>verifymsg
- echo "^first-dir\\(/\\|\$\\) ${TESTDIR}/vscript" >>verifymsg
- echo "^missing-script\$ ${TESTDIR}/bogus" >>verifymsg
- echo "^missing-var\$ ${TESTDIR}/vscript \${=Bogus}" >>verifymsg
- # first test the directory independant verifymsg
- dotest info-v1 "${testcvs} -q ci -m add-verification" \
- "Checking in verifymsg;
- ${CVSROOT_DIRNAME}/CVSROOT/verifymsg,v <-- verifymsg
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../first-dir
- echo line2 >>file1
- dotest_fail info-v2 "${testcvs} -q ci -m bogus" \
- "No BugId found\.
- ${PROG} \[commit aborted\]: Message verification failed"
- cat >${TESTDIR}/comment.tmp <<EOF
- BugId: 42
- and many more lines after it
- EOF
- dotest info-v3 "${testcvs} -q ci -F ${TESTDIR}/comment.tmp" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.4; previous revision: 1\.3
- done"
- rm ${TESTDIR}/comment.tmp
- cd ..
- mkdir another-dir
- cd another-dir
- touch file2
- dotest_fail info-v4 \
- "${testcvs} import -m bogus first-dir/another x y" \
- "No BugId found\.
- ${PROG} \[import aborted\]: Message verification failed"
- # now verify that directory dependent verifymsgs work
- dotest info-v5 \
- "${testcvs} import -m bogus first-dir/yet-another x y" \
- "${TESTDIR}/wnt/another-dir
- N first-dir/yet-another/file2
- No conflicts created by this import" \
- "${CVSROOT_DIRNAME}/first-dir/yet-another
- N first-dir/yet-another/file2
- No conflicts created by this import"
- # FIXMECVS
- #
- # note that in the local case the error message is the same as
- # info-v5
- #
- # This means that the verifymsg scripts cannot reliably and
- # consistantly obtain information on which directory is being
- # committed to. Thus it is currently useless for them to be
- # running in every dir. They should either be run once or
- # directory information should be passed.
- if $remote; then
- dotest_fail info-v6r \
- "${testcvs} import -m bogus first-dir/yet-another/and-another x y" \
- "${CVSROOT_DIRNAME}/first-dir/yet-another/and-another
- ${PROG} \[import aborted\]: Message verification failed"
- else
- dotest info-v6 \
- "${testcvs} import -m bogus first-dir/yet-another/and-another x y" \
- "${TESTDIR}/wnt/another-dir
- N first-dir/yet-another/and-another/file2
- No conflicts created by this import"
- fi
- # check that errors invoking the script cause verification failure
- #
- # The second text below occurs on Cygwin, where I assume execvp
- # does not return to let CVS print the error message when its
- # argument does not exist.
- dotest_fail info-v7 "${testcvs} import -m bogus missing-script x y" \
- "${PROG} import: cannot exec ${TESTDIR}/bogus: No such file or directory
- ${PROG} \[import aborted\]: Message verification failed" \
- "${PROG} \[import aborted\]: Message verification failed"
- dotest_fail info-v8 "${testcvs} import -m bogus missing-var x y" \
- "${PROG} import: verifymsg:25: no such user variable \${=Bogus}
- ${PROG} \[import aborted\]: Message verification failed"
- rm file2
- cd ..
- rmdir another-dir
- cd CVSROOT
- echo "RereadLogAfterVerify=always" >>config
- dotest info-rereadlog-1 "${testcvs} -q ci -m add-RereadLogAfterVerify=always" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../first-dir
- echo line3 >>file1
- cat >${TESTDIR}/comment.tmp <<EOF
- BugId: new
- See what happens next.
- EOF
- dotest info-reread-2 "${testcvs} -q ci -F ${TESTDIR}/comment.tmp" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.5; previous revision: 1\.4
- done"
- dotest info-reread-3 "${testcvs} -q log -N -r1.5 file1" "
- .*
- BugId: new
- See what happens next.
- A new bugid was found.
- ============================================================================="
- cd ../CVSROOT
- grep -v "RereadLogAfterVerify" config > config.new
- mv config.new config
- echo "RereadLogAfterVerify=stat" >>config
- dotest info-reread-4 "${testcvs} -q ci -m add-RereadLogAfterVerify=stat" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../first-dir
- echo line4 >>file1
- cat >${TESTDIR}/comment.tmp <<EOF
- BugId: new
- See what happens next with stat.
- EOF
- dotest info-reread-5 "${testcvs} -q ci -F ${TESTDIR}/comment.tmp" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.6; previous revision: 1\.5
- done"
- dotest info-reread-6 "${testcvs} -q log -N -r1.6 file1" "
- .*
- BugId: new
- See what happens next with stat.
- A new bugid was found.
- ============================================================================="
- cd ../CVSROOT
- grep -v "RereadLogAfterVerify" config > config.new
- mv config.new config
- echo "RereadLogAfterVerify=never" >>config
- dotest info-reread-7 "${testcvs} -q ci -m add-RereadLogAfterVerify=never" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../first-dir
- echo line5 >>file1
- cat >${TESTDIR}/comment.tmp <<EOF
- BugId: new
- See what happens next.
- EOF
- dotest info-reread-8 "${testcvs} -q ci -F ${TESTDIR}/comment.tmp" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.7; previous revision: 1\.6
- done"
- dotest info-reread-6 "${testcvs} -q log -N -r1.7 file1" "
- .*
- BugId: new
- See what happens next.
- ============================================================================="
- cd ../CVSROOT
- echo 'DEFAULT false' >verifymsg
- echo 'DEFAULT true' >>verifymsg
- echo '# defaults' >config
- dotest info-multdef "${testcvs} -q ci -m multdef" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- Checking in verifymsg;
- ${CVSROOT_DIRNAME}/CVSROOT/verifymsg,v <-- verifymsg
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../CVSROOT
- echo '# do nothing' >verifymsg
- dotest info-cleanup-verifymsg "${testcvs} -q ci -m nuke-verifymsg" \
- "${PROG} commit: Multiple .DEFAULT. lines (1 and 2) in verifymsg file
- Checking in verifymsg;
- ${CVSROOT_DIRNAME}/CVSROOT/verifymsg,v <-- verifymsg
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- rm ${TESTDIR}/vscript*
- cd ..
- dotest_fail info-cleanup-0 "${testcvs} -n release -d CVSROOT" \
- "${PROG} \[release aborted\]: cannot run command ${DOTSTAR}"
- if echo "yes" | ${testcvs} release -d CVSROOT >>${LOGFILE} ; then
- pass info-cleanup
- else
- fail info-cleanup
- fi
- if echo "yes" | ${testcvs} release -d first-dir >>${LOGFILE} ; then
- pass info-cleanup-2
- else
- fail info-cleanup-2
- fi
- cd ..
- rm -r wnt
- rm $HOME/.cvsrc
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- taginfo)
- # Tests of the CVSROOT/taginfo file. See the comment at the
- # "info" tests for a full list of administrative file tests.
- # Tests to add:
- # -F to move
- mkdir 1; cd 1
- dotest taginfo-1 "${testcvs} -q co CVSROOT" "U CVSROOT/${DOTSTAR}"
- cd CVSROOT
- cat >${TESTDIR}/1/loggit <<EOF
- #!${TESTSHELL}
- if test "\$1" = rejectme; then
- exit 1
- else
- echo "\$@" >>${TESTDIR}/1/taglog
- exit 0
- fi
- EOF
- # #^@&!^@ Cygwin.
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod +x ${TESTDIR}/1/loggit"
- else
- chmod +x ${TESTDIR}/1/loggit
- fi
- echo "ALL ${TESTDIR}/1/loggit" >taginfo
- dotest taginfo-2 "${testcvs} -q ci -m check-in-taginfo" \
- "Checking in taginfo;
- ${CVSROOT_DIRNAME}/CVSROOT/taginfo,v <-- taginfo
- new revision: 1\.2; previous revision: 1\.1
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- # taginfo-3 used to rely on the top-level CVS directory
- # being created to add "first-dir" to the repository. Since
- # that won't happen anymore, we create the directory in the
- # repository.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest taginfo-3 "${testcvs} -q co first-dir" ''
- cd first-dir
- echo first >file1
- dotest taginfo-4 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest taginfo-5 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest taginfo-6 "${testcvs} -q tag tag1" "T file1"
- dotest taginfo-7 "${testcvs} -q tag -b br" "T file1"
- dotest taginfo-8 "$testcvs -q update -r br" '[UP] file1'
- echo add text on branch >>file1
- dotest taginfo-9 "${testcvs} -q ci -m modify-on-br" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest taginfo-10 "${testcvs} -q tag -F -c brtag" "T file1"
- dotest_fail taginfo-11 "${testcvs} -q tag rejectme" \
- "${PROG} tag: Pre-tag check failed
- ${PROG} \[tag aborted\]: correct the above errors first!"
- # When we are using taginfo to allow/disallow, it would be
- # convenient to be able to use "cvs -n tag" to test whether
- # the allow/disallow functionality is working as expected.
- dotest taginfo-12 "${testcvs} -nq tag rejectme" "T file1"
- # But when taginfo is used for logging, it is a pain for -n
- # to call taginfo, since taginfo doesn't know whether -n was
- # specified or not.
- dotest taginfo-13 "${testcvs} -nq tag would-be-tag" "T file1"
- # Deleting: the cases are basically either the tag existed,
- # or it didn't exist.
- dotest taginfo-14 "${testcvs} -q tag -d tag1" "D file1"
- dotest taginfo-15 "${testcvs} -q tag -d tag1" ""
- # Likewise with rtag.
- dotest taginfo-16 "${testcvs} -q rtag tag1 first-dir" ""
- dotest taginfo-17 "${testcvs} -q rtag -d tag1 first-dir" ""
- dotest taginfo-18 "${testcvs} -q rtag -d tag1 first-dir" ""
- # The "br" example should be passing 1.1.2 or 1.1.0.2.
- # But it turns out that is very hard to implement, since
- # check_fileproc doesn't know what branch number it will
- # get. Probably the whole thing should be re-architected
- # so that taginfo only allows/denies tagging, and a new
- # hook, which is done from tag_fileproc, does logging.
- # That would solve this, some more subtle races, and also
- # the fact that it is nice for users to run "-n tag foo" to
- # see whether a tag would be allowed. Failing that,
- # I suppose passing "1.1.branch" or "branch" for "br"
- # would be an improvement.
- dotest taginfo-examine "cat ${TESTDIR}/1/taglog" \
- "tag1 add ${CVSROOT_DIRNAME}/first-dir file1 1.1
- br add ${CVSROOT_DIRNAME}/first-dir file1 1.1
- brtag mov ${CVSROOT_DIRNAME}/first-dir file1 1.1.2.1
- tag1 del ${CVSROOT_DIRNAME}/first-dir file1 1.1
- tag1 del ${CVSROOT_DIRNAME}/first-dir
- tag1 add ${CVSROOT_DIRNAME}/first-dir file1 1.1
- tag1 del ${CVSROOT_DIRNAME}/first-dir file1 1.1
- tag1 del ${CVSROOT_DIRNAME}/first-dir"
- cd ..
- cd CVSROOT
- echo '# Keep life simple' > taginfo
- dotest taginfo-cleanup-1 "${testcvs} -q ci -m check-in-taginfo" \
- "Checking in taginfo;
- ${CVSROOT_DIRNAME}/CVSROOT/taginfo,v <-- taginfo
- new revision: 1\.3; previous revision: 1\.2
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..
- cd ..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- config)
- # Tests of the CVSROOT/config file. See the comment at the
- # "info" tests for a full list of administrative file tests.
- # On Windows, we can't check out CVSROOT, because the case
- # insensitivity means that this conflicts with cvsroot.
- mkdir wnt
- cd wnt
- dotest config-1 "${testcvs} -q co CVSROOT" "U CVSROOT/${DOTSTAR}"
- cd CVSROOT
- echo 'bogus line' >config
- # We can't rely on specific revisions, since other tests
- # might need to modify CVSROOT/config
- dotest config-3 "${testcvs} -q ci -m change-to-bogus-line" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- echo 'BogusOption=yes' >config
- dotest config-4 "${testcvs} -q ci -m change-to-bogus-opt" \
- "${PROG} [a-z]*: syntax error in ${CVSROOT_DIRNAME}/CVSROOT/config: line 'bogus line' is missing '='
- Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- echo '# No config is a good config' > config
- dotest config-5 "${testcvs} -q ci -m change-to-comment" \
- "${PROG} [a-z]*: ${CVSROOT_DIRNAME}/CVSROOT/config: unrecognized keyword 'BogusOption'
- Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- dotest config-6 "${testcvs} -q update" ''
- echo 'IgnoreUnknownConfigKeys=yes' > config
- echo 'BogusOption=yes' >> config
- dotest config-7 "${testcvs} -q ci -m change-to-comment" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- dotest config-8 "${testcvs} -q update" ''
- echo '# No config is a good config' > config
- dotest config-9 "${testcvs} -q ci -m change-to-comment" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- dotest config-10 "${testcvs} -q update" ''
- cd ..
- rm -r CVSROOT
- cd ..
- rm -r wnt
- ;;
- serverpatch)
- # Test remote CVS handling of unpatchable files. This isn't
- # much of a test for local CVS.
- # We test this with some keyword expansion games, but the situation
- # also arises if the user modifies the file while CVS is running.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- mkdir 1
- cd 1
- dotest serverpatch-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- # Add a file with an RCS keyword.
- echo '$''Name$' > file1
- echo '1' >> file1
- dotest serverpatch-2 "${testcvs} add file1" \
- "${PROG}"' add: scheduling file `file1'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest serverpatch-3 "${testcvs} -q commit -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- # Tag the file.
- dotest serverpatch-4 "${testcvs} -q tag tag file1" 'T file1'
- # Check out a tagged copy of the file.
- cd ../..
- mkdir 2
- cd 2
- dotest serverpatch-5 "${testcvs} -q co -r tag first-dir" \
- 'U first-dir/file1'
- # Remove the tag. Prior to 1.11.23, this left the tag string in the
- # expansion of the Name keyword.
- dotest serverpatch-6 "$testcvs -q update -A first-dir" \
- 'U first-dir/file1'
- # Modify and check in the first copy.
- cd ../1/first-dir
- echo '2' >> file1
- dotest serverpatch-7 "${testcvs} -q ci -mx file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- # Now update the second copy. Prior to 1.11.23, the patch would fail
- # using remote CVS, forcing the file to be refetched.
- cd ../../2/first-dir
- dotest serverpatch-8 "${testcvs} -q update" \
- '[UP] file1'
- cd ../..
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- log)
- # Test selecting revisions with cvs log.
- # See also log2 tests for more tests.
- # See also branches-14.3 for logging with a branch off of a branch.
- # See also multibranch-14 for logging with several branches off the
- # same branchpoint.
- # Tests of each option to cvs log:
- # -h: admin-19a-log
- # -N: log, log2, admin-19a-log
- # -b, -r: log
- # -d: logopt, rcs
- # -s: logopt, rcs3
- # -R: logopt, rcs3
- # -w, -t: not tested yet (TODO)
- # Check in a file with a few revisions and branches.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest log-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- echo 'first revision' > file1
- echo 'first revision' > file2
- dotest log-2 "${testcvs} add file1 file2" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- # While we're at it, check multi-line comments, input from file,
- # and trailing whitespace trimming
- echo 'line 1 ' >${TESTDIR}/comment.tmp
- echo ' ' >>${TESTDIR}/comment.tmp
- echo 'line 2 ' >>${TESTDIR}/comment.tmp
- echo ' ' >>${TESTDIR}/comment.tmp
- echo ' ' >>${TESTDIR}/comment.tmp
- dotest log-3 "${testcvs} -q commit -F ${TESTDIR}/comment.tmp" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- rm -f ${TESTDIR}/comment.tmp
- echo 'second revision' > file1
- echo 'second revision' > file2
- dotest log-4 "${testcvs} -q ci -m2 file1 file2" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest log-5 "${testcvs} -q tag -b branch file1" 'T file1'
- dotest log-5a "${testcvs} -q tag tag1 file2" 'T file2'
- echo 'third revision' > file1
- echo 'third revision' > file2
- dotest log-6 "${testcvs} -q ci -m3 file1 file2" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.3; previous revision: 1\.2
- done"
- dotest log-6a "${testcvs} -q tag tag2 file2" 'T file2'
- dotest log-7 "${testcvs} -q update -r branch" \
- "[UP] file1
- ${PROG} update: file2 is no longer in the repository"
- echo 'first branch revision' > file1
- dotest log-8 "${testcvs} -q ci -m1b file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2\.2\.1; previous revision: 1\.2
- done"
- dotest log-9 "${testcvs} -q tag tag file1" 'T file1'
- echo 'second branch revision' > file1
- dotest log-10 "${testcvs} -q ci -m2b file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2\.2\.2; previous revision: 1\.2\.2\.1
- done"
- # Set up a bunch of shell variables to make the later tests
- # easier to describe.=
- log_header1="
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.3
- branch:
- locks: strict
- access list:"
- rlog_header1="
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- head: 1\.3
- branch:
- locks: strict
- access list:"
- log_tags1='symbolic names:
- tag: 1\.2\.2\.1
- branch: 1\.2\.0\.2'
- log_keyword='keyword substitution: kv'
- log_dash='----------------------------
- revision'
- log_date="date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;"
- log_lines=" lines: ${PLUS}1 -1"
- log_rev1="${log_dash} 1\.1
- ${log_date}
- line 1
- line 2"
- log_rev2="${log_dash} 1\.2
- ${log_date}${log_lines}
- branches: 1\.2\.2;
- 2"
- log_rev3="${log_dash} 1\.3
- ${log_date}${log_lines}
- 3"
- log_rev1b="${log_dash} 1\.2\.2\.1
- ${log_date}${log_lines}
- 1b"
- log_rev2b="${log_dash} 1\.2\.2\.2
- ${log_date}${log_lines}
- 2b"
- log_trailer='============================================================================='
- # Now, finally, test the log output.
- dotest log-11 "${testcvs} log file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 5
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_rev1}
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-12 "${testcvs} log -N file1" \
- "${log_header1}
- ${log_keyword}
- total revisions: 5; selected revisions: 5
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_rev1}
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-13 "${testcvs} log -b file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 3
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_rev1}
- ${log_trailer}"
- dotest log-14 "${testcvs} log -r file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-14a "${testcvs} log -rHEAD file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- # The user might not realize that "-r" must not take a space.
- # In the error message, HEAD is a file name, not a tag name (which
- # might be confusing itself).
- dotest_fail log-14b "${testcvs} log -r HEAD file1" \
- "${PROG} log: nothing known about HEAD
- ${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- # Check that unusual syntax works correctly.
- dotest log-14c "${testcvs} log -r: file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-14d "${testcvs} log -r, file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-14e "${testcvs} log -r. file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-14f "${testcvs} log -r:: file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 0
- description:
- ${log_trailer}"
- dotest log-15 "${testcvs} log -r1.2 file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev2}
- ${log_trailer}"
- dotest log-16 "${testcvs} log -r1.2.2 file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- # This test would fail with the old invocation of rlog, but it
- # works with the builtin log support.
- dotest log-17 "${testcvs} log -rbranch file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-18 "${testcvs} log -r1.2.2. file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev2b}
- ${log_trailer}"
- # Multiple -r options are undocumented; see comments in
- # cvs.texinfo about whether they should be deprecated.
- dotest log-18a "${testcvs} log -r1.2.2.2 -r1.3:1.3 file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev2b}
- ${log_trailer}"
- # This test would fail with the old invocation of rlog, but it
- # works with the builtin log support.
- dotest log-19 "${testcvs} log -rbranch. file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev2b}
- ${log_trailer}"
- dotest log-20 "${testcvs} log -r1.2: file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_trailer}"
- dotest log-20a "${testcvs} log -r1.2:: file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-21 "${testcvs} log -r:1.2 file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev2}
- ${log_rev1}
- ${log_trailer}"
- dotest log-21a "${testcvs} log -r::1.2 file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev2}
- ${log_rev1}
- ${log_trailer}"
- dotest log-22 "${testcvs} log -r1.1:1.2 file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev2}
- ${log_rev1}
- ${log_trailer}"
- dotest log-22a "${testcvs} log -r1.1::1.2 file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev2}
- ${log_trailer}"
- dotest log-22b "${testcvs} log -r1.1::1.3 file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_trailer}"
- # Test BASE pseudotag
- dotest log-23 "${testcvs} log -rBASE file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev2b}
- ${log_trailer}"
- dotest log-24 "${testcvs} -q up -r1.2 file1" "[UP] file1"
- dotest log-25 "${testcvs} log -rBASE file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev2}
- ${log_trailer}"
- dotest log-26 "${testcvs} -q up -rbranch file1" "[UP] file1"
- # Now the same tests but with rlog
- dotest log-r11 "${testcvs} rlog first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 5
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_rev1}
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-r12 "${testcvs} rlog -N first-dir/file1" \
- "${rlog_header1}
- ${log_keyword}
- total revisions: 5; selected revisions: 5
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_rev1}
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-r13 "${testcvs} rlog -b first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 3
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_rev1}
- ${log_trailer}"
- dotest log-r14 "${testcvs} rlog -r first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-r14a "${testcvs} rlog -rHEAD first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest_fail log-r14b "${testcvs} rlog -r HEAD first-dir/file1" \
- "${PROG} rlog: cannot find module .HEAD. - ignored
- ${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-r14c "${testcvs} rlog -r: first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-r14d "${testcvs} rlog -r, first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-r14e "${testcvs} rlog -r. first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-r14f "${testcvs} rlog -r:: first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 0
- description:
- ${log_trailer}"
- dotest log-r15 "${testcvs} rlog -r1.2 first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev2}
- ${log_trailer}"
- dotest log-r16 "${testcvs} rlog -r1.2.2 first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-r17 "${testcvs} rlog -rbranch first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-r18 "${testcvs} rlog -r1.2.2. first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev2b}
- ${log_trailer}"
- dotest log-r18a "${testcvs} rlog -r1.2.2.2 -r1.3:1.3 first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev2b}
- ${log_trailer}"
- dotest log-r19 "${testcvs} rlog -rbranch. first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev2b}
- ${log_trailer}"
- dotest log-r20 "${testcvs} rlog -r1.2: first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_trailer}"
- dotest log-r20a "${testcvs} rlog -r1.2:: first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev3}
- ${log_trailer}"
- dotest log-r21 "${testcvs} rlog -r:1.2 first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev2}
- ${log_rev1}
- ${log_trailer}"
- dotest log-r21a "${testcvs} rlog -r::1.2 first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev2}
- ${log_rev1}
- ${log_trailer}"
- dotest log-r22 "${testcvs} rlog -r1.1:1.2 first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev2}
- ${log_rev1}
- ${log_trailer}"
- dotest log-r22a "${testcvs} rlog -r1.1::1.2 first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 1
- description:
- ${log_rev2}
- ${log_trailer}"
- dotest log-r22b "${testcvs} rlog -r1.1::1.3 first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_trailer}"
- # Test BASE pseudotag
- dotest log-r23 "${testcvs} rlog -rBASE first-dir/file1" \
- "${PROG} rlog: warning: no revision .BASE. in .${CVSROOT_DIRNAME}/first-dir/file1,v.
- ${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 0
- description:
- ${log_trailer}"
- dotest log-r24 "${testcvs} -q up -r1.2 file1" "[UP] file1"
- dotest log-r25 "${testcvs} rlog -rBASE first-dir/file1" \
- "${PROG} rlog: warning: no revision .BASE. in .${CVSROOT_DIRNAME}/first-dir/file1,v.
- ${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 0
- description:
- ${log_trailer}"
- # Test when head is dead
- dotest log-d0 "${testcvs} -q up -A" \
- "[UP] file1
- U file2"
- dotest log-d1 "${testcvs} -q rm -f file1" \
- "${PROG} remove: use .${PROG} commit. to remove this file permanently"
- dotest log-d2 "${testcvs} -q ci -m4" \
- "Removing file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: delete; previous revision: 1\.3
- done"
- log_header1="
- RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- Working file: file1
- head: 1\.4
- branch:
- locks: strict
- access list:"
- rlog_header1="
- RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- head: 1\.4
- branch:
- locks: strict
- access list:"
- log_header2="
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- Working file: file2
- head: 1\.3
- branch:
- locks: strict
- access list:"
- rlog_header2="
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- head: 1\.3
- branch:
- locks: strict
- access list:"
- log_tags2='symbolic names:
- tag2: 1\.3
- tag1: 1\.2'
- log_rev4="${log_dash} 1\.4
- date: [0-9/]* [0-9:]*; author: ${username}; state: dead; lines: ${PLUS}0 -0
- 4"
- log_rev22="${log_dash} 1\.2
- ${log_date}${log_lines}
- 2"
- dotest log-d3 "${testcvs} log -rbranch file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-rd3 "${testcvs} rlog -rbranch first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-d4 "${testcvs} -q log -rbranch" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}
- ${PROG} log: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v.
- ${log_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3; selected revisions: 0
- description:
- ${log_trailer}"
- dotest log-d4a "${testcvs} -q log -t -rbranch" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6
- description:
- ${log_trailer}
- ${PROG} log: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v.
- ${log_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3
- description:
- ${log_trailer}"
- dotest log-d4b "${testcvs} -q log -tS -rbranch" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_trailer}
- ${PROG} log: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v."
- dotest log-d4c "${testcvs} -q log -h -rbranch" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6
- ${log_trailer}
- ${PROG} log: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v.
- ${log_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3
- ${log_trailer}"
- dotest log-d4d "${testcvs} -q log -hS -rbranch" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- ${log_trailer}
- ${PROG} log: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v."
- dotest log-d4e "${testcvs} -q log -R -rbranch" \
- "${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- ${CVSROOT_DIRNAME}/first-dir/file2,v"
- dotest log-d4f "${testcvs} -q log -R -S -rbranch" \
- "${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- ${PROG} log: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v."
- dotest log-rd4 "${testcvs} -q rlog -rbranch first-dir" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}
- ${PROG} rlog: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v.
- ${rlog_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3; selected revisions: 0
- description:
- ${log_trailer}"
- dotest log-rd4a "${testcvs} -q rlog -t -rbranch first-dir" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6
- description:
- ${log_trailer}
- ${PROG} rlog: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v.
- ${rlog_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3
- description:
- ${log_trailer}"
- dotest log-rd4b "${testcvs} -q rlog -St -rbranch first-dir" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_trailer}
- ${PROG} rlog: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v."
- dotest log-rd4c "${testcvs} -q rlog -h -rbranch first-dir" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6
- ${log_trailer}
- ${PROG} rlog: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v.
- ${rlog_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3
- ${log_trailer}"
- dotest log-rd4d "${testcvs} -q rlog -Sh -rbranch first-dir" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- ${log_trailer}
- ${PROG} rlog: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v."
- dotest log-rd4e "${testcvs} -q rlog -R -rbranch first-dir" \
- "${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- ${CVSROOT_DIRNAME}/first-dir/file2,v"
- dotest log-rd4f "${testcvs} -q rlog -R -S -rbranch first-dir" \
- "${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- ${PROG} rlog: warning: no revision .branch. in .${CVSROOT_DIRNAME}/first-dir/file2,v."
- dotest log-d5 "${testcvs} log -r1.2.2.1:1.2.2.2 file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-rd5 "${testcvs} rlog -r1.2.2.1:1.2.2.2 first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-d6 "${testcvs} -q log -r1.2.2.1:1.2.2.2" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}
- ${log_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3; selected revisions: 0
- description:
- ${log_trailer}"
- dotest log-rd6 "${testcvs} -q rlog -r1.2.2.1:1.2.2.2 first-dir" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_rev2b}
- ${log_rev1b}
- ${log_trailer}
- ${rlog_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3; selected revisions: 0
- description:
- ${log_trailer}"
- dotest log-d7 "${testcvs} log -r1.2:1.3 file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_trailer}"
- dotest log-rd7 "${testcvs} -q rlog -r1.2:1.3 first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev2}
- ${log_trailer}"
- dotest log-d8 "${testcvs} -q log -rtag1:tag2" \
- "${PROG} log: warning: no revision .tag1. in .${CVSROOT_DIRNAME}/first-dir/Attic/file1,v.
- ${PROG} log: warning: no revision .tag2. in .${CVSROOT_DIRNAME}/first-dir/Attic/file1,v.
- ${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 0
- description:
- ${log_trailer}
- ${log_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev22}
- ${log_trailer}"
- dotest log-d8a "${testcvs} -q log -rtag1:tag2 -S" \
- "${PROG} log: warning: no revision .tag1. in .${CVSROOT_DIRNAME}/first-dir/Attic/file1,v.
- ${PROG} log: warning: no revision .tag2. in .${CVSROOT_DIRNAME}/first-dir/Attic/file1,v.
- ${log_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev22}
- ${log_trailer}"
- dotest log-rd8 "${testcvs} -q rlog -rtag1:tag2 first-dir" \
- "${PROG} rlog: warning: no revision .tag1. in .${CVSROOT_DIRNAME}/first-dir/Attic/file1,v.
- ${PROG} rlog: warning: no revision .tag2. in .${CVSROOT_DIRNAME}/first-dir/Attic/file1,v.
- ${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 6; selected revisions: 0
- description:
- ${log_trailer}
- ${rlog_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev22}
- ${log_trailer}"
- dotest log-rd8a "${testcvs} -q rlog -rtag1:tag2 -S first-dir" \
- "${PROG} rlog: warning: no revision .tag1. in .${CVSROOT_DIRNAME}/first-dir/Attic/file1,v.
- ${PROG} rlog: warning: no revision .tag2. in .${CVSROOT_DIRNAME}/first-dir/Attic/file1,v.
- ${rlog_header2}
- ${log_tags2}
- ${log_keyword}
- total revisions: 3; selected revisions: 2
- description:
- ${log_rev3}
- ${log_rev22}
- ${log_trailer}"
- dotest log-d99 "${testcvs} -q up -rbranch" \
- "[UP] file1
- ${PROG} update: file2 is no longer in the repository"
- # Now test outdating revisions
- dotest log-o0 "${testcvs} admin -o 1.2.2.2:: file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- done"
- dotest log-o1 "${testcvs} admin -o ::1.2.2.1 file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- done"
- dotest log-o2 "${testcvs} admin -o 1.2.2.1:: file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file1,v
- deleting revision 1\.2\.2\.2
- done"
- dotest log-o3 "${testcvs} log file1" \
- "${log_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 5
- description:
- ${log_rev4}
- ${log_rev3}
- ${log_rev2}
- ${log_rev1}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-ro3 "${testcvs} rlog first-dir/file1" \
- "${rlog_header1}
- ${log_tags1}
- ${log_keyword}
- total revisions: 5; selected revisions: 5
- description:
- ${log_rev4}
- ${log_rev3}
- ${log_rev2}
- ${log_rev1}
- ${log_rev1b}
- ${log_trailer}"
- dotest log-o4 "${testcvs} -q update -p -r 1.2.2.1 file1" \
- "first branch revision"
- cd ..
- rm -r first-dir
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- log2)
- # More "cvs log" tests, for example the file description.
- # Check in a file
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest log2-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- echo 'first revision' > file1
- dotest log2-2 "${testcvs} add -m file1-is-for-testing file1" \
- "${PROG}"' add: scheduling file `file1'\'' for addition
- '"${PROG}"' add: use .'"${PROG}"' commit. to add this file permanently'
- dotest log2-3 "${testcvs} -q commit -m 1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- # Setting the file description with add -m doesn't yet work
- # client/server, so skip log2-4 for remote.
- if $remote; then :; else
- dotest log2-4 "${testcvs} log -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- file1-is-for-testing
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- 1
- ============================================================================="
- fi # end of tests skipped for remote
- dotest log2-5 "${testcvs} admin -t-change-description file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done"
- dotest log2-6 "${testcvs} log -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- change-description
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- 1
- ============================================================================="
- echo 'longer description' >${TESTDIR}/descrip
- echo 'with two lines' >>${TESTDIR}/descrip
- dotest log2-7 "${testcvs} admin -t${TESTDIR}/descrip file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done"
- dotest_fail log2-7a "${testcvs} admin -t${TESTDIR}/nonexist file1" \
- "${PROG} \[[a-z]* aborted\]: can't stat ${TESTDIR}/nonexist: No such file or directory"
- dotest log2-8 "${testcvs} log -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- longer description
- with two lines
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- 1
- ============================================================================="
- # TODO: `cvs admin -t "my message" file1' is a request to
- # read the message from stdin and to operate on two files.
- # Should test that there is an error because "my message"
- # doesn't exist.
- dotest log2-9 "echo change from stdin | ${testcvs} admin -t -q file1" ""
- dotest log2-10 "${testcvs} log -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- change from stdin
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- 1
- ============================================================================="
- cd ..
- rm ${TESTDIR}/descrip
- rm -r first-dir
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- logopt)
- # Some tests of log.c's option parsing and such things.
- mkdir 1; cd 1
- dotest logopt-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest logopt-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo hi >file1
- dotest logopt-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest logopt-4 "${testcvs} -q ci -m add file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- cd ..
- dotest logopt-5 "${testcvs} log -R -d 2038-01-01" \
- "${PROG} log: Logging \.
- ${PROG} log: Logging first-dir
- ${CVSROOT_DIRNAME}/first-dir/file1,v"
- dotest logopt-6 "${testcvs} log -d 2038-01-01 -R" \
- "${PROG} log: Logging \.
- ${PROG} log: Logging first-dir
- ${CVSROOT_DIRNAME}/first-dir/file1,v"
- dotest logopt-6a "${testcvs} log -Rd 2038-01-01" \
- "${PROG} log: Logging \.
- ${PROG} log: Logging first-dir
- ${CVSROOT_DIRNAME}/first-dir/file1,v"
- dotest logopt-7 "${testcvs} log -s Exp -R" \
- "${PROG} log: Logging \.
- ${PROG} log: Logging first-dir
- ${CVSROOT_DIRNAME}/first-dir/file1,v"
- cd ..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- ann)
- # Tests of "cvs annotate". See also:
- # basica-10 A simple annotate test
- # rcs Annotate and the year 2000
- # keywordlog Annotate and $Log.
- mkdir 1; cd 1
- dotest ann-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest ann-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- cat >file1 <<EOF
- this
- is
- the
- ancestral
- file
- EOF
- dotest ann-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest ann-4 "${testcvs} -q ci -m add file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- cat >file1 <<EOF
- this
- is
- a
- file
- with
- a
- blank
- line
- EOF
- dotest ann-5 "${testcvs} -q ci -m modify file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest ann-6 "${testcvs} -q tag -b br" "T file1"
- cat >file1 <<EOF
- this
- is
- a
- trunk file
- with
- a
- blank
- line
- EOF
- dotest ann-7 "${testcvs} -q ci -m modify file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done"
- dotest ann-8 "${testcvs} -q update -r br" "[UP] file1"
- cat >file1 <<EOF
- this
- is
- a
- file
- with
- a
- blank
- line
- and some
- branched content
- EOF
- dotest ann-9 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2\.2\.1; previous revision: 1\.2
- done"
- # Note that this annotates the trunk despite the presence
- # of a sticky tag in the current directory. This is
- # fairly bogus, but it is the longstanding behavior for
- # whatever that is worth.
- dotest ann-10 "${testcvs} ann" \
- "
- Annotations for file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1 ($username8 *[0-9a-zA-Z-]*): this
- 1\.1 ($username8 *[0-9a-zA-Z-]*): is
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.3 ($username8 *[0-9a-zA-Z-]*): trunk file
- 1\.2 ($username8 *[0-9a-zA-Z-]*):
- 1\.2 ($username8 *[0-9a-zA-Z-]*): with
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.2 ($username8 *[0-9a-zA-Z-]*): blank
- 1\.2 ($username8 *[0-9a-zA-Z-]*): line"
- dotest ann-10blame "${testcvs} blame" \
- "
- Annotations for file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1 ($username8 *[0-9a-zA-Z-]*): this
- 1\.1 ($username8 *[0-9a-zA-Z-]*): is
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.3 ($username8 *[0-9a-zA-Z-]*): trunk file
- 1\.2 ($username8 *[0-9a-zA-Z-]*):
- 1\.2 ($username8 *[0-9a-zA-Z-]*): with
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.2 ($username8 *[0-9a-zA-Z-]*): blank
- 1\.2 ($username8 *[0-9a-zA-Z-]*): line"
- dotest ann-11 "${testcvs} ann -r br" \
- "
- Annotations for file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1 ($username8 *[0-9a-zA-Z-]*): this
- 1\.1 ($username8 *[0-9a-zA-Z-]*): is
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.1 ($username8 *[0-9a-zA-Z-]*): file
- 1\.2 ($username8 *[0-9a-zA-Z-]*):
- 1\.2 ($username8 *[0-9a-zA-Z-]*): with
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.2 ($username8 *[0-9a-zA-Z-]*): blank
- 1\.2 ($username8 *[0-9a-zA-Z-]*): line
- 1\.2\.2\.1 ($username8 *[0-9a-zA-Z-]*): and some
- 1\.2\.2\.1 ($username8 *[0-9a-zA-Z-]*): branched content"
- # FIXCVS: shouldn't "-r 1.2.0.2" be the same as "-r br"?
- dotest ann-12 "${testcvs} ann -r 1.2.0.2 file1" ""
- dotest ann-13 "${testcvs} ann -r 1.2.2 file1" \
- "
- Annotations for file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1 ($username8 *[0-9a-zA-Z-]*): this
- 1\.1 ($username8 *[0-9a-zA-Z-]*): is
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.1 ($username8 *[0-9a-zA-Z-]*): file
- 1\.2 ($username8 *[0-9a-zA-Z-]*):
- 1\.2 ($username8 *[0-9a-zA-Z-]*): with
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.2 ($username8 *[0-9a-zA-Z-]*): blank
- 1\.2 ($username8 *[0-9a-zA-Z-]*): line
- 1\.2\.2\.1 ($username8 *[0-9a-zA-Z-]*): and some
- 1\.2\.2\.1 ($username8 *[0-9a-zA-Z-]*): branched content"
- dotest_fail ann-14 "${testcvs} ann -r bill-clintons-chastity file1" \
- "${PROG} \[annotate aborted\]: no such tag bill-clintons-chastity"
- # Now get rid of the working directory and test rannotate
- cd ../..
- rm -r 1
- dotest ann-r10 "${testcvs} rann first-dir" \
- "
- Annotations for first-dir/file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1 ($username8 *[0-9a-zA-Z-]*): this
- 1\.1 ($username8 *[0-9a-zA-Z-]*): is
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.3 ($username8 *[0-9a-zA-Z-]*): trunk file
- 1\.2 ($username8 *[0-9a-zA-Z-]*):
- 1\.2 ($username8 *[0-9a-zA-Z-]*): with
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.2 ($username8 *[0-9a-zA-Z-]*): blank
- 1\.2 ($username8 *[0-9a-zA-Z-]*): line"
- dotest ann-r11 "${testcvs} rann -r br first-dir" \
- "
- Annotations for first-dir/file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1 ($username8 *[0-9a-zA-Z-]*): this
- 1\.1 ($username8 *[0-9a-zA-Z-]*): is
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.1 ($username8 *[0-9a-zA-Z-]*): file
- 1\.2 ($username8 *[0-9a-zA-Z-]*):
- 1\.2 ($username8 *[0-9a-zA-Z-]*): with
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.2 ($username8 *[0-9a-zA-Z-]*): blank
- 1\.2 ($username8 *[0-9a-zA-Z-]*): line
- 1\.2\.2\.1 ($username8 *[0-9a-zA-Z-]*): and some
- 1\.2\.2\.1 ($username8 *[0-9a-zA-Z-]*): branched content"
- dotest ann-r12 "${testcvs} rann -r 1.2.0.2 first-dir/file1" ""
- dotest ann-r13 "${testcvs} rann -r 1.2.2 first-dir/file1" \
- "
- Annotations for first-dir/file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1 ($username8 *[0-9a-zA-Z-]*): this
- 1\.1 ($username8 *[0-9a-zA-Z-]*): is
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.1 ($username8 *[0-9a-zA-Z-]*): file
- 1\.2 ($username8 *[0-9a-zA-Z-]*):
- 1\.2 ($username8 *[0-9a-zA-Z-]*): with
- 1\.2 ($username8 *[0-9a-zA-Z-]*): a
- 1\.2 ($username8 *[0-9a-zA-Z-]*): blank
- 1\.2 ($username8 *[0-9a-zA-Z-]*): line
- 1\.2\.2\.1 ($username8 *[0-9a-zA-Z-]*): and some
- 1\.2\.2\.1 ($username8 *[0-9a-zA-Z-]*): branched content"
- dotest_fail ann-r14 "${testcvs} rann -r bill-clintons-chastity first-dir/file1" \
- "${PROG} \[rannotate aborted\]: no such tag bill-clintons-chastity"
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- ann-id)
- # Demonstrate that cvs-1.9.28.1 improperly expands rcs keywords in
- # the output of `cvs annotate' -- it uses values from the previous
- # delta. In this case, `1.1' instead of `1.2', even though it puts
- # the proper version number on the prefix to each line of output.
- mkdir 1; cd 1
- dotest ann-id-1 "${testcvs} -q co -l ." ''
- module=x
- mkdir $module
- dotest ann-id-2 "${testcvs} add $module" \
- "Directory ${CVSROOT_DIRNAME}/$module added to the repository"
- cd $module
- file=m
- echo '$Id''$' > $file
- dotest ann-id-3 "$testcvs add $file" \
- "${PROG} add: scheduling file .$file. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest ann-id-4 "$testcvs -Q ci -m . $file" \
- "RCS file: ${CVSROOT_DIRNAME}/$module/$file,v
- done
- Checking in $file;
- ${CVSROOT_DIRNAME}/$module/$file,v <-- $file
- initial revision: 1\.1
- done"
- echo line2 >> $file
- dotest ann-id-5 "$testcvs -Q ci -m . $file" \
- "Checking in $file;
- ${CVSROOT_DIRNAME}/$module/$file,v <-- $file
- new revision: 1\.2; previous revision: 1\.1
- done"
- # The version number after $file,v should be `1.2'.
- # 1.9.28.1 puts `1.1' there.
- dotest ann-id-6 "$testcvs -Q ann $file" \
- "
- Annotations for $file
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1.2 ($username8 *[0-9a-zA-Z-]*): "'\$'"Id: $file,v 1.1 [0-9/]* [0-9:]* $username Exp "'\$'"
- 1.2 ($username8 *[0-9a-zA-Z-]*): line2"
- cd ../..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/$module
- ;;
- crerepos)
- # Various tests relating to creating repositories, operating
- # on repositories created with old versions of CVS, etc.
- CVS_SERVER_save=$CVS_SERVER
- # Because this test is all about -d options and such, it
- # at least to some extent needs to be different for remote vs.
- # local.
- if $remote; then
- # Use :ext: rather than :fork:. Most of the tests use :fork:,
- # so we want to make sure that we test :ext: _somewhere_.
- # Make sure 'rsh' works first.
- depends_on_rsh "$CVS_RSH"
- if test $? -eq 77; then
- skip crerepos "$skipreason"
- continue
- fi
- # For remote, just create the repository. We don't yet do
- # the various other tests above for remote but that should be
- # changed.
- mkdir crerepos
- mkdir crerepos/CVSROOT
- # Make sure server ignores real ${HOME}/.cvsrc:
- cat >$TESTDIR/cvs-setHome <<EOF
- #!/bin/sh
- HOME=$HOME
- export HOME
- exec $CVS_SERVER_save "\$@"
- EOF
- chmod a+x $TESTDIR/cvs-setHome
- # Note that we set CVS_SERVER at the beginning.
- CVS_SERVER=$TESTDIR/cvs-setHome; export CVS_SERVER
- CREREPOS_ROOT=:ext:$host$TESTDIR/crerepos
- else
- # First, if the repository doesn't exist at all...
- dotest_fail crerepos-1 \
- "${testcvs} -d ${TESTDIR}/crerepos co cvs-sanity" \
- "${PROG} \[checkout aborted\]: ${TESTDIR}/crerepos/CVSROOT: .*"
- mkdir crerepos
- # The repository exists but CVSROOT doesn't.
- dotest_fail crerepos-2 \
- "${testcvs} -d ${TESTDIR}/crerepos co cvs-sanity" \
- "${PROG} \[checkout aborted\]: ${TESTDIR}/crerepos/CVSROOT: .*"
- mkdir crerepos/CVSROOT
- # Checkout of nonexistent module
- dotest_fail crerepos-3 \
- "${testcvs} -d ${TESTDIR}/crerepos co cvs-sanity" \
- "${PROG} checkout: cannot find module .cvs-sanity. - ignored"
- # Now test that CVS works correctly without a modules file
- # or any of that other stuff. In particular, it *must*
- # function if administrative files added to CVS recently (since
- # CVS 1.3) do not exist, because the repository might have
- # been created with an old version of CVS.
- mkdir 1; cd 1
- dotest crerepos-4 \
- "${testcvs} -q -d ${TESTDIR}/crerepos co CVSROOT" \
- ''
- if echo yes | \
- ${testcvs} -d ${TESTDIR}/crerepos release -d CVSROOT >>${LOGFILE}; then
- pass crerepos-5
- else
- fail crerepos-5
- fi
- rm -rf CVS
- cd ..
- # The directory 1 should be empty
- dotest crerepos-6 "rmdir 1"
- CREREPOS_ROOT=${TESTDIR}/crerepos
- fi
- if $remote; then
- # Test that CVS rejects a relative path in CVSROOT.
- mkdir 1; cd 1
- # Note that having the client reject the pathname (as :fork:
- # does), does _not_ test for the bugs we are trying to catch
- # here. The point is that malicious clients might send all
- # manner of things and the server better protect itself.
- dotest_fail crerepos-6a-r \
- "${testcvs} -q -d :ext:`hostname`:../crerepos get ." \
- "${PROG} [a-z]*: CVSROOT may only specify a positive, non-zero, integer port (not .\.\..)\.
- ${PROG} [a-z]*: Perhaps you entered a relative pathname${QUESTION}
- ${PROG} \[[a-z]* aborted\]: Bad CVSROOT: .:ext:${hostname}:\.\./crerepos.\."
- cd ..
- rm -r 1
- else # local
- # Test that CVS rejects a relative path in CVSROOT.
- mkdir 1; cd 1
- # Set CVS_RSH=false since ocassionally (e.g. when CVS_RSH=ssh on
- # some systems) some rsh implementations will block because they
- # can look up '..' and want to ask the user about the unknown host
- # key or somesuch. Which error message we get depends on whether
- # false finishes running before we try to talk to it or not.
- dotest_fail crerepos-6a "CVS_RSH=false ${testcvs} -q -d ../crerepos get ." \
- "${PROG} \[checkout aborted\]: .*" \
- "${PROG} checkout: CVSROOT is set for a remote access method but your
- ${PROG} checkout: CVS executable doesn't support it\.
- ${PROG} \[checkout aborted\]: Bad CVSROOT: .\.\./crerepos.\."
- cd ..
- rm -r 1
- mkdir 1; cd 1
- dotest_fail crerepos-6b "${testcvs} -d crerepos init" \
- "${PROG} init: CVSROOT must be an absolute pathname (not .crerepos.)
- ${PROG} init: when using local access method\.
- ${PROG} \[init aborted\]: Bad CVSROOT: .crerepos.\."
- cd ..
- rm -r 1
- fi # end of tests to be skipped for remote
- # CVS better not create a history file--if the administrator
- # doesn't need it and wants to save on disk space, they just
- # delete it.
- dotest_fail crerepos-7 \
- "test -f ${TESTDIR}/crerepos/CVSROOT/history" ''
- # Now test mixing repositories. This kind of thing tends to
- # happen accidentally when people work with several repositories.
- mkdir 1; cd 1
- dotest crerepos-8 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest crerepos-9 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch file1
- dotest crerepos-10 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest crerepos-11 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- cd ../..
- rm -r 1
- mkdir 1; cd 1
- dotest crerepos-12 "${testcvs} -d ${CREREPOS_ROOT} -q co -l ." ''
- mkdir crerepos-dir
- dotest crerepos-13 "${testcvs} add crerepos-dir" \
- "Directory ${TESTDIR}/crerepos/crerepos-dir added to the repository"
- cd crerepos-dir
- touch cfile
- dotest crerepos-14 "${testcvs} add cfile" \
- "${PROG} add: scheduling file .cfile. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest crerepos-15 "${testcvs} -q ci -m add-it" \
- "RCS file: ${TESTDIR}/crerepos/crerepos-dir/cfile,v
- done
- Checking in cfile;
- ${TESTDIR}/crerepos/crerepos-dir/cfile,v <-- cfile
- initial revision: 1\.1
- done"
- cd ../..
- rm -r 1
- mkdir 1; cd 1
- dotest crerepos-16 "${testcvs} co first-dir" \
- "${PROG} checkout: Updating first-dir
- U first-dir/file1"
- dotest crerepos-17 "${testcvs} -d ${CREREPOS_ROOT} co crerepos-dir" \
- "${PROG} checkout: Updating crerepos-dir
- U crerepos-dir/cfile"
- dotest crerepos-18 "${testcvs} update" \
- "${PROG} update: Updating first-dir
- ${PROG} update: Updating crerepos-dir"
- cd ..
- CVS_SERVER=$CVS_SERVER_save; export CVS_SERVER
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -f $TESTDIR/cvs-setHome
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir ${TESTDIR}/crerepos
- ;;
- crerepos-extssh)
- # Various tests relating to creating repositories, operating
- # on repositories created with old versions of CVS, etc.
- CVS_SERVER_save=$CVS_SERVER
- # Because this test is all about -d options and such, it
- # at least to some extent needs to be different for remote vs.
- # local.
- if $remote; then
- # Use :extssh: rather than :fork:. Most of the tests use :fork:,
- # so we want to make sure that we test :extssh: _somewhere_.
- # Make sure 'ssh' works first.
- depends_on_rsh "$CVS_RSH"
- if test $? -eq 77; then
- skip crerepos "$skipreason"
- continue
- fi
- # For remote, just create the repository. We don't yet do
- # the various other tests above for remote but that should be
- # changed.
- mkdir crerepos
- mkdir crerepos/CVSROOT
- # Make sure server ignores real ${HOME}/.cvsrc:
- cat >$TESTDIR/cvs-setHome <<EOF
- #!/bin/sh
- HOME=$HOME
- export HOME
- exec $CVS_SERVER_save "\$@"
- EOF
- chmod a+x $TESTDIR/cvs-setHome
- # Note that we set CVS_SERVER at the beginning.
- CVS_SERVER=$TESTDIR/cvs-setHome; export CVS_SERVER
- CREREPOS_ROOT=:extssh:$host$TESTDIR/crerepos
- else
- # First, if the repository doesn't exist at all...
- dotest_fail crerepos-extssh-1 \
- "${testcvs} -d ${TESTDIR}/crerepos co cvs-sanity" \
- "${PROG} \[checkout aborted\]: ${TESTDIR}/crerepos/CVSROOT: .*"
- mkdir crerepos
- # The repository exists but CVSROOT doesn't.
- dotest_fail crerepos-extssh-2 \
- "${testcvs} -d ${TESTDIR}/crerepos co cvs-sanity" \
- "${PROG} \[checkout aborted\]: ${TESTDIR}/crerepos/CVSROOT: .*"
- mkdir crerepos/CVSROOT
- # Checkout of nonexistent module
- dotest_fail crerepos-extssh-3 \
- "${testcvs} -d ${TESTDIR}/crerepos co cvs-sanity" \
- "${PROG} checkout: cannot find module .cvs-sanity. - ignored"
- # Now test that CVS works correctly without a modules file
- # or any of that other stuff. In particular, it *must*
- # function if administrative files added to CVS recently (since
- # CVS 1.3) do not exist, because the repository might have
- # been created with an old version of CVS.
- mkdir 1; cd 1
- dotest crerepos-extssh-4 \
- "${testcvs} -q -d ${TESTDIR}/crerepos co CVSROOT" \
- ''
- if echo yes | \
- ${testcvs} -d ${TESTDIR}/crerepos release -d CVSROOT >>${LOGFILE}; then
- pass crerepos-extssh-5
- else
- fail crerepos-extssh-5
- fi
- rm -rf CVS
- cd ..
- # The directory 1 should be empty
- dotest crerepos-extssh-6 "rmdir 1"
- CREREPOS_ROOT=${TESTDIR}/crerepos
- fi
- if $remote; then
- # Test that CVS rejects a relative path in CVSROOT.
- mkdir 1; cd 1
- # Note that having the client reject the pathname (as :fork:
- # does), does _not_ test for the bugs we are trying to catch
- # here. The point is that malicious clients might send all
- # manner of things and the server better protect itself.
- dotest_fail crerepos-extssh-6a-r \
- "${testcvs} -q -d :extssh:`hostname`:../crerepos get ." \
- "${PROG} [a-z]*: CVSROOT may only specify a positive, non-zero, integer port (not .\.\..)\.
- ${PROG} [a-z]*: Perhaps you entered a relative pathname${QUESTION}
- ${PROG} \[[a-z]* aborted\]: Bad CVSROOT: .:extssh:${hostname}:\.\./crerepos.\."
- cd ..
- rm -r 1
- else # local
- # Test that CVS rejects a relative path in CVSROOT.
- mkdir 1; cd 1
- # Set CVS_RSH=false since ocassionally (e.g. when CVS_RSH=ssh on
- # some systems) some rsh implementations will block because they
- # can look up '..' and want to ask the user about the unknown host
- # key or somesuch. Which error message we get depends on whether
- # false finishes running before we try to talk to it or not.
- dotest_fail crerepos-extssh-6a "CVS_RSH=false ${testcvs} -q -d ../crerepos get ." \
- "${PROG} \[checkout aborted\]: .*" \
- "${PROG} checkout: CVSROOT is set for a remote access method but your
- ${PROG} checkout: CVS executable doesn't support it\.
- ${PROG} \[checkout aborted\]: Bad CVSROOT: .\.\./crerepos.\."
- cd ..
- rm -r 1
- mkdir 1; cd 1
- dotest_fail crerepos-extssh-6b "${testcvs} -d crerepos init" \
- "${PROG} init: CVSROOT must be an absolute pathname (not .crerepos.)
- ${PROG} init: when using local access method\.
- ${PROG} \[init aborted\]: Bad CVSROOT: .crerepos.\."
- cd ..
- rm -r 1
- fi # end of tests to be skipped for remote
- # CVS better not create a history file--if the administrator
- # doesn't need it and wants to save on disk space, they just
- # delete it.
- dotest_fail crerepos-extssh-7 \
- "test -f ${TESTDIR}/crerepos/CVSROOT/history" ''
- # Now test mixing repositories. This kind of thing tends to
- # happen accidentally when people work with several repositories.
- mkdir 1; cd 1
- dotest crerepos-extssh-8 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest crerepos-extssh-9 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch file1
- dotest crerepos-extssh-10 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest crerepos-extssh-11 "${testcvs} -q ci -m add-it" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- cd ../..
- rm -r 1
- mkdir 1; cd 1
- dotest crerepos-extssh-12 "${testcvs} -d ${CREREPOS_ROOT} -q co -l ." ''
- mkdir crerepos-dir
- dotest crerepos-extssh-13 "${testcvs} add crerepos-dir" \
- "Directory ${TESTDIR}/crerepos/crerepos-dir added to the repository"
- cd crerepos-dir
- touch cfile
- dotest crerepos-extssh-14 "${testcvs} add cfile" \
- "${PROG} add: scheduling file .cfile. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest crerepos-extssh-15 "${testcvs} -q ci -m add-it" \
- "RCS file: ${TESTDIR}/crerepos/crerepos-dir/cfile,v
- done
- Checking in cfile;
- ${TESTDIR}/crerepos/crerepos-dir/cfile,v <-- cfile
- initial revision: 1\.1
- done"
- cd ../..
- rm -r 1
- mkdir 1; cd 1
- dotest crerepos-extssh-16 "${testcvs} co first-dir" \
- "${PROG} checkout: Updating first-dir
- U first-dir/file1"
- dotest crerepos-extssh-17 "${testcvs} -d ${CREREPOS_ROOT} co crerepos-dir" \
- "${PROG} checkout: Updating crerepos-dir
- U crerepos-dir/cfile"
- dotest crerepos-extssh-18 "${testcvs} update" \
- "${PROG} update: Updating first-dir
- ${PROG} update: Updating crerepos-dir"
- cd ..
- CVS_SERVER=$CVS_SERVER_save; export CVS_SERVER
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -f $TESTDIR/cvs-setHome
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir ${TESTDIR}/crerepos
- ;;
- rcs)
- # Test ability to import an RCS file. Note that this format
- # is fixed--files written by RCS5, and other software which
- # implements this format, will be out there "forever" and
- # CVS must always be able to import such files.
- # See tests admin-13, admin-25 and rcs-8a for exporting RCS files.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- # Currently the way to import an RCS file is to copy it
- # directly into the repository.
- #
- # This file was written by RCS 5.7, and then the dates were
- # hacked so that we test year 2000 stuff. Note also that
- # "author" names are just strings, as far as importing
- # RCS files is concerned--they need not correspond to user
- # IDs on any particular system.
- #
- # I also tried writing a file with the RCS supplied with
- # HPUX A.09.05. According to "man rcsintro" this is
- # "Revision Number: 3.0; Release Date: 83/05/11". There
- # were a few minor differences like whitespace but at least
- # in simple cases like this everything else seemed the same
- # as the file written by RCS 5.7 (so I won't try to make it
- # a separate test case).
- cat <<EOF >${CVSROOT_DIRNAME}/first-dir/file1,v
- head 1.3;
- access;
- symbols;
- locks; strict;
- comment @# @;
- 1.3
- date 2000.11.24.15.58.37; author kingdon; state Exp;
- branches;
- next 1.2;
- 1.2
- date 96.11.24.15.57.41; author kingdon; state Exp;
- branches;
- next 1.1;
- 1.1
- date 96.11.24.15.56.05; author kingdon; state Exp;
- branches;
- next ;
- desc
- @file1 is for testing CVS
- @
- 1.3
- log
- @delete second line; modify twelfth line
- @
- text
- @This is the first line
- This is the third line
- This is the fourth line
- This is the fifth line
- This is the sixth line
- This is the seventh line
- This is the eighth line
- This is the ninth line
- This is the tenth line
- This is the eleventh line
- This is the twelfth line (and what a line it is)
- This is the thirteenth line
- @
- 1.2
- log
- @add more lines
- @
- text
- @a1 1
- This is the second line
- d11 1
- a11 1
- This is the twelfth line
- @
- 1.1
- log
- @add file1
- @
- text
- @d2 12
- @
- EOF
- dotest rcs-1 "${testcvs} -q co first-dir" 'U first-dir/file1'
- cd first-dir
- dotest rcs-2 "${testcvs} -q log" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.3
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- file1 is for testing CVS
- ----------------------------
- revision 1\.3
- date: 2000/11/24 15:58:37; author: kingdon; state: Exp; lines: ${PLUS}1 -2
- delete second line; modify twelfth line
- ----------------------------
- revision 1\.2
- date: 1996/11/24 15:57:41; author: kingdon; state: Exp; lines: ${PLUS}12 -0
- add more lines
- ----------------------------
- revision 1\.1
- date: 1996/11/24 15:56:05; author: kingdon; state: Exp;
- add file1
- ============================================================================="
- # Note that the dates here are chosen so that (a) we test
- # at least one date after 2000, (b) we will notice if the
- # month and day are getting mixed up with each other.
- # TODO: also test that year isn't getting mixed up with month
- # or day, for example 01-02-03.
- # ISO8601 format. There are many, many, other variations
- # specified by ISO8601 which we should be testing too.
- dotest rcs-3 "${testcvs} -q log -d '1996-12-11<'" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.3
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 3; selected revisions: 1
- description:
- file1 is for testing CVS
- ----------------------------
- revision 1\.3
- date: 2000/11/24 15:58:37; author: kingdon; state: Exp; lines: ${PLUS}1 -2
- delete second line; modify twelfth line
- ============================================================================="
- # RFC822 format (as amended by RFC1123).
- dotest rcs-4 "${testcvs} -q log -d '<3 Apr 2000 00:00'" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.3
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 3; selected revisions: 2
- description:
- file1 is for testing CVS
- ----------------------------
- revision 1\.2
- date: 1996/11/24 15:57:41; author: kingdon; state: Exp; lines: ${PLUS}12 -0
- add more lines
- ----------------------------
- revision 1\.1
- date: 1996/11/24 15:56:05; author: kingdon; state: Exp;
- add file1
- ============================================================================="
- # Intended behavior for "cvs annotate" is that it displays the
- # last two digits of the year. Make sure it does that rather
- # than some bogosity like "100".
- dotest rcs-4a "${testcvs} annotate file1" \
- "
- Annotations for file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1 (kingdon 24-Nov-96): This is the first line
- 1\.2 (kingdon 24-Nov-96): This is the third line
- 1\.2 (kingdon 24-Nov-96): This is the fourth line
- 1\.2 (kingdon 24-Nov-96): This is the fifth line
- 1\.2 (kingdon 24-Nov-96): This is the sixth line
- 1\.2 (kingdon 24-Nov-96): This is the seventh line
- 1\.2 (kingdon 24-Nov-96): This is the eighth line
- 1\.2 (kingdon 24-Nov-96): This is the ninth line
- 1\.2 (kingdon 24-Nov-96): This is the tenth line
- 1\.2 (kingdon 24-Nov-96): This is the eleventh line
- 1\.3 (kingdon 24-Nov-00): This is the twelfth line (and what a line it is)
- 1\.2 (kingdon 24-Nov-96): This is the thirteenth line"
- # Probably should split this test into two at this point (file1
- # above this line and file2 below), as the two share little
- # data/setup.
- # OK, here is another one. This one was written by hand based on
- # doc/RCSFILES and friends. One subtle point is that none of
- # the lines end with newlines; that is a feature which we
- # should be testing.
- cat <<EOF >${CVSROOT_DIRNAME}/first-dir/file2,v
- head 1.5 ;
- branch 1.2.6;
- access ;
- symbols branch:1.2.6;
- locks;
- testofanewphrase @without newphrase we'd have trouble extending @@ all@ ;
- 1.5 date 71.01.01.01.00.00; author joe; state bogus; branches; next 1.4;
- 1.4 date 71.01.01.00.00.05; author joe; state bogus; branches; next 1.3;
- 1.3 date 70.12.31.15.00.05; author joe; state bogus; branches; next 1.2;
- 1.2 date 70.12.31.12.15.05; author me; state bogus; branches 1.2.6.1; next 1.1;
- 1.1 date 70.12.31.11.00.05; author joe; state bogus; branches; next; newph;
- 1.2.6.1 date 71.01.01.08.00.05; author joe; state Exp; branches; next;
- desc @@
- 1.5 log @@ newphrase1; newphrase2 42; text @head revision@
- 1.4 log @@ text @d1 1
- a1 1
- new year revision@
- 1.3 log @@ text @d1 1
- a1 1
- old year revision@
- 1.2 log @@ text @d1 1
- a1 1
- mid revision@ 1.1
- log @@ text @d1 1
- a1 1
- start revision@
- 1.2.6.1 log @@ text @d1 1
- a1 1
- branch revision@
- EOF
- # ' Match the single quote in above here doc -- for font-lock mode.
- # First test the default branch.
- dotest rcs-5 "${testcvs} -q update file2" "U file2"
- dotest rcs-6 "cat file2" "branch revision"
- # Check in a revision on the branch to force CVS to
- # interpret every revision in the file.
- dotest rcs-6a "$testcvs -q update -r branch file2" 'U file2'
- echo "next branch revision" > file2
- dotest rcs-6b "${testcvs} -q ci -m mod file2" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.2\.6\.2; previous revision: 1\.2\.6\.1
- done"
- # Now get rid of the default branch, it will get in the way.
- dotest rcs-7 "${testcvs} admin -b file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
- # But we do want to make sure that "cvs admin" leaves the newphrases
- # in the file.
- # The extra whitespace regexps are for the RCS library, which does
- # not preserve whitespace in the dogmatic manner of RCS 5.7. -twp
- dotest rcs-8 \
- "grep testofanewphrase ${CVSROOT_DIRNAME}/first-dir/file2,v" \
- "testofanewphrase[ ][ ]*@without newphrase we'd have trouble extending @@ all@[ ]*;"
- # The easiest way to test for newphrases in deltas and deltatexts
- # is to just look at the whole file, I guess.
- dotest rcs-8a "cat ${CVSROOT_DIRNAME}/first-dir/file2,v" \
- "head 1\.5;
- access;
- symbols
- branch:1.2.6;
- locks;
- testofanewphrase @without newphrase we'd have trouble extending @@ all@;
- 1\.5
- date 71\.01\.01\.01\.00\.00; author joe; state bogus;
- branches;
- next 1\.4;
- 1\.4
- date 71\.01\.01\.00\.00\.05; author joe; state bogus;
- branches;
- next 1\.3;
- 1\.3
- date 70\.12\.31\.15\.00\.05; author joe; state bogus;
- branches;
- next 1\.2;
- 1\.2
- date 70\.12\.31\.12\.15\.05; author me; state bogus;
- branches
- 1\.2\.6\.1;
- next 1\.1;
- 1\.1
- date 70\.12\.31\.11\.00\.05; author joe; state bogus;
- branches;
- next ;
- newph ;
- 1\.2\.6\.1
- date 71\.01\.01\.08\.00\.05; author joe; state Exp;
- branches;
- next 1\.2\.6\.2;
- 1\.2\.6\.2
- date [0-9.]*; author ${username}; state Exp;
- branches;
- next ;
- desc
- @@
- 1\.5
- log
- @@
- newphrase1 ;
- newphrase2 42;
- text
- @head revision@
- 1\.4
- log
- @@
- text
- @d1 1
- a1 1
- new year revision@
- 1\.3
- log
- @@
- text
- @d1 1
- a1 1
- old year revision@
- 1\.2
- log
- @@
- text
- @d1 1
- a1 1
- mid revision@
- 1\.1
- log
- @@
- text
- @d1 1
- a1 1
- start revision@
- 1\.2\.6\.1
- log
- @@
- text
- @d1 1
- a1 1
- branch revision@
- 1\.2\.6\.2
- log
- @mod
- @
- text
- @d1 1
- a1 1
- next branch revision
- @"
- dotest rcs-9 "${testcvs} -q update -p -D '1970-12-31 11:30 UT' file2" \
- "start revision"
- dotest rcs-10 "${testcvs} -q update -p -D '1970-12-31 12:30 UT' file2" \
- "mid revision"
- dotest rcs-11 "${testcvs} -q update -p -D '1971-01-01 00:30 UT' file2" \
- "new year revision"
- # Same test as rcs-10, but with am/pm.
- dotest rcs-12 "${testcvs} -q update -p -D 'December 31, 1970 12:30pm UT' file2" \
- "mid revision"
- # Same test as rcs-11, but with am/pm.
- dotest rcs-13 "${testcvs} -q update -p -D 'January 1, 1971 12:30am UT' file2" \
- "new year revision"
- # OK, now make sure cvs log doesn't have any trouble with the
- # newphrases and such.
- dotest rcs-14 "${testcvs} -q log file2" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- Working file: file2
- head: 1\.5
- branch:
- locks:
- access list:
- symbolic names:
- branch: 1\.2\.6
- keyword substitution: kv
- total revisions: 7; selected revisions: 7
- description:
- ----------------------------
- revision 1\.5
- date: 1971/01/01 01:00:00; author: joe; state: bogus; lines: ${PLUS}1 -1
- \*\*\* empty log message \*\*\*
- ----------------------------
- revision 1\.4
- date: 1971/01/01 00:00:05; author: joe; state: bogus; lines: ${PLUS}1 -1
- \*\*\* empty log message \*\*\*
- ----------------------------
- revision 1\.3
- date: 1970/12/31 15:00:05; author: joe; state: bogus; lines: ${PLUS}1 -1
- \*\*\* empty log message \*\*\*
- ----------------------------
- revision 1\.2
- date: 1970/12/31 12:15:05; author: me; state: bogus; lines: ${PLUS}1 -1
- branches: 1\.2\.6;
- \*\*\* empty log message \*\*\*
- ----------------------------
- revision 1\.1
- date: 1970/12/31 11:00:05; author: joe; state: bogus;
- \*\*\* empty log message \*\*\*
- ----------------------------
- revision 1\.2\.6\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -1
- mod
- ----------------------------
- revision 1\.2\.6\.1
- date: 1971/01/01 08:00:05; author: joe; state: Exp; lines: ${PLUS}1 -1
- \*\*\* empty log message \*\*\*
- ============================================================================="
- # Now test each date format for "cvs log -d".
- # Earlier than 1971-01-01
- dotest rcs-15 "${testcvs} -q log -d '<1971-01-01 00:00 GMT' file2 \
- | grep revision" \
- "total revisions: 7; selected revisions: 3
- revision 1\.3
- revision 1\.2
- revision 1\.1"
- # Later than 1971-01-01
- dotest rcs-16 "${testcvs} -q log -d '1971-01-01 00:00 GMT<' file2 \
- | grep revision" \
- "total revisions: 7; selected revisions: 4
- revision 1\.5
- revision 1\.4
- revision 1\.2\.6\.2
- revision 1\.2\.6\.1"
- # Alternate syntaxes for later and earlier; multiple -d options
- dotest rcs-17 "${testcvs} -q log -d '>1971-01-01 00:00 GMT' \
- -d '1970-12-31 12:15 GMT>' file2 | grep revision" \
- "total revisions: 7; selected revisions: 5
- revision 1\.5
- revision 1\.4
- revision 1\.1
- revision 1\.2\.6\.2
- revision 1\.2\.6\.1"
- # Range, and single date
- dotest rcs-18 "${testcvs} -q log -d '1970-12-31 11:30 GMT' \
- -d '1971-01-01 00:00:05 GMT<1971-01-01 01:00:01 GMT' \
- file2 | grep revision" \
- "total revisions: 7; selected revisions: 2
- revision 1\.5
- revision 1\.1"
- # Alternate range syntax; equality
- dotest rcs-19 "${testcvs} -q log \
- -d '1971-01-01 01:00:01 GMT>=1971-01-01 00:00:05 GMT' \
- file2 | grep revision" \
- "total revisions: 7; selected revisions: 2
- revision 1\.5
- revision 1\.4"
- cd ..
- rm -r first-dir
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- rcs2)
- # More date tests. Might as well do this as a separate
- # test from "rcs", so that we don't need to perturb the
- # "written by RCS 5.7" RCS file.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- # Significance of various dates:
- # * At least one Y2K standard refers to recognizing 9 Sep 1999
- # (as an example of a pre-2000 date, I guess).
- # * At least one Y2K standard refers to recognizing 1 Jan 2001
- # (as an example of a post-2000 date, I guess).
- # * Many Y2K standards refer to 2000 being a leap year.
- cat <<EOF >${CVSROOT_DIRNAME}/first-dir/file1,v
- head 1.7; access; symbols; locks; strict;
- 1.7 date 2004.08.31.01.01.01; author sue; state; branches; next 1.6;
- 1.6 date 2004.02.29.01.01.01; author sue; state; branches; next 1.5;
- 1.5 date 2003.02.28.01.01.01; author sue; state; branches; next 1.4;
- 1.4 date 2001.01.01.01.01.01; author sue; state; branches; next 1.3;
- 1.3 date 2000.02.29.01.01.01; author sue; state; branches; next 1.2;
- 1.2 date 99.09.09.01.01.01; author sue; state; branches; next 1.1;
- 1.1 date 98.09.10.01.01.01; author sue; state; branches; next;
- desc @a test file@
- 1.7 log @@ text @head revision@
- 1.6 log @@ text @d1 1
- a1 1
- 2004 was a great year for leaping@
- 1.5 log @@ text @d1 1
- a1 1
- 2003 wasn't@
- 1.4 log @@ text @d1 1
- a1 1
- two year hiatus@
- 1.3 log @@ text @d1 1
- a1 1
- 2000 is also a good year for leaping@
- 1.2 log @@ text @d1 1
- a1 1
- Tonight we're going to party like it's a certain year@
- 1.1 log @@ text @d1 1
- a1 1
- Need to start somewhere@
- EOF
- # ' Match the 3rd single quote in the here doc -- for font-lock mode.
- dotest rcs2-1 "${testcvs} -q co first-dir" 'U first-dir/file1'
- cd first-dir
- # 9 Sep 1999
- dotest rcs2-2 "${testcvs} -q update -p -D '1999-09-09 11:30 UT' file1" \
- "Tonight we're going to party like it's a certain year"
- # 1 Jan 2001.
- dotest rcs2-3 "${testcvs} -q update -p -D '2001-01-01 11:30 UT' file1" \
- "two year hiatus"
- # 29 Feb 2000
- dotest rcs2-4 "${testcvs} -q update -p -D '2000-02-29 11:30 UT' file1" \
- "2000 is also a good year for leaping"
- # 29 Feb 2003 is invalid
- dotest_fail rcs2-5 "${testcvs} -q update -p -D '2003-02-29 11:30 UT' file1" \
- "${PROG} \[[a-z]* aborted\]: Can't parse date/time: 2003-02-29 11:30 UT"
- dotest rcs2-6 "${testcvs} -q update -p -D 2007-01-07 file1" \
- "head revision"
- # This assumes that the clock of the machine running the tests
- # is set to at least the year 1998 or so. There don't seem
- # to be a lot of ways to test the relative date code (short
- # of something like LD_LIBRARY_PRELOAD'ing in our own
- # getttimeofday, or hacking the CVS source with testing
- # features, which always seems to be problematic since then
- # someone feels like documenting them and things go downhill
- # from there).
- #
- # These tests can be expected to fail 3 times every 400 years
- # starting Feb. 29, 2096 (because 8 years from that date would
- # be Feb. 29, 2100, which is an invalid date -- 2100 isn't a
- # leap year because it's divisible by 100 but not by 400).
- dotest rcs2-7 "${testcvs} -q update -p -D '96 months' file1" \
- "head revision"
- dotest rcs2-8 "${testcvs} -q update -p -D '8 years' file1" \
- "head revision"
- cd ..
- rm -r first-dir
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- rcs3)
- # More RCS file tests, in particular at least some of the
- # error handling issues.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- cat <<EOF >${CVSROOT_DIRNAME}/first-dir/file1,v
- head 1.1; access; symbols; locks; expand o; 1.1 date 2007.03.20.04.03.02
- ; author jeremiah ;state ; branches; next;desc@@1.1log@@text@head@
- EOF
- mkdir 1; cd 1
- # CVS requires whitespace between "desc" and its value.
- # The rcsfile(5) manpage doesn't really seem to answer the
- # question one way or the other (it has a grammar but almost
- # nothing about lexical analysis).
- dotest_fail rcs3-1 "${testcvs} -q co first-dir" \
- "${PROG} \[checkout aborted\]: EOF while looking for value in RCS file ${CVSROOT_DIRNAME}/first-dir/file1,v"
- cat <<EOF >${CVSROOT_DIRNAME}/first-dir/file1,v
- head 1.1; access; symbols; locks; expand o; 1.1 date 2007.03.20.04.03.02
- ; author jeremiah ;state ; branches; next;desc @@1.1log@@text@head@
- EOF
- # Whitespace issues, likewise.
- dotest_fail rcs3-2 "${testcvs} -q co first-dir" \
- "${PROG} \[checkout aborted\]: unexpected '.x6c' reading revision number in RCS file ${CVSROOT_DIRNAME}/first-dir/file1,v"
- cat <<EOF >${CVSROOT_DIRNAME}/first-dir/file1,v
- head 1.1; access; symbols; locks; expand o; 1.1 date 2007.03.20.04.03.02
- ; author jeremiah ;state ; branches; next;desc @@1.1 log@@text@head@
- EOF
- # Charming array of different messages for similar
- # whitespace issues (depending on where the whitespace is).
- dotest_fail rcs3-3 "${testcvs} -q co first-dir" \
- "${PROG} \[checkout aborted\]: EOF while looking for value in RCS file ${CVSROOT_DIRNAME}/first-dir/file1,v"
- cat <<EOF >${CVSROOT_DIRNAME}/first-dir/file1,v
- head 1.1; access; symbols; locks; expand o; 1.1 date 2007.03.20.04.03.02
- ; author jeremiah ;state ; branches; next;desc @@1.1 log @@text @head@
- EOF
- dotest rcs3-4 "${testcvs} -q co first-dir" 'U first-dir/file1'
- # Ouch, didn't expect this one. FIXCVS. Or maybe just remove
- # the feature, if this is a -s problem?
- dotest_fail rcs3-5 "${testcvs} log -s nostate first-dir/file1" \
- "${DOTSTAR}ssertion.*failed${DOTSTAR}" "${DOTSTAR}failed assertion${DOTSTAR}"
- cd first-dir
- dotest_fail rcs3-5a "${testcvs} log -s nostate file1" \
- "${DOTSTAR}ssertion.*failed${DOTSTAR}" "${DOTSTAR}failed assertion${DOTSTAR}"
- cd ..
- # See remote code above for rationale for cd.
- cd first-dir
- dotest rcs3-6 "${testcvs} log -R file1" \
- "${CVSROOT_DIRNAME}/first-dir/file1,v"
- # OK, now put an extraneous '\0' at the end.
- ${AWK} </dev/null 'BEGIN { printf "@%c", 10 }' | ${TR} '@' '\000' \
- >>${CVSROOT_DIRNAME}/first-dir/file1,v
- dotest_fail rcs3-7 "${testcvs} log -s nostate file1" \
- "${PROG} \[log aborted\]: unexpected '.x0' reading revision number in RCS file ${CVSROOT_DIRNAME}/first-dir/file1,v"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- rcs4)
- # Fix a bug that shows up when checking out files by date with the
- # "-D date" command line option. There is code in the original to
- # handle a special case. If the date search finds revision 1.1 it
- # is supposed to check whether revision 1.1.1.1 has the same date
- # stamp, which would indicate that the file was originally brought
- # in with "cvs import". In that case it is supposed to return the
- # vendor branch version 1.1.1.1.
- #
- # However, there is a bug in the code. It actually compares
- # the date of revision 1.1 for equality with the date given
- # on the command line -- clearly wrong. This commit fixes
- # the coding bug.
- #
- # There is an additional bug which is _not_ fixed yet.
- # The date comparison should not be a strict
- # equality test. It should allow a fudge factor of, say, 2-3
- # seconds. Old versions of CVS created the two revisions
- # with two separate invocations of the RCS "ci" command. We
- # have many old files in the tree in which the dates of
- # revisions 1.1 and 1.1.1.1 differ by 1 second.
- mkdir rcs4
- cd rcs4
- mkdir imp-dir
- cd imp-dir
- echo 'OpenMunger sources' >file1
- # choose a time in the past to demonstrate the problem
- TZ=GMT touch -t 200012010123 file1
- dotest_sort rcs4-1 \
- "${testcvs} import -d -m add rcs4-dir openmunger openmunger-1_0" \
- '
- N rcs4-dir/file1
- No conflicts created by this import'
- echo 'OpenMunger sources release 1.1 extras' >>file1
- TZ=GMT touch -t 200112011234 file1
- dotest_sort rcs4-2 \
- "${testcvs} import -d -m add rcs4-dir openmunger openmunger-1_1" \
- '
- No conflicts created by this import
- U rcs4-dir/file1'
- cd ..
- # Next checkout the new module
- dotest rcs4-3 \
- "${testcvs} -q co rcs4-dir" \
- 'U rcs4-dir/file1'
- cd rcs4-dir
- echo 'local change' >> file1
- # commit a local change
- dotest rcs4-4 \
- "${testcvs} -q commit -m hack file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/rcs4-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- # now see if we get version 1.1 or 1.1.1.1 when we ask for
- # a checkout by time... it really should be 1.1.1.1 as
- # that was indeed the version that was visible at the target
- # time.
- dotest rcs4-5 \
- "${testcvs} -q update -D 'October 1, 2001 UTC' file1" \
- '[UP] file1'
- dotest rcs4-6 \
- "${testcvs} -q status file1" \
- '===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1\.1\.1.*
- Repository revision: 1\.1\.1\.1 '${CVSROOT_DIRNAME}'/rcs4-dir/file1,v
- Sticky Tag: (none)
- Sticky Date: 2001\.10\.01\.00\.00\.00
- Sticky Options: (none)'
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -r rcs4
- rm -rf ${CVSROOT_DIRNAME}/rcs4-dir
- ;;
- rcs5)
- # Some tests of the $Log keyword and log message without a trailing
- # EOL. This used to look ugly and, in the worst case, could cause
- # a seg fault due to a buffer overflow.
- #
- # Note that it should not be possible to create this situation via a
- # CVS server (and any client), since the server itself inserts the
- # trailing EOL onto log messages that are missing one. Still, we
- # shouldn't segfault due to a corrupt RCS file and I think that a log
- # message without the trailing EOL doesn't actually violate the RCS
- # spec, though it doesn't appear to be possible to create such a log
- # message using RCS 5.7.
- mkdir $CVSROOT_DIRNAME/rcs5
- cat <<\EOF >$CVSROOT_DIRNAME/rcs5/file1,v
- head 1.1;
- access;
- symbols;
- locks;
- expand kv;
- 1.1 date 2007.03.20.04.03.02; author jeremiah; state Ext; branches; next;
- desc
- @@
- 1.1
- log
- @he always had very fine wine@
- text
- @line1
- /*
- EOF
- echo ' * Revision history: $''Log$' >>$CVSROOT_DIRNAME/rcs5/file1,v
- cat <<\EOF >>$CVSROOT_DIRNAME/rcs5/file1,v
- */
- line5
- @
- EOF
- mkdir rcs5
- cd rcs5
- dotest rcs5-1 "$testcvs -Q co rcs5"
- dotest rcs5-2 "cat rcs5/file1" \
- "line1
- /\\*
- \\* Revision history: "'\$'"Log: file1,v "'\$'"
- \\* Revision history: Revision 1\.1 2007/03/20 04:03:02 jeremiah
- \\* Revision history: he always had very fine wine
- \\* Revision history:
- \\*/
- line5"
- cd ..
- rm -r rcs5
- rm -rf $CVSROOT_DIRNAME/rcs5
- ;;
- rcs6)
- # Test that CVS notices a specific type of corruption in the RCS
- # archive. In the past, this type of corruption had turned up after
- # a user ineptly attempted to delete a revision from an arcvhive
- # manually.
- mkdir rcs6; cd rcs6
- # Make the project.
- dotest rcs6-init-1 "$testcvs -Q co -ld top .; cd top"
- mkdir rcs6
- dotest rcs6-init-2 "$testcvs -Q add rcs6"
- cd rcs6
- # Populate it.
- echo some words >afile
- dotest rcs6-init-3 "$testcvs -Q add afile"
- dotest rcs6-init-4 "$testcvs -Q ci -mnewfile afile" \
- "RCS file: $CVSROOT_DIRNAME/rcs6/afile,v
- done
- Checking in afile;
- $CVSROOT_DIRNAME/rcs6/afile,v <-- afile
- initial revision: 1\.1
- done"
- echo more words >>afile
- dotest rcs6-init-5 "$testcvs -Q ci -mrev2 afile" \
- "Checking in afile;
- $CVSROOT_DIRNAME/rcs6/afile,v <-- afile
- new revision: 1\.2; previous revision: 1\.1
- done"
- # Corrupt the archive.
- sed -e '8,12d' \
- -e 's/^head 1\.2/head 1.1/' \
- <$CVSROOT_DIRNAME/rcs6/afile,v \
- >$CVSROOT_DIRNAME/rcs6/cfile,v
- # Update used to work.
- dotest_fail rcs6-1 "$testcvs -q up" \
- "$PROG \[update aborted\]: Expected head revision 1\.1, found 1\.2\."
- # Then a commit hosed the archive further without any warnings.
- # Updating to an old revision (e.g. 1.1) would have reported the
- # corruption. A second commit would have deleted data from the
- # file.
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../../..
- rm -r rcs6
- rm -rf $CVSROOT_DIRNAME/rcs6
- ;;
- lockfiles)
- # Tests of CVS lock files.
- # TODO-maybe: Add a test where we arrange for a loginfo
- # script (or some such) to ensure that locks are in place
- # so then we can see how they are behaving.
- mkdir 1; cd 1
- mkdir sdir
- mkdir sdir/ssdir
- echo file >sdir/ssdir/file1
- dotest lockfiles-1 \
- "${testcvs} -Q import -m import-it first-dir bar baz" ""
- cd ..
- mkdir 2; cd 2
- dotest lockfiles-2 "${testcvs} -q co first-dir" \
- "U first-dir/sdir/ssdir/file1"
- dotest lockfiles-3 "${testcvs} -Q co CVSROOT" ""
- cd CVSROOT
- echo "LockDir=${TESTDIR}/locks" >config
- dotest lockfiles-4 "${testcvs} -q ci -m config-it" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../first-dir/sdir/ssdir
- # The error message appears twice because Lock_Cleanup only
- # stops recursing after the first attempt.
- dotest_fail lockfiles-5 "${testcvs} -q update" \
- "${PROG} \[update aborted\]: cannot stat ${TESTDIR}/locks: No such file or directory
- ${PROG} \[update aborted\]: cannot stat ${TESTDIR}/locks: No such file or directory"
- mkdir ${TESTDIR}/locks
- # Grumble, mumble. Cygwin.
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod u=rwx,g=r,o= ${TESTDIR}/locks"
- else
- chmod u=rwx,g=r,o= ${TESTDIR}/locks
- fi
- umask 0077
- CVSUMASK=0077; export CVSUMASK
- dotest lockfiles-6 "${testcvs} -q update" ""
- # TODO: should also be testing that CVS continues to honor the
- # umask and CVSUMASK normally. In the case of the umask, CVS
- # doesn't seem to use it for much (although it perhaps should).
- dotest lockfiles-7 "ls ${TESTDIR}/locks/first-dir/sdir/ssdir" ""
- # The policy is that when CVS creates new lock directories, they
- # inherit the permissions from the parent directory. CVSUMASK
- # isn't right, because typically the reason for LockDir is to
- # use a different set of permissions.
- #
- # Bah! Cygwin!
- if test -n "$remotehost"; then
- dotest lockfiles-7a "$CVS_RSH $remotehost 'ls -ld ${TESTDIR}/locks/first-dir'" \
- "drwxr-----.*first-dir"
- dotest lockfiles-7b "$CVS_RSH $remotehost 'ls -ld ${TESTDIR}/locks/first-dir/sdir/ssdir'" \
- "drwxr-----.*first-dir/sdir/ssdir"
- else
- dotest lockfiles-7a "ls -ld ${TESTDIR}/locks/first-dir" \
- "drwxr-----.*first-dir"
- dotest lockfiles-7b "ls -ld ${TESTDIR}/locks/first-dir/sdir/ssdir" \
- "drwxr-----.*first-dir/sdir/ssdir"
- fi
- cd ../../..
- dotest lockfiles-8 "${testcvs} -q update" ""
- dotest lockfiles-9 "${testcvs} -q co -l ." ""
- ###
- ### There are race conditions in the following tests, but hopefully
- ### the 5 seconds the first process waits to remove the lockdir and
- ### the 30 seconds CVS waits betweens checks will be significant
- ### enough to render the case moot.
- ###
- # Considers the following cases:
- #
- # Lock Present
- # Operation Allowed (case #)
- #
- # Read Write
- # _______ ______
- # Read |Yes (1) No (3)
- # Write |No (7) No (9)
- #
- # Tests do not appear in same ordering as table. The odd numbering
- # scheme maintains correspondance with a larger table on 1.12.x:
- # 1. Read when read locks are present...
- # 3. Don't read when write locks present...
- # 7. Don't write when read locks are present...
- # 9. Don't write when write locks are present...
- # 3. Don't read when write locks present...
- mkdir "$TESTDIR/locks/first-dir/#cvs.lock"
- (sleep 5; rmdir "$TESTDIR/locks/first-dir/#cvs.lock")&
- dotest lockfiles-10 "$testcvs -q co -l first-dir" \
- "$PROG checkout: \[[0-9:]*\] waiting for $username's lock in $CVSROOT_DIRNAME/first-dir
- $PROG checkout: \[[0-9:]*\] obtained lock in $CVSROOT_DIRNAME/first-dir"
- # 1. Read when read locks are present...
- touch "$TESTDIR/locks/first-dir/#cvs.rfl.test.lock"
- dotest lockfiles-11 "$testcvs -q co -l first-dir"
- rm "$TESTDIR/locks/first-dir/#cvs.rfl.test.lock"
- # 7. Don't write when read locks are present...
- echo I always have trouble coming up with witty text for the test files >>first-dir/sdir/ssdir/file1
- touch "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.rfl.test.lock"
- (sleep 5; rm "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.rfl.test.lock")&
- dotest lockfiles-13 "$testcvs -q ci -mconflict first-dir" \
- "$PROG commit: \[[0-9:]*\] waiting for $username's lock in $CVSROOT_DIRNAME/first-dir/sdir/ssdir
- $PROG commit: \[[0-9:]*\] obtained lock in $CVSROOT_DIRNAME/first-dir/sdir/ssdir
- Checking in first-dir/sdir/ssdir/file1;
- $CVSROOT_DIRNAME/first-dir/sdir/ssdir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- # 9. Don't write when write locks are present...
- echo yet this poem would probably only give longfellow bile >>first-dir/sdir/ssdir/file1
- mkdir "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.lock"
- (sleep 5; rmdir "$TESTDIR/locks/first-dir/sdir/ssdir/#cvs.lock")&
- dotest lockfiles-19 "$testcvs -q ci -mnot-up-to-date first-dir" \
- "$PROG commit: \[[0-9:]*\] waiting for $username's lock in $CVSROOT_DIRNAME/first-dir/sdir/ssdir
- $PROG commit: \[[0-9:]*\] obtained lock in $CVSROOT_DIRNAME/first-dir/sdir/ssdir
- Checking in first-dir/sdir/ssdir/file1;
- $CVSROOT_DIRNAME/first-dir/sdir/ssdir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done"
- # 10. Don't write when history locks are present...
- echo have you ever heard a poem quite so vile\? >>first-dir/sdir/ssdir/file1
- mkdir "$TESTDIR/locks/CVSROOT/#cvs.history.lock"
- (sleep 5; rmdir "$TESTDIR/locks/CVSROOT/#cvs.history.lock")&
- dotest lockfiles-20 "$testcvs -q ci -mnot-up-to-date first-dir" \
- "Checking in first-dir/sdir/ssdir/file1;
- $CVSROOT_DIRNAME/first-dir/sdir/ssdir/file1,v <-- file1
- new revision: 1\.4; previous revision: 1\.3
- done
- $PROG commit: \[[0-9:]*\] waiting for $username's lock in $CVSROOT_DIRNAME/CVSROOT
- $PROG commit: \[[0-9:]*\] obtained lock in $CVSROOT_DIRNAME/CVSROOT"
- dotest lockfiles-21 "$testcvs -Q tag newtag first-dir"
- rm -f $CVSROOT_DIRNAME/CVSROOT/val-tags
- mkdir "$TESTDIR/locks/CVSROOT/#cvs.val-tags.lock"
- (sleep 5; rmdir "$TESTDIR/locks/CVSROOT/#cvs.val-tags.lock")&
- dotest lockfiles-22 "$testcvs -q up -r newtag first-dir" \
- "$PROG update: \[[0-9:]*\] waiting for $username's lock in $CVSROOT_DIRNAME/CVSROOT
- $PROG update: \[[0-9:]*\] obtained lock in $CVSROOT_DIRNAME/CVSROOT
- [UP] first-dir/sdir/ssdir/file1"
- cd CVSROOT
- echo "# nobody here but us comments" >config
- dotest lockfiles-cleanup-1 "${testcvs} -q ci -m config-it" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../..
- # Perhaps should restore the umask and CVSUMASK to what they
- # were before. But the other tests "should" not care about them...
- umask 0077
- unset CVSUMASK
- rm -r ${TESTDIR}/locks
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- backuprecover)
- # Tests to make sure we get the expected behavior
- # when we recover a repository from an old backup
- #
- # Details:
- # Backup will be older than some developer's workspaces
- # This means the first attempt at an update will fail
- # The workaround for this is to replace the CVS
- # directories with those from a "new" checkout from
- # the recovered repository. Due to this, multiple
- # merges should cause conflicts (the same data
- # will be merged more than once).
- # A workspace updated before the date of the recovered
- # copy will not need any extra attention
- #
- # Note that backuprecover-15 is probably a failure case
- # If nobody else had a more recent update, the data would be lost
- # permanently
- # Granted, the developer should have been notified not to do this
- # by now, but still...
- #
- mkdir backuprecover; cd backuprecover
- mkdir 1; cd 1
- dotest backuprecover-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest backuprecover-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- mkdir dir
- dotest backuprecover-3 "${testcvs} add dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir added to the repository"
- touch file1 dir/file2
- dotest backuprecover-4 "${testcvs} -q add file1 dir/file2" \
- "${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest backuprecover-5 "${testcvs} -q ci -mtest" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir/file2,v
- done
- Checking in dir/file2;
- ${CVSROOT_DIRNAME}/first-dir/dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- echo "Line one" >>file1
- echo " is the place" >>file1
- echo " we like to begin" >>file1
- echo "Anything else" >>file1
- echo " looks like" >>file1
- echo " a sin" >>file1
- echo "File 2" >>dir/file2
- echo " is the place" >>dir/file2
- echo " the rest of it goes" >>dir/file2
- echo "Why I don't use" >>dir/file2
- echo " something like 'foo'" >>dir/file2
- echo " God only knows" >>dir/file2
- dotest backuprecover-6 "${testcvs} -q ci -mtest" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done
- Checking in dir/file2;
- ${CVSROOT_DIRNAME}/first-dir/dir/file2,v <-- file2
- new revision: 1\.2; previous revision: 1\.1
- done"
- # Simulate the lazy developer
- # (he did some work but didn't check it in...)
- cd ../..
- mkdir 2; cd 2
- dotest backuprecover-7 "${testcvs} -Q co first-dir" ''
- cd first-dir
- sed -e "s/looks like/just looks like/" file1 >tmp; mv tmp file1
- sed -e "s/don't use/don't just use/" dir/file2 >tmp; mv tmp dir/file2
- # developer 1 is on a roll
- cd ../../1/first-dir
- echo "I need some more words" >>file1
- echo " to fill up this space" >>file1
- echo " anything else would be a disgrace" >>file1
- echo "My rhymes cross many boundries" >>dir/file2
- echo " this time it's files" >>dir/file2
- echo " a word that fits here would be something like dials" >>dir/file2
- dotest backuprecover-8 "${testcvs} -q ci -mtest" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done
- Checking in dir/file2;
- ${CVSROOT_DIRNAME}/first-dir/dir/file2,v <-- file2
- new revision: 1\.3; previous revision: 1\.2
- done"
- # Save a backup copy
- cp -r ${CVSROOT_DIRNAME}/first-dir ${CVSROOT_DIRNAME}/backup
- # Simulate developer 3
- cd ../..
- mkdir 3; cd 3
- dotest backuprecover-9a "${testcvs} -Q co first-dir" ''
- cd first-dir
- echo >>file1
- echo >>dir/file2
- echo "Developer 1 makes very lame rhymes" >>file1
- echo " I think he should quit and become a mime" >>file1
- echo "What the %*^# kind of rhyme crosses a boundry?" >>dir/file2
- echo " I think you should quit and get a job in the foundry" >>dir/file2
- dotest backuprecover-9b "${testcvs} -q ci -mtest" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.4; previous revision: 1\.3
- done
- Checking in dir/file2;
- ${CVSROOT_DIRNAME}/first-dir/dir/file2,v <-- file2
- new revision: 1\.4; previous revision: 1\.3
- done"
- # Developer 4 so we can simulate a conflict later...
- cd ../..
- mkdir 4; cd 4
- dotest backuprecover-10 "${testcvs} -Q co first-dir" ''
- cd first-dir
- sed -e "s/quit and/be fired so he can/" dir/file2 >tmp; mv tmp dir/file2
- # And back to developer 1
- cd ../../1/first-dir
- dotest backuprecover-11 "${testcvs} -Q update" ''
- echo >>file1
- echo >>dir/file2
- echo "Oh yeah, well rhyme this" >>file1
- echo " developer three" >>file1
- echo " you want opposition" >>file1
- echo " you found some in me!" >>file1
- echo "I'll give you mimes" >>dir/file2
- echo " and foundries galore!" >>dir/file2
- echo " your head will spin" >>dir/file2
- echo " once you find what's in store!" >>dir/file2
- dotest backuprecover-12 "${testcvs} -q ci -mtest" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.5; previous revision: 1\.4
- done
- Checking in dir/file2;
- ${CVSROOT_DIRNAME}/first-dir/dir/file2,v <-- file2
- new revision: 1\.5; previous revision: 1\.4
- done"
- # developer 3'll do a bit of work that never gets checked in
- cd ../../3/first-dir
- dotest backuprecover-13 "${testcvs} -Q update" ''
- sed -e "s/very/some extremely/" file1 >tmp; mv tmp file1
- dotest backuprecover-14 "${testcvs} -q ci -mtest" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.6; previous revision: 1\.5
- done"
- echo >>file1
- echo "Tee hee hee hee" >>file1
- echo >>dir/file2
- echo "Find what's in store?" >>dir/file2
- echo " Oh, I'm so sure!" >>dir/file2
- echo " You've got an ill, and I have the cure!" >>dir/file2
- # Slag the original and restore it a few revisions back
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- mv ${CVSROOT_DIRNAME}/backup ${CVSROOT_DIRNAME}/first-dir
- # Have developer 1 try an update and lose some data
- #
- # Feel free to imagine the horrific scream of despair
- cd ../../1/first-dir
- dotest backuprecover-15 "${testcvs} update" \
- "${PROG} update: Updating .
- U file1
- ${PROG} update: Updating dir
- U dir/file2"
- # Developer 3 tries the same thing (he has an office)
- # but fails without losing data since all of his files have
- # uncommitted changes
- cd ../../3/first-dir
- dotest_fail backuprecover-16 "${testcvs} update" \
- "${PROG} update: Updating \.
- ${PROG} \[update aborted\]: could not find desired version 1\.6 in ${CVSROOT_DIRNAME}/first-dir/file1,v"
- # create our workspace fixin' script
- cd ../..
- echo \
- "#!/bin/sh
- # This script will copy the CVS database dirs from the checked out
- # version of a newly recovered repository and replace the CVS
- # database dirs in a workspace with later revisions than those in the
- # recovered repository
- cd repos-first-dir
- DATADIRS=\`find . -name CVS -print\`
- cd ../first-dir
- find . -name CVS -print | xargs rm -rf
- for file in \${DATADIRS}; do
- cp -r ../repos-first-dir/\${file} \${file}
- done" >fixit
- # We only need to fix the workspaces of developers 3 and 4
- # (1 lost all her data and 2 has an update date from
- # before the date the backup was made)
- cd 3
- dotest backuprecover-17 \
- "${testcvs} -Q co -d repos-first-dir first-dir" ''
- cd ../4
- dotest backuprecover-18 \
- "${testcvs} -Q co -d repos-first-dir first-dir" ''
- sh ../fixit
- cd ../3; sh ../fixit
- # (re)commit developer 3's stuff
- cd first-dir
- dotest backuprecover-19 "${testcvs} -q ci -mrecover/merge" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.4; previous revision: 1\.3
- done
- Checking in dir/file2;
- ${CVSROOT_DIRNAME}/first-dir/dir/file2,v <-- file2
- new revision: 1\.4; previous revision: 1\.3
- done"
- # and we should get a conflict on developer 4's stuff
- cd ../../4/first-dir
- dotest backuprecover-20 "${testcvs} update" \
- "${PROG} update: Updating \.
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.3
- retrieving revision 1\.4
- Merging differences between 1\.3 and 1\.4 into file1
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in file1
- C file1
- ${PROG} update: Updating dir
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir/file2,v
- retrieving revision 1\.3
- retrieving revision 1\.4
- Merging differences between 1\.3 and 1\.4 into file2
- rcsmerge: warning: conflicts during merge
- ${PROG} update: conflicts found in dir/file2
- C dir/file2"
- sed -e \
- "/^<<<<<<</,/^=======/d
- /^>>>>>>>/d" file1 >tmp; mv tmp file1
- sed -e \
- "/^<<<<<<</,/^=======/d
- /^>>>>>>>/d
- s/quit and/be fired so he can/" dir/file2 >tmp; mv tmp dir/file2
- dotest backuprecover-21 "${testcvs} -q ci -mrecover/merge" \
- "Checking in dir/file2;
- ${CVSROOT_DIRNAME}/first-dir/dir/file2,v <-- file2
- new revision: 1\.5; previous revision: 1\.4
- done"
- # go back and commit developer 2's stuff to prove it can still be done
- cd ../../2/first-dir
- dotest backuprecover-22 "${testcvs} -Q update" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.2
- retrieving revision 1\.4
- Merging differences between 1\.2 and 1\.4 into file1
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dir/file2,v
- retrieving revision 1\.2
- retrieving revision 1\.5
- Merging differences between 1\.2 and 1\.5 into file2"
- dotest backuprecover-23 "${testcvs} -q ci -mtest" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.5; previous revision: 1\.4
- done
- Checking in dir/file2;
- ${CVSROOT_DIRNAME}/first-dir/dir/file2,v <-- file2
- new revision: 1\.6; previous revision: 1\.5
- done"
- # and restore the data to developer 1
- cd ../../1/first-dir
- dotest backuprecover-24 "${testcvs} -Q update" ''
- cd ../../..
- rm -r backuprecover
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- sshstdio)
- # CVS_RSH=ssh can have a problem with a non-blocking stdio
- # in some cases. So, this test is all about testing :ext:
- # with CVS_RSH=ssh. The problem is that not all machines
- # will necessarily have ssh available, so be prepared to
- # skip this test.
- # Are we able to run find and use an ssh?
- if $remote; then :; else
- continue
- fi
- depends_on_ssh
- if test $? -eq 77; then
- skip sshstdio "$skipreason"
- continue
- fi
- SSHSTDIO_ROOT=:ext:$host$CVSROOT_DIRNAME
- mkdir sshstdio; cd sshstdio
- dotest sshstdio-1 "$testcvs -d $SSHSTDIO_ROOT -q co -l ."
- mkdir first-dir
- dotest sshstdio-2 "$testcvs add first-dir" \
- "Directory $CVSROOT_DIRNAME/first-dir added to the repository"
- cd first-dir
- a='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
- c='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
- # Generate 1024 lines of $a
- cnt=0
- echo $a > aaa
- while [ $cnt -lt 5 ] ; do
- cnt=`expr $cnt + 1` ;
- mv aaa aaa.old
- cat aaa.old aaa.old aaa.old aaa.old > aaa
- done
- dotest sshstdio-3 "$testcvs -q add aaa" \
- "$PROG add: use .$PROG commit. to add this file permanently"
- dotest sshstdio-4 "$testcvs -q ci -mcreate aaa" \
- "RCS file: $CVSROOT_DIRNAME/first-dir/aaa,v
- done
- Checking in aaa;
- $CVSROOT_DIRNAME/first-dir/aaa,v <-- aaa
- initial revision: 1\.1
- done"
- # replace lines 1, 512, 513, 1024 with $c
- sed 510q < aaa > aaa.old
- (echo $c; cat aaa.old; echo $c; \
- echo $c; cat aaa.old; echo $c) > aaa
- dotest sshstdio-5 "$testcvs -q ci -mmodify-it aaa" \
- "Checking in aaa;
- $CVSROOT_DIRNAME/first-dir/aaa,v <-- aaa
- new revision: 1\.2; previous revision: 1\.1
- done"
- cat > wrapper.sh <<EOF
- #!$TESTSHELL
- exec "\$@" 2>&1 < /dev/null | cat
- EOF
- chmod +x wrapper.sh
- ./wrapper.sh \
- $testcvs -z5 -Q diff --side-by-side -W 500 -r 1.1 -r 1.2 \
- aaa \
- |sed -e \
- '/^Write failed flushing stdout buffer\.
$/d;
- /^write stdout: Broken pipe
$/d;
- :retry;
- /Write failed flushing stdout buffer\.
$/{
- N;
- s/Write failed flushing stdout buffer\.
\n//;
- b retry;
- }
- /write stdout: Broken pipe
$/{
- N;
- s/write stdout: Broken pipe
\n//;
- b retry;
- }' \
- > wrapper.dif
-
- $testcvs -z5 -Q diff --side-by-side -W 500 -r 1.1 -r 1.2 \
- aaa > good.dif
-
- dotest sshstdio-6 "cmp wrapper.dif good.dif"
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
-
- cd ../..
- CVS_RSH=$save_CVS_RSH; export CVS_RSH
- rm -r sshstdio
- rm -rf $CVSROOT_DIRNAME/first-dir
- ;;
- parseroot2)
- # Test some :ext: roots for consistancy.
- if $remote; then :; else
- continue
- fi
- depends_on_rsh "$CVS_RSH"
- if test $? -eq 77; then
- skip parseroot2 "$skipreason"
- continue
- fi
- # Test checking out and subsequently updating with some different
- # CVSROOTs.
- # A standard case, hostname:dirname.
- mkdir parseroot2; cd parseroot2
- save_CVSROOT=$CVSROOT
- CVSROOT=$host:$CVSROOT_DIRNAME
- dotest parseroot2-1 "$testcvs -Q co CVSROOT"
- cd CVSROOT
- dotest parseroot2-2 "$testcvs -Q up"
- cd ..
- # A degenerate remote case, just the server name and the directory
- # name, with no :'s to help parsing. It can be mistaken for a
- # relative directory name.
- rm -r CVSROOT
- CVSROOT=$host$CVSROOT_DIRNAME
- dotest parseroot2-3 "$testcvs -Q co CVSROOT"
- cd CVSROOT
- dotest parseroot2-4 "$testcvs -Q up"
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
-
- cd ../..
- CVSROOT=$save_CVSROOT
- rm -r parseroot2
- ;;
- history)
- # CVSROOT/history tests:
- # history: various "cvs history" invocations
- # basic2: Generating the CVSROOT/history file via CVS commands.
- # Put in some data for the history file (discarding what was
- # there before). Note that this file format is fixed; the
- # user may wish to analyze data from a previous version of
- # CVS. If we phase out this format, it should be done
- # slowly and carefully.
- cat >${CVSROOT_DIRNAME}/CVSROOT/history <<EOF
- O3395c677|anonymous|<remote>/*0|ccvs||ccvs
- O3396c677|anonymous|<remote>/src|ccvs||src
- O3397c677|kingdon|<remote>/*0|ccvs||ccvs
- M339cafae|nk|<remote>|ccvs/src|1.229|sanity.sh
- M339cafff|anonymous|<remote>|ccvs/src|1.23|Makefile
- M339dc339|kingdon|~/work/*0|ccvs/src|1.231|sanity.sh
- W33a6eada|anonymous|<remote>*4|ccvs/emx||Makefile.in
- C3b235f50|kingdon|<remote>|ccvs/emx|1.3|README
- M3b23af50|kingdon|~/work/*0|ccvs/doc|1.281|cvs.texinfo
- EOF
- dotest history-1 "${testcvs} history -e -a" \
- "O 1997-06-04 19:48 ${PLUS}0000 anonymous ccvs =ccvs= <remote>/\*
- O 1997-06-05 14:00 ${PLUS}0000 anonymous ccvs =src= <remote>/\*
- M 1997-06-10 01:38 ${PLUS}0000 anonymous 1\.23 Makefile ccvs/src == <remote>
- W 1997-06-17 19:51 ${PLUS}0000 anonymous Makefile\.in ccvs/emx == <remote>/emx
- O 1997-06-06 08:12 ${PLUS}0000 kingdon ccvs =ccvs= <remote>/\*
- M 1997-06-10 21:12 ${PLUS}0000 kingdon 1\.231 sanity\.sh ccvs/src == ~/work/ccvs/src
- C 2001-06-10 11:51 ${PLUS}0000 kingdon 1\.3 README ccvs/emx == <remote>
- M 2001-06-10 17:33 ${PLUS}0000 kingdon 1\.281 cvs\.texinfo ccvs/doc == ~/work/ccvs/doc
- M 1997-06-10 01:36 ${PLUS}0000 nk 1\.229 sanity\.sh ccvs/src == <remote>"
- dotest history-2 "${testcvs} history -e -a -D '10 Jun 1997 13:00 UT'" \
- "W 1997-06-17 19:51 ${PLUS}0000 anonymous Makefile\.in ccvs/emx == <remote>/emx
- M 1997-06-10 21:12 ${PLUS}0000 kingdon 1\.231 sanity\.sh ccvs/src == ~/work/ccvs/src
- C 2001-06-10 11:51 ${PLUS}0000 kingdon 1\.3 README ccvs/emx == <remote>
- M 2001-06-10 17:33 ${PLUS}0000 kingdon 1\.281 cvs\.texinfo ccvs/doc == ~/work/ccvs/doc"
- dotest history-3 "${testcvs} history -e -a -D '10 Jun 2001 13:00 UT'" \
- "M 2001-06-10 17:33 ${PLUS}0000 kingdon 1\.281 cvs\.texinfo ccvs/doc == ~/work/ccvs/doc"
- dotest history-4 "${testcvs} history -ac sanity.sh" \
- "M 1997-06-10 21:12 ${PLUS}0000 kingdon 1\.231 sanity\.sh ccvs/src == ~/work/ccvs/src
- M 1997-06-10 01:36 ${PLUS}0000 nk 1\.229 sanity\.sh ccvs/src == <remote>"
- dotest history-5 "${testcvs} history -a -xCGUWAMR README sanity.sh" \
- "M 1997-06-10 21:12 ${PLUS}0000 kingdon 1\.231 sanity\.sh ccvs/src == ~/work/ccvs/src
- C 2001-06-10 11:51 ${PLUS}0000 kingdon 1\.3 README ccvs/emx == <remote>
- M 1997-06-10 01:36 ${PLUS}0000 nk 1\.229 sanity\.sh ccvs/src == <remote>"
- dotest history-6 "${testcvs} history -xCGUWAMR -a -f README -f sanity.sh" \
- "M 1997-06-10 21:12 ${PLUS}0000 kingdon 1\.231 sanity\.sh ccvs/src == ~/work/ccvs/src
- C 2001-06-10 11:51 ${PLUS}0000 kingdon 1\.3 README ccvs/emx == <remote>
- M 1997-06-10 01:36 ${PLUS}0000 nk 1\.229 sanity\.sh ccvs/src == <remote>"
- dotest history-7 "${testcvs} history -xCGUWAMR -a -f sanity.sh README" \
- "M 1997-06-10 21:12 ${PLUS}0000 kingdon 1\.231 sanity\.sh ccvs/src == ~/work/ccvs/src
- C 2001-06-10 11:51 ${PLUS}0000 kingdon 1\.3 README ccvs/emx == <remote>
- M 1997-06-10 01:36 ${PLUS}0000 nk 1\.229 sanity\.sh ccvs/src == <remote>"
- dotest history-8 "${testcvs} history -ca -D '1970-01-01 00:00 UT'" \
- "M 1997-06-10 01:36 ${PLUS}0000 nk 1\.229 sanity.sh ccvs/src == <remote>
- M 1997-06-10 01:38 ${PLUS}0000 anonymous 1\.23 Makefile ccvs/src == <remote>
- M 1997-06-10 21:12 ${PLUS}0000 kingdon 1\.231 sanity.sh ccvs/src == ~/work/ccvs/src
- M 2001-06-10 17:33 ${PLUS}0000 kingdon 1\.281 cvs.texinfo ccvs/doc == ~/work/ccvs/doc"
- dotest history-9 "${testcvs} history -acl" \
- "M 2001-06-10 17:33 ${PLUS}0000 kingdon 1\.281 cvs.texinfo ccvs/doc == ~/work/ccvs/doc
- M 1997-06-10 01:38 ${PLUS}0000 anonymous 1\.23 Makefile ccvs/src == <remote>
- M 1997-06-10 21:12 ${PLUS}0000 kingdon 1\.231 sanity.sh ccvs/src == ~/work/ccvs/src"
- dotest history-10 "${testcvs} history -lca -D '1970-01-01 00:00 UT'" \
- "M 2001-06-10 17:33 ${PLUS}0000 kingdon 1\.281 cvs.texinfo ccvs/doc == ~/work/ccvs/doc
- M 1997-06-10 01:38 ${PLUS}0000 anonymous 1\.23 Makefile ccvs/src == <remote>
- M 1997-06-10 21:12 ${PLUS}0000 kingdon 1\.231 sanity.sh ccvs/src == ~/work/ccvs/src"
- dotest history-11 "${testcvs} history -aw" \
- "O 1997-06-04 19:48 ${PLUS}0000 anonymous ccvs =ccvs= <remote>/\*
- O 1997-06-05 14:00 ${PLUS}0000 anonymous ccvs =src= <remote>/\*
- O 1997-06-06 08:12 ${PLUS}0000 kingdon ccvs =ccvs= <remote>/\*"
- dotest history-12 "${testcvs} history -aw -D'1970-01-01 00:00 UT'" \
- "O 1997-06-04 19:48 ${PLUS}0000 anonymous ccvs =ccvs= <remote>/\*
- O 1997-06-05 14:00 ${PLUS}0000 anonymous ccvs =src= <remote>/\*
- O 1997-06-06 08:12 ${PLUS}0000 kingdon ccvs =ccvs= <remote>/\*"
- ;;
- big)
- # Test ability to operate on big files. Intention is to
- # test various realloc'ing code in RCS_deltas, rcsgetkey,
- # etc. "big" is currently defined to be 1000 lines (64000
- # bytes), which in terms of files that users will use is not
- # large, merely average, but my reasoning is that this
- # should be big enough to make sure realloc'ing is going on
- # and that raising it a lot would start to stress resources
- # on machines which run the tests, without any significant
- # benefit.
- mkdir ${CVSROOT_DIRNAME}/first-dir
- dotest big-1 "${testcvs} -q co first-dir" ''
- cd first-dir
- for i in 0 1 2 3 4 5 6 7 8 9; do
- for j in 0 1 2 3 4 5 6 7 8 9; do
- for k in 0 1 2 3 4 5 6 7 8 9; do
- echo \
- "This is line ($i,$j,$k) which goes into the file file1 for testing" >>file1
- done
- done
- done
- dotest big-2 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest big-3 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- cd ..
- mkdir 2
- cd 2
- dotest big-4 "${testcvs} -q get first-dir" "U first-dir/file1"
- cd ../first-dir
- echo "add a line to the end" >>file1
- dotest big-5 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- cd ../2/first-dir
- # The idea here is particularly to test the Rcs-diff response
- # and the reallocing thereof, for remote.
- dotest big-6 "${testcvs} -q update" "[UP] file1"
- cd ../..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -r first-dir 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- modes)
- # Test repository permissions (CVSUMASK and so on).
- # Although the tests in this section "cheat" by testing
- # repository permissions, which are sort of not a user-visible
- # sort of thing, the modes do have user-visible consequences,
- # such as whether a second user can check out the files. But
- # it would be awkward to test the consequences, so we don't.
- # Solaris /bin/sh doesn't support export -n. I'm not sure
- # what we can do about this, other than hope that whoever
- # is running the tests doesn't have CVSUMASK set.
- #export -n CVSUMASK # if unset, defaults to 002
- umask 077
- mkdir 1; cd 1
- dotest modes-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest modes-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch aa
- dotest modes-3 "${testcvs} add aa" \
- "${PROG} add: scheduling file .aa. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest modes-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aa,v
- done
- Checking in aa;
- ${CVSROOT_DIRNAME}/first-dir/aa,v <-- aa
- initial revision: 1\.1
- done"
- # Yawn. Cygwin.
- if test -n "$remotehost"; then
- dotest modes-5remotehost "$CVS_RSH $remotehost 'ls -l ${CVSROOT_DIRNAME}/first-dir/aa,v'" \
- "-r--r--r-- .*"
- else
- dotest modes-5 "ls -l ${CVSROOT_DIRNAME}/first-dir/aa,v" \
- "-r--r--r-- .*"
- fi
- # Test for whether we can set the execute bit.
- chmod +x aa
- echo change it >>aa
- dotest modes-6 "${testcvs} -q ci -m set-execute-bit" \
- "Checking in aa;
- ${CVSROOT_DIRNAME}/first-dir/aa,v <-- aa
- new revision: 1\.2; previous revision: 1\.1
- done"
- # If CVS let us update the execute bit, it would be set here.
- # But it doesn't, and as far as I know that is longstanding
- # CVS behavior.
- #
- # Yeah, yeah. Search for "Cygwin".
- if test -n "$remotehost"; then
- dotest modes-7remotehost "$CVS_RSH $remotehost 'ls -l ${CVSROOT_DIRNAME}/first-dir/aa,v'" \
- "-r--r--r-- .*"
- else
- dotest modes-7 "ls -l ${CVSROOT_DIRNAME}/first-dir/aa,v" \
- "-r--r--r-- .*"
- fi
- # OK, now manually change the modes and see what happens.
- #
- # Cygwin, already.
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod g=r,o= ${CVSROOT_DIRNAME}/first-dir/aa,v"
- else
- chmod g=r,o= ${CVSROOT_DIRNAME}/first-dir/aa,v
- fi
- echo second line >>aa
- dotest modes-7a "${testcvs} -q ci -m set-execute-bit" \
- "Checking in aa;
- ${CVSROOT_DIRNAME}/first-dir/aa,v <-- aa
- new revision: 1\.3; previous revision: 1\.2
- done"
- # Cygwin.
- if test -n "$remotehost"; then
- dotest modes-7bremotehost "$CVS_RSH $remotehost 'ls -l ${CVSROOT_DIRNAME}/first-dir/aa,v'" \
- "-r--r----- .*"
- else
- dotest modes-7b "ls -l ${CVSROOT_DIRNAME}/first-dir/aa,v" \
- "-r--r----- .*"
- fi
- CVSUMASK=007
- export CVSUMASK
- touch ab
- # Might as well test the execute bit too.
- chmod +x ab
- dotest modes-8 "${testcvs} add ab" \
- "${PROG} add: scheduling file .ab. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest modes-9 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/ab,v
- done
- Checking in ab;
- ${CVSROOT_DIRNAME}/first-dir/ab,v <-- ab
- initial revision: 1\.1
- done"
- if $remote; then
- # The problem here is that the CVSUMASK environment variable
- # needs to be set on the server (e.g. .bashrc). This is, of
- # course, bogus, but that is the way it is currently.
- if test -n "$remotehost"; then
- dotest modes-10remotehost "$CVS_RSH $remotehost 'ls -l ${CVSROOT_DIRNAME}/first-dir/ab,v'" \
- "-r--r--r--.*"
- else
- dotest modes-10r "ls -l ${CVSROOT_DIRNAME}/first-dir/ab,v" \
- "-r-xr-x---.*" "-r-xr-xr-x.*"
- fi
- else
- dotest modes-10 "ls -l ${CVSROOT_DIRNAME}/first-dir/ab,v" \
- "-r-xr-x---.*"
- fi
- # OK, now add a file on a branch. Check that the mode gets
- # set the same way (it is a different code path in CVS).
- dotest modes-11 "${testcvs} -q tag -b br" 'T aa
- T ab'
- dotest modes-12 "$testcvs -q update -r br" \
- '[UP] aa
- U ab'
- touch ac
- dotest modes-13 "${testcvs} add ac" \
- "${PROG} add: scheduling file .ac. for addition on branch .br.
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- # Not sure it really makes sense to refer to a "previous revision"
- # when we are just now adding the file; as far as I know
- # that is longstanding CVS behavior, for what it's worth.
- dotest modes-14 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/ac,v
- done
- Checking in ac;
- ${CVSROOT_DIRNAME}/first-dir/Attic/ac,v <-- ac
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- if $remote; then
- # The problem here is that the CVSUMASK environment variable
- # needs to be set on the server (e.g. .bashrc). This is, of
- # course, bogus, but that is the way it is currently. The
- # first match is for the :ext: method (where the CVSUMASK
- # won't be set), while the second is for the :fork: method
- # (where it will be).
- if test -n "$remotehost"; then
- dotest modes-15r \
- "$CVS_RSH $remotehost 'ls -l ${CVSROOT_DIRNAME}/first-dir/Attic/ac,v'" \
- "-r--r--r--.*"
- else
- dotest modes-15r \
- "ls -l ${CVSROOT_DIRNAME}/first-dir/Attic/ac,v" \
- "-r--r--r--.*" "-r--r-----.*"
- fi
- else
- dotest modes-15 \
- "ls -l ${CVSROOT_DIRNAME}/first-dir/Attic/ac,v" \
- "-r--r-----.*"
- fi
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- # Perhaps should restore the umask and CVSUMASK. But the other
- # tests "should" not care about them...
- ;;
- modes2)
- # More tests of file permissions in the working directory
- # and that sort of thing.
- # The usual setup, file first-dir/aa with two revisions.
- mkdir 1; cd 1
- dotest modes2-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest modes2-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch aa
- dotest modes2-3 "${testcvs} add aa" \
- "${PROG} add: scheduling file .aa. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest modes2-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aa,v
- done
- Checking in aa;
- ${CVSROOT_DIRNAME}/first-dir/aa,v <-- aa
- initial revision: 1\.1
- done"
- echo "more money" >> aa
- dotest modes2-5 "${testcvs} -q ci -m add" \
- "Checking in aa;
- ${CVSROOT_DIRNAME}/first-dir/aa,v <-- aa
- new revision: 1\.2; previous revision: 1\.1
- done"
- # OK, here is the test. The idea is to see what
- # No_Difference does if it can't open the file.
- # If we don't change the st_mtime, CVS doesn't even try to read
- # the file. Note that some versions of "touch" require that we
- # do this while the file is still writable.
- touch aa
- chmod a= aa
- # Don't try this when permissions are broken, as with Cygwin.
- if ls ${CVSROOT_DIRNAME}/first-dir >/dev/null 2>&1; then :; else
- dotest_fail modes2-6 "${testcvs} -q update -r 1.1 aa" \
- "${PROG} \[update aborted\]: cannot open file aa for comparing: Permission denied" \
- "${PROG} \[update aborted\]: reading aa: Permission denied"
- fi
- chmod u+rwx aa
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- modes3)
- # Repository permissions. Particularly, what happens if we
- # can't read/write in the repository.
- # TODO: the case where we can access the repository, just not
- # the attic (may that one can remain a fatal error, seems less
- # useful for access control).
- mkdir 1; cd 1
- dotest modes3-1 "${testcvs} -q co -l ." ''
- mkdir first-dir second-dir
- dotest modes3-2 "${testcvs} add first-dir second-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository
- Directory ${CVSROOT_DIRNAME}/second-dir added to the repository"
- touch first-dir/aa second-dir/ab
- dotest modes3-3 "${testcvs} add first-dir/aa second-dir/ab" \
- "${PROG} add: scheduling file .first-dir/aa. for addition
- ${PROG} add: scheduling file .second-dir/ab. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest modes3-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aa,v
- done
- Checking in first-dir/aa;
- ${CVSROOT_DIRNAME}/first-dir/aa,v <-- aa
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/second-dir/ab,v
- done
- Checking in second-dir/ab;
- ${CVSROOT_DIRNAME}/second-dir/ab,v <-- ab
- initial revision: 1\.1
- done"
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod a= ${CVSROOT_DIRNAME}/first-dir"
- else
- chmod a= ${CVSROOT_DIRNAME}/first-dir
- fi
- if ls ${CVSROOT_DIRNAME}/first-dir >/dev/null 2>&1; then
- # Avoid this test under Cygwin since permissions work differently
- # there.
- #
- # This test also gets avoided under Mac OS X since the system `ls'
- # is broken and exits with a 0 status despite the permission
- # denied error.
- if test -n "$remotehost"; then
- cygwin_hack=false
- else
- cygwin_hack=:
- fi
- else
- cygwin_hack=false
- fi
- cd $TESTDIR/1
- if $cygwin_hack; then :; else
- dotest modes3-5 "${testcvs} update" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating first-dir
- ${PROG} update: cannot open directory ${CVSROOT_DIRNAME}/first-dir: Permission denied
- ${PROG} update: skipping directory first-dir
- ${PROG} update: Updating second-dir"
- fi
- # OK, I can see why one might say the above case could be a
- # fatal error, because normally users without access to first-dir
- # won't have it in their working directory. But the next
- # one is more of a problem if it is fatal.
- #
- # The second text string below is for Cygwin again, and again it
- # should really be XFAIL under Cygwin, but for now deal with the
- # passing opendir by accepting the alternate string.
- rm -r first-dir
- dotest modes3-6 "${testcvs} update -dP" \
- "${PROG} update: Updating .
- ${PROG} update: Updating CVSROOT
- U ${DOTSTAR}
- ${PROG} update: Updating first-dir
- ${PROG} update: cannot open directory ${CVSROOT_DIRNAME}/first-dir: Permission denied
- ${PROG} update: skipping directory first-dir
- ${PROG} update: Updating second-dir" \
- "${PROG} update: Updating .
- ${PROG} update: Updating CVSROOT
- U ${DOTSTAR}
- ${PROG} update: Updating first-dir
- ${PROG} update: Updating second-dir"
- cd ..
- rm -r 1
- chmod u+rwx ${CVSROOT_DIRNAME}/first-dir
- rm -rf ${CVSROOT_DIRNAME}/first-dir ${CVSROOT_DIRNAME}/second-dir
- ;;
- stamps)
- # Test timestamps.
- mkdir 1; cd 1
- dotest stamps-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest stamps-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch aa
- echo '$''Id$' >kw
- # Cygwin, *cough*, puts the year in the time column until the minute
- # is no longer the current minute. Sleep 60 seconds to avoid this
- # problem.
- sleep 60
- ls -l aa >${TESTDIR}/1/stamp.aa.touch
- ls -l kw >${TESTDIR}/1/stamp.kw.touch
- # "sleep 1" would suffice if we could assume ls --full-time, but
- # that is as far as I know unique to GNU ls. Is there some POSIX.2
- # way to get the timestamp of a file, including the seconds?
- sleep 60
- dotest stamps-3 "${testcvs} add aa kw" \
- "${PROG} add: scheduling file .aa. for addition
- ${PROG} add: scheduling file .kw. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- ls -l aa >${TESTDIR}/1/stamp.aa.add
- ls -l kw >${TESTDIR}/1/stamp.kw.add
- # "cvs add" should not muck with the timestamp.
- dotest stamps-4aa \
- "cmp ${TESTDIR}/1/stamp.aa.touch ${TESTDIR}/1/stamp.aa.add" ''
- dotest stamps-4kw \
- "cmp ${TESTDIR}/1/stamp.kw.touch ${TESTDIR}/1/stamp.kw.add" ''
- sleep 60
- dotest stamps-5 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aa,v
- done
- Checking in aa;
- ${CVSROOT_DIRNAME}/first-dir/aa,v <-- aa
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/kw,v
- done
- Checking in kw;
- ${CVSROOT_DIRNAME}/first-dir/kw,v <-- kw
- initial revision: 1\.1
- done"
- # Cygwin, *cough*, puts the year in the time column until the minute
- # is no longer the current minute. Sleep 60 seconds to avoid this
- # problem.
- sleep 60
- ls -l aa >${TESTDIR}/1/stamp.aa.ci
- ls -l kw >${TESTDIR}/1/stamp.kw.ci
- # If there are no keywords, "cvs ci" leaves the timestamp alone
- # If there are, it sets the timestamp to the date of the commit.
- # I'm not sure how logical this is, but it is intentional.
- # If we wanted to get fancy we would make sure the time as
- # reported in "cvs log kw" matched stamp.kw.ci. But that would
- # be a lot of work.
- dotest stamps-6aa \
- "cmp ${TESTDIR}/1/stamp.aa.add ${TESTDIR}/1/stamp.aa.ci" ''
- if cmp ${TESTDIR}/1/stamp.kw.add ${TESTDIR}/1/stamp.kw.ci >/dev/null
- then
- fail stamps-6kw
- else
- pass stamps-6kw
- fi
- cd ../..
- sleep 60
- mkdir 2
- cd 2
- dotest stamps-7 "${testcvs} -q get first-dir" "U first-dir/aa
- U first-dir/kw"
- cd first-dir
- ls -l aa >${TESTDIR}/1/stamp.aa.get
- ls -l kw >${TESTDIR}/1/stamp.kw.get
- # On checkout, CVS should set the timestamp to the date that the
- # file was committed. Could check that the time as reported in
- # "cvs log aa" matches stamp.aa.get, but that would be a lot of
- # work.
- if cmp ${TESTDIR}/1/stamp.aa.ci ${TESTDIR}/1/stamp.aa.get >/dev/null
- then
- fail stamps-8aa
- else
- pass stamps-8aa
- fi
- dotest stamps-8kw \
- "cmp ${TESTDIR}/1/stamp.kw.ci ${TESTDIR}/1/stamp.kw.get" ''
- # Now we want to see what "cvs update" does.
- sleep 60
- echo add a line >>aa
- echo add a line >>kw
- dotest stamps-9 "${testcvs} -q ci -m change-them" \
- "Checking in aa;
- ${CVSROOT_DIRNAME}/first-dir/aa,v <-- aa
- new revision: 1\.2; previous revision: 1\.1
- done
- Checking in kw;
- ${CVSROOT_DIRNAME}/first-dir/kw,v <-- kw
- new revision: 1\.2; previous revision: 1\.1
- done"
-
- # Cygwin, *cough*, puts the year in the time column until the minute
- # is no longer the current minute. Sleep 60 seconds to avoid this
- # problem.
- sleep 60
- ls -l aa >${TESTDIR}/1/stamp.aa.ci2
- ls -l kw >${TESTDIR}/1/stamp.kw.ci2
- cd ../..
- cd 1/first-dir
- sleep 60
- dotest stamps-10 "${testcvs} -q update" '[UP] aa
- [UP] kw'
- # this doesn't serve any function other than being able to
- # look at it manually, as we have no machinery for dates being
- # newer or older than other dates.
- date >${TESTDIR}/1/stamp.debug.update
- ls -l aa >${TESTDIR}/1/stamp.aa.update
- ls -l kw >${TESTDIR}/1/stamp.kw.update
- # stamp.aa.update and stamp.kw.update should both be approximately
- # the same as stamp.debug.update. Perhaps we could be testing
- # this in a more fancy fashion by "touch stamp.before" before
- # stamps-10, "touch stamp.after" after, and then using ls -t
- # to check them. But for now we just make sure that the *.update
- # stamps differ from the *.ci2 ones.
- # As for the rationale, this is so that if one updates and gets
- # a new revision, then "make" will be sure to regard those files
- # as newer than .o files which may be sitting around.
- if cmp ${TESTDIR}/1/stamp.aa.update ${TESTDIR}/1/stamp.aa.ci2 \
- >/dev/null
- then
- fail stamps-11aa
- else
- pass stamps-11aa
- fi
- if cmp ${TESTDIR}/1/stamp.kw.update ${TESTDIR}/1/stamp.kw.ci2 \
- >/dev/null
- then
- fail stamps-11kw
- else
- pass stamps-11kw
- fi
- cd ../..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- perms)
- # short cut around checking out and committing CVSROOT
- rm -f ${CVSROOT_DIRNAME}/CVSROOT/config
- echo 'PreservePermissions=yes' > ${CVSROOT_DIRNAME}/CVSROOT/config
- chmod 444 ${CVSROOT_DIRNAME}/CVSROOT/config
- mkdir 1; cd 1
- dotest perms-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest perms-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch foo
- chmod 431 foo
- dotest perms-3 "${testcvs} add foo" \
- "${PROG} add: scheduling file .foo. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest perms-4 "${testcvs} -q ci -m ''" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/foo,v
- done
- Checking in foo;
- ${CVSROOT_DIRNAME}/first-dir/foo,v <-- foo
- initial revision: 1\.1
- done"
- # Test checking out files with different permissions.
- cd ../..
- mkdir 2; cd 2
- dotest perms-5 "${testcvs} -q co first-dir" "U first-dir/foo"
- cd first-dir
- if $remote; then :; else
- # PreservePermissions not yet implemented for remote.
- dotest perms-6 "ls -l foo" "-r---wx--x .* foo"
- fi
- cd ../..
- rm -rf 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -f ${CVSROOT_DIRNAME}/CVSROOT/config
- touch ${CVSROOT_DIRNAME}/CVSROOT/config
- chmod 444 ${CVSROOT_DIRNAME}/CVSROOT/config
- ;;
- symlinks)
- # short cut around checking out and committing CVSROOT
- rm -f ${CVSROOT_DIRNAME}/CVSROOT/config
- echo 'PreservePermissions=yes' > ${CVSROOT_DIRNAME}/CVSROOT/config
- chmod 444 ${CVSROOT_DIRNAME}/CVSROOT/config
- mkdir 1; cd 1
- dotest symlinks-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest symlinks-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- dotest symlinks-2.1 "ln -s ${TESTDIR}/fumble slink" ""
- dotest symlinks-3 "${testcvs} add slink" \
- "${PROG} add: scheduling file .slink. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- if $remote; then
- # Remote doesn't implement PreservePermissions, and in its
- # absence the correct behavior is to follow the symlink.
- dotest_fail symlinks-4r "${testcvs} -q ci -m ''" \
- "${PROG} \[commit aborted\]: reading slink: No such file or directory"
- else
- dotest symlinks-4 "${testcvs} -q ci -m ''" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/slink,v
- done
- Checking in slink;
- ${CVSROOT_DIRNAME}/first-dir/slink,v <-- slink
- initial revision: 1\.1
- done"
- # Test checking out symbolic links.
- cd ../..
- mkdir 2; cd 2
- dotest symlinks-5 "${testcvs} -q co first-dir" "U first-dir/slink"
- cd first-dir
- dotest symlinks-6 "ls -l slink" \
- "l[rwx\-]* .* slink -> ${TESTDIR}/fumble"
- fi
- cd ../..
- rm -rf 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -f ${CVSROOT_DIRNAME}/CVSROOT/config
- touch ${CVSROOT_DIRNAME}/CVSROOT/config
- chmod 444 ${CVSROOT_DIRNAME}/CVSROOT/config
- ;;
- symlinks2)
- # Symlinks in working directory without PreservePermissions.
- # Also see: symlinks: with PreservePermissions
- # rcslib-symlink-*: symlinks in repository.
- mkdir 1; cd 1
- dotest symlinks2-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest symlinks2-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo nonsymlink > slink
- dotest symlinks2-3 "${testcvs} add slink" \
- "${PROG} add: scheduling file .slink. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest symlinks2-4 "${testcvs} -q ci -m ''" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/slink,v
- done
- Checking in slink;
- ${CVSROOT_DIRNAME}/first-dir/slink,v <-- slink
- initial revision: 1\.1
- done"
- rm slink
- # Choose name cvslog.* so it is in default ignore list.
- echo second file >cvslog.file2
- dotest symlinks2-5 "ln -s cvslog.file2 slink" ""
- dotest symlinks2-6 "${testcvs} -q ci -m linkify" \
- "Checking in slink;
- ${CVSROOT_DIRNAME}/first-dir/slink,v <-- slink
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest symlinks2-7 "${testcvs} -q update -r 1.1 slink" "[UP] slink"
- dotest symlinks2-8 "cat slink" "nonsymlink"
- dotest symlinks2-9 "ls -l slink" "-[-rwx]* .* slink"
- cd ../..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- hardlinks)
- # short cut around checking out and committing CVSROOT
- rm -f ${CVSROOT_DIRNAME}/CVSROOT/config
- echo 'PreservePermissions=yes' > ${CVSROOT_DIRNAME}/CVSROOT/config
- chmod 444 ${CVSROOT_DIRNAME}/CVSROOT/config
- mkdir 1; cd 1
- dotest hardlinks-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest hardlinks-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- # Make up some ugly filenames, to test that they get
- # encoded properly in the delta nodes. Note that `dotest' screws
- # up if some arguments have embedded spaces.
- if touch aaaa
- then
- pass hardlinks-2.1
- else
- fail hardlinks-2.1
- fi
- if ln aaaa b.b.b.b
- then
- pass hardlinks-2.2
- else
- fail hardlinks-2.2
- fi
- if ln aaaa 'dd dd dd'
- then
- pass hardlinks-2.3
- else
- fail hardlinks-2.3
- fi
- dotest hardlinks-3 "${testcvs} add [abd]*" \
- "${PROG} add: scheduling file .aaaa. for addition
- ${PROG} add: scheduling file .b\.b\.b\.b. for addition
- ${PROG} add: scheduling file .dd dd dd. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest hardlinks-4 "${testcvs} -q ci -m ''" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aaaa,v
- done
- Checking in aaaa;
- ${CVSROOT_DIRNAME}/first-dir/aaaa,v <-- aaaa
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/b\.b\.b\.b,v
- done
- Checking in b\.b\.b\.b;
- ${CVSROOT_DIRNAME}/first-dir/b\.b\.b\.b,v <-- b\.b\.b\.b
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/dd dd dd,v
- done
- Checking in dd dd dd;
- ${CVSROOT_DIRNAME}/first-dir/dd dd dd,v <-- dd dd dd
- initial revision: 1\.1
- done"
- # Test checking out hardlinked files.
- cd ../..
- mkdir 2; cd 2
- if $remote; then
- # Remote does not implement PreservePermissions.
- dotest hardlinks-5r "${testcvs} -q co first-dir" \
- "U first-dir/aaaa
- U first-dir/b\.b\.b\.b
- U first-dir/dd dd dd"
- cd first-dir
- dotest hardlinks-6r "ls -l [abd]*" \
- "-[rwx\-]* *1 .* aaaa
- -[rwx\-]* *1 .* b\.b\.b\.b
- -[rwx\-]* *1 .* dd dd dd"
- else
- dotest hardlinks-5 "${testcvs} -q co first-dir" \
- "U first-dir/aaaa
- U first-dir/b\.b\.b\.b
- U first-dir/dd dd dd"
- cd first-dir
- # To make sure that the files are properly hardlinked, it
- # would be nice to do `ls -i' and make sure all the inodes
- # match. But I think that would require expr to support
- # tagged regexps, and I don't think we can rely on that.
- # So instead we just see that each file has the right
- # number of links. -twp
- dotest hardlinks-6 "ls -l [abd]*" \
- "-[rwx\-]* *3 .* aaaa
- -[rwx\-]* *3 .* b\.b\.b\.b
- -[rwx\-]* *3 .* dd dd dd"
- fi
- cd ../..
- rm -rf 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- rm -f ${CVSROOT_DIRNAME}/CVSROOT/config
- touch ${CVSROOT_DIRNAME}/CVSROOT/config
- chmod 444 ${CVSROOT_DIRNAME}/CVSROOT/config
- ;;
- sticky)
- # More tests of sticky tags, particularly non-branch sticky tags.
- # See many tests (e.g. multibranch) for ordinary sticky tag
- # operations such as adding files on branches.
- # See "head" test for interaction between stick tags and HEAD.
- mkdir 1; cd 1
- dotest sticky-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest sticky-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch file1
- dotest sticky-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest sticky-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest sticky-5 "${testcvs} -q tag tag1" "T file1"
- echo add a line >>file1
- dotest sticky-6 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest sticky-7 "${testcvs} -q update -r tag1" "[UP] file1"
- dotest sticky-8 "cat file1" ''
- dotest sticky-9 "${testcvs} -q update" ''
- dotest sticky-10 "cat file1" ''
- touch file2
- dotest_fail sticky-11 "${testcvs} add file2" \
- "${PROG} add: cannot add file on non-branch tag tag1"
- dotest sticky-12 "${testcvs} -q update -A" "[UP] file1
- ${QUESTION} file2" "${QUESTION} file2
- [UP] file1"
- dotest sticky-13 "${testcvs} add file2" \
- "${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest sticky-14 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- # Now back to tag1
- dotest sticky-15 "${testcvs} -q update -r tag1" "[UP] file1
- ${PROG} update: file2 is no longer in the repository"
- rm file1
- dotest sticky-16 "${testcvs} rm file1" \
- "${PROG} remove: scheduling .file1. for removal
- ${PROG} remove: use .${PROG} commit. to remove this file permanently"
- # Hmm, this command seems to silently remove the tag from
- # the file. This appears to be intentional.
- # The silently part especially strikes me as odd, though.
- dotest sticky-17 "${testcvs} -q ci -m remove-it" ""
- dotest sticky-18 "${testcvs} -q update -A" "U file1
- U file2"
- dotest sticky-19 "${testcvs} -q update -r tag1" \
- "${PROG} update: file1 is no longer in the repository
- ${PROG} update: file2 is no longer in the repository"
- dotest sticky-20 "${testcvs} -q update -A" "U file1
- U file2"
- # Now try with a numeric revision.
- dotest sticky-21 "${testcvs} -q update -r 1.1 file1" "U file1"
- dotest sticky-22 "${testcvs} rm -f file1" \
- "${PROG} remove: cannot remove file .file1. which has a numeric sticky tag of .1\.1."
- # The old behavior was that remove allowed this and then commit
- # gave an error, which was somewhat hard to clear. I mean, you
- # could get into a long elaborate discussion of this being a
- # conflict and two ways to resolve it, but I don't really see
- # why CVS should have a concept of conflict that arises, not from
- # parallel development, but from CVS's own sticky tags.
- # Ditto with a sticky date.
- #
- # I'm kind of surprised that the "file1 was lost" doesn't crop
- # up elsewhere in the testsuite. It is a long-standing
- # discrepency between local and remote CVS and should probably
- # be cleaned up at some point.
- dotest sticky-23 "${testcvs} -q update -Dnow file1" \
- "${PROG} update: warning: file1 was lost
- U file1" "U file1"
- dotest sticky-24 "${testcvs} rm -f file1" \
- "${PROG} remove: cannot remove file .file1. which has a sticky date of .[0-9.]*."
- dotest sticky-25 "${testcvs} -q update -A" \
- "${PROG} update: warning: file1 was lost
- U file1" "U file1"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- keyword)
- # Test keyword expansion.
- # Various other tests relate to our ability to correctly
- # set the keyword expansion mode.
- # "binfiles" tests "cvs admin -k".
- # "binfiles" and "binfiles2" test "cvs add -k".
- # "rdiff" tests "cvs co -k".
- # "binfiles" (and this test) test "cvs update -k".
- # "binwrap" tests setting the mode from wrappers.
- # "keyword2" tests "cvs update -kk -j" with text and binary files
- # I don't think any test is testing "cvs import -k".
- # Other keyword expansion tests:
- # keywordlog - $Log.
- mkdir 1; cd 1
- dotest keyword-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest keyword-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo '$''Author$' > file1
- echo '$''Date$' >> file1
- echo '$''Header$' >> file1
- echo '$''Id$' >> file1
- echo '$''Locker$' >> file1
- echo '$''Name$' >> file1
- echo '$''RCSfile$' >> file1
- echo '$''Revision$' >> file1
- echo '$''Source$' >> file1
- echo '$''State$' >> file1
- echo '$''Nonkey$' >> file1
- # Omit the trailing dollar sign
- echo '$''Date' >> file1
- # Put two keywords on one line
- echo '$''State$' '$''State$' >> file1
- # Use a header for Log
- echo 'xx $''Log$' >> file1
- dotest keyword-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest keyword-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest keyword-5 "cat file1" \
- '\$'"Author: ${username} "'\$'"
- "'\$'"Date: [0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] "'\$'"
- "'\$'"Header: ${CVSROOT_DIRNAME}/first-dir/file1,v 1\.1 [0-9/]* [0-9:]* ${username} Exp "'\$'"
- "'\$'"Id: file1,v 1\.1 [0-9/]* [0-9:]* ${username} Exp "'\$'"
- "'\$'"Locker: "'\$'"
- "'\$'"Name: "'\$'"
- "'\$'"RCSfile: file1,v "'\$'"
- "'\$'"Revision: 1\.1 "'\$'"
- "'\$'"Source: ${CVSROOT_DIRNAME}/first-dir/file1,v "'\$'"
- "'\$'"State: Exp "'\$'"
- "'\$'"Nonkey"'\$'"
- "'\$'"Date
- "'\$'"State: Exp "'\$'" "'\$'"State: Exp "'\$'"
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.1 [0-9/]* [0-9:]* ${username}
- xx add
- xx"
- # Use cvs admin to lock the RCS file in order to check -kkvl
- # vs. -kkv. CVS does not normally lock RCS files, but some
- # people use cvs admin to enforce reserved checkouts.
- dotest keyword-6 "${testcvs} admin -l file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- 1\.1 locked
- done"
- dotest keyword-7 "$testcvs update -kkv file1" '[UP] file1'
- dotest keyword-8 "cat file1" \
- '\$'"Author: ${username} "'\$'"
- "'\$'"Date: [0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] "'\$'"
- "'\$'"Header: ${CVSROOT_DIRNAME}/first-dir/file1,v 1\.1 [0-9/]* [0-9:]* ${username} Exp "'\$'"
- "'\$'"Id: file1,v 1\.1 [0-9/]* [0-9:]* ${username} Exp "'\$'"
- "'\$'"Locker: "'\$'"
- "'\$'"Name: "'\$'"
- "'\$'"RCSfile: file1,v "'\$'"
- "'\$'"Revision: 1\.1 "'\$'"
- "'\$'"Source: ${CVSROOT_DIRNAME}/first-dir/file1,v "'\$'"
- "'\$'"State: Exp "'\$'"
- "'\$'"Nonkey"'\$'"
- "'\$'"Date
- "'\$'"State: Exp "'\$'" "'\$'"State: Exp "'\$'"
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.1 [0-9/]* [0-9:]* ${username}
- xx add
- xx"
- dotest keyword-9 "$testcvs update -kkvl file1" '[UP] file1'
- dotest keyword-10 "cat file1" \
- '\$'"Author: ${username} "'\$'"
- "'\$'"Date: [0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9] "'\$'"
- "'\$'"Header: ${CVSROOT_DIRNAME}/first-dir/file1,v 1\.1 [0-9/]* [0-9:]* ${username} Exp ${username} "'\$'"
- "'\$'"Id: file1,v 1\.1 [0-9/]* [0-9:]* ${username} Exp ${username} "'\$'"
- "'\$'"Locker: ${username} "'\$'"
- "'\$'"Name: "'\$'"
- "'\$'"RCSfile: file1,v "'\$'"
- "'\$'"Revision: 1\.1 "'\$'"
- "'\$'"Source: ${CVSROOT_DIRNAME}/first-dir/file1,v "'\$'"
- "'\$'"State: Exp "'\$'"
- "'\$'"Nonkey"'\$'"
- "'\$'"Date
- "'\$'"State: Exp "'\$'" "'\$'"State: Exp "'\$'"
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.1 [0-9/]* [0-9:]* ${username}
- xx add
- xx"
- dotest keyword-11 "${testcvs} update -kk file1" '[UP] file1'
- dotest keyword-12 "cat file1" \
- '\$'"Author"'\$'"
- "'\$'"Date"'\$'"
- "'\$'"Header"'\$'"
- "'\$'"Id"'\$'"
- "'\$'"Locker"'\$'"
- "'\$'"Name"'\$'"
- "'\$'"RCSfile"'\$'"
- "'\$'"Revision"'\$'"
- "'\$'"Source"'\$'"
- "'\$'"State"'\$'"
- "'\$'"Nonkey"'\$'"
- "'\$'"Date
- "'\$'"State"'\$'" "'\$'"State"'\$'"
- xx "'\$'"Log"'\$'"
- xx Revision 1\.1 [0-9/]* [0-9:]* ${username}
- xx add
- xx"
- dotest keyword-13 "$testcvs update -kv file1" '[UP] file1'
- dotest keyword-14 "cat file1" \
- "${username}
- [0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]
- ${CVSROOT_DIRNAME}/first-dir/file1,v 1\.1 [0-9/]* [0-9:]* ${username} Exp
- file1,v 1\.1 [0-9/]* [0-9:]* ${username} Exp
- file1,v
- 1\.1
- ${CVSROOT_DIRNAME}/first-dir/file1,v
- Exp
- "'\$'"Nonkey"'\$'"
- "'\$'"Date
- Exp Exp
- xx file1,v
- xx Revision 1\.1 [0-9/]* [0-9:]* ${username}
- xx add
- xx"
- dotest keyword-15 "${testcvs} update -ko file1" "U file1"
- dotest keyword-16 "cat file1" \
- '\$'"Author"'\$'"
- "'\$'"Date"'\$'"
- "'\$'"Header"'\$'"
- "'\$'"Id"'\$'"
- "'\$'"Locker"'\$'"
- "'\$'"Name"'\$'"
- "'\$'"RCSfile"'\$'"
- "'\$'"Revision"'\$'"
- "'\$'"Source"'\$'"
- "'\$'"State"'\$'"
- "'\$'"Nonkey"'\$'"
- "'\$'"Date
- "'\$'"State"'\$'" "'\$'"State"'\$'"
- xx "'\$'"Log"'\$'
- # Test the Name keyword. First go back to normal expansion.
- dotest keyword-17 "${testcvs} update -A file1" "U file1"
- echo '$''Name$' > file1
- dotest keyword-18 "${testcvs} ci -m modify file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest keyword-19 "${testcvs} -q tag tag1" "T file1"
- echo "change" >> file1
- dotest keyword-20 "${testcvs} -q ci -m mod2 file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done"
- # Prior to 1.11.23, remote CVS would fail the patch checksum test
- # and refetch the file here, failing this test.
- dotest keyword-21 "$testcvs -q update -r tag1" 'U file1'
- dotest keyword-22 "cat file1" '\$'"Name: tag1 "'\$'
- # The update used to fail the first time with a checksum failure
- # here, then the server would send the whole failure. This was fixed
- # in 1.11.23.
- dotest keyword-23 "$testcvs update -A file1" "U file1"
- dotest keyword-24 "cat file1" '\$'"Name: "'\$'"
- change"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- keywordlog)
- # Test the Log keyword.
- mkdir 1; cd 1
- dotest keywordlog-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest keywordlog-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo initial >file1
- dotest keywordlog-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- # See "rmadd" for a list of other tests of cvs ci -r.
- dotest keywordlog-4 "${testcvs} -q ci -r 1.3 -m add file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.3
- done"
- cd ../..
- mkdir 2; cd 2
- dotest keywordlog-4a "${testcvs} -q co first-dir" "U first-dir/file1"
- cd ../1/first-dir
- echo 'xx $''Log$' >> file1
- cat >${TESTDIR}/comment.tmp <<EOF
- First log line
- Second log line
- EOF
- # As with rmadd-25, "cvs ci -r" sets a sticky tag.
- dotest_fail keywordlog-4b \
- "${testcvs} ci -F ${TESTDIR}/comment.tmp file1" \
- "${PROG} commit: sticky tag .1\.3. for file .file1. is not a branch
- ${PROG} \[commit aborted\]: correct above errors first!"
- dotest keywordlog-4c "${testcvs} -q update -A" "M file1"
- dotest keywordlog-5 "${testcvs} ci -F ${TESTDIR}/comment.tmp file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.4; previous revision: 1\.3
- done"
- rm -f ${TESTDIR}/comment.tmp
- dotest keywordlog-6 "${testcvs} -q tag -b br" "T file1"
- dotest keywordlog-7 "cat file1" \
- "initial
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.4 [0-9/]* [0-9:]* ${username}
- xx First log line
- xx Second log line
- xx"
- cd ../../2/first-dir
- dotest keywordlog-8 "${testcvs} -q update" "[UP] file1"
- dotest keywordlog-9 "cat file1" \
- "initial
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.4 [0-9/]* [0-9:]* ${username}
- xx First log line
- xx Second log line
- xx"
- cd ../../1/first-dir
- echo "change" >> file1
- dotest keywordlog-10 "${testcvs} ci -m modify file1" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.5; previous revision: 1\.4
- done"
- dotest keywordlog-11 "cat file1" \
- "initial
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.5 [0-9/]* [0-9:]* ${username}
- xx modify
- xx
- xx Revision 1\.4 [0-9/]* [0-9:]* ${username}
- xx First log line
- xx Second log line
- xx
- change"
- cd ../../2/first-dir
- dotest keywordlog-12 "${testcvs} -q update" "[UP] file1"
- dotest keywordlog-13 "cat file1" \
- "initial
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.5 [0-9/]* [0-9:]* ${username}
- xx modify
- xx
- xx Revision 1\.4 [0-9/]* [0-9:]* ${username}
- xx First log line
- xx Second log line
- xx
- change"
- cd ../../1/first-dir
- dotest keywordlog-14 "${testcvs} -q update -r br" "[UP] file1"
- echo br-change >>file1
- dotest keywordlog-15 "${testcvs} -q ci -m br-modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.4\.2\.1; previous revision: 1\.4
- done"
- dotest keywordlog-16 "cat file1" \
- "initial
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.4\.2\.1 [0-9/]* [0-9:]* ${username}
- xx br-modify
- xx
- xx Revision 1\.4 [0-9/]* [0-9:]* ${username}
- xx First log line
- xx Second log line
- xx
- br-change"
- cd ../../2/first-dir
- dotest keywordlog-17 "${testcvs} -q update -r br" "[UP] file1"
- dotest keywordlog-18 "cat file1" \
- "initial
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.4\.2\.1 [0-9/]* [0-9:]* ${username}
- xx br-modify
- xx
- xx Revision 1\.4 [0-9/]* [0-9:]* ${username}
- xx First log line
- xx Second log line
- xx
- br-change"
- cd ../..
- dotest keywordlog-19 "${testcvs} -q co -p -r br first-dir/file1" \
- "initial
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.4\.2\.1 [0-9/]* [0-9:]* ${username}
- xx br-modify
- xx
- xx Revision 1\.4 [0-9/]* [0-9:]* ${username}
- xx First log line
- xx Second log line
- xx
- br-change"
- dotest keywordlog-20 "${testcvs} -q co -p first-dir/file1" \
- "initial
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.5 [0-9/]* [0-9:]* ${username}
- xx modify
- xx
- xx Revision 1\.4 [0-9/]* [0-9:]* ${username}
- xx First log line
- xx Second log line
- xx
- change"
- dotest keywordlog-21 "${testcvs} -q co -p -r 1.4 first-dir/file1" \
- "initial
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.4 [0-9/]* [0-9:]* ${username}
- xx First log line
- xx Second log line
- xx"
- cd 2/first-dir
- # OK, the basic rule for keyword expansion is that it
- # happens on checkout. And the rule for annotate is that
- # it annotates a checked-in revision, rather than a checked-out
- # file. So, although it is kind of confusing that the latest
- # revision does not appear in the annotated output, and the
- # annotated output does not quite match what you'd get with
- # update or checkout, the behavior is more or less logical.
- # The same issue occurs with annotate and other keywords,
- # I think, although it is particularly noticeable for $Log.
- dotest keywordlog-22 "${testcvs} ann -r br file1" \
- "
- Annotations for file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.3 ($username8 *[0-9a-zA-Z-]*): initial
- 1\.4\.2\.1 ($username8 *[0-9a-zA-Z-]*): xx "'\$'"Log: file1,v "'\$'"
- 1\.4\.2\.1 ($username8 *[0-9a-zA-Z-]*): xx Revision 1\.4 [0-9/]* [0-9:]* $username
- 1\.4\.2\.1 ($username8 *[0-9a-zA-Z-]*): xx First log line
- 1\.4\.2\.1 ($username8 *[0-9a-zA-Z-]*): xx Second log line
- 1\.4\.2\.1 ($username8 *[0-9a-zA-Z-]*): xx
- 1\.4\.2\.1 ($username8 *[0-9a-zA-Z-]*): br-change"
- dotest keywordlog-23 "${testcvs} ann -r HEAD file1" \
- "
- Annotations for file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.3 ($username8 *[0-9a-zA-Z-]*): initial
- 1\.5 ($username8 *[0-9a-zA-Z-]*): xx "'\$'"Log: file1,v "'\$'"
- 1\.5 ($username8 *[0-9a-zA-Z-]*): xx Revision 1\.4 [0-9/]* [0-9:]* $username
- 1\.5 ($username8 *[0-9a-zA-Z-]*): xx First log line
- 1\.5 ($username8 *[0-9a-zA-Z-]*): xx Second log line
- 1\.5 ($username8 *[0-9a-zA-Z-]*): xx
- 1\.5 ($username8 *[0-9a-zA-Z-]*): change"
- cd ../..
- #
- # test the operation of 'admin -o' in conjunction with keywords
- # (especially Log - this used to munge the RCS file for all time)
- #
- dotest keywordlog-24 \
- "${testcvs} admin -oHEAD 1/first-dir/file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- deleting revision 1\.5
- done"
- dotest keywordlog-25 \
- "${testcvs} -q co -p first-dir/file1" \
- "initial
- xx "'\$'"Log: file1,v "'\$'"
- xx Revision 1\.4 [0-9/]* [0-9:]* ${username}
- xx First log line
- xx Second log line
- xx"
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -r 1 2
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- keywordname)
- # Test the Name keyword.
- # See the keyword test for a descriptions of some other tests that
- # test keyword expansion modes.
- mkdir keywordname; cd keywordname
- mkdir 1; cd 1
- dotest keywordname-init-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest keywordname-init-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo '$'"Name$" >file1
- echo '$'"Name$" >file2
- dotest keywordname-init-3 "${testcvs} add file1 file2" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- # See "rmadd" for a list of other tests of cvs ci -r.
- dotest keywordname-init-4 "${testcvs} -q ci -r 1.3 -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.3
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.3
- done"
- dotest keywordname-init-5b "cat file1" \
- '\$''Name: \$'
- dotest keywordname-init-5c "cat file2" \
- '\$''Name: \$'
- dotest keywordname-init-6 "$testcvs -q up -A"
- dotest keywordname-init-6b "cat file1" \
- '\$''Name: \$'
- dotest keywordname-init-6c "cat file2" \
- '\$''Name: \$'
- dotest keywordname-init-7 "${testcvs} -q tag -b br" \
- "T file1
- T file2"
- echo new data >>file1
- dotest keywordname-init-8 "${testcvs} -q ci -mchange" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.4; previous revision: 1\.3
- done"
- # First check out a branch.
- #
- # There used to be a bug where static tags would be substituted for
- # Name keywords but not branch tags.
- #
- # Prior to 1.11.23, there also used to be a bug where keyword
- # substitutions were not performed unless the file was otherwise
- # updated. When this bug was present, keywordname-update-1 would
- # report a patch checksum failure and refetch file1 in client/server
- # mode and no `br' would have been substituted into Name's value for
- # file2, meaning keywordname-update-3 would also fail.
- dotest keywordname-update-1 "$testcvs -q up -rbr" \
- 'U file1
- U file2'
- dotest keywordname-update-2 "cat file1" '\$''Name: br \$'
- # For the same reason keywordname-update-1 would fail above, no `br'
- # would have been substituted into Name's value here prior to
- # 1.11.23.
- dotest keywordname-update-3 "cat file2" '\$''Name: br \$'
- # Now verify that updating to the trunk leaves no substitution for
- # $Name
- dotest keywordname-update-4 "${testcvs} -q tag firsttag" \
- "T file1
- T file2"
- # This used to fail in the same manner as keywordname-update-1.
- dotest keywordname-update-5 "$testcvs -q up -A" \
- 'U file1
- U file2'
- dotest keywordname-update-6 "cat file1" \
- '\$''Name: \$
- new data'
- dotest keywordname-update-7 "cat file2" '\$''Name: \$'
- # This used to fail in the same manner as keywordname-update-1.
- dotest keywordname-update-8 "$testcvs -q up -rfirsttag" \
- 'U file1
- U file2'
- dotest keywordname-update-9 "cat file1" '\$''Name: firsttag \$'
- # This used to fail in the same manner as keywordname-update-3.
- dotest keywordname-update-10 "cat file2" '\$''Name: firsttag \$'
- # And reverify the trunk update when the change is actually removed.
- dotest keywordname-update-11 "$testcvs -q up -A" \
- 'U file1
- U file2'
- dotest keywordname-update-12 "cat file1" \
- '\$''Name: \$
- new data'
- dotest keywordname-update-13 "cat file2" '\$''Name: \$'
- cd ../..
- # now verify that a fresh checkout substitutes all the $Name fields
- mkdir 2; cd 2
- dotest keywordname-checkout-1 \
- "${testcvs} -q co -rfirsttag first-dir" \
- "U first-dir/file1
- U first-dir/file2"
- cd first-dir
- dotest keywordname-checkout-2 "cat file1" '\$'"Name: firsttag "'\$'
- dotest keywordname-checkout-3 "cat file2" '\$'"Name: firsttag "'\$'
- cd ../..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ..
- rm -r keywordname
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- keyword2)
- # Test merging on files with keywords:
- # without -kk
- # with -kk
- # on text files
- # on binary files
- # Note: This test assumes that CVS has already passed the binfiles
- # test sequence
- # Note2: We are testing positive on binary corruption here
- # we probably really DON'T want to 'cvs update -kk' a binary file...
- mkdir 1; cd 1
- dotest keyword2-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest keyword2-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo '$''Revision$' >> file1
- echo "I" >>file1
- echo "like" >>file1
- echo "long" >>file1
- echo "files!" >>file1
- echo "" >>file1
- echo "a test line for our times" >>file1
- echo "" >>file1
- echo "They" >>file1
- echo "make" >>file1
- echo "diff" >>file1
- echo "look like it" >>file1
- echo "did a much better" >>file1
- echo "job." >>file1
- dotest keyword2-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- ${AWK} 'BEGIN { printf "%c%c%c%sRevision: 1.1 $@%c%c", \
- 2, 10, 137, "$", 13, 10 }' \
- </dev/null | ${TR} '@' '\000' >../binfile.dat
- cp ../binfile.dat .
- dotest keyword2-5 "${testcvs} add -kb binfile.dat" \
- "${PROG} add: scheduling file .binfile\.dat. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest keyword2-6 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/binfile\.dat,v
- done
- Checking in binfile\.dat;
- ${CVSROOT_DIRNAME}/first-dir/binfile\.dat,v <-- binfile\.dat
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest keyword2-7 "${testcvs} -q tag -b branch" \
- "T binfile\.dat
- T file1"
- sed -e 's/our/the best of and the worst of/' file1 >f; mv f file1
- dotest keyword2-8 "${testcvs} -q ci -m change" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest keyword2-9 "$testcvs -q update -r branch" \
- 'U binfile\.dat
- [UP] file1'
- echo "what else do we have?" >>file1
- dotest keyword2-10 "${testcvs} -q ci -m change" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- # Okay, first a conflict in file1 - should be okay with binfile.dat
- dotest keyword2-11 "$testcvs -q update -A -j branch" \
- "U binfile\.dat
- U file1
- RCS file: $CVSROOT_DIRNAME/first-dir/file1,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.1
- Merging differences between 1\.1 and 1\.1\.2\.1 into file1
- rcsmerge: warning: conflicts during merge"
- dotest_fail keyword2-12 "${testcvs} diff file1" \
- "Index: file1
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.2
- diff -r1\.2 file1
- 0a1
- > <<<<<<< file1
- 1a3,5
- > =======
- > \\\$""Revision: 1\.1\.2\.1 \\\$
- > >>>>>>> 1\.1\.2\.1
- 14a19
- > what else do we have${QUESTION}"
- # Here's the problem... shouldn't -kk a binary file...
- rm file1
- dotest keyword2-13 "${testcvs} -q update -A -kk -j branch" \
- "${PROG} update: warning: file1 was lost
- U file1
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.1
- retrieving revision 1\.1\.2\.1
- Merging differences between 1\.1 and 1\.1\.2\.1 into file1"
- # binfile won't get checked in, but it is now corrupt and could
- # have been checked in if it had changed on the branch...
- dotest keyword2-14 "${testcvs} -q ci -m change" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done"
- # "-kk" no longer corrupts binary files
- dotest keyword2-15 "cmp binfile.dat ../binfile.dat" ''
- # Okay, restore everything and make CVS try and merge a binary file...
- # "-kk" no longer affects binary files
- dotest keyword2-16 "${testcvs} -q update -A" \
- "[UP] file1"
- dotest keyword2-17 "${testcvs} -q tag -b branch2" \
- "T binfile\.dat
- T file1"
- dotest keyword2-18 "$testcvs -q update -r branch2" \
- 'U binfile\.dat
- [UP] file1'
- ${AWK} 'BEGIN { printf "%c%c%c@%c%c", 2, 10, 137, 13, 10 }' \
- </dev/null | ${TR} '@' '\000' >>binfile.dat
- dotest keyword2-19 "${testcvs} -q ci -m badbadbad" \
- "Checking in binfile\.dat;
- ${CVSROOT_DIRNAME}/first-dir/binfile\.dat,v <-- binfile\.dat
- new revision: 1\.1\.4\.1; previous revision: 1\.1
- done"
- # "-kk" no longer affects binary files
- # XXXX: do not ask, why we get the "U binfile.dat" line twice
- # looks like a bug!
- dotest keyword2-20 "${testcvs} -q update -A -kk -j branch2" \
- "U binfile\.dat
- U binfile\.dat
- U file1"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- head)
- # Testing handling of the HEAD special tag.
- # There are many cases involving added and removed files
- # which we don't yet try to deal with.
- # TODO: We also could be paying much closer attention to
- # "head of the trunk" versus "head of the default branch".
- # That is what "cvs import" is doing here (but I didn't really
- # fully follow through on writing the tests for that case).
- mkdir imp-dir
- cd imp-dir
- echo 'imported contents' >file1
- # It may seem like we don't do much with file2, but do note that
- # the "cvs diff" invocations do also diff file2 (and come up empty).
- echo 'imported contents' >file2
- dotest_sort head-1 "${testcvs} import -m add first-dir tag1 tag2" \
- "
- N first-dir/file1
- N first-dir/file2
- No conflicts created by this import"
- cd ..
- rm -r imp-dir
- mkdir 1
- cd 1
- dotest head-2 "${testcvs} -q co first-dir" \
- "U first-dir/file1
- U first-dir/file2"
- cd first-dir
- echo 'add a line on trunk' >> file1
- dotest head-3 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest head-4 "${testcvs} -q tag trunktag" "T file1
- T file2"
- echo 'add a line on trunk after trunktag' >> file1
- dotest head-5 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3; previous revision: 1\.2
- done"
- dotest head-6 "${testcvs} -q tag -b br1" "T file1
- T file2"
- dotest head-7 "$testcvs -q update -r br1" \
- '[UP] file1
- [UP] file2'
- echo 'modify on branch' >>file1
- dotest head-8 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3\.2\.1; previous revision: 1\.3
- done"
- dotest head-9 "${testcvs} -q tag brtag" "T file1
- T file2"
- echo 'modify on branch after brtag' >>file1
- dotest head-10 "${testcvs} -q ci -m modify" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.3\.2\.2; previous revision: 1\.3\.2\.1
- done"
- # With no sticky tags, HEAD is the head of the trunk.
- dotest head-trunk-setup "$testcvs -q update -A" \
- '[UP] file1
- [UP] file2'
- dotest head-trunk-update "${testcvs} -q update -r HEAD -p file1" \
- "imported contents
- add a line on trunk
- add a line on trunk after trunktag"
- # and diff thinks so too. Case (a) from the comment in
- # cvs.texinfo (Common options).
- dotest_fail head-trunk-diff "${testcvs} -q diff -c -r HEAD -r br1" \
- "Index: file1
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.3
- retrieving revision 1\.3\.2\.2
- diff -c -r1\.3 -r1\.3\.2\.2
- \*\*\* file1 ${RFCDATE} 1\.3
- --- file1 ${RFCDATE} 1\.3\.2\.2
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1,3 \*\*\*\*
- --- 1,5 ----
- imported contents
- add a line on trunk
- add a line on trunk after trunktag
- ${PLUS} modify on branch
- ${PLUS} modify on branch after brtag"
- # With a branch sticky tag, HEAD is the head of the trunk.
- dotest head-br1-setup "$testcvs -q update -r br1" \
- '[UP] file1
- [UP] file2'
- dotest head-br1-update "${testcvs} -q update -r HEAD -p file1" \
- "imported contents
- add a line on trunk
- add a line on trunk after trunktag"
- # But diff thinks that HEAD is "br1". Case (b) from cvs.texinfo.
- # Probably people are relying on it.
- dotest head-br1-diff "${testcvs} -q diff -c -r HEAD -r br1" ""
- # With a nonbranch sticky tag on a branch,
- # HEAD is the head of the trunk
- dotest head-brtag-setup "$testcvs -q update -r brtag" \
- '[UP] file1
- [UP] file2'
- dotest head-brtag-update "${testcvs} -q update -r HEAD -p file1" \
- "imported contents
- add a line on trunk
- add a line on trunk after trunktag"
- # CVS 1.9 and older thought that HEAD is "brtag" (this was
- # noted as "strange, maybe accidental"). But "br1" makes a
- # whole lot more sense.
- dotest head-brtag-diff "${testcvs} -q diff -c -r HEAD -r br1" ""
- # With a nonbranch sticky tag on the trunk, HEAD is the head
- # of the trunk, I think.
- dotest head-trunktag-setup "$testcvs -q update -r trunktag" \
- '[UP] file1
- [UP] file2'
- dotest head-trunktag-check "cat file1" "imported contents
- add a line on trunk"
- dotest head-trunktag-update "${testcvs} -q update -r HEAD -p file1" \
- "imported contents
- add a line on trunk
- add a line on trunk after trunktag"
- # Like head-brtag-diff, there is a non-branch sticky tag.
- dotest_fail head-trunktag-diff \
- "${testcvs} -q diff -c -r HEAD -r br1" \
- "Index: file1
- ===================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- retrieving revision 1\.3
- retrieving revision 1\.3\.2\.2
- diff -c -r1\.3 -r1\.3\.2\.2
- \*\*\* file1 ${RFCDATE} 1\.3
- --- file1 ${RFCDATE} 1\.3\.2\.2
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- \*\*\* 1,3 \*\*\*\*
- --- 1,5 ----
- imported contents
- add a line on trunk
- add a line on trunk after trunktag
- ${PLUS} modify on branch
- ${PLUS} modify on branch after brtag"
- # Also might test what happens if we setup with update -r
- # HEAD. In general, if sticky tags matter, does the
- # behavior of "update -r <foo>" (without -p) depend on the
- # sticky tags before or after the update?
- # Note that we are testing both the case where this deletes
- # a revision (file1) and the case where it does not (file2)
- dotest_fail head-o0a "${testcvs} admin -o ::br1" \
- "${PROG} admin: Administrating \.
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- ${PROG} admin: cannot remove revision 1\.3\.2\.1 because it has tags
- ${PROG} admin: RCS file for .file1. not modified\.
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
- dotest head-o0b "${testcvs} tag -d brtag" \
- "${PROG} tag: Untagging \.
- D file1
- D file2"
- dotest head-o1 "${testcvs} admin -o ::br1" \
- "${PROG} admin: Administrating \.
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- deleting revision 1\.3\.2\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- tagdate)
- # Test combining -r and -D.
- #
- # Note that this is not a complete test. It relies on the fact
- # that update, checkout and export have a LOT of shared code.
- # Notice:
- # 1) checkout is never tested at all with -r -D
- # 2) update never uses an argument to '-D' besides 'now'
- # (this test does not provide enough data to prove
- # that 'cvs update' with both a '-r' and a '-D'
- # specified does not ignore '-D': a 'cvs up
- # -r<branch> -Dnow' and a 'cvs up -r<branch>'
- # should specify the same file revision).
- # 3) export uses '-r<branch> -D<when there was a different
- # revision>', hopefully completing this behavior test
- # for checkout and update as well.
- #
- mkdir 1; cd 1
- save_TZ=$TZ
- TZ=UTC; export TZ
- dotest tagdate-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest tagdate-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo trunk-1 >file1
- dotest tagdate-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest tagdate-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- date_T1=`getrlogdate -r1.1 first-dir/file1`
- dotest tagdate-5 "${testcvs} -q tag -b br1" "T file1"
- dotest tagdate-6 "${testcvs} -q tag -b br2" "T file1"
- echo trunk-2 >file1
- dotest tagdate-7 "${testcvs} -q ci -m modify-on-trunk" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done"
- date_T2=`getrlogdate -r1.2 first-dir/file1`
- # We are testing -r -D where br1 is a (magic) branch without
- # any revisions. First the case where br2 doesn't have any
- # revisions either:
- dotest tagdate-8 "${testcvs} -q update -p -r br1 -D now" "trunk-1"
- dotest tagdate-9 "${testcvs} -q update -r br2" "[UP] file1"
- echo br2-1 >file1
- dotest tagdate-10 "${testcvs} -q ci -m modify-on-br2" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.4\.1; previous revision: 1\.1
- done"
- date_T3=`getrlogdate -r1.1.4.1 first-dir/file1`
- # Then the case where br2 does have revisions:
- dotest tagdate-11 "${testcvs} -q update -p -r br1 -D now" "trunk-1"
- # For some reason, doing this on a branch seems to be relevant.
- dotest_fail tagdate-12 "${testcvs} -q update -j:yesterday" \
- "${PROG} \[update aborted\]: argument to join may not contain a date specifier without a tag"
- # And check export
- echo br2-2 >file1
- dotest tagdate-13 "${testcvs} -q ci -m modify-2-on-br2" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.4\.2; previous revision: 1\.1\.4\.1
- done"
- date_T4=`getrlogdate -r1.1.4.2 first-dir/file1`
- cd ../..
- mkdir 2; cd 2
- dotest tagdate-14 "${testcvs} -q export -r br2 -D'$date_T3' first-dir" \
- "[UP] first-dir/file1"
- dotest tagdate-15 "cat first-dir/file1" "br2-1"
- # Now for annotate
- cd ../1/first-dir
- dotest tagdate-16 "${testcvs} annotate -rbr2 -D'$date_T3'" \
- "
- Annotations for file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1\.4\.1 ($username8 *[0-9a-zA-Z-]*): br2-1"
- dotest tagdate-17 "${testcvs} annotate -rbr2 -Dnow" \
- "
- Annotations for file1
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- 1\.1\.4\.2 ($username8 *[0-9a-zA-Z-]*): br2-2"
- # Now check to see what happens when we add files to br2 and trunk
- echo br2-1 > file3
- dotest tagdate-18 "${testcvs} add file3" \
- "${PROG} add: scheduling file \`file3' for addition on branch \`br2'
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest tagdate-19 "${testcvs} -q ci -m add file3" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v <-- file3
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- date_T5=`getrlogdate -r1.1 first-dir/file3`
- date_T6=`getrlogdate -r1.1.2.1 first-dir/file3`
- cd ../..
- mkdir 3; cd 3
- dotest tagdate-20 "${testcvs} -Q co first-dir" ''
- cd first-dir
- echo trunk-1 > file2
- dotest tagdate-21 "${testcvs} add file2" \
- "${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest tagdate-22 "${testcvs} -q ci -m add file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- date_T7=`getrlogdate -r1.1 first-dir/file2`
- echo "trunk-2" >file2
- dotest tagdate-23 "${testcvs} -q ci -m update file2" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.2; previous revision: 1\.1
- done"
- date_T8=`getrlogdate -r1.2 first-dir/file2`
- cd ../../1/first-dir
- echo br2-1 > file2
- dotest tagdate-24 "${testcvs} add file2" \
- "${PROG} add: scheduling file \`file2' for addition on branch \`br2'
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest tagdate-25 "${testcvs} -q ci -m add file2" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.2\.2\.2; previous revision: 1\.2\.2\.1
- done"
- date_T9=`getrlogdate -r1.2.2.2 first-dir/file2`
- cd ../..
- # Time Rev Branch Comments
- # T0 trunk first-dir created
- # T1 1.1 trunk first-dir/file1 committed "trunk-1"
- # br1 branch created
- # br2 branch created
- # T2 1.2 trunk first-dir/file1 committed "trunk-2"
- # T3 1.1.4.1 br2 first-dir/file1 committed "br2-1"
- # +60s
- # T4 1.1.4.2 br2 first-dir/file1 committed "br2-2"
- # T5 1.1 trunk first-dir/file3 dead
- # T6 1.1.2.1 br2 first-dir/file3 committed "br2-1"
- # T7 1.1 trunk first-dir/file2 committed "trunk-1"
- # T8 1.2 trunk first-dir/file2 committed "trunk-2"
- # T8 1.2.2.1 br2 first-dir/file2 dead
- # T9 1.2.2.2 br2 first-dir/file2 committed "br2-1"
- #
- mkdir 4; cd 4
- (echo Dates for tagdate-26-* are:;\
- echo " date_T1='$date_T1'";\
- echo " date_T2='$date_T2'";\
- echo " date_T3='$date_T3'";\
- echo " date_T4='$date_T4'";\
- echo " date_T5='$date_T5'";\
- echo " date_T6='$date_T6'";\
- echo " date_T7='$date_T7'";\
- echo " date_T8='$date_T8'";\
- echo " date_T9='$date_T9'") >>$LOGFILE
- dotest tagdate-26-trunk-t1 \
- "${testcvs} co -D'$date_T1' -d first-dir-trunk-t1 first-dir" \
- "${PROG} checkout: Updating first-dir-trunk-t1
- U first-dir-trunk-t1/file1"
- dotest tagdate-26-br2-t1 \
- "${testcvs} co -r br2 -D'$date_T1' -d first-dir-br2-t1 first-dir" \
- "${PROG} checkout: Updating first-dir-br2-t1
- U first-dir-br2-t1/file1"
- dotest tagdate-26-trunk-t2 \
- "${testcvs} co -D'$date_T2' -d first-dir-trunk-t2 first-dir" \
- "${PROG} checkout: Updating first-dir-trunk-t2
- U first-dir-trunk-t2/file1"
- dotest tagdate-26-br2-t2 \
- "${testcvs} co -r br2 -D'$date_T2' -d first-dir-br2-t2 first-dir" \
- "${PROG} checkout: Updating first-dir-br2-t2
- U first-dir-br2-t2/file1"
- dotest tagdate-26-br2-t3 \
- "${testcvs} co -r br2 -D'$date_T3' -d first-dir-br2-t3 first-dir" \
- "${PROG} checkout: Updating first-dir-br2-t3
- U first-dir-br2-t3/file1"
- dotest tagdate-26-br2-t4 \
- "${testcvs} co -r br2 -D'$date_T4' -d first-dir-br2-t4 first-dir" \
- "${PROG} checkout: Updating first-dir-br2-t4
- U first-dir-br2-t4/file1"
- dotest tagdate-26-br2-t6 \
- "${testcvs} co -r br2 -D'$date_T6' -d first-dir-br2-t6 first-dir" \
- "${PROG} checkout: Updating first-dir-br2-t6
- U first-dir-br2-t6/file1
- U first-dir-br2-t6/file3"
- dotest tagdate-26-trunk-t7 \
- "${testcvs} co -D'$date_T7' -d first-dir-trunk-t7 first-dir" \
- "${PROG} checkout: Updating first-dir-trunk-t7
- U first-dir-trunk-t7/file1
- U first-dir-trunk-t7/file2"
- dotest tagdate-26-br2-t7 \
- "${testcvs} co -r br2 -D'$date_T7' -d first-dir-br2-t7 first-dir" \
- "${PROG} checkout: Updating first-dir-br2-t7
- U first-dir-br2-t7/file1
- U first-dir-br2-t7/file3"
- dotest tagdate-26-trunk-t8 \
- "${testcvs} co -D'$date_T8' -d first-dir-trunk-t8 first-dir" \
- "${PROG} checkout: Updating first-dir-trunk-t8
- U first-dir-trunk-t8/file1
- U first-dir-trunk-t8/file2"
- dotest tagdate-26-br2-t8 \
- "${testcvs} co -r br2 -D'$date_T8' -d first-dir-br2-t8 first-dir" \
- "${PROG} checkout: Updating first-dir-br2-t8
- U first-dir-br2-t8/file1
- U first-dir-br2-t8/file3"
- dotest tagdate-26-br2-t9 \
- "${testcvs} co -r br2 -D'$date_T9' -d first-dir-br2-t9 first-dir" \
- "${PROG} checkout: Updating first-dir-br2-t9
- U first-dir-br2-t9/file1
- U first-dir-br2-t9/file2
- U first-dir-br2-t9/file3"
- dotest tagdate-27-trunk-t1 \
- "${testcvs} status first-dir-trunk-t1" \
- "${PROG} status: Examining first-dir-trunk-t1
- ===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1[^.]*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: (none)
- Sticky Date: [0-9.]*
- Sticky Options: (none)"
- dotest tagdate-27-br2-t1 \
- "${testcvs} status first-dir-br2-t1" \
- "${PROG} status: Examining first-dir-br2-t1
- ===================================================================
- File: file1 Status: Needs Patch
- Working revision: 1\.1[^.]*
- Repository revision: 1\.1\.4\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: br2 (branch: 1\.1\.4)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest tagdate-27-trunk-t2 \
- "${testcvs} status first-dir-trunk-t2" \
- "${PROG} status: Examining first-dir-trunk-t2
- ===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.2[^.]*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: (none)
- Sticky Date: [0-9.]*
- Sticky Options: (none)"
- dotest tagdate-27-br2-t2 \
- "${testcvs} status first-dir-br2-t2" \
- "${PROG} status: Examining first-dir-br2-t2
- ===================================================================
- File: file1 Status: Needs Patch
- Working revision: 1\.1[^.]*
- Repository revision: 1\.1\.4\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: br2 (branch: 1\.1\.4)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest tagdate-27-br2-t3 \
- "${testcvs} status first-dir-br2-t3" \
- "${PROG} status: Examining first-dir-br2-t3
- ===================================================================
- File: file1 Status: Needs Patch
- Working revision: 1\.1\.4\.1[^.]*
- Repository revision: 1\.1\.4\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: br2 (branch: 1\.1\.4)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest tagdate-27-br2-t4 \
- "${testcvs} status first-dir-br2-t4" \
- "${PROG} status: Examining first-dir-br2-t4
- ===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1\.4\.2[^.]*
- Repository revision: 1\.1\.4\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: br2 (branch: 1\.1\.4)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest tagdate-27-br2-t6 \
- "${testcvs} status first-dir-br2-t6" \
- "${PROG} status: Examining first-dir-br2-t6
- ===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1\.4\.2[^.]*
- Repository revision: 1\.1\.4\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: br2 (branch: 1\.1\.4)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Up-to-date
- Working revision: 1\.1\.2\.1[^.]*
- Repository revision: 1\.1\.2\.1 ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- Sticky Tag: br2 (branch: 1\.1\.2)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest tagdate-27-trunk-t7 \
- "${testcvs} status first-dir-trunk-t7" \
- "${PROG} status: Examining first-dir-trunk-t7
- ===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.2[^.]*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: (none)
- Sticky Date: [0-9.]*
- Sticky Options: (none)
- ===================================================================
- File: file2 Status: Up-to-date
- Working revision: 1\.1[^.]*
- Repository revision: 1\.1 ${CVSROOT_DIRNAME}/first-dir/file2,v
- Sticky Tag: (none)
- Sticky Date: [0-9.]*
- Sticky Options: (none)"
- dotest tagdate-27-br2-t7 \
- "${testcvs} status first-dir-br2-t7" \
- "${PROG} status: Examining first-dir-br2-t7
- ===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1\.4\.2[^.]*
- Repository revision: 1\.1\.4\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: br2 (branch: 1\.1\.4)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Up-to-date
- Working revision: 1\.1\.2\.1[^.]*
- Repository revision: 1\.1\.2\.1 ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- Sticky Tag: br2 (branch: 1\.1\.2)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest tagdate-27-trunk-t8 \
- "${testcvs} status first-dir-trunk-t8" \
- "${PROG} status: Examining first-dir-trunk-t8
- ===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.2[^.]*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: (none)
- Sticky Date: [0-9.]*
- Sticky Options: (none)
- ===================================================================
- File: file2 Status: Up-to-date
- Working revision: 1\.2[^.]*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/file2,v
- Sticky Tag: (none)
- Sticky Date: [0-9.]*
- Sticky Options: (none)"
- dotest tagdate-27-br2-t8 \
- "${testcvs} status first-dir-br2-t8" \
- "${PROG} status: Examining first-dir-br2-t8
- ===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1\.4\.2[^.]*
- Repository revision: 1\.1\.4\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: br2 (branch: 1\.1\.4)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Up-to-date
- Working revision: 1\.1\.2\.1[^.]*
- Repository revision: 1\.1\.2\.1 ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- Sticky Tag: br2 (branch: 1\.1\.2)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest tagdate-27-br2-t9 \
- "${testcvs} status first-dir-br2-t9" \
- "${PROG} status: Examining first-dir-br2-t9
- ===================================================================
- File: file1 Status: Up-to-date
- Working revision: 1\.1\.4\.2[^.]*
- Repository revision: 1\.1\.4\.2 ${CVSROOT_DIRNAME}/first-dir/file1,v
- Sticky Tag: br2 (branch: 1\.1\.4)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file2 Status: Up-to-date
- Working revision: 1\.2\.2\.2[^.]*
- Repository revision: 1\.2\.2\.2 ${CVSROOT_DIRNAME}/first-dir/file2,v
- Sticky Tag: br2 (branch: 1\.2\.2)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file3 Status: Up-to-date
- Working revision: 1\.1\.2\.1[^.]*
- Repository revision: 1\.1\.2\.1 ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- Sticky Tag: br2 (branch: 1\.1\.2)
- Sticky Date: (none)
- Sticky Options: (none)"
- # Now check the contents of the files
- dotest tagdate-28-trunk-t1 'cat first-dir-trunk-t1/file1' 'trunk-1'
- dotest tagdate-28-br2-t1 'cat first-dir-br2-t1/file1' 'trunk-1'
- dotest tagdate-28-trunk-t2 'cat first-dir-trunk-t2/file1' 'trunk-2'
- dotest tagdate-28-br2-t2 'cat first-dir-br2-t2/file1' 'trunk-1'
- dotest tagdate-28-br2-t3 'cat first-dir-br2-t3/file1' 'br2-1'
- dotest tagdate-28-br2-t4 'cat first-dir-br2-t4/file1' 'br2-2'
- dotest tagdate-28-br2-t6a 'cat first-dir-br2-t6/file1' "br2-2"
- dotest tagdate-28-br2-t6b 'cat first-dir-br2-t6/file3' "br2-1"
- dotest tagdate-28-trunk-t7a 'cat first-dir-trunk-t7/file1' "trunk-2"
- dotest tagdate-28-trunk-t7b 'cat first-dir-trunk-t7/file2' "trunk-1"
- dotest tagdate-28-br2-t7a 'cat first-dir-br2-t7/file1' "br2-2"
- dotest tagdate-28-br2-t7b 'cat first-dir-br2-t7/file3' "br2-1"
- dotest tagdate-28-trunk-t8a 'cat first-dir-trunk-t8/file1' "trunk-2"
- dotest tagdate-28-trunk-t8b 'cat first-dir-trunk-t8/file2' "trunk-2"
- dotest tagdate-28-br2-t8a 'cat first-dir-br2-t8/file1' "br2-2"
- dotest tagdate-28-br2-t8c 'cat first-dir-br2-t8/file3' "br2-1"
- dotest tagdate-28-br2-t9a 'cat first-dir-br2-t9/file1' "br2-2"
- dotest tagdate-28-br2-t9b 'cat first-dir-br2-t9/file2' "br2-1"
- dotest tagdate-28-br2-t9c 'cat first-dir-br2-t9/file3' "br2-1"
- cd ..
- unset date_T1 date_T2 date_T3 date_T4 date_T5
- unset date_T6 date_T7 date_T8 date_T9
- TZ=$save_TZ
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -r 1 2 3 4
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- multibranch2)
- # Commit the first delta on branch A when there is an older
- # branch, B, that already has a delta. A and B come from the
- # same branch point. Then verify that branches A and B are
- # in the right order.
- mkdir 1; cd 1
- dotest multibranch2-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest multibranch2-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- echo trunk-1 >file1
- echo trunk-1 >file2
- dotest multibranch2-3 "${testcvs} add file1 file2" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest multibranch2-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- dotest multibranch2-5 "${testcvs} -q tag -b A" "T file1
- T file2"
- dotest multibranch2-6 "${testcvs} -q tag -b B" "T file1
- T file2"
- dotest multibranch2-7 "$testcvs -q update -r B" \
- '[UP] file1
- [UP] file2'
- echo branch-B >file1
- echo branch-B >file2
- dotest multibranch2-8 "${testcvs} -q ci -m modify-on-B" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.4\.1; previous revision: 1\.1
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.1\.4\.1; previous revision: 1\.1
- done"
- dotest multibranch2-9 "${testcvs} -q update -r A" '[UP] file1
- [UP] file2'
- echo branch-A >file1
- # When using cvs-1.9.20, this commit gets a failed assertion in rcs.c.
- dotest multibranch2-10 "${testcvs} -q ci -m modify-on-A" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest multibranch2-11 "${testcvs} -q log file1" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- B: 1\.1\.0\.4
- A: 1\.1\.0\.2
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- branches: 1\.1\.2; 1\.1\.4;
- add
- ----------------------------
- revision 1\.1\.4\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp; lines: ${PLUS}1 -1
- modify-on-B
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp; lines: ${PLUS}1 -1
- modify-on-A
- ============================================================================="
- # This one is more concise.
- dotest multibranch2-12 "${testcvs} -q log -r1.1 file1" \
- "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- B: 1\.1\.0\.4
- A: 1\.1\.0\.2
- keyword substitution: kv
- total revisions: 3; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- branches: 1\.1\.2; 1\.1\.4;
- add
- ============================================================================="
- # OK, try very much the same thing except we run update -j to
- # bring the changes from B to A. Probably tests many of the
- # same code paths but might as well keep it separate, I guess.
- dotest multibranch2-13 "${testcvs} -q update -r B" "[UP] file1
- [UP] file2"
- dotest multibranch2-14 "${testcvs} -q update -r A -j B file2" \
- "[UP] file2
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- retrieving revision 1.1
- retrieving revision 1.1.4.1
- Merging differences between 1.1 and 1.1.4.1 into file2"
- dotest multibranch2-15 "${testcvs} -q ci -m commit-on-A file2" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- tag8k)
- # In cvs-1.9.27, there is a bug that can cause an abort.
- # It happens when you commit a change to a ,v file that has
- # just the right amount of tag/branch info to align one of the
- # semicolons in the branch info to be on a 8k-byte boundary.
- # The result: rcsbuf_getkey got an abort. This failure doesn't
- # corrupt the ,v file -- that would be really serious. But it
- # does leave stale write locks that have to be removed manually.
- mkdir 1
- cd 1
- module=x
- : > junk
- dotest tag8k-1 "$testcvs -Q import -m . $module X Y" ''
- dotest tag8k-2 "$testcvs -Q co $module" ''
- cd $module
- file=m
- : > $file
- dotest tag8k-3 "$testcvs add $file" \
- "${PROG} add: scheduling file .$file. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest tag8k-4 "$testcvs -Q ci -m . $file" \
- "RCS file: ${CVSROOT_DIRNAME}/$module/$file,v
- done
- Checking in $file;
- ${CVSROOT_DIRNAME}/$module/$file,v <-- $file
- initial revision: 1\.1
- done"
- # It seems there have to be at least two versions.
- echo a > $file
- dotest tag8k-5 "$testcvs -Q ci -m . $file" \
- "Checking in $file;
- ${CVSROOT_DIRNAME}/$module/$file,v <-- $file
- new revision: 1\.2; previous revision: 1\.1
- done"
- # Add just under 8K worth of tags.
- t=TAG---------------------------------------------------------------------
- t=$t$t
- t=$t$t$t$t$t
- # Now $t is 720 bytes long.
- # Apply some tags with that long prefix.
- dotest tag8k-6 "$testcvs -Q tag $t-0 $file" ''
- dotest tag8k-7 "$testcvs -Q tag $t-1 $file" ''
- dotest tag8k-8 "$testcvs -Q tag $t-2 $file" ''
- dotest tag8k-9 "$testcvs -Q tag $t-3 $file" ''
- dotest tag8k-10 "$testcvs -Q tag $t-4 $file" ''
- dotest tag8k-11 "$testcvs -Q tag $t-5 $file" ''
- dotest tag8k-12 "$testcvs -Q tag $t-6 $file" ''
- dotest tag8k-13 "$testcvs -Q tag $t-7 $file" ''
- dotest tag8k-14 "$testcvs -Q tag $t-8 $file" ''
- dotest tag8k-15 "$testcvs -Q tag $t-9 $file" ''
- dotest tag8k-16 "$testcvs -Q tag $t-a $file" ''
- # Extract the author value.
- name=`sed -n 's/.*; author \([^;]*\);.*/\1/p' ${CVSROOT_DIRNAME}/$module/$file,v|sed 1q`
- # Form a suffix string of length (16 - length($name)).
- # CAREFUL: this will lose if $name is longer than 16.
- sed_pattern=`echo $name|sed s/././g`
- suffix=`echo 1234567890123456|sed s/$sed_pattern//`
- # Add a final tag with length chosen so that it will push the
- # offset of the `;' in the 2nd occurrence of `;\tauthor' in the
- # ,v file to exactly 8192.
- dotest tag8k-17 "$testcvs -Q tag "x8bytes-$suffix" $file" ''
- # This commit would fail with 1.9.27.
- echo a >> $file
- dotest tag8k-18 "$testcvs -Q ci -m . $file" \
- "Checking in $file;
- ${CVSROOT_DIRNAME}/$module/$file,v <-- $file
- new revision: 1\.3; previous revision: 1\.2
- done"
- cd ../..
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/$module
- ;;
- admin)
- # More "cvs admin" tests.
- # The basicb-21 test tests rejecting an illegal option.
- # For -l and -u, see "reserved" and "keyword" tests.
- # "binfiles" test has a test of "cvs admin -k".
- # "log2" test has tests of -t and -q options to cvs admin.
- # "rcs" tests -b option also.
- # For -o, see:
- # admin-22-o1 through admin-23 (various cases not involving ::)
- # binfiles2-o* (:rev, rev on trunk; rev:, deleting entire branch)
- # basicb-o* (attempt to delete all revisions)
- # basica-o1 through basica-o3 (basic :: usage)
- # head-o1 (::branch, where this deletes a revision or is noop)
- # branches-o1 (::branch, similar, with different branch topology)
- # log-o1 (1.3.2.1::)
- # binfiles-o1 (1.3:: and ::1.3; binary files)
- # binfiles3-9 (binary files)
- # Also could be testing:
- # 1.3.2.6::1.3.2.8
- # 1.3.2.6::1.3.2
- # 1.3.2.1::1.3.2.6
- # 1.3::1.3.2.6 (error? or synonym for ::1.3.2.6?)
- # -n: admin, tagf tests.
- mkdir 1; cd 1
- dotest admin-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest admin-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- dotest_fail admin-3 "${testcvs} -q admin -i file1" \
- "${PROG} admin: the -i option to admin is not supported
- ${PROG} admin: run add or import to create an RCS file
- ${PROG} \[admin aborted\]: specify ${PROG} -H admin for usage information"
- dotest_fail admin-4 "${testcvs} -q log file1" \
- "${PROG} log: nothing known about file1"
- dotest_fail admin-4a "${testcvs} -q admin file1" \
- "${PROG} admin: nothing known about file1"
- # Set up some files, file2 a plain one and file1 with a revision
- # on a branch.
- touch file1 file2
- dotest admin-5 "${testcvs} add file1 file2" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest admin-6 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- dotest admin-7 "${testcvs} -q tag -b br" "T file1
- T file2"
- dotest admin-8 "$testcvs -q update -r br" \
- 'U file1
- U file2'
- echo 'add a line on the branch' >> file1
- echo 'add a file on the branch' >> file3
- dotest admin-9a "${testcvs} -q add file3" \
- "${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest admin-9b "${testcvs} -q ci -m modify-on-branch" \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- done
- Checking in file3;
- ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v <-- file3
- new revision: 1\.1\.2\.1; previous revision: 1\.1
- done"
- dotest admin-10 "$testcvs -q update -A" \
- "U file1
- U file2
- $PROG update: file3 is no longer in the repository"
- # Check that we can administer files in the repository that
- # aren't in the working directory.
- dotest admin-10-1 "${testcvs} admin ." \
- "${PROG} admin: Administrating .
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
- dotest admin-10-2 "${testcvs} -q admin file3" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- done"
- # Try to recurse with a numeric revision arg.
- # If we wanted to comprehensive about this, we would also test
- # this for -l, -u, and all the different -o syntaxes.
- dotest_fail admin-10a "${testcvs} -q admin -b1.1.2" \
- "${PROG} [a-z]*: while processing more than one file:
- ${PROG} \[[a-z]* aborted\]: attempt to specify a numeric revision"
- dotest_fail admin-10b "${testcvs} -q admin -m1.1:bogus file1 file2" \
- "${PROG} [a-z]*: while processing more than one file:
- ${PROG} \[[a-z]* aborted\]: attempt to specify a numeric revision"
- # try a bad symbolic revision
- dotest_fail admin-10c "${testcvs} -q admin -bBOGUS" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/file1,v: Symbolic name BOGUS is undefined.
- ${PROG} admin: RCS file for .file1. not modified\.
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/file2,v: Symbolic name BOGUS is undefined.
- ${PROG} admin: RCS file for .file2. not modified\."
- # Note that -s option applies to the new default branch, not
- # the old one.
- # Also note that the implementation of -a via "rcs" requires
- # no space between -a and the argument. However, we expect
- # to change that once CVS parses options.
- dotest admin-11 "${testcvs} -q admin -afoo,bar -abaz \
- -b1.1.2 -cxx -U -sfoo file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done"
- dotest admin-11a "${testcvs} log -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch: 1\.1\.2
- locks:
- access list:
- foo
- bar
- baz
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.2;
- add
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: foo; lines: ${PLUS}1 -0
- modify-on-branch
- ============================================================================="
- dotest admin-12 "${testcvs} -q admin -bbr file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done"
- dotest admin-12a "${testcvs} log -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch: 1\.1\.2
- locks:
- access list:
- foo
- bar
- baz
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.2;
- add
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: foo; lines: ${PLUS}1 -0
- modify-on-branch
- ============================================================================="
- # "cvs log" doesn't print the comment leader. RCS 5.7 will print
- # the comment leader only if one specifies "-V4" to rlog. So it
- # seems like the only way to test it is by looking at the RCS file
- # directly. This also serves as a test of exporting RCS files
- # (analogous to the import tests in "rcs").
- # Rather than try to write a rigorous check for whether the
- # file CVS exports is legal, we just write a simpler
- # test for what CVS actually exports, and figure we can revise
- # the check as needed (within the confines of the RCS5 format as
- # documented in RCSFILES).
- # Note that we must accept either 2 or 4 digit year.
- dotest admin-13 "cat ${CVSROOT_DIRNAME}/first-dir/file1,v" \
- "head 1\.1;
- branch 1\.1\.2;
- access
- foo
- bar
- baz;
- symbols
- br:1\.1\.0\.2;
- locks;
- comment @xx@;
- 1\.1
- date [0-9][0-9]*\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]; author ${username}; state Exp;
- branches
- 1\.1\.2\.1;
- next ;
- 1\.1\.2\.1
- date [0-9][0-9]*\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]; author ${username}; state foo;
- branches;
- next ;
- desc
- @@
- 1\.1
- log
- @add
- @
- text
- @@
- 1\.1\.2\.1
- log
- @modify-on-branch
- @
- text
- @a0 1
- add a line on the branch
- @"
- dotest_fail admin-14-1 "${testcvs} -q admin \
- -m1.1.1.1:changed-bogus-log-message file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- cvs admin: ${CVSROOT_DIRNAME}/first-dir/file2,v: no such revision 1\.1\.1\.1
- cvs admin: RCS file for .file2. not modified."
- dotest admin-14-2 "${testcvs} -q log file2" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- Working file: file2
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- br: 1\.1\.0\.2
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- add
- ============================================================================="
- dotest admin-14-3 "${testcvs} -q admin -aauth3 -aauth2,foo \
- -soneone:1.1 -m1.1:changed-log-message -ntagone: file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
- dotest admin-15 "${testcvs} -q log file2" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- Working file: file2
- head: 1\.1
- branch:
- locks: strict
- access list:
- auth3
- auth2
- foo
- symbolic names:
- tagone: 1\.1
- br: 1\.1\.0\.2
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: oneone;
- changed-log-message
- ============================================================================="
- dotest admin-16 "${testcvs} -q admin \
- -A${CVSROOT_DIRNAME}/first-dir/file2,v -b -L -Nbr:1.1 file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done"
- dotest admin-17 "${testcvs} -q log file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- foo
- bar
- baz
- auth3
- auth2
- symbolic names:
- br: 1\.1
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.2;
- add
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: foo; lines: ${PLUS}1 -0
- modify-on-branch
- ============================================================================="
- dotest_fail admin-18 "${testcvs} -q admin -nbr:1.1.2 file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/file1,v: symbolic name br already bound to 1\.1
- ${PROG} admin: RCS file for .file1. not modified\."
- dotest admin-19 "${testcvs} -q admin -ebaz -ebar,auth3 -nbr file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done"
- dotest admin-20 "${testcvs} -q log file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- foo
- auth2
- symbolic names:
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.2;
- add
- ----------------------------
- revision 1.1.2.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: foo; lines: ${PLUS}1 -0
- modify-on-branch
- ============================================================================="
- # OK, this is starting to get ridiculous, in terms of
- # testing a feature (access lists) which doesn't do anything
- # useful, but what about nonexistent files and
- # relative pathnames in admin -A?
- dotest_fail admin-19a-nonexist \
- "${testcvs} -q admin -A${TESTDIR}/foo/bar file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- ${PROG} admin: Couldn't open rcs file .${TESTDIR}/foo/bar.: No such file or directory
- ${PROG} \[admin aborted\]: cannot continue"
- # In the remote case, we are cd'd off into the temp directory
- # and so these tests give "No such file or directory" errors.
- if $remote; then :; else
- dotest admin-19a-admin "${testcvs} -q admin -A../../${CVSROOTDIR}/first-dir/file2,v file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done"
- dotest admin-19a-log "${testcvs} -q log -h -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- foo
- auth2
- auth3
- keyword substitution: kv
- total revisions: 2
- ============================================================================="
- fi # end of tests skipped for remote
- # Now test that plain -e works right.
- dotest admin-19a-2 "${testcvs} -q admin -e file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done"
- dotest admin-19a-3 "${testcvs} -q log -h -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 2
- ============================================================================="
- # Put the access list back, to avoid special cases later.
- dotest admin-19a-4 "${testcvs} -q admin -afoo,auth2 file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done"
- # Add another revision to file2, so we can delete one.
- echo 'add a line' >> file2
- dotest admin-21 "${testcvs} -q ci -m modify file2" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest admin-22 "${testcvs} -q admin -o1.1 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- deleting revision 1\.1
- done"
- # Test admin -o. More variants that we could be testing:
- # * REV: [on branch]
- # * REV1:REV2 [deleting whole branch]
- # * high branch numbers (e.g. 1.2.2.3.2.3)
- # ... and probably others. See RCS_delete_revs for ideas.
- echo first rev > aaa
- dotest admin-22-o1 "${testcvs} add aaa" \
- "${PROG} add: scheduling file .aaa. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest admin-22-o2 "${testcvs} -q ci -m first aaa" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- done
- Checking in aaa;
- ${CVSROOT_DIRNAME}/first-dir/aaa,v <-- aaa
- initial revision: 1\.1
- done"
- echo second rev >> aaa
- dotest admin-22-o3 "${testcvs} -q ci -m second aaa" \
- "Checking in aaa;
- ${CVSROOT_DIRNAME}/first-dir/aaa,v <-- aaa
- new revision: 1\.2; previous revision: 1\.1
- done"
- echo third rev >> aaa
- dotest admin-22-o4 "${testcvs} -q ci -m third aaa" \
- "Checking in aaa;
- ${CVSROOT_DIRNAME}/first-dir/aaa,v <-- aaa
- new revision: 1\.3; previous revision: 1\.2
- done"
- echo fourth rev >> aaa
- dotest admin-22-o5 "${testcvs} -q ci -m fourth aaa" \
- "Checking in aaa;
- ${CVSROOT_DIRNAME}/first-dir/aaa,v <-- aaa
- new revision: 1\.4; previous revision: 1\.3
- done"
- echo fifth rev >>aaa
- dotest admin-22-o6 "${testcvs} -q ci -m fifth aaa" \
- "Checking in aaa;
- ${CVSROOT_DIRNAME}/first-dir/aaa,v <-- aaa
- new revision: 1\.5; previous revision: 1\.4
- done"
- echo sixth rev >> aaa
- dotest admin-22-o7 "${testcvs} -q ci -m sixth aaa" \
- "Checking in aaa;
- ${CVSROOT_DIRNAME}/first-dir/aaa,v <-- aaa
- new revision: 1\.6; previous revision: 1\.5
- done"
- dotest admin-22-o8 "${testcvs} admin -l1.6 aaa" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- 1\.6 locked
- done"
- dotest admin-22-o9 "${testcvs} log -r1.6 aaa" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- Working file: aaa
- head: 1\.6
- branch:
- locks: strict
- ${username}: 1\.6
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 6; selected revisions: 1
- description:
- ----------------------------
- revision 1\.6 locked by: ${username};
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- sixth
- ============================================================================="
- dotest_fail admin-22-o10 "${testcvs} admin -o1.5: aaa" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/aaa,v: can't remove locked revision 1\.6
- ${PROG} admin: RCS file for .aaa. not modified\."
- dotest admin-22-o11 "${testcvs} admin -u aaa" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- 1\.6 unlocked
- done"
- dotest admin-22-o12 "${testcvs} admin -o1.5: aaa" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- deleting revision 1\.6
- deleting revision 1\.5
- done"
- dotest admin-22-o13 "${testcvs} log aaa" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- Working file: aaa
- head: 1\.4
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 4; selected revisions: 4
- description:
- ----------------------------
- revision 1\.4
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- fourth
- ----------------------------
- revision 1\.3
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- third
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- second
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- first
- ============================================================================="
- dotest admin-22-o14 "${testcvs} tag -b -r1.3 br1 aaa" "T aaa"
- dotest admin-22-o15 "${testcvs} update -rbr1 aaa" "U aaa"
- echo new branch rev >> aaa
- dotest admin-22-o16 "${testcvs} ci -m new-branch aaa" \
- "Checking in aaa;
- ${CVSROOT_DIRNAME}/first-dir/aaa,v <-- aaa
- new revision: 1\.3\.2\.1; previous revision: 1\.3
- done"
- dotest_fail admin-22-o17 "${testcvs} admin -o1.2:1.4 aaa" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- deleting revision 1\.4
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/aaa,v: can't remove branch point 1\.3
- ${PROG} admin: RCS file for .aaa. not modified\."
- dotest admin-22-o18 "${testcvs} update -p -r1.4 aaa" \
- "===================================================================
- Checking out aaa
- RCS: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- VERS: 1\.4
- \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
- first rev
- second rev
- third rev
- fourth rev"
- echo second branch rev >> aaa
- dotest admin-22-o19 "${testcvs} ci -m branch-two aaa" \
- "Checking in aaa;
- ${CVSROOT_DIRNAME}/first-dir/aaa,v <-- aaa
- new revision: 1\.3\.2\.2; previous revision: 1\.3\.2\.1
- done"
- echo third branch rev >> aaa
- dotest admin-22-o20 "${testcvs} ci -m branch-three aaa" \
- "Checking in aaa;
- ${CVSROOT_DIRNAME}/first-dir/aaa,v <-- aaa
- new revision: 1\.3\.2\.3; previous revision: 1\.3\.2\.2
- done"
- echo fourth branch rev >> aaa
- dotest admin-22-o21 "${testcvs} ci -m branch-four aaa" \
- "Checking in aaa;
- ${CVSROOT_DIRNAME}/first-dir/aaa,v <-- aaa
- new revision: 1\.3\.2\.4; previous revision: 1\.3\.2\.3
- done"
- dotest admin-22-o22 "${testcvs} admin -o:1.3.2.3 aaa" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- deleting revision 1\.3\.2\.1
- deleting revision 1\.3\.2\.2
- deleting revision 1\.3\.2\.3
- done"
- dotest admin-22-o23 "${testcvs} log aaa" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- Working file: aaa
- head: 1\.4
- branch:
- locks: strict
- access list:
- symbolic names:
- br1: 1\.3\.0\.2
- keyword substitution: kv
- total revisions: 5; selected revisions: 5
- description:
- ----------------------------
- revision 1\.4
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- fourth
- ----------------------------
- revision 1\.3
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- branches: 1\.3\.2;
- third
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- second
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- first
- ----------------------------
- revision 1\.3\.2\.4
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}4 -0
- branch-four
- ============================================================================="
- dotest admin-22-o24 "${testcvs} -q update -p -r 1.3.2.4 aaa" \
- "first rev
- second rev
- third rev
- new branch rev
- second branch rev
- third branch rev
- fourth branch rev"
- # The bit here about how there is a "tagone" tag pointing to
- # a nonexistent revision is documented by rcs. I dunno, I
- # wonder whether the "cvs admin -o" should give a warning in
- # this case.
- dotest admin-23 "${testcvs} -q log file2" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- Working file: file2
- head: 1\.2
- branch:
- locks: strict
- access list:
- auth3
- auth2
- foo
- symbolic names:
- tagone: 1\.1
- br: 1\.1\.0\.2
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- modify
- ============================================================================="
- dotest admin-25 "cat ${CVSROOT_DIRNAME}/first-dir/file1,v" \
- "head 1\.1;
- access
- foo
- auth2;
- symbols;
- locks; strict;
- comment @xx@;
- 1\.1
- date [0-9][0-9]*\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]; author ${username}; state Exp;
- branches
- 1\.1\.2\.1;
- next ;
- 1\.1\.2\.1
- date [0-9][0-9]*\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]; author ${username}; state foo;
- branches;
- next ;
- desc
- @@
- 1\.1
- log
- @add
- @
- text
- @@
- 1\.1\.2\.1
- log
- @modify-on-branch
- @
- text
- @a0 1
- add a line on the branch
- @"
- # Tests of cvs admin -n. Make use of the results of
- # admin-1 through admin-25.
- # FIXME: We probably shouldn't make use of those results;
- # this test is way too long as it is.
- # tagtwo should be a revision
- #
- dotest admin-26-1 "${testcvs} admin -ntagtwo:tagone file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
-
- # br1 should be a branch
- #
- dotest admin-26-2 "${testcvs} admin -nbr1:br file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
-
- # Attach some tags using RCS versions
- #
- dotest admin-26-3 "${testcvs} admin -ntagthree:1.1 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
- dotest admin-26-4 "${testcvs} admin -nbr2:1.1.2 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
- dotest admin-26-5 "${testcvs} admin -nbr4:1.1.0.2 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
-
- # Check results so far
- #
- dotest admin-26-6 "${testcvs} status -v file2" \
- "===================================================================
- File: file2 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT_DIRNAME}/first-dir/file2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- br4 (branch: 1\.1\.2)
- br2 (branch: 1\.1\.2)
- tagthree (revision: 1\.1)
- br1 (branch: 1\.1\.2)
- tagtwo (revision: 1\.1)
- tagone (revision: 1\.1)
- br (branch: 1\.1\.2)"
-
- # Add a couple more revisions
- #
- echo "nuthr_line" >> file2
- dotest admin-27-1 "${testcvs} commit -m nuthr_line file2" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.3; previous revision: 1\.2
- done"
- echo "yet_another" >> file2
- dotest admin-27-2 "${testcvs} commit -m yet_another file2" \
- "Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- new revision: 1\.4; previous revision: 1\.3
- done"
-
- # Fail trying to reattach existing tag with -n
- #
- dotest admin-27-3 "${testcvs} admin -ntagfour:1.1 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
- dotest_fail admin-27-4 "${testcvs} admin -ntagfour:1.3 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/file2,v: symbolic name tagfour already bound to 1\.1
- ${PROG} admin: RCS file for .file2. not modified\."
-
- # Succeed at reattaching existing tag, using -N
- #
- dotest admin-27-5 "${testcvs} admin -Ntagfour:1.3 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done"
-
- # Fail on some bogus operations
- # Try to attach to nonexistant tag
- #
- dotest_fail admin-28-1 "${testcvs} admin -ntagsix:tagfive file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/file2,v: Symbolic name or revision tagfive is undefined\.
- ${PROG} admin: RCS file for .file2. not modified\."
-
- # Try a some nonexisting numeric target tags
- #
- dotest_fail admin-28-2 "${testcvs} admin -ntagseven:2.1 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- ${PROG} \[admin aborted\]: revision .2\.1. does not exist"
- dotest_fail admin-28-3 "${testcvs} admin -ntageight:2.1.2 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- ${PROG} \[admin aborted\]: revision .2\.1\.2. does not exist"
-
- # Try some invalid targets
- #
- dotest_fail admin-28-4 "${testcvs} admin -ntagnine:1.a.2 file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- ${PROG} \[admin aborted\]: tag .1\.a\.2. must start with a letter"
- # Confirm that a missing tag is not a fatal error.
- dotest admin-28-5.1 "${testcvs} -Q tag BO+GUS file1" ''
- dotest_fail admin-28-5.2 "${testcvs} admin -ntagten:BO+GUS file2 file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/file2,v: Symbolic name or revision BO${PLUS}GUS is undefined\.
- ${PROG} admin: RCS file for .file2. not modified\.
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done"
- dotest_fail admin-28-6 "${testcvs} admin -nq.werty:tagfour file2" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- ${PROG} \[admin aborted\]: tag .q\.werty. must not contain the characters ..*"
- # Verify the archive
- #
- dotest admin-29 "cat ${CVSROOT_DIRNAME}/first-dir/file2,v" \
- "head 1\.4;
- access
- auth3
- auth2
- foo;
- symbols
- tagfour:1\.3
- br4:1\.1\.0\.2
- br2:1\.1\.0\.2
- tagthree:1\.1
- br1:1\.1\.0\.2
- tagtwo:1\.1
- tagone:1\.1
- br:1\.1\.0\.2;
- locks; strict;
- comment @# @;
- 1\.4
- date [0-9][0-9]*\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]; author ${username}; state Exp;
- branches;
- next 1\.3;
- 1\.3
- date [0-9][0-9]*\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]; author ${username}; state Exp;
- branches;
- next 1\.2;
- 1\.2
- date [0-9][0-9]*\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]; author ${username}; state Exp;
- branches;
- next ;
- desc
- @@
- 1\.4
- log
- @yet_another
- @
- text
- @add a line
- nuthr_line
- yet_another
- @
- 1\.3
- log
- @nuthr_line
- @
- text
- @d3 1
- @
- 1\.2
- log
- @modify
- @
- text
- @d2 1
- @"
- dotest_fail admin-30 "${testcvs} admin -mbr:another-log-message \
- file2 aaa file3" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/file2,v: no such revision br: 1\.1
- ${PROG} admin: RCS file for .file2. not modified.
- RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/aaa,v: no such revision br
- ${PROG} admin: RCS file for .aaa. not modified.
- RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- done"
- dotest admin-31 "${testcvs} log" \
- "${PROG} log: Logging \.
- RCS file: ${CVSROOT_DIRNAME}/first-dir/aaa,v
- Working file: aaa
- head: 1\.4
- branch:
- locks: strict
- access list:
- symbolic names:
- br1: 1\.3\.0\.2
- keyword substitution: kv
- total revisions: 5; selected revisions: 5
- description:
- ----------------------------
- revision 1\.4
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- fourth
- ----------------------------
- revision 1\.3
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- branches: 1\.3\.2;
- third
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- second
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- first
- ----------------------------
- revision 1\.3\.2\.4
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}4 -0
- branch-four
- =============================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- foo
- auth2
- symbolic names:
- tagten: 1\.1
- BO${PLUS}GUS: 1\.1
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- branches: 1\.1\.2;
- add
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: foo; lines: ${PLUS}1 -0
- modify-on-branch
- =============================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- Working file: file2
- head: 1\.4
- branch:
- locks: strict
- access list:
- auth3
- auth2
- foo
- symbolic names:
- tagfour: 1\.3
- br4: 1\.1\.0\.2
- br2: 1\.1\.0\.2
- tagthree: 1\.1
- br1: 1\.1\.0\.2
- tagtwo: 1\.1
- tagone: 1\.1
- br: 1\.1\.0\.2
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- ----------------------------
- revision 1\.4
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- yet_another
- ----------------------------
- revision 1\.3
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- nuthr_line
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- modify
- =============================================================================
- RCS file: ${CVSROOT_DIRNAME}/first-dir/Attic/file3,v
- Working file: file3
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- br: 1\.1\.0\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: dead;
- branches: 1\.1\.2;
- file file3 was initially added on branch br\.
- ----------------------------
- revision 1\.1\.2\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- another-log-message
- ============================================================================="
- cd ../..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- # clean up our after ourselves
- rm -r 1
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- reserved)
- # Tests of reserved checkouts. Eventually this will test
- # rcslock.pl (or equivalent) and all kinds of stuff. Right
- # now it just does some very basic checks on cvs admin -u
- # and cvs admin -l.
- # Also should test locking on a branch (and making sure that
- # locks from one branch don't get mixed up with those from
- # another. Both the case where one of the branches is the
- # main branch, and in which neither one is).
- # See also test keyword, which tests that keywords and -kkvl
- # do the right thing in the presence of locks.
- # The usual setup, directory first-dir containing file file1.
- mkdir 1; cd 1
- dotest reserved-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest reserved-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch file1
- dotest reserved-3 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest reserved-4 "${testcvs} -q ci -m add" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest reserved-5 "${testcvs} -q admin -l file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- 1\.1 locked
- done"
- dotest reserved-6 "${testcvs} log -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- ${username}: 1\.1
- access list:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1 locked by: ${username};
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- add
- ============================================================================="
- # Note that this just tests the owner of the lock giving
- # it up. It doesn't test breaking a lock.
- dotest reserved-7 "${testcvs} -q admin -u file1" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- 1\.1 unlocked
- done"
- dotest reserved-8 "${testcvs} log -N file1" "
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- Working file: file1
- head: 1\.1
- branch:
- locks: strict
- access list:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- add
- ============================================================================="
- # rcslock.pl tests. Of course, the point isn't to test
- # rcslock.pl from the distribution but equivalent
- # functionality (for example, many sites may have an old
- # rcslock.pl). The functionality of this hook falls
- # short of the real rcslock.pl though.
- # Note that we can use rlog or look at the RCS file directly,
- # but we can't use "cvs log" because "cvs commit" has a lock.
- cat >${TESTDIR}/lockme <<EOF
- #!${TESTSHELL}
- line=\`grep <\$1/\$2,v 'locks $anyusername:1\.[0-9];'\`
- if test -z "\$line"; then
- # It isn't locked
- exit 0
- else
- user=\`echo \$line | sed -e 's/locks \\($anyusername\\):[0-9.]*;.*/\\1/'\`
- version=\`echo \$line | sed -e 's/locks $anyusername:\\([0-9.]*\\);.*/\\1/'\`
- echo "\$user has file a-lock locked for version \$version" >&2
- exit 1
- fi
- EOF
- # Cygwin. Blaaarg.
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod +x ${TESTDIR}/lockme"
- else
- chmod +x ${TESTDIR}/lockme
- fi
- echo stuff > a-lock
- dotest reserved-9 "${testcvs} add a-lock" \
- "${PROG} add: scheduling file .a-lock. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest reserved-10 "${testcvs} -q ci -m new a-lock" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/a-lock,v
- done
- Checking in a-lock;
- ${CVSROOT_DIRNAME}/first-dir/a-lock,v <-- a-lock
- initial revision: 1\.1
- done"
- # FIXME: the contents of CVSROOT fluctuate a lot
- # here. Maybe the expect pattern should just
- # confirm that commitinfo is one of the files checked out,
- # but for now we just check that CVS exited with success.
- cd ..
- if ${testcvs} -q co CVSROOT >>${LOGFILE} ; then
- pass reserved-11
- else
- fail reserved-11
- fi
- cd CVSROOT
- echo "DEFAULT ${TESTDIR}/lockme" >>commitinfo
- dotest reserved-12 "${testcvs} -q ci -m rcslock commitinfo" \
- "Checking in commitinfo;
- ${CVSROOT_DIRNAME}/CVSROOT/commitinfo,v <-- commitinfo
- new revision: 1\.2; previous revision: 1\.1
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..; cd first-dir
- # Simulate (approximately) what a-lock would look like
- # if someone else had locked revision 1.1.
- sed -e 's/locks; strict;/locks fred:1.1; strict;/' ${CVSROOT_DIRNAME}/first-dir/a-lock,v > a-lock,v
- # Cygwin.
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod 644 ${CVSROOT_DIRNAME}/first-dir/a-lock,v"
- else
- chmod 644 ${CVSROOT_DIRNAME}/first-dir/a-lock,v
- fi
- dotest reserved-13 "mv a-lock,v ${CVSROOT_DIRNAME}/first-dir/a-lock,v"
- # Cygwin. Blah.
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod 444 ${CVSROOT_DIRNAME}/first-dir/a-lock,v"
- else
- chmod 444 ${CVSROOT_DIRNAME}/first-dir/a-lock,v
- fi
- echo more stuff >> a-lock
- dotest_fail reserved-13b "${testcvs} ci -m '' a-lock" \
- "fred has file a-lock locked for version 1\.1
- ${PROG} commit: Pre-commit check failed
- ${PROG} \[commit aborted\]: correct above errors first!"
- # OK, now test "cvs admin -l" in the case where someone
- # else has the file locked.
- dotest_fail reserved-13c "${testcvs} admin -l a-lock" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/a-lock,v
- ${PROG} \[admin aborted\]: Revision 1\.1 is already locked by fred"
- dotest reserved-14 "${testcvs} admin -u1.1 a-lock" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/a-lock,v
- ${PROG} admin: ${CVSROOT_DIRNAME}/first-dir/a-lock,v: revision 1\.1 locked by fred; breaking lock
- 1\.1 unlocked
- done"
- dotest reserved-15 "${testcvs} -q ci -m success a-lock" \
- "Checking in a-lock;
- ${CVSROOT_DIRNAME}/first-dir/a-lock,v <-- a-lock
- new revision: 1\.2; previous revision: 1\.1
- done"
- # Now test for a bug involving branches and locks
- sed -e 's/locks; strict;/locks fred:1.2; strict;/' ${CVSROOT_DIRNAME}/first-dir/a-lock,v > a-lock,v
- chmod 644 ${CVSROOT_DIRNAME}/first-dir/a-lock,v
- dotest reserved-16 \
- "mv a-lock,v ${CVSROOT_DIRNAME}/first-dir/a-lock,v" ""
- chmod 444 ${CVSROOT_DIRNAME}/first-dir/a-lock,v
- dotest reserved-17 "${testcvs} -q tag -b br a-lock" "T a-lock"
- dotest reserved-18 "$testcvs -q update -r br a-lock" '[UP] a-lock'
- echo edit it >>a-lock
- dotest reserved-19 "${testcvs} -q ci -m modify a-lock" \
- "Checking in a-lock;
- ${CVSROOT_DIRNAME}/first-dir/a-lock,v <-- a-lock
- new revision: 1\.2\.2\.1; previous revision: 1\.2
- done"
- # undo commitinfo changes
- cd ../CVSROOT
- echo '# vanilla commitinfo' >commitinfo
- dotest reserved-cleanup-1 "${testcvs} -q ci -m back commitinfo" \
- "Checking in commitinfo;
- ${CVSROOT_DIRNAME}/CVSROOT/commitinfo,v <-- commitinfo
- new revision: 1\.3; previous revision: 1\.2
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ..; rm -r CVSROOT; cd first-dir
- cd ../..
- rm -r 1
- rm ${TESTDIR}/lockme
- rm -rf ${CVSROOT_DIRNAME}/first-dir
- ;;
- diffmerge1)
- # Make sure CVS can merge correctly in circumstances where it
- # used to mess up (due to a bug which existed in diffutils 2.7
- # and 2.6, but not 2.5, and which has been fixed in CVS's diff
- # lib by Paul Eggert, bless his bitty heart).
- # This first test involves two working copies, "mine" and
- # "yours", checked out from the same repository at the same
- # time. In yours, you remove some text from the end of the
- # file and check it in; meanwhile, "me" has commented out some
- # lines earlier in the file, and I go to check it in right
- # after you checked yours in. CVS naturally tells me the file
- # is not up-to-date, so I run cvs update, but it updates
- # incorrectly, leaving in the lines of text you just deleted.
- # Bad! I'm in too much of a hurry to actually look at the
- # file, so I check it in and go home, and so your changes have
- # been lost. Later you discover this, and you suspect me of
- # deliberately sabotaging your work, so you let all the air
- # out of my tires. Only after a series of expensive lawsuits
- # and countersuits do we discover that this was all CVS's
- # fault.
- #
- # Luckily, this problem has been fixed now, as our test will
- # handily confirm, no doubt:
- # First make a repository containing the original text:
- # We should be here anyway, but cd to it just in case:
- cd ${TESTDIR}
- mkdir diffmerge1
- cd diffmerge1
- # These are the files we both start out with:
- mkdir import
- cd import
- diffmerge_create_older_files
- dotest diffmerge1_import \
- "${testcvs} import -m import diffmerge1 tag1 tag2" \
- "${DOTSTAR}No conflicts created by this import"
- cd ..
- # Check out two working copies, one for "you" and one for
- # "me". If no branch is used and cvs detects that only one
- # of the two people made changes, then cvs does not run the
- # merge algorithm. But if a branch is used, then cvs does run
- # the merge algorithm (even in this case of only one of the two
- # people having made changes). CVS used to have a bug in this
- # case. Therefore, it is important to test this case by
- # using a branch:
- ${testcvs} rtag -b tag diffmerge1 >/dev/null 2>&1
- ${testcvs} checkout -r tag diffmerge1 >/dev/null 2>&1
- mv diffmerge1 yours
- ${testcvs} checkout diffmerge1 >/dev/null 2>&1
- mv diffmerge1 mine
- # In your working copy, you'll make changes, and
- # then check in your changes before I check in mine:
- cd yours
- diffmerge_create_your_files
- dotest diffmerge1_yours "${testcvs} -q ci -m yours" \
- "Checking in testcase01;
- ${CVSROOT_DIRNAME}/diffmerge1/testcase01,v <-- testcase01
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done
- Checking in testcase02;
- ${CVSROOT_DIRNAME}/diffmerge1/testcase02,v <-- testcase02
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done
- Checking in testcase03;
- ${CVSROOT_DIRNAME}/diffmerge1/testcase03,v <-- testcase03
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done
- Checking in testcase04;
- ${CVSROOT_DIRNAME}/diffmerge1/testcase04,v <-- testcase04
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done
- Checking in testcase05;
- ${CVSROOT_DIRNAME}/diffmerge1/testcase05,v <-- testcase05
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done
- Checking in testcase06;
- ${CVSROOT_DIRNAME}/diffmerge1/testcase06,v <-- testcase06
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done
- Checking in testcase07;
- ${CVSROOT_DIRNAME}/diffmerge1/testcase07,v <-- testcase07
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done
- Checking in testcase08;
- ${CVSROOT_DIRNAME}/diffmerge1/testcase08,v <-- testcase08
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done
- Checking in testcase09;
- ${CVSROOT_DIRNAME}/diffmerge1/testcase09,v <-- testcase09
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done
- Checking in testcase10;
- ${CVSROOT_DIRNAME}/diffmerge1/testcase10,v <-- testcase10
- new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
- done"
- # Change my copy. Then I
- # update, after both my modifications and your checkin:
- cd ../mine
- diffmerge_create_my_files
- dotest diffmerge1_mine "${testcvs} -q update -j tag" \
- "M testcase01
- RCS file: ${CVSROOT_DIRNAME}/diffmerge1/testcase01,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.1\.2\.1
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1 into testcase01
- M testcase02
- RCS file: ${CVSROOT_DIRNAME}/diffmerge1/testcase02,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.1\.2\.1
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1 into testcase02
- M testcase03
- RCS file: ${CVSROOT_DIRNAME}/diffmerge1/testcase03,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.1\.2\.1
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1 into testcase03
- M testcase04
- RCS file: ${CVSROOT_DIRNAME}/diffmerge1/testcase04,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.1\.2\.1
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1 into testcase04
- RCS file: ${CVSROOT_DIRNAME}/diffmerge1/testcase05,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.1\.2\.1
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1 into testcase05
- RCS file: ${CVSROOT_DIRNAME}/diffmerge1/testcase06,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.1\.2\.1
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1 into testcase06
- M testcase07
- RCS file: ${CVSROOT_DIRNAME}/diffmerge1/testcase07,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.1\.2\.1
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1 into testcase07
- testcase07 already contains the differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1
- M testcase08
- RCS file: ${CVSROOT_DIRNAME}/diffmerge1/testcase08,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.1\.2\.1
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1 into testcase08
- M testcase09
- RCS file: ${CVSROOT_DIRNAME}/diffmerge1/testcase09,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.1\.2\.1
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1 into testcase09
- M testcase10
- RCS file: ${CVSROOT_DIRNAME}/diffmerge1/testcase10,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.1\.1\.1\.2\.1
- Merging differences between 1\.1\.1\.1 and 1\.1\.1\.1\.2\.1 into testcase10"
- # So if your changes didn't make it into my working copy, or
- # in any case if the files do not look like the final text
- # in the files in directory comp_me, then the test flunks:
- cd ..
- mkdir comp_me
- cd comp_me
- diffmerge_create_expected_files
- cd ..
- rm mine/.#*
- # If you have GNU's version of diff, you may try
- # uncommenting the following line which will give more
- # fine-grained information about how cvs differed from the
- # correct result:
- #dotest diffmerge1_cmp "diff -u --recursive --exclude=CVS comp_me mine" ''
- dotest diffmerge1_cmp "directory_cmp comp_me mine"
- # Clean up after ourselves:
- cd ..
- if $keep; then :; else
- rm -rf diffmerge1 ${CVSROOT_DIRNAME}/diffmerge1
- fi
- ;;
- diffmerge2)
- # FIXME: This test should be rewritten to be much more concise.
- # It currently weighs in at something like 600 lines, but the
- # same thing could probably be tested in more like 50-100 lines.
- mkdir diffmerge2
- # This tests for another diffmerge bug reported by Martin
- # Tomes; actually, his bug was probably caused by an initial
- # fix for the bug in test diffmerge1, and likely wasn't ever
- # a problem in CVS as long as one was using a normal
- # distribution of diff or a version of CVS that has the diff
- # lib in it.
- #
- # Nevertheless, once burned twice cautious, so we test for his
- # bug here.
- #
- # Here is his report, more or less verbatim:
- # ------------------------------------------
- #
- # Put the attached file (sgrid.h,v) into your repository
- # somewhere, check out the module and do this:
- #
- # cvs update -j Review_Phase_2_Enhancements sgrid.h
- # cvs diff -r Review_V1p3 sgrid.h
- #
- # As there have been no changes made on the trunk there
- # should be no differences, however this is output:
- #
- # % cvs diff -r Review_V1p3 sgrid.h
- # Index: sgrid.h
- # ===================================================================
- # RCS file: /usr/local/repository/play/fred/sgrid.h,v
- # retrieving revision 1.1.2.1
- # diff -r1.1.2.1 sgrid.h
- # 178a179,184
- # > /*--------------------------------------------------------------
- # > INLINE FUNCTION : HORIZONTALLINES
- # > NOTES : Description at the end of the file
- # > ----------------------------------------------------------------*/
- # > uint16 horizontalLines( void );
- # >
- #
- # I did a cvs diff -c -r 1.1 -r 1.1.2.1 sgrid.h and patched those
- # differences to sgrid.h version 1.1 and got the correct result
- # so it looks like the built in patch is faulty.
- # -------------------------------------------------------------------
- #
- # This is the RCS file, sgrid.h,v, that he sent:
- echo "head 1.1;
- access;
- symbols
- Review_V1p3:1.1.2.1
- Review_V1p3C:1.1.2.1
- Review_1p3A:1.1.2.1
- Review_V1p3A:1.1.2.1
- Review_Phase_2_Enhancements:1.1.0.2
- Review_V1p2:1.1
- Review_V1p2B:1.1
- Review_V1p2A:1.1
- Review_V1p1:1.1
- Review_1p1:1.1;
- locks; strict;
- comment @ * @;
- 1.1
- date 97.04.02.11.20.05; author colinl; state Exp;
- branches
- 1.1.2.1;
- next ;
- 1.1.2.1
- date 97.06.09.10.00.07; author colinl; state Exp;
- branches;
- next ;
- desc
- @@
- 1.1
- log
- @Project: DEV1175
- DCN:
- Tested By: Colin Law
- Reviewed By:
- Reason for Change: Initial Revision of all files
- Design Change Details:
- Implications:
- @
- text
- @/* \$""Header: L:/gpanels/dis/sgrid.h_v 1.1.1.0 24 Jan 1996 14:59:20 PAULT \$ */
- /*
- * \$""Log: L:/gpanels/dis/sgrid.h_v \$
- *
- * Rev 1.1.1.0 24 Jan 1996 14:59:20 PAULT
- * Branched
- *
- * Rev 1.1 24 Jan 1996 12:09:52 PAULT
- * Consolidated 4100 code merged to trunk
- *
- * Rev 1.0.2.0 01 Jun 1995 14:18:58 DAVEH
- * Branched
- *
- * Rev 1.0 19 Apr 1995 16:32:48 COLINL
- * Initial revision.
- */
- /*****************************************************************************
- FILE : SGRID.H
- VERSION : 2.1
- AUTHOR : Dave Hartley
- SYSTEM : Borland C++
- DESCRIPTION : The declaration of the scrolling grid class
-
- *****************************************************************************/
- #if !defined(__SGRID_H)
- #define __SGRID_H
- #if !defined(__SCROLL_H)
- #include <scroll.h>
- #endif
- #if !defined(__GKI_H)
- #include \"gki.h\"
- #endif
- #if defined PRINTING_SUPPORT
- class Printer;
- #endif
- /*****************************************************************************
- CLASS : ScrollingGrid
- DESCRIPTION: This class inherits from a grid and a scrollable, and
- can therefore use all the PUBLIC services provided by these
- classes. A description of these can be found in
- GRID.H and SCROLL.H.
- A scrolling grid is a set of horizontal and vertical lines
- that scroll and continually update to provide a complete grid
- *****************************************************************************/
- class ScrollingGrid : public Scrollable
- {
- public:
- #if defined _WINDOWS
- /*---------------------------------------------------------------------------
- FUNCTION : CONSTRUCTOR
- DESCRIPTION : sets up the details of the grid, ready for painting
- ARGUMENTS : name : sgColour
- - the colour of the grid
- sgLineType
- - the syle of line
- sgHorizontalTotal
- - the total number of horizontal grid lines
- verticalSpacingMin
- - the min distance between the vertical grid lines
- on the scrolling axis
- currentTimestamp
- - timestamp value now
- ticksPerSecond
- - number of timestamp ticks per second
- ticksPerPixel
- - number of timestamp ticks per pixel required
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- ScrollingGrid( GkiColour sgColour, GkiLineType sgLineType,
- uint16 sgHorizontalTotal,
- uint16 verticalSpacingMin, uint32 currentTimestamp,
- uint16 ticksPerSecond, uint32 ticksPerPixel );
- #else
- /*---------------------------------------------------------------------------
- FUNCTION : CONSTRUCTOR
- DESCRIPTION : sets up the details of the grid, ready for painting
- ARGUMENTS : name : sgColour
- - the colour of the grid
- sgLineType
- - the syle of line
- sgHorizontalTotal ( THE MAX NUMBER OF LINES IS 100 )
- - the total number of horizontal grid lines
- sgVerticalSpacing
- - the distance between the vertical grid lines
- on the scrolling axis
-
- RETURN : None
- NOTES : If the caller does not get the total grid lines value, synced
- with the overall size of the viewport, the spacing between
- grid lines will not be consistent.
- ---------------------------------------------------------------------------*/
- ScrollingGrid( GkiColour sgColour, GkiLineType sgLineType
- , uint16 sgHorizontalTotal, uint16 sgVerticalSpacing );
- #endif
- /*---------------------------------------------------------------------------
- FUNCTION : DESTRUCTOR
- DESCRIPTION : tidies it all up
- ARGUMENTS : name :
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- ~ScrollingGrid( void );
- /*---------------------------------------------------------------------------
- FUNCTION : ATTACH
- DESCRIPTION : This service overloads the base class service, as it does
- additional work at the time of attachment.
- ARGUMENTS : name : tDrawingArea
- - the scrolled viewport to attach this trend to
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void attach( SViewport *tDrawingArea );
- #if defined _WINDOWS
- /*---------------------------------------------------------------------------
- FUNCTION : calculateVerticalSpacing
- DESCRIPTION : determines optimum spacing along time axis
- ARGUMENTS :
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void calculateVerticalSpacing();
- /*---------------------------------------------------------------------------
- FUNCTION : gridSpacingTicks
- DESCRIPTION : Provides the grid spacing in the time axis in ticks
- ARGUMENTS :
- RETURN : Number of ticks
- NOTES :
- ---------------------------------------------------------------------------*/
- uint32 gridSpacingTicks();
- #endif
- /*---------------------------------------------------------------------------
- INLINE FUNCTION : HORIZONTALLINES
- NOTES : Description at the end of the file
- ---------------------------------------------------------------------------*/
- uint16 horizontalLines( void );
- #if defined _WINDOWS
- // In Windows the OnDraw() function replaces paint()
- /*---------------------------------------------------------------------------
- FUNCTION : ScrollingGrid OnDraw
- DESCRIPTION : Paints the given area of the grid.
- Pure virtual
- ARGUMENTS : pDC pointer to the device context to use for display
- Note that the device context operates in the coords
- of the window owning the viewport
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- virtual void OnDraw( CDC *pDC );
- #else // not Windows
- /*---------------------------------------------------------------------------
- FUNCTION : PAINT
- DESCRIPTION : This extends the standard grid paint method to paint the
- viewport relative to its current position.
-
- ARGUMENTS : name :
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void paint( void );
- #endif
- /*---------------------------------------------------------------------------
- FUNCTION : P A I N T T E X T M A R K E R S
- DESCRIPTION : this service allow the text markers to be painted seperatley
- from the grid lines
- ARGUMENTS : name :
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void paintTextMarkers();
- #if defined PRINTING_SUPPORT
- /*---------------------------------------------------------------------------
- FUNCTION : P R I N T
- DESCRIPTION : This print service prints a grid marker ( being either a
- timestamp or a date, IF there is one at the plot position
- given
- ARGUMENTS : name :
- displayPosition
- - Where in the log to look to see if there is an
- entry to print
- - printerPtr
- the printer to print to
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void print( uint16 currentPrintPos, Printer *printerPtr );
- #endif
- /*---------------------------------------------------------------------------
- FUNCTION : S E T D R I V E D I R E C T I O N
- DESCRIPTION : Sets direction for update and scrolling forwards or backwards
- ARGUMENTS : direction - required direction
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void setDriveDirection( ScrollDirection direction );
- /*---------------------------------------------------------------------------
- FUNCTION : S E T U P
- DESCRIPTION : service that will setup the grid prior to a paint
- ARGUMENTS : name :
- - newTimestamp
-
- - newTimeBase
- the number of ticks that represent a plot point on
- the trendgraph.
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void setup( uint32 newTimestamp, uint32 newTimeBase );
- #if defined PRINTING_SUPPORT
- /*---------------------------------------------------------------------------
- FUNCTION : S E T U P F O R P R I N T
- DESCRIPTION : This service iis to be called prior to printing. It allows
- the grid to prepare its markers ready for the print
- commands
- ARGUMENTS : name :
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void setupForPrint();
- #endif
- /*---------------------------------------------------------------------------
- FUNCTION : UPDATE
- DESCRIPTION : When this service is called it will calculate what needs to
- be painted and fill in the display again.
- ARGUMENTS : name : timeStamp
- - the reference time of this update.
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void update( uint32 timeStamp );
- /*---------------------------------------------------------------------------
- FUNCTION : U P D A T E B U F F E R
- DESCRIPTION : When a display update is not required, use this method. It
- updates the internal data ready for a call to paint that
- will then show the grid in the right position
- ARGUMENTS : name :
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void updateBuffer( void );
- private:
- /*---------------------------------------------------------------------------
- FUNCTION : M A K E G R I D M A R K E R
- DESCRIPTION : service that perpares a string for display. The string will
- either be a short date, or short time. this is determined
- by the current setting of the dateMarker flag
- ARGUMENTS : name : timestampVal
- - the value to convert
-
- storePtr
- - the place to put the string
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void makeGridMarker( uint32 timestampVal, char *storePtr );
-
- /*---------------------------------------------------------------------------
- FUNCTION : P A I N T G R I D M A R K E R
- DESCRIPTION : given a position will put the string on the display
- ARGUMENTS : name :
- yPos
- - were it goes on the Y-axis
- gridMarkerPtr
- - what it is
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void paintGridMarker( uint16 yPos, char *gridMarkerPtr );
- #if defined _WINDOWS
- /*---------------------------------------------------------------------------
- FUNCTION : PAINTHORIZONTALLINES
- DESCRIPTION : responsible for painting the grids horizontal lines
- ARGUMENTS : pRectToDraw pointer to rectangle that needs refreshing.
- in viewport coords
- pDC pointer to device context to use
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void paintHorizontalLines(RectCoords* pRectToDraw, CDC* pDC );
- #else
- /*---------------------------------------------------------------------------
- FUNCTION : PAINTHORIZONTALLINES
- DESCRIPTION : responsible for painting the grids horizontal lines
- ARGUMENTS : name: xStart
- - the starting X co-ordinate for the horizontal line
- xEnd
- - the ending X co-ordinate for the horizontal line
-
- RETURN : None
- NOTES : Remember lines are drawn from origin. The origin in a
- horizontal viewport will be the top.
- ---------------------------------------------------------------------------*/
- void paintHorizontalLines( uint16 xStart, uint16 xEnd );
- #endif
- #if defined _WINDOWS
- /*---------------------------------------------------------------------------
- FUNCTION : PAINTVERTICALLINES
- DESCRIPTION : responsible for painting the grids vertical lines
- ARGUMENTS : pRectToDraw pointer to rectangle that needs refreshing.
- in viewport coords
- offset offset from rhs that rightmost line would be
- drawn if rectangle included whole viewport
- pDC pointer to device context to use
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void paintVerticalLines( RectCoords* pRectToDraw, uint16 offset,
- CDC* pDC );
- #else
- /*---------------------------------------------------------------------------
- FUNCTION : PAINTVERTICALLINES
- DESCRIPTION : responsible for painting the grids vertical lines
- ARGUMENTS : name : yStart
- - the starting Y co-ordinate for the vertical line
- yEnd
- - the ending Y co-ordinate for the vertical line
- offset
- - a starting point offset that determines at what X
- position the first line will be drawn
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void paintVerticalLines( uint16 yStart, uint16 yEnd, uint16 offset );
- #endif
- #if defined _WINDOWS
- /*---------------------------------------------------------------------------
- FUNCTION : PAINTVERTICALLINE
- DESCRIPTION : paints one line at the position specified, and length
- ARGUMENTS : name : yStart
- - the starting point on the y axis for the line
- yEnd
- - the end point on the y axis for the line
- xPosition
- - The horizontal offset from the start of the viewport
- pDC pointer to device context to use
-
- RETURN : None
- NOTES : There is not an equivalent horizontal method as yet. This
- is a seperate method because the service is useful to a
- derivation of this class
- ---------------------------------------------------------------------------*/
- void paintVerticalLine( uint16 yStart, uint16 yEnd
- , uint16 xPosition, CDC *pDC );
- #else
- /*---------------------------------------------------------------------------
- FUNCTION : PAINTVERTICALLINE
- DESCRIPTION : paints one line at the position specified, and length
- ARGUMENTS : name : yStart
- - the starting point on the y axis for the line
- yEnd
- - the end point on the y axis for the line
- xPosition
- - The horizontal offset from the start of the viewport
-
- RETURN : None
- NOTES : There is not an equivalent horizontal method as yet. This
- is a seperate method because the service is useful to a
- derivation of this class
- ---------------------------------------------------------------------------*/
- void paintVerticalLine( uint16 yStart, uint16 yEnd
- , uint16 xPosition );
- #endif
- /*---------------------------------------------------------------------------
- INLINE FUNCTION : VERTICALSPACING
- NOTES : Description at the end of the file
- ---------------------------------------------------------------------------*/
- uint16 verticalSpacing( void );
- // Position in viewport that we are now writing to if going forwards
- // Note that if this is greater than viewport length then we have
- // just scrolled and value must be adjusted before use.
- sint16 forwardsOutputPosition;
-
- // Position in viewport that we are now writing to if going backwards
- // Note that if this is less than zero then we have
- // just scrolled and value must be adjusted before use.
- sint16 backwardsOutputPosition;
- // position in grid cycle of forwards output position.
- // if zero then it is time to output a grid line
- sint16 forwardsIntervalCount;
- // position in grid cycle of forwards output position.
- // if zero then it is time to output a grid line
- sint16 backwardsIntervalCount;
-
- uint32 lastUpdateTimestamp;
- uint32 timeBase; // ticks per pixel
- uint16 currentOutputPosition;
- uint16 gridTimestampSpacing;
- uint16 intervalCount;
- uint16 horizontalTotal;
- uint16 vSpacing;
- #if defined PRINTING_SUPPORT
- uint16 numberOfGridMarkersPrinted;
- #endif
- bool firstTime; // indicates first time through
- bool dateMarker;
- GkiLineType lineType;
- GkiColour gridColour;
- #if defined _WINDOWS
- uint16 ticksPerSec; // number of time ticks per second
- uint16 vSpacingMin; // minimum pixels per division along time axis
- CPen *pPen; // the pen to use for drawing in windows
- #endif
- };
- /*****************************************************************************
- I N L I N E F U N C T I O N S
- *****************************************************************************/
- /*---------------------------------------------------------------------------
- FUNCTION : HORIZONTALLINES
- DESCRIPTION : supplies the number of horizontal lines in the grid
- ARGUMENTS : name :
-
- RETURN :
- NOTES :
- ---------------------------------------------------------------------------*/
- inline uint16 ScrollingGrid::horizontalLines( void )
- {
- return( horizontalTotal );
- }
- /*---------------------------------------------------------------------------
- FUNCTION : VERTICALSPACING
- DESCRIPTION : returns the distance between adjacent vertical lines
- ARGUMENTS : name :
-
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- inline uint16 ScrollingGrid::verticalSpacing( void )
- {
- return( vSpacing );
- }
- #endif
- @
- 1.1.2.1
- log
- @DEV1194:DS4 Provision of major and minor grid lines
- @
- text
- @d1 1
- a1 1
- /* \$""Header: /usr/local/repository/cmnsrc/review/src/sgrid.h,v 1.1 1997/04/02 11:20:05 colinl Exp \$ */
- d3 1
- a3 12
- * \$""Log: sgrid.h,v \$
- * Revision 1.1 1997/04/02 11:20:05 colinl
- * Project: DEV1175
- * DCN:
- * Tested By: Colin Law
- * Reviewed By:
- * Reason for Change: Initial Revision of all files
- *
- * Design Change Details:
- *
- * Implications:
- *
- d58 6
- a63 5
- ARGUMENTS : name : majorColour colour for major grid lines
- minorColour colour for minor grid lines
- sgLineType line type for minor grid lines
- yMajorGridLines number of major y lines on grid
- yMinorGridLines number of major y lines on grid
- d77 2
- a78 3
- ScrollingGrid( GkiColour majorColour, GkiColour minorColour,
- GkiLineType sgLineType,
- uint16 yMajorGridLines, uint16 yMinorGridLines,
- a137 17
- FUNCTION : DrawHorizontalGridLines
- DESCRIPTION : Draws major or minor grid lines
- ARGUMENTS : pDC device context
- pPen pen to use
- numLines total lines required
- yLow, yHigh, xLow, xHigh rectangle to draw in
- yMax max y value
- RETURN : None
- NOTES :
- ---------------------------------------------------------------------------*/
- void DrawHorizontalGridLines( CDC* pDC, CPen* pPen,
- uint16 numLines,
- uint16 yLow, uint16 yHigh, uint16 xLow, uint16 xHigh,
- uint16 yMax );
- /*---------------------------------------------------------------------------
- d148 6
- d448 1
- a448 2
- uint16 m_yMajorGridLines;
- uint16 m_yMinorGridLines;
- d456 2
- a457 3
- GkiLineType lineType; // line type for minor grid lines
- GkiColour m_majorColour;
- GkiColour m_minorColour;
- d462 1
- a462 2
- CPen *pMajorPen; // pen to use for drawing major grid lines
- CPen *pMinorPen; // pen to use for drawing minor grid lines
- d472 12
- @" > diffmerge2/sgrid.h,v
- # We have to put the RCS file in the repository by hand for
- # this test:
- mkdir ${CVSROOT_DIRNAME}/diffmerge2
- cp diffmerge2/sgrid.h,v ${CVSROOT_DIRNAME}/diffmerge2/sgrid.h,v
- rm -rf diffmerge2
- dotest diffmerge2_co \
- "${testcvs} co diffmerge2" "${DOTSTAR}U ${DOTSTAR}"
- cd diffmerge2
- dotest diffmerge2_update \
- "${testcvs} update -j Review_Phase_2_Enhancements sgrid.h" \
- "${DOTSTAR}erging ${DOTSTAR}"
- # This is the one that counts -- there should be no output:
- dotest diffmerge2_diff \
- "${testcvs} diff -r Review_V1p3 sgrid.h" ''
- cd ..
- rm -rf diffmerge2
- rm -rf ${CVSROOT_DIRNAME}/diffmerge2
- ;;
- release)
- # Tests of "cvs release", particularly multiple arguments.
- # Other CVS release tests:
- # info-cleanup-0 for "cvs -n release".
- # ignore-193 for the text of the question that cvs release asks.
- # Also for interactions with cvsignore.
- # basicc: "-d .", global -Q, no arguments (is a noop),
- # "cvs release" without -d, multiple arguments.
- # dirs-4: repository directory has been deleted.
- # modules2-6: multiple arguments.
- # First the usual setup; create a directory first-dir.
- mkdir 1; cd 1
- dotest release-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest release-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- mkdir dir1
- dotest release-3 "${testcvs} add dir1" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir1 added to the repository"
- mkdir dir2
- dotest release-4 "${testcvs} add dir2" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir2 added to the repository"
- cd dir2
- mkdir dir3
- dotest release-5 "${testcvs} add dir3" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir2/dir3 added to the repository"
- cd ../..
- dotest release-6 "${testcvs} release -d first-dir/dir2/dir3 first-dir/dir1" \
- "You have .0. altered files in this repository.
- Are you sure you want to release (and delete) directory .first-dir/dir2/dir3.: \
- You have .0. altered files in this repository.
- Are you sure you want to release (and delete) directory .first-dir/dir1.: " <<EOF
- yes
- yes
- EOF
- dotest_fail release-7 "test -d first-dir/dir1" ''
- dotest_fail release-8 "test -d first-dir/dir2/dir3" ''
- dotest release-9 "${testcvs} update" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating first-dir
- ${PROG} update: Updating first-dir/dir2"
- cd first-dir
- mkdir dir1
- dotest release-10 "${testcvs} add dir1" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir1 added to the repository"
- cd dir2
- mkdir dir3
- dotest release-11 "${testcvs} add dir3" \
- "Directory ${CVSROOT_DIRNAME}/first-dir/dir2/dir3 added to the repository"
- cd ../..
- dotest release-12 "${testcvs} release first-dir/dir2/dir3 first-dir/dir1" \
- "You have .0. altered files in this repository.
- Are you sure you want to release directory .first-dir/dir2/dir3.: .. .release. aborted by user choice.
- You have .0. altered files in this repository.
- Are you sure you want to release directory .first-dir/dir1.: " <<EOF
- no
- yes
- EOF
- dotest release-13 "${testcvs} release first-dir/dir2/dir3 first-dir/dir2" \
- "You have .0. altered files in this repository.
- Are you sure you want to release directory .first-dir/dir2/dir3.: \
- You have .0. altered files in this repository.
- Are you sure you want to release directory .first-dir/dir2.: " <<EOF
- yes
- yes
- EOF
- dotest release-14 "test -d first-dir/dir1" ''
- dotest release-15 "test -d first-dir/dir2/dir3" ''
- rm -rf first-dir/dir1 first-dir/dir2
- dotest release-16 "${testcvs} update" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating first-dir"
- # Check to make sure release isn't overwriting a
- # CVS/Entries file in the current directory (using data
- # from the released directory).
- # cvs 1.11 (remote) fails on release-21 (a message about
- # chdir into the removed directory), although it seemingly
- # unedits and removes the directory correctly. If
- # you manually continue, it then fails on release-22 do
- # to the messed up CVS/Entries file from release-21.
- cd first-dir
- mkdir second-dir
- dotest release-18 "$testcvs add second-dir" \
- "Directory $CVSROOT_DIRNAME/first-dir/second-dir added to the repository"
- cd second-dir
- touch file1
- dotest release-19 "$testcvs -Q add file1"
- dotest release-20 '$testcvs -q ci -m add' \
- "RCS file: $CVSROOT_DIRNAME/first-dir/second-dir/file1,v
- done
- Checking in file1;
- $CVSROOT_DIRNAME/first-dir/second-dir/file1,v <-- file1
- initial revision: 1\.1
- done"
- dotest release-21 "$testcvs edit file1"
- cd ..
- dotest release-22 "echo yes | $testcvs release -d second-dir" \
- "You have \[0\] altered files in this repository.
- Are you sure you want to release (and delete) directory \`second-dir': "
- dotest release-23 "$testcvs -q update -d" "U second-dir/file1"
- dotest release-24 "$testcvs edit"
- cd ../..
- rm -rf 1 $CVSROOT_DIRNAME/first-dir
- ;;
- recase)
- #
- # Some tests of behavior which broke at one time or another when run
- # from case insensitive clients against case sensitive servers.
- #
- # These tests are namned according to the following convention:
- #
- # ci Client (sandbox filesystem) case Insensitive
- # cs Client (sandbox filesystem) case Sensitive
- # si Server (repository filesystem) case Insensitive
- # ss Server (repository filesystem) case Sensitive
- #
- mkdir 1; cd 1
- # First, we will expect different results for a few of these tests
- # based on whether the repository is on a case sensitive filesystem
- # or not and whether the sandbox is on a case sensitive filesystem or
- # not, so determine which cases we are dealing with:
- echo file >file
- echo FiLe >FiLe
- if cmp file FiLe >/dev/null; then
- client_sensitive=false
- else
- client_sensitive=:
- fi
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost 'echo file >file'
- $CVS_RSH $remotehost 'echo FiLe >FiLe'
- if $CVS_RSH $remotehost 'cmp file FiLe >/dev/null'; then
- server_sensitive=false
- else
- server_sensitive=:
- fi
- else
- server_sensitive=$client_sensitive
- fi
- # The first test (recase-1 & recase-2) is for a remove of a file then
- # a readd in a different case.
- mkdir $CVSROOT_DIRNAME/first-dir
- dotest recase-init-1 "$testcvs -Q co first-dir"
- cd first-dir
- echo this file has no content >file
- dotest recase-init-2 "$testcvs -Q add file"
- dotest recase-init-3 "$testcvs -Q ci -madd" \
- "RCS file: $CVSROOT_DIRNAME/first-dir/file,v
- done
- Checking in file;
- $CVSROOT_DIRNAME/first-dir/file,v <-- file
- initial revision: 1\.1
- done"
- dotest recase-init-4 "$testcvs -Q tag first"
- # Now remove the file.
- dotest recase-init-5 "$testcvs -Q rm -f file"
- dotest recase-init-6 "$testcvs -Q ci -mrm" \
- "Removing file;
- $CVSROOT_DIRNAME/first-dir/file,v <-- file
- new revision: delete; previous revision: 1\.1
- done"
- # Now the test - readd in a different case.
- echo this file needs some content >FiLe
- if $server_sensitive; then
- dotest recase-1ss "$testcvs add FiLe" \
- "$PROG add: scheduling file \`FiLe' for addition
- $PROG add: use '$PROG commit' to add this file permanently"
- dotest recase-2ss "$testcvs -q ci -mrecase" \
- "RCS file: $CVSROOT_DIRNAME/first-dir/FiLe,v
- done
- Checking in FiLe;
- $CVSROOT_DIRNAME/first-dir/FiLe,v <-- FiLe
- initial revision: 1\.1
- done"
- else # server insensitive
- dotest recase-1si "$testcvs add FiLe" \
- "$PROG add: Re-adding file \`FiLe' (in place of dead revision 1\.2)\.
- $PROG add: use '$PROG commit' to add this file permanently"
- dotest recase-2si "$testcvs -q ci -mrecase" \
- "Checking in FiLe;
- $CVSROOT_DIRNAME/first-dir/FiLe,v <-- FiLe
- new revision: 1\.3; previous revision: 1\.2
- done"
- fi
- # Now verify that a checkout will still work
- cd ../..
- mkdir 2; cd 2
- dotest recase-3 "$testcvs -q co first-dir" \
- "U first-dir/FiLe"
- cd first-dir
- # Prove that we can still get status and log information on
- # conflicting case files (1 in Attic, one in parent).
- if $remote; then
- if $client_sensitive; then
- file=file
- fIlE=fIlE
- else # client insensitive
- # Because FiLe is present on a case insensitive client, it is the
- # only one ever found and queried or altered.
- file=FiLe
- fIlE=FiLe
- fi
- else # ! $remote
- file=file
- fIlE=fIlE
- fi
- if $server_sensitive; then
- if $client_sensitive; then
- # Client finds Entry only for FiLe. Others returned by server.
- dotest recase-4sscs "$testcvs status file" \
- "===================================================================
- File: no file file Status: Up-to-date
- Working revision: No entry for file
- Repository revision: 1\.2 $CVSROOT_DIRNAME/first-dir/Attic/file,v"
- dotest recase-5sscs "$testcvs log file" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/Attic/file,v
- Working file: file
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- first: 1\.1
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: $username; state: dead; lines: +0 -0
- rm
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- add
- ============================================================================="
- dotest recase-6sscs "$testcvs status FiLe" \
- "===================================================================
- File: FiLe Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 $CVSROOT_DIRNAME/first-dir/FiLe,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest recase-7sscs "$testcvs log FiLe" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/FiLe,v
- Working file: FiLe
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- recase
- ============================================================================="
- else # server sensitive && client insensitive
- # Client finds same Entry for file & FiLe.
- dotest recase-4ssci "$testcvs status file" \
- "===================================================================
- File: FiLe Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 $CVSROOT_DIRNAME/first-dir/FiLe,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest recase-5ssci "$testcvs log file" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/FiLe,v
- Working file: FiLe
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- recase
- ============================================================================="
- dotest recase-6ss "$testcvs status FiLe" \
- "===================================================================
- File: FiLe Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 $CVSROOT_DIRNAME/first-dir/FiLe,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest recase-7ss "$testcvs log FiLe" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/FiLe,v
- Working file: FiLe
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- recase
- ============================================================================="
- fi
- else # server insensitive
- # There is only one archive when the server is insensitive, but the
- # printed file/archive name can vary.
- dotest recase-4si "$testcvs status file" \
- "===================================================================
- File: $file Status: Up-to-date
- Working revision: 1\.3.*
- Repository revision: 1\.3 $CVSROOT_DIRNAME/first-dir/$file,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest recase-5si "$testcvs log file" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/$file,v
- Working file: $file
- head: 1\.3
- branch:
- locks: strict
- access list:
- symbolic names:
- first: 1\.1
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- ----------------------------
- revision 1\.3
- date: [0-9/]* [0-9:]*; author: $username; state: Exp; lines: +1 -1
- recase
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: $username; state: dead; lines: +0 -0
- rm
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- add
- ============================================================================="
- dotest recase-6si "$testcvs status FiLe" \
- "===================================================================
- File: FiLe Status: Up-to-date
- Working revision: 1\.3.*
- Repository revision: 1\.3 $CVSROOT_DIRNAME/first-dir/FiLe,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest recase-7si "$testcvs log FiLe" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/FiLe,v
- Working file: FiLe
- head: 1\.3
- branch:
- locks: strict
- access list:
- symbolic names:
- first: 1\.1
- keyword substitution: kv
- total revisions: 3; selected revisions: 3
- description:
- ----------------------------
- revision 1\.3
- date: [0-9/]* [0-9:]*; author: $username; state: Exp; lines: +1 -1
- recase
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: $username; state: dead; lines: +0 -0
- rm
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- add
- ============================================================================="
- fi
- # And when the file does not exist on the client, we go with the
- # client Entries match.
- if $client_sensitive && $server_sensitive; then
- dotest recase-8sscs "$testcvs status fIlE" \
- "$PROG status: nothing known about fIlE
- ===================================================================
- File: no file fIlE Status: Unknown
- Working revision: No entry for fIlE
- Repository revision: No revision control file"
- else # !$client_sensitive || !$server_sensitive
- dotest recase-8anyi "$testcvs status fIlE" \
- "===================================================================
- File: $fIlE Status: Up-to-date
- Working revision: 1\.[0-9]*.*
- Repository revision: 1\.[0-9]* $CVSROOT_DIRNAME/first-dir/$fIlE,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- fi
- # and an update
- if $server_sensitive; then
- dotest recase-9ss "$testcvs -q up -rfirst" \
- "$PROG update: FiLe is no longer in the repository
- U file"
- if $client_sensitive; then
- dotest recase-10sscs "$testcvs -q up -A" \
- "U FiLe
- $PROG update: file is no longer in the repository"
- else # client insensitive
- # FIXCVS: This should remove the offending file first.
- dotest_fail recase-10ssci "$testcvs -q up -A" \
- "$PROG update: move away \./FiLe; it is in the way
- C FiLe
- $PROG update: file is no longer in the repository"
- cd ..
- rm -r first-dir
- dotest recase-11ssci "$testcvs -q co first-dir" \
- "U first-dir/FiLe"
- cd first-dir
- fi
- #
- # See what happens when cased names clash.
- #
- # Copy the archive
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "cp $CVSROOT_DIRNAME/first-dir/FiLe,v \
- $CVSROOT_DIRNAME/first-dir/FILE,v"
- else
- cp $CVSROOT_DIRNAME/first-dir/FiLe,v \
- $CVSROOT_DIRNAME/first-dir/FILE,v
- fi
- if $client_sensitive; then
- dotest recase-12sscs "$testcvs -q up" "U FILE"
- else # client insensitive
- dotest_fail recase-12ssci "$testcvs -q up" \
- "$PROG update: move away \./FILE; it is in the way
- C FILE"
- fi
- else # server insensitive
- dotest recase-9si "$testcvs -q up -rfirst" "U FiLe"
- dotest recase-10si "$testcvs -q up -A" "U FiLe"
- fi
- # Prove that we can still get status and log information on
- # conflicting case files (1 in Attic, two in parent).
- if $server_sensitive; then
- if $client_sensitive; then
- # Client finds Entry only for FiLe. Others returned by server.
- dotest recase-13sscs "$testcvs status file" \
- "===================================================================
- File: no file file Status: Up-to-date
- Working revision: No entry for file
- Repository revision: 1\.2 $CVSROOT_DIRNAME/first-dir/Attic/file,v"
- dotest recase-14sscs "$testcvs log file" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/Attic/file,v
- Working file: file
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- first: 1\.1
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: $username; state: dead; lines: +0 -0
- rm
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- add
- ============================================================================="
- dotest recase-15sscs "$testcvs status FiLe" \
- "===================================================================
- File: FiLe Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 $CVSROOT_DIRNAME/first-dir/FiLe,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest recase-16sscs "$testcvs log FiLe" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/FiLe,v
- Working file: FiLe
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- recase
- ============================================================================="
- dotest recase-17sscs "$testcvs status FILE" \
- "===================================================================
- File: FILE Status: Up-to-date
- Working revision: 1.1.*
- Repository revision: 1.1 ${CVSROOT_DIRNAME}/first-dir/FILE,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest recase-18sscs "$testcvs log FILE" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/FILE,v
- Working file: FILE
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- recase
- ============================================================================="
- else # $server_sensitive && !$client_sensitive
- # Client finds same Entry for file & FiLe.
- dotest recase-13ssci "$testcvs status file" \
- "===================================================================
- File: FiLe Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 $CVSROOT_DIRNAME/first-dir/FiLe,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest recase-16ssci "$testcvs log FiLe" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/FiLe,v
- Working file: FiLe
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- recase
- ============================================================================="
- dotest recase-17ssci "$testcvs status FILE" \
- "===================================================================
- File: FiLe Status: Up-to-date
- Working revision: 1\.1.*
- Repository revision: 1\.1 $CVSROOT_DIRNAME/first-dir/FiLe,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- dotest recase-18ssci "$testcvs log FILE" \
- "
- RCS file: $CVSROOT_DIRNAME/first-dir/FiLe,v
- Working file: FiLe
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: $username; state: Exp;
- recase
- ============================================================================="
- fi
- else # !$server_sensitive
- # Skip these when the server is case insensitive - nothing
- # has changed since recase-[4-7]si
- :
- fi
- if $client_sensitive && $server_sensitive; then
- dotest recase-19sscs "$testcvs status fIlE" \
- "$PROG status: nothing known about fIlE
- ===================================================================
- File: no file fIlE Status: Unknown
- Working revision: No entry for fIlE
- Repository revision: No revision control file"
- else # !$client_sensitive || !$server_sensitive
- dotest recase-19anyi "$testcvs status fIlE" \
- "===================================================================
- File: $fIlE Status: Up-to-date
- Working revision: 1\.[0-9]*.*
- Repository revision: 1\.[0-9]* $CVSROOT_DIRNAME/first-dir/$fIlE,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)"
- fi
- # And last but not least, prove that a checkout is still possible.
- cd ../..
- mkdir 3; cd 3
- if $server_sensitive; then
- if $client_sensitive; then
- dotest recase-20sscs "$testcvs -q co first-dir" \
- "U first-dir/FILE
- U first-dir/FiLe"
- else # $server_senstive && !$client_sensitive
- dotest_fail recase-20ssci "$testcvs -q co first-dir" \
- "U first-dir/FILE
- $PROG checkout: move away first-dir/FiLe; it is in the way
- C first-dir/FiLe"
- fi
- else # !$server_sensitive
- # Skip these since nothing has changed.
- :
- fi
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ..
- rm -r 1 2 3
- if $server_sensitive && test -n "$remotehost"; then
- # It is necessary to remove one of the case-conflicted files before
- # recursively removing the rest under Cygwin on a Samba share or
- # Samba returns a permission denied error due to its case
- # confusion.
- $CVS_RSH $remotehost "rm -f $CVSROOT_DIRNAME/first-dir/FILE,v"
- fi
- rm -rf $CVSROOT_DIRNAME/first-dir
- ;;
- multiroot)
- #
- # set up two repositories
- #
- CVSROOT1_DIRNAME=${TESTDIR}/root1
- CVSROOT2_DIRNAME=${TESTDIR}/root2
- CVSROOT1=`newroot $CVSROOT1_DIRNAME`
- CVSROOT2=`newroot $CVSROOT2_DIRNAME`
- testcvs1="${testcvs} -d ${CVSROOT1}"
- testcvs2="${testcvs} -d ${CVSROOT2}"
- dotest multiroot-setup-1 "mkdir $CVSROOT1_DIRNAME $CVSROOT2_DIRNAME"
- dotest multiroot-setup-2 "$testcvs -d$CVSROOT1_DIRNAME init"
- dotest multiroot-setup-3 "$testcvs -d$CVSROOT2_DIRNAME init"
- #
- # create some directories in root1
- #
- mkdir 1; cd 1
- dotest multiroot-setup-4 "${testcvs1} co -l ." \
- "${PROG} checkout: Updating ."
- mkdir mod1-1 mod1-2
- dotest multiroot-setup-5 "${testcvs1} add mod1-1 mod1-2" \
- "Directory ${CVSROOT1_DIRNAME}/mod1-1 added to the repository
- Directory ${CVSROOT1_DIRNAME}/mod1-2 added to the repository"
- echo file1-1 > mod1-1/file1-1
- echo file1-2 > mod1-2/file1-2
- dotest multiroot-setup-6 "${testcvs1} add mod1-1/file1-1 mod1-2/file1-2" \
- "${PROG} add: scheduling file .mod1-1/file1-1. for addition
- ${PROG} add: scheduling file .mod1-2/file1-2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest multiroot-setup-7 "${testcvs1} commit -m is" \
- "${PROG} [a-z]*: Examining \.
- ${PROG} [a-z]*: Examining mod1-1
- ${PROG} [a-z]*: Examining mod1-2
- RCS file: ${CVSROOT1_DIRNAME}/mod1-1/file1-1,v
- done
- Checking in mod1-1/file1-1;
- ${CVSROOT1_DIRNAME}/mod1-1/file1-1,v <-- file1-1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT1_DIRNAME}/mod1-2/file1-2,v
- done
- Checking in mod1-2/file1-2;
- ${CVSROOT1_DIRNAME}/mod1-2/file1-2,v <-- file1-2
- initial revision: 1.1
- done"
- cd ..
- rm -rf 1
- #
- # create some directories in root2
- #
- mkdir 1; cd 1
- dotest multiroot-setup-8 "${testcvs2} co -l ." \
- "${PROG} checkout: Updating ."
- mkdir mod2-1 mod2-2
- dotest multiroot-setup-9 "${testcvs2} add mod2-1 mod2-2" \
- "Directory ${CVSROOT2_DIRNAME}/mod2-1 added to the repository
- Directory ${CVSROOT2_DIRNAME}/mod2-2 added to the repository"
- echo file2-1 > mod2-1/file2-1
- echo file2-2 > mod2-2/file2-2
- dotest multiroot-setup-6 "${testcvs2} add mod2-1/file2-1 mod2-2/file2-2" \
- "${PROG} add: scheduling file .mod2-1/file2-1. for addition
- ${PROG} add: scheduling file .mod2-2/file2-2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest multiroot-setup-10 "${testcvs2} commit -m anyone" \
- "${PROG} [a-z]*: Examining \.
- ${PROG} [a-z]*: Examining mod2-1
- ${PROG} [a-z]*: Examining mod2-2
- RCS file: ${CVSROOT2_DIRNAME}/mod2-1/file2-1,v
- done
- Checking in mod2-1/file2-1;
- ${CVSROOT2_DIRNAME}/mod2-1/file2-1,v <-- file2-1
- initial revision: 1.1
- done
- RCS file: ${CVSROOT2_DIRNAME}/mod2-2/file2-2,v
- done
- Checking in mod2-2/file2-2;
- ${CVSROOT2_DIRNAME}/mod2-2/file2-2,v <-- file2-2
- initial revision: 1.1
- done"
- cd ..
- rm -rf 1
- # check out a few directories, from simple/shallow to
- # complex/deep
- mkdir 1; cd 1
- # OK, this case is kind of weird. If we just run things from
- # here, without CVS/Root, then CVS will contact the server
- # mentioned in CVSROOT (which is irrelevant) which will print
- # some messages. Our workaround is to make sure we have a
- # CVS/Root file at top level. In the future, it is possible
- # the best behavior will be to extend the existing behavior
- # ("being called from a directory without CVS administration
- # has always meant to process each of the sub-dirs") to also
- # do that if there is no CVSROOT, CVS/Root, or -d at top level.
- #
- # The local case could stumble through the tests without creating
- # the top-level CVS/Root, but we create it for local and for
- # remote to reduce special cases later in the test.
- dotest multiroot-workaround "${testcvs1} -q co -l ." ""
- dotest multiroot-setup-11 "${testcvs1} co mod1-1 mod1-2" \
- "${PROG} checkout: Updating mod1-1
- U mod1-1/file1-1
- ${PROG} checkout: Updating mod1-2
- U mod1-2/file1-2"
- dotest multiroot-setup-12 "${testcvs2} co mod2-1 mod2-2" \
- "${PROG} checkout: Updating mod2-1
- U mod2-1/file2-1
- ${PROG} checkout: Updating mod2-2
- U mod2-2/file2-2"
- cd mod1-2
- dotest multiroot-setup-13 "${testcvs2} co mod2-2" \
- "${PROG} checkout: Updating mod2-2
- U mod2-2/file2-2"
- cd ..
- cd mod2-2
- dotest multiroot-setup-14 "${testcvs1} co mod1-2" \
- "${PROG} checkout: Updating mod1-2
- U mod1-2/file1-2"
- cd ..
- #
- # Make sure that the Root and Repository files contain the
- # correct information.
- #
- dotest multiroot-cvsadm-1a "cat mod1-1/CVS/Root" "${CVSROOT1}"
- dotest multiroot-cvsadm-1b "cat mod1-1/CVS/Repository" "mod1-1"
- dotest multiroot-cvsadm-2a "cat mod2-1/CVS/Root" "${CVSROOT2}"
- dotest multiroot-cvsadm-2b "cat mod2-1/CVS/Repository" "mod2-1"
- dotest multiroot-cvsadm-3a "cat mod1-2/CVS/Root" "${CVSROOT1}"
- dotest multiroot-cvsadm-3b "cat mod1-2/CVS/Repository" "mod1-2"
- dotest multiroot-cvsadm-3c "cat mod1-2/mod2-2/CVS/Root" "${CVSROOT2}"
- dotest multiroot-cvsadm-3d "cat mod1-2/mod2-2/CVS/Repository" "mod2-2"
- dotest multiroot-cvsadm-4a "cat mod2-2/CVS/Root" "${CVSROOT2}"
- dotest multiroot-cvsadm-4b "cat mod2-2/CVS/Repository" "mod2-2"
- dotest multiroot-cvsadm-4c "cat mod2-2/mod1-2/CVS/Root" "${CVSROOT1}"
- dotest multiroot-cvsadm-4d "cat mod2-2/mod1-2/CVS/Repository" "mod1-2"
- #
- # Start testing various cvs commands. Begin with commands
- # without extra arguments (e.g. "cvs update", "cvs diff",
- # etc.
- #
- # Do at least one command with both CVSROOTs to make sure
- # that there's not some kind of unexpected dependency on the
- # choice of which CVSROOT is specified on the command line.
- dotest multiroot-update-1a "${testcvs1} update" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating mod1-1
- ${PROG} update: Updating mod1-2
- ${PROG} update: Updating mod1-2/mod2-2
- ${PROG} update: cannot open directory ${CVSROOT1_DIRNAME}/mod2-2: No such file or directory
- ${PROG} update: skipping directory mod1-2/mod2-2
- ${PROG} update: Updating mod2-1
- ${PROG} update: cannot open directory ${CVSROOT1_DIRNAME}/mod2-1: No such file or directory
- ${PROG} update: skipping directory mod2-1
- ${PROG} update: Updating mod2-2
- ${PROG} update: cannot open directory ${CVSROOT1_DIRNAME}/mod2-2: No such file or directory
- ${PROG} update: skipping directory mod2-2"
- # Same deal but with -d ${CVSROOT2}.
- dotest multiroot-update-1b "${testcvs2} update" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating mod1-1
- ${PROG} update: cannot open directory ${CVSROOT2_DIRNAME}/mod1-1: No such file or directory
- ${PROG} update: skipping directory mod1-1
- ${PROG} update: Updating mod1-2
- ${PROG} update: cannot open directory ${CVSROOT2_DIRNAME}/mod1-2: No such file or directory
- ${PROG} update: skipping directory mod1-2
- ${PROG} update: Updating mod2-1
- ${PROG} update: Updating mod2-2
- ${PROG} update: Updating mod2-2/mod1-2
- ${PROG} update: cannot open directory ${CVSROOT2_DIRNAME}/mod1-2: No such file or directory
- ${PROG} update: skipping directory mod2-2/mod1-2"
- # modify all files and do a diff
- echo bobby >> mod1-1/file1-1
- echo brown >> mod1-2/file1-2
- echo goes >> mod2-1/file2-1
- echo down >> mod2-2/file2-2
- dotest_fail multiroot-diff-1 "${testcvs} diff" \
- "${PROG} diff: Diffing \.
- ${PROG} diff: Diffing mod1-1
- Index: mod1-1/file1-1
- ===================================================================
- RCS file: ${TESTDIR}/root1/mod1-1/file1-1,v
- retrieving revision 1\.1
- diff -r1\.1 file1-1
- 1a2
- > bobby
- ${PROG} diff: Diffing mod1-2
- Index: mod1-2/file1-2
- ===================================================================
- RCS file: ${TESTDIR}/root1/mod1-2/file1-2,v
- retrieving revision 1\.1
- diff -r1\.1 file1-2
- 1a2
- > brown
- ${PROG} diff: Diffing mod2-2/mod1-2
- ${PROG} diff: Diffing mod1-2/mod2-2
- ${PROG} diff: Diffing mod2-1
- Index: mod2-1/file2-1
- ===================================================================
- RCS file: ${TESTDIR}/root2/mod2-1/file2-1,v
- retrieving revision 1\.1
- diff -r1\.1 file2-1
- 1a2
- > goes
- ${PROG} diff: Diffing mod2-2
- Index: mod2-2/file2-2
- ===================================================================
- RCS file: ${TESTDIR}/root2/mod2-2/file2-2,v
- retrieving revision 1\.1
- diff -r1\.1 file2-2
- 1a2
- > down" \
- "${PROG} diff: Diffing \.
- ${PROG} diff: Diffing mod1-1
- Index: mod1-1/file1-1
- ===================================================================
- RCS file: ${TESTDIR}/root1/mod1-1/file1-1,v
- retrieving revision 1\.1
- diff -r1\.1 file1-1
- 1a2
- > bobby
- ${PROG} diff: Diffing mod1-2
- Index: mod1-2/file1-2
- ===================================================================
- RCS file: ${TESTDIR}/root1/mod1-2/file1-2,v
- retrieving revision 1\.1
- diff -r1\.1 file1-2
- 1a2
- > brown
- ${PROG} diff: Diffing mod2-2
- ${PROG} diff: Diffing mod2-2/mod1-2
- ${PROG} diff: Diffing mod1-2
- ${PROG} diff: Diffing mod1-2/mod2-2
- ${PROG} diff: Diffing mod2-1
- Index: mod2-1/file2-1
- ===================================================================
- RCS file: ${TESTDIR}/root2/mod2-1/file2-1,v
- retrieving revision 1\.1
- diff -r1\.1 file2-1
- 1a2
- > goes
- ${PROG} diff: Diffing mod2-2
- Index: mod2-2/file2-2
- ===================================================================
- RCS file: ${TESTDIR}/root2/mod2-2/file2-2,v
- retrieving revision 1\.1
- diff -r1\.1 file2-2
- 1a2
- > down"
- dotest multiroot-commit-1 "${testcvs} commit -m actually" \
- "${PROG} [a-z]*: Examining \.
- ${PROG} [a-z]*: Examining mod1-1
- ${PROG} [a-z]*: Examining mod1-2
- ${PROG} [a-z]*: Examining mod2-2/mod1-2
- Checking in mod1-1/file1-1;
- ${TESTDIR}/root1/mod1-1/file1-1,v <-- file1-1
- new revision: 1.2; previous revision: 1.1
- done
- Checking in mod1-2/file1-2;
- ${TESTDIR}/root1/mod1-2/file1-2,v <-- file1-2
- new revision: 1.2; previous revision: 1.1
- done
- ${PROG} [a-z]*: Examining mod1-2/mod2-2
- ${PROG} [a-z]*: Examining mod2-1
- ${PROG} [a-z]*: Examining mod2-2
- Checking in mod2-1/file2-1;
- ${TESTDIR}/root2/mod2-1/file2-1,v <-- file2-1
- new revision: 1.2; previous revision: 1.1
- done
- Checking in mod2-2/file2-2;
- ${TESTDIR}/root2/mod2-2/file2-2,v <-- file2-2
- new revision: 1.2; previous revision: 1.1
- done"
- dotest multiroot-update-2 "${testcvs} update" \
- "${PROG} update: Updating \.
- ${PROG} [a-z]*: Updating mod1-1
- ${PROG} [a-z]*: Updating mod1-2
- ${PROG} [a-z]*: Updating mod2-2/mod1-2
- U mod2-2/mod1-2/file1-2
- ${PROG} [a-z]*: Updating mod1-2/mod2-2
- U mod1-2/mod2-2/file2-2
- ${PROG} update: Updating mod2-1
- ${PROG} update: Updating mod2-2" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating mod1-1
- ${PROG} update: Updating mod1-2
- ${PROG} update: Updating mod2-2
- ${PROG} update: Updating mod2-2/mod1-2
- P mod2-2/mod1-2/file1-2
- ${PROG} update: Updating mod1-2
- ${PROG} update: Updating mod1-2/mod2-2
- P mod1-2/mod2-2/file2-2
- ${PROG} update: Updating mod2-1
- ${PROG} update: Updating mod2-2"
- dotest multiroot-tag-1 "${testcvs} tag cattle" \
- "${PROG} tag: Tagging \.
- ${PROG} tag: Tagging mod1-1
- T mod1-1/file1-1
- ${PROG} tag: Tagging mod1-2
- T mod1-2/file1-2
- ${PROG} tag: Tagging mod2-2/mod1-2
- ${PROG} tag: Tagging mod1-2/mod2-2
- T mod1-2/mod2-2/file2-2
- ${PROG} tag: Tagging mod2-1
- T mod2-1/file2-1
- ${PROG} tag: Tagging mod2-2" \
- "${PROG} tag: Tagging \.
- ${PROG} tag: Tagging mod1-1
- T mod1-1/file1-1
- ${PROG} tag: Tagging mod1-2
- T mod1-2/file1-2
- ${PROG} tag: Tagging mod2-2
- ${PROG} tag: Tagging mod2-2/mod1-2
- ${PROG} tag: Tagging mod1-2
- ${PROG} tag: Tagging mod1-2/mod2-2
- T mod1-2/mod2-2/file2-2
- ${PROG} tag: Tagging mod2-1
- T mod2-1/file2-1
- ${PROG} tag: Tagging mod2-2"
- echo anotherfile1-1 > mod1-1/anotherfile1-1
- echo anotherfile2-1 > mod2-1/anotherfile2-1
- echo anotherfile1-2 > mod2-2/mod1-2/anotherfile1-2
- echo anotherfile2-2 > mod1-2/mod2-2/anotherfile2-2
- if $remote; then
- cd mod1-1
- dotest multiroot-add-1ar "${testcvs} add anotherfile1-1" \
- "${PROG} add: scheduling file .anotherfile1-1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- cd ../mod2-1
- dotest multiroot-add-1br "${testcvs} add anotherfile2-1" \
- "${PROG} add: scheduling file .anotherfile2-1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- cd ../mod2-2/mod1-2
- dotest multiroot-add-1cr "${testcvs} add anotherfile1-2" \
- "${PROG} add: scheduling file .anotherfile1-2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- cd ../../mod1-2/mod2-2
- dotest multiroot-add-1dr "${testcvs} add anotherfile2-2" \
- "${PROG} add: scheduling file .anotherfile2-2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- cd ../..
- else
- dotest multiroot-add-1 "${testcvs} add mod1-1/anotherfile1-1 mod2-1/anotherfile2-1 mod2-2/mod1-2/anotherfile1-2 mod1-2/mod2-2/anotherfile2-2" \
- "${PROG} add: scheduling file .mod1-1/anotherfile1-1. for addition
- ${PROG} add: scheduling file .mod2-1/anotherfile2-1. for addition
- ${PROG} add: scheduling file .mod2-2/mod1-2/anotherfile1-2. for addition
- ${PROG} add: scheduling file .mod1-2/mod2-2/anotherfile2-2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- fi
- dotest multiroot-status-1 "${testcvs} status -v" \
- "${PROG} status: Examining \.
- ${PROG} status: Examining mod1-1
- ===================================================================
- File: anotherfile1-1 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file1-1 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT1_DIRNAME}/mod1-1/file1-1,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)
- ${PROG} status: Examining mod1-2
- ===================================================================
- File: file1-2 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT1_DIRNAME}/mod1-2/file1-2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)
- ${PROG} status: Examining mod2-2/mod1-2
- ===================================================================
- File: anotherfile1-2 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file1-2 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT1_DIRNAME}/mod1-2/file1-2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)
- ${PROG} status: Examining mod1-2/mod2-2
- ===================================================================
- File: anotherfile2-2 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file2-2 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT2_DIRNAME}/mod2-2/file2-2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)
- ${PROG} status: Examining mod2-1
- ===================================================================
- File: anotherfile2-1 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file2-1 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT2_DIRNAME}/mod2-1/file2-1,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)
- ${PROG} status: Examining mod2-2
- ===================================================================
- File: file2-2 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT2_DIRNAME}/mod2-2/file2-2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)" \
- "${PROG} status: Examining \.
- ${PROG} status: Examining mod1-1
- ===================================================================
- File: anotherfile1-1 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file1-1 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT1_DIRNAME}/mod1-1/file1-1,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)
- ${PROG} status: Examining mod1-2
- ===================================================================
- File: file1-2 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT1_DIRNAME}/mod1-2/file1-2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)
- ${PROG} status: Examining mod2-2
- ${PROG} status: Examining mod2-2/mod1-2
- ===================================================================
- File: anotherfile1-2 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file1-2 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT1_DIRNAME}/mod1-2/file1-2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)
- ${PROG} status: Examining mod1-2
- ${PROG} status: Examining mod1-2/mod2-2
- ===================================================================
- File: anotherfile2-2 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file2-2 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT2_DIRNAME}/mod2-2/file2-2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)
- ${PROG} status: Examining mod2-1
- ===================================================================
- File: anotherfile2-1 Status: Locally Added
- Working revision: New file!
- Repository revision: No revision control file
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- ===================================================================
- File: file2-1 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT2_DIRNAME}/mod2-1/file2-1,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)
- ${PROG} status: Examining mod2-2
- ===================================================================
- File: file2-2 Status: Up-to-date
- Working revision: 1\.2.*
- Repository revision: 1\.2 ${CVSROOT2_DIRNAME}/mod2-2/file2-2,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
- Existing Tags:
- cattle (revision: 1\.2)"
- dotest multiroot-commit-2 "${testcvs} commit -m reading" \
- "${PROG} [a-z]*: Examining \.
- ${PROG} [a-z]*: Examining mod1-1
- ${PROG} [a-z]*: Examining mod1-2
- ${PROG} [a-z]*: Examining mod2-2/mod1-2
- RCS file: ${CVSROOT1_DIRNAME}/mod1-1/anotherfile1-1,v
- done
- Checking in mod1-1/anotherfile1-1;
- ${CVSROOT1_DIRNAME}/mod1-1/anotherfile1-1,v <-- anotherfile1-1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT1_DIRNAME}/mod1-2/anotherfile1-2,v
- done
- Checking in mod2-2/mod1-2/anotherfile1-2;
- ${CVSROOT1_DIRNAME}/mod1-2/anotherfile1-2,v <-- anotherfile1-2
- initial revision: 1\.1
- done
- ${PROG} [a-z]*: Examining mod1-2/mod2-2
- ${PROG} [a-z]*: Examining mod2-1
- ${PROG} [a-z]*: Examining mod2-2
- RCS file: ${CVSROOT2_DIRNAME}/mod2-2/anotherfile2-2,v
- done
- Checking in mod1-2/mod2-2/anotherfile2-2;
- ${CVSROOT2_DIRNAME}/mod2-2/anotherfile2-2,v <-- anotherfile2-2
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT2_DIRNAME}/mod2-1/anotherfile2-1,v
- done
- Checking in mod2-1/anotherfile2-1;
- ${CVSROOT2_DIRNAME}/mod2-1/anotherfile2-1,v <-- anotherfile2-1
- initial revision: 1\.1
- done"
- dotest multiroot-update-3 "${testcvs} update" \
- "${PROG} update: Updating \.
- ${PROG} [a-z]*: Updating mod1-1
- ${PROG} [a-z]*: Updating mod1-2
- U mod1-2/anotherfile1-2
- ${PROG} [a-z]*: Updating mod2-2/mod1-2
- ${PROG} [a-z]*: Updating mod1-2/mod2-2
- ${PROG} [a-z]*: Updating mod2-1
- ${PROG} [a-z]*: Updating mod2-2
- U mod2-2/anotherfile2-2" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating mod1-1
- ${PROG} update: Updating mod1-2
- U mod1-2/anotherfile1-2
- ${PROG} update: Updating mod2-2
- ${PROG} update: Updating mod2-2/mod1-2
- ${PROG} update: Updating mod1-2
- ${PROG} update: Updating mod1-2/mod2-2
- ${PROG} update: Updating mod2-1
- ${PROG} update: Updating mod2-2
- U mod2-2/anotherfile2-2"
- dotest multiroot-log-1 "${testcvs} log" \
- "${PROG} log: Logging \.
- ${PROG} log: Logging mod1-1
- RCS file: ${CVSROOT1_DIRNAME}/mod1-1/anotherfile1-1,v
- Working file: mod1-1/anotherfile1-1
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT1_DIRNAME}/mod1-1/file1-1,v
- Working file: mod1-1/file1-1
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- is
- =============================================================================
- ${PROG} log: Logging mod1-2
- RCS file: ${CVSROOT1_DIRNAME}/mod1-2/anotherfile1-2,v
- Working file: mod1-2/anotherfile1-2
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT1_DIRNAME}/mod1-2/file1-2,v
- Working file: mod1-2/file1-2
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- is
- =============================================================================
- ${PROG} log: Logging mod2-2/mod1-2
- RCS file: ${CVSROOT1_DIRNAME}/mod1-2/anotherfile1-2,v
- Working file: mod2-2/mod1-2/anotherfile1-2
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT1_DIRNAME}/mod1-2/file1-2,v
- Working file: mod2-2/mod1-2/file1-2
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- is
- =============================================================================
- ${PROG} log: Logging mod1-2/mod2-2
- RCS file: ${CVSROOT2_DIRNAME}/mod2-2/anotherfile2-2,v
- Working file: mod1-2/mod2-2/anotherfile2-2
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT2_DIRNAME}/mod2-2/file2-2,v
- Working file: mod1-2/mod2-2/file2-2
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- anyone
- =============================================================================
- ${PROG} log: Logging mod2-1
- RCS file: ${CVSROOT2_DIRNAME}/mod2-1/anotherfile2-1,v
- Working file: mod2-1/anotherfile2-1
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT2_DIRNAME}/mod2-1/file2-1,v
- Working file: mod2-1/file2-1
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- anyone
- =============================================================================
- ${PROG} log: Logging mod2-2
- RCS file: ${CVSROOT2_DIRNAME}/mod2-2/anotherfile2-2,v
- Working file: mod2-2/anotherfile2-2
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT2_DIRNAME}/mod2-2/file2-2,v
- Working file: mod2-2/file2-2
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- anyone
- =============================================================================" \
- "${PROG} log: Logging \.
- ${PROG} log: Logging mod1-1
- RCS file: ${CVSROOT1_DIRNAME}/mod1-1/anotherfile1-1,v
- Working file: mod1-1/anotherfile1-1
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT1_DIRNAME}/mod1-1/file1-1,v
- Working file: mod1-1/file1-1
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- is
- =============================================================================
- ${PROG} log: Logging mod1-2
- RCS file: ${CVSROOT1_DIRNAME}/mod1-2/anotherfile1-2,v
- Working file: mod1-2/anotherfile1-2
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT1_DIRNAME}/mod1-2/file1-2,v
- Working file: mod1-2/file1-2
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- is
- =============================================================================
- ${PROG} log: Logging mod2-2
- ${PROG} log: Logging mod2-2/mod1-2
- RCS file: ${CVSROOT1_DIRNAME}/mod1-2/anotherfile1-2,v
- Working file: mod2-2/mod1-2/anotherfile1-2
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT1_DIRNAME}/mod1-2/file1-2,v
- Working file: mod2-2/mod1-2/file1-2
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- is
- =============================================================================
- ${PROG} log: Logging mod1-2
- ${PROG} log: Logging mod1-2/mod2-2
- RCS file: ${CVSROOT2_DIRNAME}/mod2-2/anotherfile2-2,v
- Working file: mod1-2/mod2-2/anotherfile2-2
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT2_DIRNAME}/mod2-2/file2-2,v
- Working file: mod1-2/mod2-2/file2-2
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- anyone
- =============================================================================
- ${PROG} log: Logging mod2-1
- RCS file: ${CVSROOT2_DIRNAME}/mod2-1/anotherfile2-1,v
- Working file: mod2-1/anotherfile2-1
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT2_DIRNAME}/mod2-1/file2-1,v
- Working file: mod2-1/file2-1
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- anyone
- =============================================================================
- ${PROG} log: Logging mod2-2
- RCS file: ${CVSROOT2_DIRNAME}/mod2-2/anotherfile2-2,v
- Working file: mod2-2/anotherfile2-2
- head: 1\.1
- branch:
- locks: strict
- access list:
- symbolic names:
- keyword substitution: kv
- total revisions: 1; selected revisions: 1
- description:
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- reading
- =============================================================================
- RCS file: ${CVSROOT2_DIRNAME}/mod2-2/file2-2,v
- Working file: mod2-2/file2-2
- head: 1\.2
- branch:
- locks: strict
- access list:
- symbolic names:
- cattle: 1\.2
- keyword substitution: kv
- total revisions: 2; selected revisions: 2
- description:
- ----------------------------
- revision 1\.2
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp; lines: ${PLUS}1 -0
- actually
- ----------------------------
- revision 1\.1
- date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
- anyone
- ============================================================================="
- # After the simple cases, let's execute some commands which
- # refer to parts of our checked-out tree (e.g. "cvs update
- # mod1-1 mod2-2")
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- # clean up after ourselves
- cd ..
- rm -r 1
- # clean up our repositories
- rm -rf root1 root2
- ;;
- multiroot2)
- # More multiroot tests. In particular, nested directories.
- CVSROOT1_DIRNAME=${TESTDIR}/root1
- CVSROOT2_DIRNAME=${TESTDIR}/root2
- CVSROOT1=`newroot $CVSROOT1_DIRNAME`
- CVSROOT2=`newroot $CVSROOT2_DIRNAME`
- dotest multiroot2-1 "$testcvs -d$CVSROOT1_DIRNAME init"
- dotest multiroot2-2 "$testcvs -d$CVSROOT2_DIRNAME init"
- mkdir imp-dir; cd imp-dir
- echo file1 >file1
- mkdir sdir
- echo sfile >sdir/sfile
- mkdir sdir/ssdir
- echo ssfile >sdir/ssdir/ssfile
- dotest_sort multiroot2-3 \
- "${testcvs} -d ${CVSROOT1} import -m import-to-root1 dir1 vend rel" "
- N dir1/file1
- N dir1/sdir/sfile
- N dir1/sdir/ssdir/ssfile
- No conflicts created by this import
- ${PROG} import: Importing ${TESTDIR}/root1/dir1/sdir
- ${PROG} import: Importing ${TESTDIR}/root1/dir1/sdir/ssdir"
- cd sdir
- dotest_sort multiroot2-4 \
- "${testcvs} -d ${CVSROOT2} import -m import-to-root2 sdir vend2 rel2" "
- N sdir/sfile
- N sdir/ssdir/ssfile
- No conflicts created by this import
- ${PROG} import: Importing ${TESTDIR}/root2/sdir/ssdir"
- cd ../..
- mkdir 1; cd 1
- # Get TopLevelAdmin-like behavior.
- dotest multiroot2-5 "${testcvs} -d ${CVSROOT1} -q co -l ."
- dotest multiroot2-5 "${testcvs} -d ${CVSROOT1} -q co dir1" \
- "U dir1/file1
- U dir1/sdir/sfile
- U dir1/sdir/ssdir/ssfile"
- cd dir1
- dotest multiroot2-6 "${testcvs} -Q release -d sdir" ""
- dotest multiroot2-7 "${testcvs} -d ${CVSROOT2} -q co sdir" \
- "U sdir/sfile
- U sdir/ssdir/ssfile"
- cd ..
- # This has one subtle effect - it deals with Entries.Log
- # so that the next test doesn't get trace messages for
- # Entries.Log
- dotest multiroot2-8 "${testcvs} update" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating dir1
- ${PROG} update: Updating dir1/sdir
- ${PROG} update: Updating dir1/sdir/ssdir" \
- "${PROG} update: Updating \.
- ${PROG} update: Updating dir1
- ${PROG} update: Updating dir1
- ${PROG} update: Updating dir1/sdir
- ${PROG} update: Updating dir1/sdir/ssdir"
- # Two reasons we don't run this on the server: (1) the server
- # also prints some trace messages, and (2) the server trace
- # messages are subject to out-of-order bugs (this one is hard
- # to work around).
- if $remote; then :; else
- dotest multiroot2-9a "${testcvs} -t update" \
- " *-> main loop with CVSROOT=${TESTDIR}/root1
- ${PROG} update: Updating \.
- *-> Reader_Lock(${TESTDIR}/root1)
- *-> Lock_Cleanup()
- ${PROG} update: Updating dir1
- *-> Reader_Lock(${TESTDIR}/root1/dir1)
- *-> Lock_Cleanup()
- *-> main loop with CVSROOT=${TESTDIR}/root2
- ${PROG} update: Updating dir1/sdir
- *-> Reader_Lock(${TESTDIR}/root2/sdir)
- *-> Lock_Cleanup()
- ${PROG} update: Updating dir1/sdir/ssdir
- *-> Reader_Lock(${TESTDIR}/root2/sdir/ssdir)
- *-> Lock_Cleanup()
- *-> Lock_Cleanup()"
- fi
- dotest multiroot2-9 "${testcvs} -q tag tag1" \
- "T dir1/file1
- T dir1/sdir/sfile
- T dir1/sdir/ssdir/ssfile"
- echo "change it" >>dir1/file1
- echo "change him too" >>dir1/sdir/sfile
- dotest multiroot2-10 "${testcvs} -q ci -m modify" \
- "Checking in dir1/file1;
- ${TESTDIR}/root1/dir1/file1,v <-- file1
- new revision: 1\.2; previous revision: 1\.1
- done
- Checking in dir1/sdir/sfile;
- ${TESTDIR}/root2/sdir/sfile,v <-- sfile
- new revision: 1\.2; previous revision: 1\.1
- done"
- dotest multiroot2-11 "${testcvs} -q tag tag2" \
- "T dir1/file1
- T dir1/sdir/sfile
- T dir1/sdir/ssdir/ssfile"
- dotest_fail multiroot2-12 \
- "${testcvs} -q diff -u -r tag1 -r tag2" \
- "Index: dir1/file1
- ===================================================================
- RCS file: ${TESTDIR}/root1/dir1/file1,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.2
- diff -u -r1\.1\.1\.1 -r1\.2
- --- dir1/file1 ${RFCDATE} 1\.1\.1\.1
- ${PLUS}${PLUS}${PLUS} dir1/file1 ${RFCDATE} 1\.2
- @@ -1 ${PLUS}1,2 @@
- file1
- ${PLUS}change it
- Index: dir1/sdir/sfile
- ===================================================================
- RCS file: ${TESTDIR}/root2/sdir/sfile,v
- retrieving revision 1\.1\.1\.1
- retrieving revision 1\.2
- diff -u -r1\.1\.1\.1 -r1\.2
- --- dir1/sdir/sfile ${RFCDATE} 1\.1\.1\.1
- ${PLUS}${PLUS}${PLUS} dir1/sdir/sfile ${RFCDATE} 1\.2
- @@ -1 ${PLUS}1,2 @@
- sfile
- ${PLUS}change him too"
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- # clean up after ourselves
- cd ..
- rm -r imp-dir 1
- # clean up our repositories
- rm -rf root1 root2
- ;;
- multiroot3)
- # More multiroot tests. Directories are side-by-side, not nested.
- # Not drastically different from multiroot but it covers somewhat
- # different stuff.
- CVSROOT1=`newroot ${TESTDIR}/root1`
- CVSROOT2=`newroot ${TESTDIR}/root2`
- mkdir 1; cd 1
- dotest multiroot3-1 "$testcvs -d$TESTDIR/root1 init"
- dotest multiroot3-2 "${testcvs} -d ${CVSROOT1} -q co -l ." ""
- mkdir dir1
- dotest multiroot3-3 "${testcvs} add dir1" \
- "Directory ${TESTDIR}/root1/dir1 added to the repository"
- dotest multiroot3-4 "$testcvs -d$TESTDIR/root2 init"
- rm -r CVS
- dotest multiroot3-5 "${testcvs} -d ${CVSROOT2} -q co -l ." ""
- mkdir dir2
- # OK, the problem is that CVS/Entries doesn't look quite right,
- # I suppose because of the "rm -r".
- # For local this fixes it up.
- dotest multiroot3-6 "${testcvs} -d ${CVSROOT1} -q co dir1" ""
- if $remote; then
- # For remote that doesn't do it. Use the quick and dirty fix.
- echo "D/dir1////" >CVS/Entries
- echo "D/dir2////" >>CVS/Entries
- fi
- dotest multiroot3-7 "${testcvs} add dir2" \
- "Directory ${TESTDIR}/root2/dir2 added to the repository"
- touch dir1/file1 dir2/file2
- if $remote; then
- # Trying to add them both in one command doesn't work,
- # because add.c doesn't do multiroot (it doesn't use recurse.c).
- # Furthermore, it can't deal with the parent directory
- # having a different root from the child, hence the cd.
- cd dir1
- dotest multiroot3-8 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- cd ..
- dotest multiroot3-8a "${testcvs} add dir2/file2" \
- "${PROG} add: scheduling file .dir2/file2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- else
- dotest multiroot3-8 "${testcvs} add dir1/file1 dir2/file2" \
- "${PROG} add: scheduling file .dir1/file1. for addition
- ${PROG} add: scheduling file .dir2/file2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- fi
- dotest multiroot3-9 "${testcvs} -q ci -m add-them" \
- "RCS file: ${TESTDIR}/root2/dir2/file2,v
- done
- Checking in dir2/file2;
- ${TESTDIR}/root2/dir2/file2,v <-- file2
- initial revision: 1\.1
- done
- RCS file: ${TESTDIR}/root1/dir1/file1,v
- done
- Checking in dir1/file1;
- ${TESTDIR}/root1/dir1/file1,v <-- file1
- initial revision: 1\.1
- done"
- # That this is an error is good - we are asking CVS to do
- # something which doesn't make sense.
- dotest_fail multiroot3-10 \
- "${testcvs} -q -d ${CVSROOT1} diff dir1/file1 dir2/file2" \
- "${PROG} diff: failed to create lock directory for .${TESTDIR}/root1/dir2' (${TESTDIR}/root1/dir2/#cvs.lock): No such file or directory
- ${PROG} diff: failed to obtain dir lock in repository .${TESTDIR}/root1/dir2'
- ${PROG} \[diff aborted\]: read lock failed - giving up"
- # This one is supposed to work.
- dotest multiroot3-11 "${testcvs} -q diff dir1/file1 dir2/file2" ""
- # make sure we can't access across repositories
- mkdir 1a
- cd 1a
- dotest_fail multiroot3-12 \
- "$testcvs -d $CVSROOT1 -q co ../root2/dir2" \
- "$PROG \[checkout aborted\]: up-level in module reference (\`..') invalid: \`\.\./root2/dir2'\." \
- "$PROG \[server aborted\]: up-level in module reference (\`..') invalid: \`\.\./root2/dir2'\.
- $PROG \[checkout aborted\]: end of file from server (consult above messages if any)"
- dotest_fail multiroot3-13 \
- "$testcvs -d $CVSROOT2 -q co ../root1/dir1" \
- "$PROG \[checkout aborted\]: up-level in module reference (\`..') invalid: \`\.\./root1/dir1'\." \
- "$PROG \[server aborted\]: up-level in module reference (\`..') invalid: \`\.\./root1/dir1'\.
- $PROG \[checkout aborted\]: end of file from server (consult above messages if any)"
- dotest_fail multiroot3-14 \
- "$testcvs -d $CVSROOT1 -q co ./../root2/dir2" \
- "$PROG \[checkout aborted\]: up-level in module reference (\`..') invalid: \`\./\.\./root2/dir2'\." \
- "$PROG \[server aborted\]: up-level in module reference (\`..') invalid: \`\./\.\./root2/dir2'\.
- $PROG \[checkout aborted\]: end of file from server (consult above messages if any)"
- dotest_fail multiroot3-15 \
- "$testcvs -d $CVSROOT2 -q co ./../root1/dir1" \
- "$PROG \[checkout aborted\]: up-level in module reference (\`..') invalid: \`\./\.\./root1/dir1'\." \
- "$PROG \[server aborted\]: up-level in module reference (\`..') invalid: \`\./\.\./root1/dir1'\.
- $PROG \[checkout aborted\]: end of file from server (consult above messages if any)"
- dotest_fail multiroot3-16 \
- "$testcvs -d $CVSROOT1 -q co -p ../root2/dir2" \
- "$PROG \[checkout aborted\]: up-level in module reference (\`..') invalid: \`\.\./root2/dir2'\." \
- "$PROG \[server aborted\]: up-level in module reference (\`..') invalid: \`\.\./root2/dir2'\.
- $PROG \[checkout aborted\]: end of file from server (consult above messages if any)"
- dotest_fail multiroot3-17 \
- "$testcvs -d $CVSROOT1 -q co -p ./../root1/dir1" \
- "$PROG \[checkout aborted\]: up-level in module reference (\`..') invalid: \`\./\.\./root1/dir1'\." \
- "$PROG \[server aborted\]: up-level in module reference (\`..') invalid: \`\./\.\./root1/dir1'\.
- $PROG \[checkout aborted\]: end of file from server (consult above messages if any)"
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -r 1
- rm -rf ${TESTDIR}/root1 ${TESTDIR}/root2
- unset CVSROOT1
- unset CVSROOT2
- ;;
- multiroot4)
- # More multiroot tests, in particular we have two roots with
- # similarly-named directories and we try to see that CVS can
- # keep them separate.
- CVSROOT1=`newroot ${TESTDIR}/root1`
- CVSROOT2=`newroot ${TESTDIR}/root2`
- mkdir 1; cd 1
- dotest multiroot4-1 "$testcvs -d$TESTDIR/root1 init"
- dotest multiroot4-2 "${testcvs} -d ${CVSROOT1} -q co -l ." ""
- mkdir dircom
- dotest multiroot4-3 "${testcvs} add dircom" \
- "Directory ${TESTDIR}/root1/dircom added to the repository"
- cd dircom
- touch file1
- dotest multiroot4-4 "${testcvs} add file1" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest multiroot4-5 "${testcvs} -q ci -m add" \
- "RCS file: ${TESTDIR}/root1/dircom/file1,v
- done
- Checking in file1;
- ${TESTDIR}/root1/dircom/file1,v <-- file1
- initial revision: 1\.1
- done"
- cd ../..
- mkdir 2; cd 2
- dotest multiroot4-6 "$testcvs -d$TESTDIR/root2 init"
- dotest multiroot4-7 "${testcvs} -d ${CVSROOT2} -q co -l ." ""
- mkdir dircom
- dotest multiroot4-8 "${testcvs} add dircom" \
- "Directory ${TESTDIR}/root2/dircom added to the repository"
- cd dircom
- touch file2
- dotest multiroot4-9 "${testcvs} add file2" \
- "${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add this file permanently"
- dotest multiroot4-10 "${testcvs} -q ci -m add" \
- "RCS file: ${TESTDIR}/root2/dircom/file2,v
- done
- Checking in file2;
- ${TESTDIR}/root2/dircom/file2,v <-- file2
- initial revision: 1\.1
- done"
- cd ../..
- cd 1/dircom
- # This may look contrived; the real world example which inspired
- # it was that a user was changing from local to remote. Cases
- # like switching servers (among those mounting the same
- # repository) and so on would also look the same.
- mkdir sdir2
- dotest multiroot4-11 "${testcvs} -d ${CVSROOT2} add sdir2" \
- "Directory ${TESTDIR}/root2/dircom/sdir2 added to the repository"
- dotest multiroot4-12 "${testcvs} -q update" ""
- cd ..
- dotest multiroot4-13 "${testcvs} -q update dircom" ""
- cd ..
- rm -r 1 2
- rm -rf ${TESTDIR}/root1 ${TESTDIR}/root2
- unset CVSROOT1
- unset CVSROOT2
- ;;
- rmroot)
- # When the Entries/Root file is removed from an existing
- # workspace, CVS should assume $CVSROOT instead
- #
- # Right now only checking that CVS exits normally on an
- # update once CVS/Root is deleted
- #
- # There was a time when this would core dump when run in
- # client/server mode
- mkdir 1; cd 1
- dotest rmroot-setup-1 "${testcvs} -q co -l ." ''
- mkdir first-dir
- dotest rmroot-setup-2 "${testcvs} add first-dir" \
- "Directory ${CVSROOT_DIRNAME}/first-dir added to the repository"
- cd first-dir
- touch file1 file2
- dotest rmroot-setup-3 "${testcvs} add file1 file2" \
- "${PROG} add: scheduling file .file1. for addition
- ${PROG} add: scheduling file .file2. for addition
- ${PROG} add: use .${PROG} commit. to add these files permanently"
- dotest rmroot-setup-4 "${testcvs} -q commit -minit" \
- "RCS file: ${CVSROOT_DIRNAME}/first-dir/file1,v
- done
- Checking in file1;
- ${CVSROOT_DIRNAME}/first-dir/file1,v <-- file1
- initial revision: 1\.1
- done
- RCS file: ${CVSROOT_DIRNAME}/first-dir/file2,v
- done
- Checking in file2;
- ${CVSROOT_DIRNAME}/first-dir/file2,v <-- file2
- initial revision: 1\.1
- done"
- rm CVS/Root
- dotest rmroot-1 "${testcvs} -q update" ''
- cd ../..
- rm -rf 1
- ;;
- reposmv)
- # More tests of repositories and specifying them.
- # Similar to crerepos but that test is probably getting big
- # enough.
- CVSROOT1=`newroot ${TESTDIR}/root1`
- CVSROOT_MOVED=`newroot ${TESTDIR}/root-moved`
- dotest reposmv-setup-1 "$testcvs -d$TESTDIR/root1 init"
- mkdir imp-dir; cd imp-dir
- echo file1 >file1
- dotest reposmv-setup-2 \
- "${testcvs} -d ${CVSROOT1} import -m add dir1 vendor release" \
- "N dir1/file1
- No conflicts created by this import"
- cd ..
- mkdir 1; cd 1
- dotest reposmv-1 "${testcvs} -d ${CVSROOT1} -Q co dir1" ""
- mv ${TESTDIR}/root1 ${TESTDIR}/root-moved
- cd dir1
- # If we didn't have a relative repository, get one now.
- dotest reposmv-1a "cat CVS/Repository" \
- "${TESTDIR}/root1/dir1" "dir1"
- echo dir1 >CVS/Repository
- # There were some duplicated warnings and such; only test
- # for the part of the error message which makes sense.
- # Bug: "skipping directory " without filename.
- if $remote; then
- dotest_fail reposmv-2r "${testcvs} update" \
- "Cannot access ${TESTDIR}/root1/CVSROOT
- No such file or directory"
- else
- dotest reposmv-2 "${testcvs} update" "${DOTSTAR}
- ${PROG} update: ignoring CVS/Root because it specifies a non-existent repository ${TESTDIR}/root1
- ${PROG} update: cannot open directory ${CVSROOT_DIRNAME}/dir1: No such file or directory
- ${PROG} update: skipping directory "
- fi
- # CVS/Root overrides $CVSROOT
- if $remote; then
- CVSROOT_save=${CVSROOT}
- CVSROOT=:fork:${TESTDIR}/root-moved; export CVSROOT
- dotest_fail reposmv-3r "${testcvs} update" \
- "Cannot access ${TESTDIR}/root1/CVSROOT
- No such file or directory"
- CVSROOT=${CVSROOT_save}; export CVSROOT
- else
- CVSROOT_save=${CVSROOT}
- CVSROOT=${TESTDIR}/root-moved; export CVSROOT
- dotest reposmv-3 "${testcvs} update" \
- "${DOTSTAR}
- ${PROG} update: ignoring CVS/Root because it specifies a non-existent repository ${TESTDIR}/root1
- ${PROG} update: Updating \.
- ${DOTSTAR}"
- CVSROOT=${CVSROOT_save}; export CVSROOT
- fi
- if $remote; then
- CVSROOT_save=${CVSROOT}
- CVSROOT=:fork:${TESTDIR}/root-none; export CVSROOT
- dotest_fail reposmv-4 "${testcvs} update" \
- "Cannot access ${TESTDIR}/root1/CVSROOT
- No such file or directory"
- CVSROOT=${CVSROOT_save}; export CVSROOT
- else
- # CVS/Root doesn't seem to quite completely override $CVSROOT
- # Bug? Not necessarily a big deal if it only affects error
- # messages.
- CVSROOT_save=${CVSROOT}
- CVSROOT=${TESTDIR}/root-none; export CVSROOT
- dotest_fail reposmv-4 "${testcvs} update" \
- "${PROG} update: in directory \.:
- ${PROG} update: ignoring CVS/Root because it specifies a non-existent repository ${TESTDIR}/root1
- ${PROG} \[update aborted\]: ${TESTDIR}/root-none/CVSROOT: No such file or directory"
- CVSROOT=${CVSROOT_save}; export CVSROOT
- fi
- # -d overrides CVS/Root
- #
- # Oddly enough, with CVS 1.10 I think this didn't work for
- # local (that is, it would appear that CVS/Root would not
- # get used, but would produce an error if it didn't exist).
- dotest reposmv-5 "${testcvs} -d ${CVSROOT_MOVED} update" \
- "${PROG} update: Updating \."
- # TODO: could also test various other things, like what if the
- # user removes CVS/Root (which is legit). Or another set of
- # tests would be if both repositories exist but we want to make
- # sure that CVS is using the correct one.
- cd ../..
- rm -r imp-dir 1
- rm -rf root1 root2
- unset CVSROOT1
- ;;
- pserver)
- # Test basic pserver functionality.
- if $remote; then
- # First set SystemAuth=no. Not really necessary, I don't
- # think, but somehow it seems like the clean thing for
- # the testsuite.
- mkdir 1; cd 1
- dotest pserver-1 "${testcvs} -Q co CVSROOT" ""
- cd CVSROOT
- echo "SystemAuth=no" >config
- dotest pserver-2 "${testcvs} -q ci -m config-it" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cat >${CVSROOT_DIRNAME}/CVSROOT/passwd <<EOF
- testme:q6WV9d2t848B2:$username
- dontroot:q6WV9d2t848B2:root
- anonymous::$username
- $username:
- willfail: :whocares
- EOF
- dotest_fail pserver-3 "${testcvs} pserver" \
- "error 0 Server configuration missing --allow-root in inetd.conf" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- testme
- Ay::'d
- END AUTH REQUEST
- EOF
- dotest_fail pserver-3a "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "error 0 ${CVSROOT_DIRNAME}XXX: no such repository
- I HATE YOU" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}XXX
- testme
- Ay::'d
- END AUTH REQUEST
- EOF
- # Confirm that not sending a newline during auth cannot constitute
- # a denial-of-service attack. This assumes that PATH_MAX is less
- # than 65536 bytes. If PATH_MAX is larger than 65535 bytes, this
- # test could hang indefinitely.
- ${AWK} 'BEGIN { printf "0123456789abcdef" }' </dev/null >garbageseg
- echo "BEGIN AUTH REQUEST" >garbageinput
- i=0
- while test $i -lt 64; do
- cat <garbageseg >>garbageseg2
- i=`expr $i + 1`
- done
- i=0
- while test $i -lt 64; do
- cat <garbageseg2 >>garbageinput
- i=`expr $i + 1`
- done
- dotest_fail pserver-auth-no-dos \
- "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${PROG} \\[pserver aborted\\]: Maximum line length exceeded during authentication\." <garbageinput
- unset i
- rm garbageseg garbageseg2 garbageinput
- # Sending the Root and noop before waiting for the
- # "I LOVE YOU" is bogus, but hopefully we can get
- # away with it.
- dotest pserver-4 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- ok" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- testme
- Ay::'d
- END AUTH REQUEST
- Root ${CVSROOT_DIRNAME}
- noop
- EOF
- # The "no such system user" error is occurring on at least one of
- # our BSD 2.0.2 nightly test platforms.
- dotest_fail pserver-4.2 \
- "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "error 0: root not allowed" \
- "E Fatal error, aborting\.
- error 0 root: no such system user" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- dontroot
- Ay::'d
- END AUTH REQUEST
- EOF
- dotest pserver-5 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- E Protocol error: Root says \"${TESTDIR}/1\" but pserver says \"${CVSROOT_DIRNAME}\"
- error " <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- testme
- Ay::'d
- END AUTH REQUEST
- Root ${TESTDIR}/1
- noop
- EOF
- dotest pserver-5a "$testcvs --allow-root=$CVSROOT_DIRNAME pserver" \
- "$DOTSTAR LOVE YOU
- E init may not be run remotely
- error " <<EOF
- BEGIN AUTH REQUEST
- $CVSROOT_DIRNAME
- testme
- Ay::'d
- END AUTH REQUEST
- init $TESTDIR/2
- EOF
- dotest_fail pserver-5b "test -d $TESTDIR/2"
- dotest_fail pserver-6 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "I HATE YOU" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- testme
- Ay::'d^b?hd
- END AUTH REQUEST
- EOF
- dotest_fail pserver-7 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "I HATE YOU" <<EOF
- BEGIN VERIFICATION REQUEST
- ${CVSROOT_DIRNAME}
- testme
- Ay::'d^b?hd
- END VERIFICATION REQUEST
- EOF
- dotest pserver-8 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU" <<EOF
- BEGIN VERIFICATION REQUEST
- ${CVSROOT_DIRNAME}
- testme
- Ay::'d
- END VERIFICATION REQUEST
- EOF
- # Tests pserver-9 through pserver-13 are about empty passwords
- # Test empty password (both sides) for aliased user
- dotest pserver-9 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- anonymous
- A
- END AUTH REQUEST
- EOF
- # Test empty password (server side only) for aliased user
- dotest pserver-10 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- anonymous
- Aanythingwouldworkhereittrulydoesnotmatter
- END AUTH REQUEST
- EOF
- # Test empty (both sides) password for non-aliased user
- dotest pserver-11 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- ${username}
- A
- END AUTH REQUEST
- EOF
- # Test empty (server side only) password for non-aliased user
- dotest pserver-12 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- ${username}
- Anypasswordwouldworkwhynotthisonethen
- END AUTH REQUEST
- EOF
- # Test failure of whitespace password
- dotest_fail pserver-13 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} HATE YOU" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- willfail
- Amquiteunabletocomeupwithinterestingpasswordsanymore
- END AUTH REQUEST
- EOF
- # The following tests are for read-only access
- # Check that readers can only read, everyone else can write
- cat >${CVSROOT_DIRNAME}/CVSROOT/readers <<EOF
- anonymous
- EOF
- dotest pserver-14 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- M Concurrent Versions System (CVS) .*
- ok" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- anonymous
- Ay::'d
- END AUTH REQUEST
- Root ${CVSROOT_DIRNAME}
- version
- EOF
- dotest pserver-16 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- M Concurrent Versions System (CVS) .*
- ok" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- testme
- Ay::'d
- END AUTH REQUEST
- Root ${CVSROOT_DIRNAME}
- version
- EOF
- dotest pserver-18 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- M Concurrent Versions System (CVS) .*
- ok" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- ${username}
- Ay::'d
- END AUTH REQUEST
- Root ${CVSROOT_DIRNAME}
- version
- EOF
- # Check that writers can write, everyone else can only read
- # even if not listed in readers
- cat >${CVSROOT_DIRNAME}/CVSROOT/writers <<EOF
- testme
- EOF
- dotest pserver-20 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- M Concurrent Versions System (CVS) .*
- ok" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- anonymous
- Ay::'d
- END AUTH REQUEST
- Root ${CVSROOT_DIRNAME}
- version
- EOF
- dotest pserver-22 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- M Concurrent Versions System (CVS) .*
- ok" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- testme
- Ay::'d
- END AUTH REQUEST
- Root ${CVSROOT_DIRNAME}
- version
- EOF
- dotest pserver-24 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- M Concurrent Versions System (CVS) .*
- ok" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- ${username}
- Ay::'d
- END AUTH REQUEST
- Root ${CVSROOT_DIRNAME}
- version
- EOF
- # Should work the same without readers
- rm ${CVSROOT_DIRNAME}/CVSROOT/readers
- dotest pserver-26 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- M Concurrent Versions System (CVS) .*
- ok" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- anonymous
- Ay::'d
- END AUTH REQUEST
- Root ${CVSROOT_DIRNAME}
- version
- EOF
- dotest pserver-28 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- M Concurrent Versions System (CVS) .*
- ok" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- testme
- Ay::'d
- END AUTH REQUEST
- Root ${CVSROOT_DIRNAME}
- version
- EOF
- dotest pserver-30 "${testcvs} --allow-root=${CVSROOT_DIRNAME} pserver" \
- "${DOTSTAR} LOVE YOU
- M Concurrent Versions System (CVS) .*
- ok" <<EOF
- BEGIN AUTH REQUEST
- ${CVSROOT_DIRNAME}
- ${username}
- Ay::'d
- END AUTH REQUEST
- Root ${CVSROOT_DIRNAME}
- version
- EOF
- # pserver used to try and print from the NULL pointer
- # in this error message in this case
- dotest_fail pserver-bufinit "${testcvs} pserver" \
- "${PROG} \[pserver aborted\]: bad auth protocol start: EOF" </dev/null
- # Clean up.
- echo "# comments only" >config
- dotest pserver-cleanup-1 "${testcvs} -q ci -m config-it" \
- "Checking in config;
- ${CVSROOT_DIRNAME}/CVSROOT/config,v <-- config
- new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
- done
- ${PROG} commit: Rebuilding administrative file database"
- cd ../..
- rm -r 1
- rm ${CVSROOT_DIRNAME}/CVSROOT/passwd ${CVSROOT_DIRNAME}/CVSROOT/writers
- fi # skip the whole thing for local
- ;;
- server)
- # Some tests of the server (independent of the client).
- if $remote; then
- dotest server-1 "${testcvs} server" \
- "E Protocol error: Root request missing
- error " <<EOF
- Directory bogus
- mumble/bar
- update
- EOF
- # Could also test for relative pathnames here (so that crerepos-6a
- # and crerepos-6b can use :fork:).
- dotest server-2 "$testcvs server" \
- "E init may not be run remotely
- error " <<EOF
- Set OTHER=variable
- Set MYENV=env-value
- init ${TESTDIR}/crerepos
- EOF
- dotest_fail server-3 "test -d $TESTDIR/crerepos/CVSROOT"
- dotest server-3a "$testcvs -d$TESTDIR/crerepos init"
- # Now some tests of gzip-file-contents (used by jCVS).
- ${AWK} 'BEGIN { \
- printf "%c%c%c%c%c%c.6%c%c+I-.%c%c%c%c5%c;%c%c%c%c", \
- 31, 139, 8, 64, 5, 7, 64, 3, 225, 2, 64, 198, 185, 5, 64, 64, 64}' \
- </dev/null | ${TR} '\100' '\000' >gzipped.dat
- # Note that the CVS client sends "-b 1.1.1", and this
- # test doesn't. But the server also defaults to that.
- cat <<EOF >session.dat
- Root ${TESTDIR}/crerepos
- UseUnchanged
- gzip-file-contents 3
- Argument -m
- Argument msg
- Argumentx
- Argument dir1
- Argument tag1
- Argument tag2
- Directory .
- ${TESTDIR}/crerepos
- Modified file1
- u=rw,g=r,o=r
- z25
- EOF
- cat gzipped.dat >>session.dat
- echo import >>session.dat
- dotest server-4 "${testcvs} server" \
- "M N dir1/file1
- M
- M No conflicts created by this import
- M
- ok" <session.dat
- dotest server-5 \
- "${testcvs} -q -d ${TESTDIR}/crerepos co -p dir1/file1" "test"
- # OK, here are some notify tests.
- dotest server-6 "${testcvs} server" \
- "Notified \./
- ${TESTDIR}/crerepos/dir1/file1
- ok" <<EOF
- Root ${TESTDIR}/crerepos
- Directory .
- ${TESTDIR}/crerepos/dir1
- Notify file1
- E Fri May 7 13:21:09 1999 GMT myhost some-work-dir EUC
- noop
- EOF
- # Sending the second "noop" before waiting for the output
- # from the first is bogus but hopefully we can get away
- # with it.
- dotest server-7 "${testcvs} server" \
- "Notified \./
- ${TESTDIR}/crerepos/dir1/file1
- ok
- Notified \./
- ${TESTDIR}/crerepos/dir1/file1
- ok" <<EOF
- Root ${TESTDIR}/crerepos
- Directory .
- ${TESTDIR}/crerepos/dir1
- Notify file1
- E Fri May 7 13:21:09 1999 GMT myhost some-work-dir EUC
- noop
- Notify file1
- E The 57th day of Discord in the YOLD 3165 myhost some-work-dir EUC
- noop
- EOF
- # OK, now test a few error conditions.
- # FIXCVS: should give "error" and no "Notified", like server-9
- dotest server-8 "${testcvs} server" \
- "E ${PROG} server: invalid character in editor value
- Notified \./
- ${TESTDIR}/crerepos/dir1/file1
- ok" <<EOF
- Root ${TESTDIR}/crerepos
- Directory .
- ${TESTDIR}/crerepos/dir1
- Notify file1
- E Setting Orange, the 52th day of Discord in the YOLD 3165 myhost some-work-dir EUC
- noop
- EOF
- dotest server-9 "${testcvs} server" \
- "E Protocol error; misformed Notify request
- error " <<EOF
- Root ${TESTDIR}/crerepos
- Directory .
- ${TESTDIR}/crerepos/dir1
- Notify file1
- E Setting Orange+57th day of Discord myhost some-work-dir EUC
- noop
- EOF
- # First demonstrate an interesting quirk in the protocol.
- # The "watchers" request selects the files to operate based
- # on files which exist in the working directory. So if we
- # don't send "Entry" or the like, it won't do anything.
- # Wants to be documented in cvsclient.texi...
- dotest server-10 "${testcvs} server" "ok" <<EOF
- Root ${TESTDIR}/crerepos
- Directory .
- ${TESTDIR}/crerepos/dir1
- watchers
- EOF
- # See if "watchers" and "editors" display the right thing.
- dotest server-11 "${testcvs} server" \
- "M file1 ${username} tedit tunedit tcommit
- ok" <<EOF
- Root ${TESTDIR}/crerepos
- Directory .
- ${TESTDIR}/crerepos/dir1
- Entry /file1/1.1////
- watchers
- EOF
- dotest server-12 "${testcvs} server" \
- "M file1 ${username} The 57th day of Discord in the YOLD 3165 myhost some-work-dir
- ok" <<EOF
- Root ${TESTDIR}/crerepos
- Directory .
- ${TESTDIR}/crerepos/dir1
- Entry /file1/1.1////
- editors
- EOF
- # Now do an unedit.
- dotest server-13 "${testcvs} server" \
- "Notified \./
- ${TESTDIR}/crerepos/dir1/file1
- ok" <<EOF
- Root ${TESTDIR}/crerepos
- Directory .
- ${TESTDIR}/crerepos/dir1
- Notify file1
- U 7 May 1999 15:00 GMT myhost some-work-dir EUC
- noop
- EOF
- # Now try "watchers" and "editors" again.
- dotest server-14 "${testcvs} server" "ok" <<EOF
- Root ${TESTDIR}/crerepos
- Directory .
- ${TESTDIR}/crerepos/dir1
- watchers
- EOF
- dotest server-15 "${testcvs} server" "ok" <<EOF
- Root ${TESTDIR}/crerepos
- Directory .
- ${TESTDIR}/crerepos/dir1
- editors
- EOF
- # Test that the global `-l' option is ignored nonfatally.
- dotest server-16 "${testcvs} server" \
- "E cvs server: WARNING: global \`-l' option ignored\.
- ok" <<EOF
- Global_option -l
- noop
- EOF
- # There used to be some exploits based on malformed Entry requests
- dotest server-17 "$testcvs server" \
- "E protocol error: Malformed Entry
- error " <<EOF
- Root $TESTDIR/crerepos
- Directory .
- $TESTDIR/crerepos/dir1
- Entry X/file1/1.1////
- noop
- EOF
- dotest server-18 "$testcvs server" \
- "E protocol error: Malformed Entry
- error " <<EOF
- Root $TESTDIR/crerepos
- Directory .
- $TESTDIR/crerepos/dir1
- Entry /CC/CC/CC
- noop
- EOF
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- rm -rf ${TESTDIR}/crerepos
- rm gzipped.dat session.dat
- fi # skip the whole thing for local
- ;;
- server2)
- # More server tests, in particular testing that various
- # possible security holes are plugged.
- if $remote; then
- dotest server2-1 "${testcvs} server" \
- "E protocol error: directory '${CVSROOT_DIRNAME}/\.\./dir1' not within root '${CVSROOT_DIRNAME}'
- error " <<EOF
- Root ${CVSROOT_DIRNAME}
- Directory .
- ${CVSROOT_DIRNAME}/../dir1
- noop
- EOF
- dotest server2-2 "${testcvs} server" \
- "E protocol error: directory '${CVSROOT_DIRNAME}dir1' not within root '${CVSROOT_DIRNAME}'
- error " <<EOF
- Root ${CVSROOT_DIRNAME}
- Directory .
- ${CVSROOT_DIRNAME}dir1
- noop
- EOF
- dotest server2-3 "${testcvs} server" \
- "E protocol error: directory '${TESTDIR}' not within root '${CVSROOT_DIRNAME}'
- error " <<EOF
- Root ${CVSROOT_DIRNAME}
- Directory .
- ${TESTDIR}
- noop
- EOF
- # OK, now a few tests for the rule that one cannot pass a
- # filename containing a slash to Modified, Is-modified,
- # Notify, Questionable, or Unchanged. For completeness
- # we'd try them all. For lazyness/conciseness we don't.
- dotest server2-4 "${testcvs} server" \
- "E protocol error: directory 'foo/bar' not within current directory
- error " <<EOF
- Root ${CVSROOT_DIRNAME}
- Directory .
- ${CVSROOT_DIRNAME}
- Unchanged foo/bar
- noop
- EOF
- dotest server2-5 \
- "$testcvs --allow-root=$CVSROOT_DIRNAME.bad server" \
- "E Bad root $CVSROOT_DIRNAME
- error " <<EOF
- Root $CVSROOT_DIRNAME
- noop
- EOF
- dotest server2-6 \
- "$testcvs --allow-root=$CVSROOT_DIRNAME server" \
- "ok" <<EOF
- Root $CVSROOT_DIRNAME
- noop
- EOF
- fi
- ;;
- server3)
- # Test that various checks on the Root request generate the correct
- # error messages.
- if $remote; then
- # As a control, a valid request.
- dotest server3-1 "$testcvs server" 'ok' <<EOF
- Root $CVSROOT_DIRNAME
- Directory .
- $CVSROOT_DIRNAME
- Unchanged foo
- noop
- EOF
- dotest server3-2 "$testcvs server" \
- "E Root somewhere/over/the/rainbow must be an absolute pathname
- error " <<EOF
- Root somewhere/over/the/rainbow
- noop
- EOF
- dotest server3-3 "$testcvs server" \
- "E Protocol error: Duplicate Root request, for $CVSROOT_DIRNAME
- error " <<EOF
- Root $CVSROOT_DIRNAME
- Root $CVSROOT_DIRNAME
- noop
- EOF
- dotest server3-4 "$testcvs server" \
- "E Protocol error: Duplicate Root request, for $CVSROOT_DIRNAME
- error " <<EOF
- Root $CVSROOT_DIRNAME
- Root $CVSROOT_DIRNAME
- Directory .
- $CVSROOT_DIRNAME
- Unchanged foo
- noop
- EOF
- # These cascading errors seem odd, but the client should have hung
- # up after the first.
- dotest server3-5 "$testcvs server" \
- "E Root somewhere/over/the/rainbow must be an absolute pathname
- error
- E Protocol error: Root request missing
- error " <<EOF
- Root somewhere/over/the/rainbow
- Directory .
- somewhere/over/the/rainbow
- Unchanged foo
- noop
- EOF
- fi
- ;;
- client)
- # Some tests of the client (independent of the server).
- if $remote; then
- cat >${TESTDIR}/serveme <<EOF
- #!${TESTSHELL}
- # This is admittedly a bit cheezy, in the sense that we make lots
- # of assumptions about what the client is going to send us.
- # We don't mention Repository, because current clients don't require it.
- # Sending these at our own pace, rather than waiting for the client to
- # make the requests, is bogus, but hopefully we can get away with it.
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "M special message"
- echo "Created first-dir/"
- echo "${CVSROOT_DIRNAME}/first-dir/file1"
- echo "/file1/1.1///"
- echo "u=rw,g=rw,o=rw"
- echo "4"
- echo "xyz"
- echo "ok"
- cat >/dev/null
- EOF
- # Cygwin. Pthffffffffft!
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod +x ${TESTDIR}/serveme"
- else
- chmod +x ${TESTDIR}/serveme
- fi
- save_CVS_SERVER=$CVS_SERVER
- CVS_SERVER=${TESTDIR}/serveme; export CVS_SERVER
- mkdir 1; cd 1
- dotest_fail client-1 "${testcvs} -q co first-dir" \
- "${PROG} \[checkout aborted\]: This server does not support the global -q option${DOTSTAR}"
- dotest client-2 "${testcvs} co first-dir" "special message"
- cat >${TESTDIR}/serveme <<EOF
- #!${TESTSHELL}
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "M merge-it"
- echo "Copy-file ./"
- echo "${CVSROOT_DIRNAME}/first-dir/file1"
- echo "${TESTDIR}/bogus/.#file1.1.1"
- echo "Merged ./"
- echo "${CVSROOT_DIRNAME}/first-dir/file1"
- echo "/file1/1.2///"
- echo "u=rw,g=rw,o=rw"
- echo "4"
- echo "abd"
- echo "ok"
- cat >/dev/null
- EOF
- cd first-dir
- mkdir ${TESTDIR}/bogus
- # The ${DOTSTAR} is to match a potential "broken pipe" if the
- # client exits before the server script sends everything
- dotest_fail client-3 "${testcvs} update" "merge-it
- ${PROG} \[update aborted\]: protocol error: Copy-file tried to specify director${DOTSTAR}"
- cat >${TESTDIR}/serveme <<EOF
- #!${TESTSHELL}
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "M merge-it"
- echo "Copy-file ./"
- echo "${CVSROOT_DIRNAME}/first-dir/file1"
- echo ".#file1.1.1"
- echo "Merged ./"
- echo "${CVSROOT_DIRNAME}/first-dir/file1"
- echo "/file1/1.2///"
- echo "u=rw,g=rw,o=rw"
- echo "4"
- echo "abc"
- echo "ok"
- cat >/dev/null
- EOF
- dotest client-4 "${testcvs} update" "merge-it"
- dotest client-5 "cat .#file1.1.1" "xyz"
- dotest client-6 "cat CVS/Entries" "/file1/1.2/[A-Za-z0-9 :]*//
- D"
- dotest client-7 "cat file1" "abc"
- cat >${TESTDIR}/serveme <<EOF
- #!${TESTSHELL}
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "M OK, whatever"
- echo "ok"
- cat >${TESTDIR}/client.tmp
- EOF
- chmod u=rw,go= file1
- # By specifying the time zone in local time, we don't
- # know exactly how that will translate to GMT.
- dotest client-8 "${testcvs} update -D 99-10-04" "OK, whatever"
- # String 2 below is Cygwin again - ptoooey.
- dotest client-9 "cat ${TESTDIR}/client.tmp" \
- "Root ${CVSROOT_DIRNAME}
- Valid-responses [-a-zA-Z ]*
- valid-requests
- Argument -D
- Argument [34] Oct 1999 [0-9][0-9]:00:00 -0000
- Argument --
- Directory \.
- ${CVSROOT_DIRNAME}/first-dir
- Entry /file1/1\.2///
- Modified file1
- u=rw,g=,o=
- 4
- abc
- update" \
- "Root ${CVSROOT_DIRNAME}
- Valid-responses [-a-zA-Z ]*
- valid-requests
- Argument -D
- Argument [34] Oct 1999 [0-9][0-9]:00:00 -0000
- Argument --
- Directory \.
- ${CVSROOT_DIRNAME}/first-dir
- Entry /file1/1\.2///
- Modified file1
- u=rw,g=r,o=r
- 4
- abc
- update"
- # The following test tests what was a potential client update in
- # CVS versions 1.11.14 and CVS versions 1.12.6 and earlier. This
- # exploit would allow a trojan server to create arbitrary files,
- # anywhere the user had write permissions, even outside of the
- # user's sandbox.
- cat >$HOME/.bashrc <<EOF
- #!$TESTSHELL
- # This is where login scripts would usually be
- # stored.
- EOF
- cat >$TESTDIR/serveme <<EOF
- #!$TESTSHELL
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "Rcs-diff $HOME/"
- echo "$HOME/.bashrc"
- echo "/.bashrc/73.50///"
- echo "u=rw,g=rw,o=rw"
- echo "20"
- echo "a1 1"
- echo "echo 'gotcha!'"
- echo "ok"
- cat >/dev/null
- EOF
-
- # If I don't run the following sleep between the above cat and
- # the following calls to dotest, sometimes the serveme file isn't
- # completely written yet by the time CVS tries to execute it,
- # causing the shell to intermittantly report syntax errors (usually
- # early EOF). There's probably a new race condition here, but this
- # works.
- #
- # Incidentally, I can reproduce this behavior with Linux 2.4.20 and
- # Bash 2.05 or Bash 2.05b.
- sleep 1
- dotest_fail client-10 "$testcvs update" \
- "$PROG update: Server attempted to update a file via an invalid pathname:
- $PROG \[update aborted\]: \`$HOME/.bashrc'\."
- # A second try at a client exploit. This one never actually
- # failed in the past, but I thought it wouldn't hurt to add a test.
- cat >$TESTDIR/serveme <<EOF
- #!$TESTSHELL
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "Rcs-diff ./"
- echo "$HOME/.bashrc"
- echo "/.bashrc/73.50///"
- echo "u=rw,g=rw,o=rw"
- echo "20"
- echo "a1 1"
- echo "echo 'gotcha!'"
- echo "ok"
- cat >/dev/null
- EOF
- sleep 1
- dotest_fail client-11 "$testcvs update" \
- "$PROG \[update aborted\]: patch original file \./\.bashrc does not exist"
- # A third try at a client exploit. This one did used to fail like
- # client-10.
- cat >$TESTDIR/serveme <<EOF
- #!$TESTSHELL
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "Rcs-diff ../../home/"
- echo "../../.bashrc"
- echo "/.bashrc/73.50///"
- echo "u=rw,g=rw,o=rw"
- echo "20"
- echo "a1 1"
- echo "echo 'gotcha!'"
- echo "ok"
- cat >/dev/null
- EOF
- sleep 1
- dotest_fail client-12 "$testcvs update" \
- "$PROG update: Server attempted to update a file via an invalid pathname:
- $PROG \[update aborted\]: \`\.\./\.\./home/.bashrc'\."
- # Try the same exploit using the Created response.
- cat >$TESTDIR/serveme <<EOF
- #!$TESTSHELL
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "Created $HOME/"
- echo "$HOME/.bashrc"
- echo "/.bashrc/73.50///"
- echo "u=rw,g=rw,o=rw"
- echo "26"
- echo "#! /bin/sh"
- echo "echo 'gotcha!'"
- echo "ok"
- cat >/dev/null
- EOF
- sleep 1
- dotest_fail client-13 "$testcvs update" \
- "$PROG update: Server attempted to update a file via an invalid pathname:
- $PROG \[update aborted\]: \`$HOME/.bashrc'\."
- # Now try using the Update-existing response
- cat >$TESTDIR/serveme <<EOF
- #!$TESTSHELL
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "Update-existing ../../home/"
- echo "../../home/.bashrc"
- echo "/.bashrc/73.50///"
- echo "u=rw,g=rw,o=rw"
- echo "26"
- echo "#! /bin/sh"
- echo "echo 'gotcha!'"
- echo "ok"
- cat >/dev/null
- EOF
- sleep 1
- dotest_fail client-14 "$testcvs update" \
- "$PROG update: Server attempted to update a file via an invalid pathname:
- $PROG \[update aborted\]: \`\.\./\.\./home/.bashrc'\."
- # Try the same exploit using the Merged response.
- cat >$TESTDIR/serveme <<EOF
- #!$TESTSHELL
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "Merged $HOME/"
- echo "$HOME/.bashrc"
- echo "/.bashrc/73.50///"
- echo "u=rw,g=rw,o=rw"
- echo "26"
- echo "#! /bin/sh"
- echo "echo 'gotcha!'"
- echo "ok"
- cat >/dev/null
- EOF
- sleep 1
- dotest_fail client-15 "$testcvs update" \
- "$PROG update: Server attempted to update a file via an invalid pathname:
- $PROG \[update aborted\]: \`$HOME/.bashrc'\."
- # Now try using the Updated response
- cat >$TESTDIR/serveme <<EOF
- #!$TESTSHELL
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "Updated ../../home/"
- echo "../../home/.bashrc"
- echo "/.bashrc/73.50///"
- echo "u=rw,g=rw,o=rw"
- echo "26"
- echo "#! /bin/sh"
- echo "echo 'gotcha!'"
- echo "ok"
- cat >/dev/null
- EOF
- sleep 1
- dotest_fail client-16 "$testcvs update" \
- "$PROG update: Server attempted to update a file via an invalid pathname:
- $PROG \[update aborted\]: \`\.\./\.\./home/.bashrc'\."
- # Try the same exploit using the Copy-file response.
- # As far as I know, Copy-file was never exploitable either.
- cat >$TESTDIR/serveme <<EOF
- #!$TESTSHELL
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "ok"
- echo "Created ."
- echo "./innocuous"
- echo "/innocuous/73.50///"
- echo "u=rw,g=rw,o=rw"
- echo "26"
- echo "#! /bin/sh"
- echo "echo 'gotcha!'"
- echo "Copy-file ."
- echo "./innocuous"
- echo "$HOME/innocuous"
- echo "ok"
- cat >/dev/null
- EOF
- sleep 1
- dotest_fail client-18 "$testcvs update" \
- "$PROG \[update aborted\]: protocol error: Copy-file tried to specify directory"
- # And verify that none of the exploits was successful.
- dotest client-19 "cat $HOME/.bashrc" \
- "#!$TESTSHELL
- # This is where login scripts would usually be
- # stored\."
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -r 1
- rmdir ${TESTDIR}/bogus
- rm $TESTDIR/serveme $HOME/.bashrc
- CVS_SERVER=${save_CVS_SERVER}; export CVS_SERVER
- fi # skip the whole thing for local
- ;;
- client2)
- # Test how the client handles error messages from the server.
- if $remote; then
- cat >$TESTDIR/serveme <<EOF
- #!$TESTSHELL
- # This is just as cheesy as the "client" tests made it out to be.
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "E Root somewhere/over/the/rainbow must be an absolute pathname"
- echo "error "
- echo "E Protocol error: Root request missing"
- echo "error "
- cat >/dev/null
- EOF
- # Cygwin. Pthffffffffft!
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod +x $TESTDIR/serveme"
- else
- chmod +x $TESTDIR/serveme
- fi
- save_CVS_SERVER=$CVS_SERVER
- CVS_SERVER=$TESTDIR/serveme; export CVS_SERVER
- mkdir client2; cd client2
- dotest_fail client2-1 "$testcvs co first-dir" \
- "Root somewhere/over/the/rainbow must be an absolute pathname"
- cat >$TESTDIR/serveme <<EOF
- #!$TESTSHELL
- # This is just as cheesy as the "client" tests made it out to be.
- echo "Valid-requests Root Valid-responses valid-requests Directory Entry Modified Unchanged Argument Argumentx ci co update"
- echo "E Root somewhere/over/the/rainbow must be an absolute pathname"
- echo
- echo "error "
- echo "E Protocol error: Root request missing"
- echo "error "
- cat >/dev/null
- EOF
- # Cygwin. Pthffffffffft!
- if test -n "$remotehost"; then
- $CVS_RSH $remotehost "chmod +x $TESTDIR/serveme"
- else
- chmod +x $TESTDIR/serveme
- fi
- dotest_fail client2-2 "$testcvs co first-dir" \
- "Root somewhere/over/the/rainbow must be an absolute pathname
- $PROG checkout: warning: unrecognized response \`' from cvs server"
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ..
- rm -r client2
- rm $TESTDIR/serveme
- CVS_SERVER=$save_CVS_SERVER; export CVS_SERVER
- fi # skip the whole thing for local
- ;;
- dottedroot)
- # Check that a CVSROOT with a "." in the name will work.
- CVSROOT_save=${CVSROOT}
- CVSROOT_DIRNAME_save=${CVSROOT_DIRNAME}
- CVSROOT_DIRNAME=${TESTDIR}/cvs.root
- CVSROOT=`newroot ${CVSROOT_DIRNAME}`
- dotest dottedroot-init-1 "$testcvs -d$CVSROOT_DIRNAME init"
- mkdir dir1
- mkdir dir1/dir2
- echo version1 >dir1/dir2/file1
- cd dir1
- dotest dottedroot-1 "${testcvs} import -m '' module1 AUTHOR INITIAL" \
- "${PROG} [a-z]*: Importing ${CVSROOT_DIRNAME}/module1/dir2
- N module1/dir2/file1
- No conflicts created by this import"
- cd ..
- # This is the test that used to cause an assertion failure
- # in recurse.c:do_recursion().
- dotest dottedroot-2 "${testcvs} co -rINITIAL module1" \
- "${PROG} [a-z]*: Updating module1
- ${PROG} [a-z]*: Updating module1/dir2
- U module1/dir2/file1"
- # This also triggered the assertion failure above prior to 1.11.23.
- dotest dottedroot-3 \
- "$testcvs -q co -prINITIAL module1/./dir2/file1" \
- 'version1'
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- rm -rf ${CVSROOT_DIRNAME}
- rm -r dir1 module1
- CVSROOT_DIRNAME=${CVSROOT_DIRNAME_save}
- CVSROOT=${CVSROOT_save}
- ;;
-
- fork)
- # Test that the server defaults to the correct executable in :fork:
- # mode. See the note in the TODO at the end of this file about this.
- #
- # This test and client should be left after all other references to
- # CVS_SERVER are removed from this script.
- #
- # The client series of tests already tests that CVS_SERVER is
- # working, but that test might be better here.
- if $remote; then
- mkdir fork; cd fork
- save_CVS_SERVER=$CVS_SERVER
- unset CVS_SERVER
- # So looking through $PATH for cvs won't work...
- echo "echo junk" >cvs
- chmod a+x cvs
- save_PATH=$PATH; PATH=.:$PATH
- dotest fork-1 "$testcvs -d:fork:$CVSROOT_DIRNAME version" \
- 'Client: \(.*\)
- Server: \1'
- CVS_SERVER=${save_CVS_SERVER}; export CVS_SERVER
- unset save_CVS_SERVER
- PATH=$save_PATH; unset save_PATH
- cd ..
- if $keep; then
- echo Keeping ${TESTDIR} and exiting due to --keep
- exit 0
- fi
- fi
- ;;
- commit-add-missing)
- # Make sure that a commit fails when a `cvs add'ed file has
- # been removed from the working directory.
- mkdir 1; cd 1
- module=c-a-m
- echo > unused-file
- dotest commit-add-missing-1 \
- "$testcvs -Q import -m. $module X Y" ''
- file=F
- # Check it out and tag it.
- dotest commit-add-missing-2 "$testcvs -Q co $module" ''
- cd $module
- dotest commit-add-missing-3 "$testcvs -Q tag -b B" ''
- echo v1 > $file
- dotest commit-add-missing-4 "$testcvs -Q add $file" ''
- rm -f $file
- dotest_fail commit-add-missing-5 "$testcvs -Q ci -m. $file" \
- "${PROG} commit: Up-to-date check failed for .$file'
- ${PROG} \[commit aborted\]: correct above errors first!"
- cd ../..
- rm -rf 1
- rm -rf ${CVSROOT_DIRNAME}/$module
- ;;
- add-restricted)
- # Verify that `sdir/CVS' may not be explicitly added.
- mkdir add-restricted; cd add-restricted
- mkdir import; cd import
- : > junk
- dotest add-restricted-init-1 \
- "$testcvs -Q import -m. add-restricted X Y"
- cd ..
- dotest add-restricted-init-2 "$testcvs -Q co add-restricted"
- cd add-restricted
- # errmsg2-3 tests the specific message here.
- dotest_fail add-restricted-1 "$testcvs -Q add CVS"
- mkdir sdir
- dotest add-restricted-2 "$testcvs -Q add sdir"
- dotest_fail add-restricted-3 "$testcvs add sdir/CVS" \
- "$PROG add: cannot add special file \`sdir/CVS'; skipping"
- if $keep; then
- echo Keeping $TESTDIR and exiting due to --keep
- exit 0
- fi
- cd ../..
- rm -rf add-restricted $CVSROOT_DIRNAME/add-restricted
- ;;
- commit-d)
- # Check that top-level commits work when CVS/Root
- # is overridden by cvs -d.
- mkdir -p 1/subdir; cd 1
- touch file1 subdir/file2
- dotest commit-d-1 "$testcvs -Q import -m. c-d-c X Y" ""
- dotest commit-d-2 "$testcvs -Q co c-d-c" ""
- cd c-d-c
- echo change >>file1; echo another change >>subdir/file2
- # Changing working root, then override with -d
- echo nosuchhost:/cvs > CVS/Root
- dotest commit-d-3 "$testcvs -Q -d $CVSROOT commit -m." \
- "Checking in file1;
- ${CVSROOT_DIRNAME}/c-d-c/file1,v <-- file1
- new revision: 1.2; previous revision: 1.1
- done
- Checking in subdir/file2;
- ${CVSROOT_DIRNAME}/c-d-c/subdir/file2,v <-- file2
- new revision: 1.2; previous revision: 1.1
- done"
- cd ../..
- rm -rf 1 cvsroot/c-d-c
- ;;
- *)
- echo $what is not the name of a test -- ignored
- ;;
- esac
- # Sanity check sanity.sh. :)
- #
- # Test our exit directory so that tests that exit in an incorrect directory
- # are noticed during single test runs.
- #
- # FIXME?
- # Sparc Solaris 9 is dereferencing paths here as if /bin/pwd were
- # called when /tmp is a symlink. This might be a new problem with this
- # test, but since this was recently tested I think it more likely to be
- # A Solaris issue.
- if test "x$TESTDIR" != "x`pwd`"; then
- fail "cleanup: PWD != TESTDIR (\``pwd`' != \`$TESTDIR')"
- fi
- # Reset val-tags to a pristine state.
- rm -f $CVSROOT_DIRNAME/CVSROOT/val-tags
- verify_tmp_empty "post $what"
- done # The big loop
- # Set up summary data for output.
- skippedoutput=
- warningsoutput=
- extendedinfo=
- if test $skipped -ne 0; then
- skippedoutput="$skipped test group"
- if test $skipped -ne 1; then
- skippedoutput="${skippedoutput}s"
- fi
- skippedoutput="$skippedoutput skipped"
- fi
- if test $warnings -ne 0; then
- warningsoutput="$warnings test"
- if test $warnings -ne 1; then
- warningsoutput="${warningsoutput}s"
- fi
- warningsoutput="$warningsoutput passed with warnings"
- fi
- if test -n "$skippedoutput" || test -n "$warningsoutput"; then
- extendedinfo=" ("
- if test -n "$skippedoutput"; then
- extendedinfo="$extendedinfo$skippedoutput"
- fi
- if test -n "$skippedoutput" && test -n "$warningsoutput"; then
- extendedinfo="$extendedinfo and "
- fi
- if test -n "$warningsoutput"; then
- extendedinfo="$extendedinfo$warningsoutput"
- fi
- extendedinfo="$extendedinfo)"
- fi
- echo "OK, all $passed tests passed$extendedinfo."
- # TODO:
- # * Test `cvs update -d foo' (where foo does not exist).
- # * Test `cvs update foo bar' (where foo and bar are both from the
- # same directory in the repository). Suppose one is a branch--make
- # sure that both directories get updated with the respective correct
- # thing.
- # * `cvs update ../foo'. Also ../../foo ./../foo foo/../../bar /foo/bar
- # foo/.././../bar foo/../bar etc.
- # * Test all flags in modules file.
- # Test that ciprog gets run both on checkin in that directory, or a
- # higher-level checkin which recurses into it.
- # * Test operations on a directory that contains other directories but has
- # no files of its own.
- # * -t global option
- # * cvs rm followed by cvs add or vice versa (with no checkin in between).
- # * cvs rm twice (should be a nice error message).
- # * -P option to checkout--(a) refrains from checking out new empty dirs,
- # (b) prunes empty dirs already there.
- # * Test that cvs -d `hostname`:${TESTDIR}/non/existent co foo
- # gives an appropriate error (e.g.
- # Cannot access ${TESTDIR}/non-existent/CVSROOT
- # No such file or directory).
- # (like basica-9, but for remote).
- # * Test ability to send notifications in response to watches. (currently
- # hard to test because CVS doesn't send notifications if username is the
- # same).
- # * Test the contents of adm files other than Root and Repository.
- # Entries seems the next most important thing.
- # * Test the following compatibility issues:
- # - The filler fields in "D" entries in CVS/Entries get preserved
- # (per cvs.texinfo).
- # - Unrecognized entry types in CVS/Entries get ignored (looks like
- # this needs to be documented in cvs.texinfo, but is not)
- # - Test that unrecognized files in CVS directories (e.g. CVS/Foobar)
- # are ignored (per cvs.texinfo).
- # - Test 'cvs history' with symlinks in the path to the working directory.
- # - Remove most of the CVS_SERVER stuff after a reasonable amount of time.
- # The "fork" & "client" series of tests should be left. 4/2/00, CVS
- # 1.11.0.1 was altered so that it would default to program_name (set from
- # argv[0]) rather than "cvs", but I'd like this script to work on legacy
- # versions of CVS for awhile.
- # - Testsuite doesn't work with usernames over eight characters in length.
- # Fix it.
- # End of TODO list.
- # Exit if keep set
- if $keep; then
- echo "Keeping ${TESTDIR} and exiting due to -k (keep) option."
- exit 0
- fi
- # Remove the test directory, but first change out of it.
- cd `dirname ${TESTDIR}`
- rm -rf ${TESTDIR}
- # end of sanity.sh