diff options
Diffstat (limited to 'contrib/cvs/src/sanity.sh')
-rwxr-xr-x | contrib/cvs/src/sanity.sh | 30254 |
1 files changed, 0 insertions, 30254 deletions
diff --git a/contrib/cvs/src/sanity.sh b/contrib/cvs/src/sanity.sh deleted file mode 100755 index dbcae19..0000000 --- a/contrib/cvs/src/sanity.sh +++ /dev/null @@ -1,30254 +0,0 @@ -#! /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 |