summaryrefslogtreecommitdiffstats
path: root/contrib/cvs/src
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1999-03-18 09:21:42 +0000
committerpeter <peter@FreeBSD.org>1999-03-18 09:21:42 +0000
commit0d50adfc046cabdc6bb5c12a9e561b000e6d45ae (patch)
tree58a4783cdce3d066e32e646cb6d675dbbdb8506a /contrib/cvs/src
parentd2f144d6a08fbcadcee174f1cc2efb9fec24e4a1 (diff)
parent308b60f66831aa65a459a7b347ea6ca14b6e4799 (diff)
downloadFreeBSD-src-0d50adfc046cabdc6bb5c12a9e561b000e6d45ae.zip
FreeBSD-src-0d50adfc046cabdc6bb5c12a9e561b000e6d45ae.tar.gz
This commit was generated by cvs2svn to compensate for changes in r44852,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'contrib/cvs/src')
-rw-r--r--contrib/cvs/src/ChangeLog712
-rw-r--r--contrib/cvs/src/Makefile.in5
-rw-r--r--contrib/cvs/src/add.c33
-rw-r--r--contrib/cvs/src/admin.c20
-rw-r--r--contrib/cvs/src/checkout.c103
-rw-r--r--contrib/cvs/src/classify.c10
-rw-r--r--contrib/cvs/src/client.c60
-rw-r--r--contrib/cvs/src/edit.c20
-rw-r--r--contrib/cvs/src/error.c14
-rw-r--r--contrib/cvs/src/fileattr.c8
-rw-r--r--contrib/cvs/src/hardlink.c220
-rw-r--r--contrib/cvs/src/hardlink.h6
-rw-r--r--contrib/cvs/src/history.c43
-rw-r--r--contrib/cvs/src/options.h.in13
-rw-r--r--contrib/cvs/src/parseinfo.c12
-rw-r--r--contrib/cvs/src/rtag.c2
-rwxr-xr-xcontrib/cvs/src/sanity.sh1768
-rw-r--r--contrib/cvs/src/status.c2
-rw-r--r--contrib/cvs/src/tag.c15
-rw-r--r--contrib/cvs/src/version.c3
-rw-r--r--contrib/cvs/src/wrapper.c10
21 files changed, 2713 insertions, 366 deletions
diff --git a/contrib/cvs/src/ChangeLog b/contrib/cvs/src/ChangeLog
index 96e1701..8077ce8 100644
--- a/contrib/cvs/src/ChangeLog
+++ b/contrib/cvs/src/ChangeLog
@@ -1,5 +1,709 @@
+Thu Aug 13 11:15:24 1998 Noel Cragg <noel@swish.red-bean.com>
+
+ * version.c: Change version number to 1.10 and name to `Halibut'.
+
+ * sanity.sh (rcslib): new tests to check behavior of symlinks in
+ the repository.
+
+Wed Aug 12 15:39:38 1998 Noel Cragg <noel@swish.red-bean.com>
+
+ * main.c (lookup_command_attribute): the `annotate' command
+ shouldn't require access to the repository. Add comment about
+ commands that do not use the working directory.
+
+Mon Aug 10 10:26:38 1998 Noel Cragg <noel@swish.red-bean.com>
+
+ * version.c: Change version number to 1.9.30.
+
+Thu Aug 6 17:44:50 1998 Noel Cragg <noel@swish.red-bean.com>
+
+ * server.c (serve_rdiff): change the name of the command (for
+ error reporting, etc.) from "patch" to "rdiff."
+ (serve_remove): rename from "cvsremove" to "remove."
+
+ * main.c (lookup_command_attribute): the `rdiff' command shouldn't
+ require write access to the repository.
+
+1998-08-06 David Masterson of kla-tencor.com
+ and Jim Kingdon
+
+ * commit.c (commit_filesdoneproc): Don't call strlen ("CVSROOT")
+ from within the assert statement. Apparently HP's cc compiler on
+ HPUX 10.20 has trouble with that.
+
+1998-08-06 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * rcs.c (RCS_checkin): When adding branch, if there is a lock on
+ the branchpoint owned by someone else, leave it alone. This
+ restores CVS 1.9 (RCS 5.7) behavior, fixing a core dump.
+ * sanity.sh (reserved): New tests reserved-16 through reserved-19
+ test for this fix.
+
+1998-08-05 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (unedit-without-baserev): Use ${QUESTION} not "?".
+ This makes it work with GNU expr 1.12 as well as 1.16.
+
+Sun Aug 2 20:27:44 1998 Noel Cragg <noel@swish.red-bean.com>
+
+ * mkmodules.c: add comment about TopLevelAdmin for the initial
+ contents of CVSROOT/config.
+
+1998-07-29 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * rcs.c (RCS_checkin): Only try to call xreadlink if HAVE_READLINK
+ is defined.
+
+Tue Jul 28 19:33:08 1998 Noel Cragg <noel@swish.red-bean.com>
+
+ * version.c: Change version number to 1.9.29.
+
+ * rcs.c (RCS_checkin): add code to follow symbolic links in the
+ repository.
+
+Sun Jul 26 05:14:41 1998 Noel Cragg <noel@swish.red-bean.com>
+
+ * This set of changes reverts the code to pre-1.9.2 behavior and
+ does not create CVS directories at top-level (except for the
+ obvious "cvs co ."). Added a new configuration option to switch
+ between 1.9 and 1.9.2 behavior.
+
+ * recurse.c (do_argument_proc): new function.
+ (start_recursion): in the case that we've done a command from
+ top-level but have no CVS directory there, the behavior should be
+ the same as "cvs <cmd> dir1 dir2 dir3...". Make sure that the
+ appropriate "Argument" commands are sent to the server by calling
+ walklist with do_argument_proc.
+
+ * client.c (call_in_directory): only create the top-level CVS
+ directory when we're checking out "." explicitly. The server will
+ force creation of this directory in all other cases.
+
+ * checkout.c (checkout_proc): only generate the top-level
+ directory when the TopLevelAdmin=yes. Also send a message to the
+ client to do the same.
+
+ * parseinfo.c (parse_config): handle TopLevelAdmin option. Set
+ top_level_admin.
+
+ * main.c: add new variable top_level_admin.
+ * cvs.h: add extern definition for above.
+
+ * sanity.sh: since we're reverting to pre 1.9.2 behavior for
+ top-level CVS directories, I needed to make changes to a bunch of
+ tests that made assumptions about said directories.
+ (preamble): make sure to add read and execute access to everything
+ in TMPDIR before removing, since some tests make things read-only.
+ (basicb-1a, basicb-1b, basicb-9a, basicb-9b): use dotest_fail
+ because these tests check for the non-existant top-level CVS
+ directory.
+ (basicc-3, emptydir-6, emptydir-7, crerepos-6): use "rm -rf" so it
+ won't complain when trying to remove the non-existant top-level
+ CVS directory.
+ (106.5): remove imported-f2-orig.tmp.
+ (modules2-10, emptydir-4, abspath-1ba, abspath-1bb): cd into the
+ directory where files exist before using the "add" command so cvs
+ can find CVSROOT in CVS/Root.
+ (cvsadm-2): look at a different CVS/Repository file, since the
+ top-level one doesn't exist.
+ (taginfo-3): create the directory in the repository directly
+ rather than relying on the fact that the top-level CVS directory
+ was created in a previous test.
+ (serverpatch-6): update first-dir explicity, rather than relying
+ on the non-existant top-level CVS/Entries file.
+ (crerepos-18): look at CVS/Repository in a subdirectory rather
+ than in the non-existant top-level CVS directory.
+ (toplevel): add code to set TopLevelAdmin=yes.
+ (toplevel2): new tests -- same as toplevel, but TopLevelAdmin=no.
+
+1998-07-21 Jim Meyering <meyering@ascend.com>
+
+ * rcs.c (RCS_checkout): Hoist frees of rev and value.
+ Warn and return 1 in several cases rather than exiting via
+ `error (1, ...'. The latter could abort a multi-file commit
+ in mid-stream, leaving stale locks in the repository.
+
+1998-07-16 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * build_src.com (rcscmds.c): Also look for include files in
+ [-.diff], just like Ian's 1998-06-18 change to Makefile.in
+
+1998-07-14 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * tag.c (pretag_proc), rtag.c (pretag_proc): Don't pass RUN_REALLY
+ to run_exec. This means that taginfo does not get executed if the
+ global -n option is specified. Which makes it like loginfo, -i,
+ -e, -o, -t, -u in modules, editinfo, and verifymsg and unlike
+ commitinfo. The old behavior was pretty bad in the sense that it
+ doesn't provide any way to log only the tags which actually
+ happen.
+ * sanity.sh (taginfo): New tests taginfo-11 to taginfo-13, for this.
+
+1998-07-12 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (ann-id): Write the test so that it tests for the
+ current (buggy) behavior.
+
+ * sanity.sh (taginfo): Also clean up cvsroot/first-dir.
+
+1998-07-12 Jim Meyering <meyering@ascend.com>
+
+ * sanity.sh (ann-id): New (currently failing) test for bug in how
+ rcs keywords are expanded in the output of `cvs annotate'.
+
+1998-07-12 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (taginfo): Write the TESTDIR into the script rather
+ than having the script look at the environment. This means that
+ it will work if TESTDIR is set by sanity.sh as well as if
+ sanity.sh finds TESTDIR in the environment.
+
+1998-07-11 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * tag.c (check_fileproc): Calculate the revision to be tagged the
+ same way that tag_fileproc does.
+ * sanity.sh (taginfo): New tests, test for this (before this fix,
+ brtag had said 1.1 not 1.1.2.1).
+
+1998-07-10 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (unedit-without-baserev): Also clean up "2" directory.
+
+1998-07-08 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * edit.c (unedit_fileproc): If the Baserev file is missing, don't
+ get the working file from CVS/Base. The previous code could get
+ you version 1.1 of the working file and put 1.2 in CVS/Entries.
+ * sanity.sh (unedit-without-baserev): New tests test for this.
+
+1998-07-02 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (unedit-without-baserev): Move the test itself to be
+ in the same order as in the "tests" variable.
+
+1998-07-02 Ian Lance Taylor <ian@cygnus.com>
+
+ * rcscmds.c: Don't include <stdarg.h> or <vasprintf.h>. Don't
+ declare vasprintf.
+ (call_diff_printf_output): Remove.
+ (call_diff_stdout_callbacks): Don't initialize printf_output
+ field--it has been removed from the interface.
+ (call_diff_file_callbacks): Likewise.
+
+1998-07-01 Jim Meyering <meyering@ascend.com>
+
+ * edit.c (unedit_fileproc): Handle the case in which base_get
+ returns a NULL baserev. That happens when a file being `unedit'ed
+ exists in the CVS/Base directory, but isn't listed in the CVS/Baserev
+ file. The one case I've seen had no Baserev file at all. The symptom
+ (if you're lucky) is a segmentation fault upon unedit. If you use
+ SunOS4.1.4 for which printf prints NULL pointers as `(null)', your
+ unedit command will complete normally, but it will have corrupted
+ your CVS/Entries file and a subsequent update may result in an
+ assertion failure, a core dump, and a stale lock in the repository.
+ * sanity.sh (unedit-without-baserev): New test for this.
+
+1998-07-01 Andy Mortimer of aeat.co.uk
+ and Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * server.c (server_updated): Use a prototype if we are using them
+ for declarations.
+
+1998-06-29 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (commit-readonly): Protect keyword against expansion
+ in sanity.sh itself. Keep the keyword in the file which we check
+ in (or else this fails to test for the RCS_checkout change).
+
+1998-06-27 Jim Meyering <meyering@ascend.com>
+
+ * rcs.c (RCS_checkout): If opening the local workfile fails due to
+ lack of write access, try to chmod the file and retry the open.
+ Before, a commit could fail part way through merely because the
+ open to rewrite with newly expanded rcs keywords would fail. It's
+ easy to make this happen if you use `cvs -r' or CVSREAD and you
+ apply a patch to one of your read-only source files -- patch
+ preserves the read-only setting for the file and your next commit
+ will fail after committing that file, but before rewriting
+ (checking out) your working copy.
+ * sanity.sh (commit-readonly): New test for this.
+
+1998-06-25 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * update.c (patch_file): Update comments regarding context diffs
+ to reflect diff library.
+
+1998-06-23 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (modules4): Add tests for reversing the order of the
+ "!first-dir/sdir" and "first-dir".
+
+1998-06-23 Jim Kingdon <kingdon@harvey.cyclic.com>
+ and Dave Wolfe@Motorola.
+
+ * sanity.sh (modes2): Touch the file before chmod'ing it.
+
+1998-06-21 Ian Lance Taylor <ian@cygnus.com>
+
+ * update.c (merge_files): Revert changes of 1998-06-19. Instead,
+ register a merged file with a dummy time stamp. Only set
+ last_register_time if we need to.
+ (join_file): Likewise. Always register a merged file, not just
+ when the merge fails.
+
+1998-06-21 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * call_diff_write_output, call_diff_printf_output,
+ call_diff_flush_output, call_diff_write_stdout, call_diff_error,
+ call_diff_stdout_callbacks, call_diff_file_callbacks): Re-indent.
+
+1998-06-19 Ian Lance Taylor <ian@cygnus.com>
+
+ * update.c (merge_file): Make sure the time stamp of the file is
+ different from the time stamp we register in the Entries file.
+ (join_file): Likewise.
+
+1998-06-18 Ian Lance Taylor <ian@cygnus.com>
+
+ * rcscmds.c: Include <stdio.h>. Include either <stdarg.h> or
+ <varargs.h>. Declare vasprintf.
+ (call_diff_write_output): New static function.
+ (call_diff_printf_output): New static function.
+ (call_diff_flush_output): New static function.
+ (call_diff_write_stdout): New static function.
+ (call_diff_error): New static function.
+ (call_diff_stdout_callbacks): New static variable.
+ (call_diff_file_callbacks): New static variable.
+ (call_diff): Don't sleep. Use a callback structure when calling
+ the diff library.
+ (call_diff3): Likewise.
+
+ * rcscmds.c: Include diffrun.h.
+ (call_diff, call_diff3): Pass NULL callback parameter.
+ (diff_run, diff3_run): Don't declare.
+ * Makefile.in (rcscmds.o): New target, to use -I for diff
+ directory.
+ (zlib.o): Depend upon zlib.h.
+
+1998-06-09 Mike Sutton@SAIC
+
+ Make it compile with Sun's bundled K&R C compiler:
+ * rcs.c (count_delta_actions): Change to static to match
+ declaration.
+ * client.c (handle_wrapper_rcs_option): Rename error label to
+ handle_error to avoid clash with function name.
+
+1998-06-09 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * rcs.c (RCS_delete_revs): If we are trying to delete all
+ revisions, give an error rather than assertion failed.
+ * sanity.sh (basicb): New tests basicb-o* test for this.
+
+1998-06-04 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * add.c (add): Only send "Directory" requests if we need to.
+
+1998-06-02 Assar Westerlund <assar@sics.se>
+
+ * client.c: Check for HAVE_GSS_C_NT_HOSTBASED_SERVICE rather than
+ assuming that GSS_C_NT_HOSTBASED_SERVICE is a macro.
+ * server.c: Likewise.
+
+1998-06-02 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * fileattr.c (fileattr_read): Check for NULL return from strchr.
+ * sanity.sh (devcom3): New test devcom3-10 checks for this.
+
+1998-06-01 Assar Westerlund <assar@sics.se>
+ and Ian Lance Taylor <ian@cygnus.com>
+
+ * client.c: If HAVE_GSSAPI_H, include <gssapi.h>. Only include
+ <gssapi/gssapi.h> if HAVE_GSSAPI_GSSAPI_H. Only include
+ <gssapi/gssapi_generic.h> if HAVE_GSSAPI_GSSAPI_GENERIC_H.
+ (GSS_C_NT_HOSTBASED_SERVICE): Define if not defined.
+ (connect_to_gserver): Use GSS_C_NT_HOSTBASED_SERVICE instead of
+ gss_nt_service_name.
+ * server.c: Same header file changes.
+ (GSS_C_NT_HOSTBASED_SERVICE): Define if not defined.
+ (gserver_authenticate_connection): Use GSS_C_NT_HOSTBASED_SERVICE
+ instead of gss_nt_service_name.
+
+1998-06-01 Jim Meyering <meyering@ascend.com>
+
+ * sanity.sh (tag8k): Add a test for the 1998-05-02 rcs.c bug fix.
+
+1998-05-26 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * rcs.c (annotate): Call tag_check_valid like the other functions
+ which have a -r option.
+ * sanity.sh (ann): New test ann-14 tests for this.
+
+1998-05-24 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (importc): New tests importc-5 through importc-8 test
+ for a (fairly obscure) regression from CVS 1.9.
+
+1998-05-23 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (modules2): Add comment listing cvs release tests.
+ (info): New test info-cleanup-0 tests "cvs -n release".
+
+ * rcs.c (rcsbuf_getid): Remove semicolon at end of #undef. I'm
+ kind of surprised that compilers accepted this at all, but
+ removing it squelches a warning for some compilers.
+
+ * version.c: Change version number to 1.9.28.1.
+
+ * Version 1.9.28.
+
+1998-05-22 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * rcs.c (RCS_cmp_file): Check for errors from CVS_FOPEN. This
+ restores the CVS 1.9 behavior (fatal error if we can't open the
+ file), and corrects an apparent oversight in Ian's 13 Apr 1997
+ change.
+ * sanity.sh (modes2): New test, tests for this.
+
+1998-05-22 Ian Lance Taylor <ian@cygnus.com>
+
+ * server.c (server_updated): Correct test for whether to unlink
+ the file.
+
+1998-05-20 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * wrapper.c (wrap_add): Disable -t/-f wrappers at least until the
+ serious bug can be fixed.
+
+1998-05-15 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * checkout.c (checkout): Call server_pathname_check on the
+ argument to "cvs co -d".
+ * server.c (server_pathname_check): Add comment about how we could
+ be handling absolute pathnames.
+ * sanity.sh (abspath): Rewrite the tests which run "cvs co -d /foo"
+ for remote, to reflect this.
+
+ * sanity.sh (abspath): Also do the "cannot rename" work-around for
+ abspath-7d.
+
+1998-05-13 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * commit.c (commit_filesdoneproc): Free admin_dir when done with it.
+
+1998-05-13 Jim Meyering <meyering@ascend.com>
+
+ * sanity.sh (editor): Change bogus sed command, `s/^/x&/g', to `s/^/x/'.
+ The former exercised a bug in GNU sed-3.01-beta3.
+ (emptydir-8): Add `Rebuilding administrative file database' message,
+ since now it does that.
+ * commit.c (commit_filesdoneproc): Pass only the admin directory
+ pathname to mkmodules.
+ Remove #if 0, now that it's fixed.
+
+ * status.c (cvsstatus): Rename from `status' to avoid shadowing
+ lots of locals and parameters by the same name.
+ * server.c (serve_status): Update caller.
+ * main.c (cmds[]): Update table entry.
+ * cvs.h: Update prototype.
+
+ * commit.c (commit_filesdoneproc): Remove trailing blanks.
+ (commit) [CLIENT_SUPPORT]: Remove unnecessary (and local-shadowing)
+ declaration of `err'.
+ Rename global `tag' to `saved_tag' to avoid overshadowing `tag'
+ parameters of three functions.
+ Rename global `message' to `saved_message' to avoid overshadowing
+ `message' parameter of a function.
+ Rename global `ulist' to `saved_ulist' and move dcl up with others.
+
+1998-05-12 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * commit.c (commit_filesdoneproc): #if 0 the new code until it can
+ be fixed.
+
+ * commit.c (commit_filesdoneproc): Add comment explaining last
+ change.
+
+1998-05-12 Jim Meyering <meyering@ascend.com>
+
+ * commit.c (commit_filesdoneproc): Call mkmodules not just when
+ committing a file directly under CVSROOT, but also when committing
+ files in subdirectories of CVSROOT.
+
+1998-05-08 Jim Meyering <meyering@ascend.com>
+
+ * filesubr.c (xreadlink): NUL-terminate the symbolic link name.
+ Use a much smaller initial buffer length.
+ Test errno only if readlink fails.
+ Use xstrdup then free the original link name so we don't waste space.
+
+1998-05-02 Jim Meyering <meyering@ascend.com>
+
+ * rcs.c (rcsbuf_getword): Fix off-by-one error that would result in
+ an abort (the first one in rcsbuf_getkey) when operating on on some
+ ,v files with over 8192 bytes of tag and branch info.
+
+1998-05-04 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (ann): New tests ann-12 and ann-13 test for specifying
+ a numeric branch.
+
+1998-05-02 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * rcs.c: Add comments about getting rid of rcsbuf_getid,
+ rcsbuf_getword, and rcsbuf_getstring.
+
+ * sanity.sh (abspath): Revise the workarounds to deal with exit
+ status.
+
+1998-04-30 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (abspath): Work around the "cannot rename" bug.
+
+1998-04-27 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * classify.c (Classify_File): Add comments about checking whether
+ command name is "update".
+
+1998-04-22 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * version.c: Change version number to 1.9.27.1.
+
+ * Version 1.9.27.
+
+1998-04-20 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ (This diff was run by devel-cvs and everyone seemed to like it).
+ * diff.c (diff_file_nodiff): Make HEAD mean the head of the branch
+ which contains the sticky tag, not the sticky tag itself.
+ * rcs.c, rcs.h (RCS_branch_head): New function.
+ * sanity.sh (head): Update for this changed behavior.
+
+1998-04-19 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh: Move emptydir tests from basicb to new test emptydir.
+ This is because we now need a module definition to create Emptydir;
+ "co -d" doesn't cut it anymore.
+
+1998-04-17 Petri Virkkula
+
+ * server.c (mkdir_p): Ignore EROFS error (like for EACCES).
+
+1998-04-16 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * checkout.c (checkout_proc): Don't create directories above the
+ last one specified in "co -d".
+ (build_dirs_and_chdir): Revert Noel's change of 17 Feb 1998.
+ (struct dir_to_build): New field just_chdir.
+ (build_dirs_and_chdir): Test it.
+ * sanity.sh (abspath): New tests abspath-7* test for a bug which
+ we fix, in which CVS would create bogus "D/////" entries in
+ CVS/Entries.
+ (abspath): Revise abspath-3* tests to test for the fact that we no
+ longer create directories above the last one specified in "co -d".
+ I checked that CVS 1.9 gives an error on this, so changing this
+ behavior back should be OK.
+ (cvsadm-2d3): Likewise (also checked CVS 1.9 for this case).
+ (cvsadm-2d3d): Likewise (also checked CVS 1.9 for this case).
+ (cvsadm-2d{4,5,6,7,8}, cvsadm-N2d{3,4,5,6,7,8}): Adjust for new
+ behavior (same case as cvsadm-2d3).
+ (cvsadm-2d{4,5,6,7,8}d, cvsadm-N2d{3,4,5,6,7,8}d): Remove test
+ (same case as cvsadm-2d3d).
+ (cvsadm): For remote, skip most these tests.
+ (abspath): When cleaning up, delete mod1 and mod2 rather than mod1
+ twice (longstanding bug, apparently only becomes visible if you
+ run the tests in a certain order).
+
+1998-04-14 Wilfredo Sanchez <wsanchez@apple.com>
+
+ * rcs.c: variable "lockfile" was being referenced after being
+ free'd. Bad. Moved the free() call down.
+
+1998-04-12 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (rcs): Add test for annotate and the year 2000.
+
+ * server.c (do_cvs_command): If there are partial lines left when
+ the child process is done, send them along.
+ * sanity.sh (rcs, rcs2): Enable all tests for remote; tests for
+ this fix.
+
+1998-04-11 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * client.c (client_senddate): Pass SDATEFORM not DATEFORM to
+ sscanf. This fixes a Y2K bug.
+
+ * history.c (history, select_hrec): Change since_date from time_t
+ to RCS format. Use the usual machinery (in particular, Make_Date
+ and client_senddate) so that it will work on VMS too.
+ * main.c, cvs.h (date_from_time_t): New function.
+ * sanity.sh (history): New test, to test that this didn't break
+ anything (also tests client_senddate fix).
+
+1998-04-11 Norbert Kiesel <nk@iname.com>
+
+ * server.c (cvs_output_binary): Shut up "gcc -Wall" by removing
+ unnecessary else if test.
+ * server.c (check_password): Fix uninitialized memory read if
+ shadow passwords are used. Also added some comments.
+ * rcs.c (RCS_checkout): Make sure to call chown with -1 for uid or
+ gid if they should not be changed
+
+1998-04-10 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh (rcs2): New test, tests for various Y2K cases.
+ * rcs.c (getdelta): Value for "state" keyword is optional (bug
+ discovered incidentally in writing rcs2 test).
+
+1998-04-09 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * filesubr.c, cvs.h (link_file): Remove; no longer used.
+
+1998-04-08 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * recurse.c (do_dir_proc): Restore update_dir rather than a
+ computation which appears to, but does not necessarily, restore it
+ (reported by various people; this fix is from Greg Hudson).
+ * sanity.sh (importc): New test, tests for this fix.
+
+1998-03-27 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * rcs.c (RCS_lock): If the revision is already locked, give an
+ error rather than dumping core.
+ * sanity.sh (reserved): New test reserved-13c tests for this.
+
+1998-03-25 Loren J. Rittle
+
+ * import.c (add_rev): Rewrite to use RCS_FLAGS_KEEPFILE option
+ of RCS_checkin() to avoid damage to imported files instead of
+ externally undoing damage after the fact. The side effect is
+ that callers of add_rev() may now incrementally walk the
+ entries of the current directory without seeing gratuitous
+ changes to the directory structure (under at least one file
+ system under at least one OS).
+
+1998-03-18 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * error.c (error): Save and restore errno. Should fix test case
+ conflicts3-23 on SCO 5.0.2. Reported by Steve Cameron.
+
+ * sanity.sh (admin): Rename admin-26-o* to admin-26-*; the "o"
+ stands for "cvs admin -o". Add comment about length of tests.
+ Use ${PLUS}.
+
+1998-03-05 Dan Wilder <dan@gasboy.com>
+
+ * Fix problem with cvs admin in which -ntag:branch
+ option associated tag with the branch's head revision.
+ Should have used branch number. Entailed in this fix,
+ the following.
+
+ * Add new functions "RCS_exist_rev", "RCS_exist_tag",
+ "RCS_tag2rev", and "RCS_valid_rev" to rcs.c. RCS_tag2rev
+ is similar to RCS_gettag, but does less interpretation.
+
+ * Plug a small memory leak.
+
+ * Add tests admin-26 through admin-29 to sanity.sh,
+ to test "cvs admin -n".
+
+1998-03-17 Samuel Tardieu <sam@inf.enst.fr>
+
+ * server.c (server_register): protect dereferencing timestamp in
+ the trace message when it is null, to avoid a segmentation fault.
+
+1998-03-16 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * options.h.in (MY_NDBM): Rewrite the comment explaining this
+ option. It was not clear to everyone who "my" referred to, for
+ example.
+
+ * hardlink.c (list_linked_files_on_disk): Remove unused variables
+ err and p.
+ (list_linked_files_on_disk): Add comment about memory allocation
+ of return value.
+ * rcs.c (rcsbuf_getword): Shut up gcc -Wall with a "return 0".
+ (RCS_checkin): Remove unused variable fullpath.
+ * sanity.sh (hardlinks): Remove comment about spurious warnings;
+ the warnings are gone.
+
+1998-03-12 Tim Pierce <twp@skepsis.com>
+
+ New functions for parsing and writing hardlink fields.
+ * rcs.c [PRESERVE_PERMISSIONS_SUPPORT] (puthardlink_proc): New
+ function.
+ (putdelta) [PRESERVE_PERMISSIONS_SUPPORT]: Use it.
+ (rcsbuf_getid, rcsbuf_getstring, rcsbuf_getword): New functions.
+ (getdelta): Call them, storing `hardlinks' field in vnode->hardlinks.
+ (RCS_reparsercsfile): When setting rdata->desc, xstrdup value
+ rather than rcsbuf_valcopying it (due to changes in how getdelta
+ handles keys and values in newphrases).
+
+ * sanity.sh (hardlinks): Use uglier filenames. Checking out
+ hardlinked files no longer produces the same spurious diagnostics,
+ so fix that test.
+ (hardlinks-2.3): Renamed from hardlinks-2.2 (duplicate test name).
+
+ New infrastructure for managing hardlink lists internally...
+ * hardlink.c, hardlink.h (list_linked_files_on_disk,
+ compare_linkage_lists, find_checkedout_proc): New functions.
+ * rcs.h (struct rcsversnode) [PRESERVE_PERMISSIONS_SUPPORT]: New
+ member `hardlinks'.
+ * update.c (special_file_mismatch): Get hardlinks from
+ vp->hardlinks instead of from vp->other_delta.
+ * rcs.c (free_rcsvers_contents): Comment about freeing hardlinks
+ member.
+ (RCS_checkout) [PRESERVE_PERMISSIONS_SUPPORT]: Get hardlinks from
+ vers->hardlinks list instead of vers->other_delta.
+
+ ... and removed obsolete code from earlier revs.
+ * hardlink.c, hardlink.h (list_files_linked_to,
+ cache_hardlinks_proc, list_files_proc, set_hardlink_field_proc):
+ Removed.
+ * hardlink.h: Removed `links' member from hardlink_info struct.
+ * commit.c (commit): Remove the call to cache_hardlinks_proc.
+ (check_fileproc) [PRESERVE_PERMISSIONS_SUPPORT]: Removed reference
+ to hlinfo->links.
+ * hardlink.c (update_hardlink_info): Same.
+ * update.c (get_linkinfo_proc): Same.
+
+ * rcs.c (RCS_checkout) [PRESERVE_PERMISSIONS_SUPPORT]: Use
+ vp->hardlinks and find_checkedout_proc to find recently-updated
+ files that may be hardlinked.
+ * update.c (special_file_mismatch): Use List * structures and
+ compare_linkage_lists for rev1_hardlinks and rev2_hardlinks.
+
+1998-03-16 Larry Jones <larry.jones@sdrc.com>
+
+ * server.c (check_password): If shadow passwords are supported but no
+ entry is found in the shadow file, check the regular password file.
+
+1998-03-07 Jim Kingdon <kingdon@harvey.cyclic.com>
+
+ * sanity.sh: Rename permissions test to perms since that is what
+ each of its individual tests are named.
+ * sanity.sh (perms symlinks hardlinks): Change CVSROOT to
+ CVSROOT_DIRNAME where appropriate.
+ (perms symlinks hardlinks): Disable/adjust the meat of the tests for
+ remote.
+ (symlinks): Link to ${TESTDIR}/fumble rather than
+ /fumble/mumble/grumble. We shouldn't be making assumptions about
+ what might exist in random directories outside ${TESTDIR}.
+ * hardlink.c (cache_hardlinks_proc): Add comment about trimming
+ whitespace.
+
+1998-03-07 Tim Pierce <twp@skepsis.com>
+
+ * rcs.c (RCS_checkout): Negation bug when checking out symlinks:
+ existence_error should be !existence_error.
+ * sanity.sh (permissions symlinks hardlinks): New tests, for
+ PreservePermissions.
+
1998-03-04 Jim Kingdon <kingdon@harvey.cyclic.com>
+ * version.c: Change version number to 1.9.26.1.
+
+ * Version 1.9.26.
+
* entries.c, cvs.h (Entries_Open): New argument update_dir; use it
in error message.
* add.c, checkout.c, client.c, find_names.c, import.c, recurse.c,
@@ -30,7 +734,7 @@
* update.c (special_file_mismatch): Compare the hard links of the
two revisions.
- * rcs.c (RCS_checkout):
+ * rcs.c (RCS_checkout):
* hardlink.c, hardlink.h: New files.
(hardlink_info): New struct.
@@ -235,7 +939,7 @@ Tue Feb 17 02:32:21 1998 Noel Cragg <noel@swish.red-bean.com>
[These mods make "checkout" work with "-d /absolute/pathname"
once again.]
-
+
* checkout.c (checkout_proc): the -d flag on the command line
should override the -d flag in the modules file if the latter is
an absolute path. The loop that assembles the list of directories
@@ -255,7 +959,7 @@ Tue Feb 17 02:32:21 1998 Noel Cragg <noel@swish.red-bean.com>
* create_adm.c (Create_Admin): include the directory in the error
message.
-
+
1998-02-16 Jim Kingdon <kingdon@harvey.cyclic.com>
* diff.c (diff_fileproc), import.c (import, add_rcs_file), rcs.c
@@ -294,7 +998,7 @@ Tue Feb 17 02:32:21 1998 Noel Cragg <noel@swish.red-bean.com>
Support for device special files, symbolic links, user and group
ownerships, and file permissions.
-
+
* parseinfo.c: (parse_config): Handle new config variable
`PreservePermissions'.
* mkmodules.c (config_contents): Add new PreservePermissions var.
diff --git a/contrib/cvs/src/Makefile.in b/contrib/cvs/src/Makefile.in
index 61b4fe2..2c93ec2 100644
--- a/contrib/cvs/src/Makefile.in
+++ b/contrib/cvs/src/Makefile.in
@@ -177,7 +177,10 @@ cvsbug: cvsbug.sh $(srcdir)/version.c
$(OBJECTS): $(HEADERS) options.h
-zlib.o: zlib.c
+rcscmds.o: rcscmds.c $(top_srcdir)/diff/diffrun.h
+ $(CC) $(CPPFLAGS) $(INCLUDES) -I$(top_srcdir)/diff $(DEFS) $(CFLAGS) -c $(srcdir)/rcscmds.c
+
+zlib.o: zlib.c $(top_srcdir)/zlib/zlib.h
$(CC) $(CPPFLAGS) $(INCLUDES) -I$(top_srcdir)/zlib $(DEFS) $(CFLAGS) -c $(srcdir)/zlib.c
subdir = src
diff --git a/contrib/cvs/src/add.c b/contrib/cvs/src/add.c
index d44435a..a4eed40 100644
--- a/contrib/cvs/src/add.c
+++ b/contrib/cvs/src/add.c
@@ -56,6 +56,9 @@ add (argc, argv)
List *entries;
Vers_TS *vers;
struct saved_cwd cwd;
+ /* Nonzero if we found a slash, and are thus adding files in a
+ subdirectory. */
+ int found_slash = 0;
if (argc == 1 || argc == -1)
usage (add_usage);
@@ -108,6 +111,20 @@ add (argc, argv)
error (0, 0, "cannot add special file `%s'; skipping", argv[i]);
skip_file = 1;
}
+ else
+ {
+ char *p;
+ p = argv[i];
+ while (*p != '\0')
+ {
+ if (ISDIRSEP (*p))
+ {
+ found_slash = 1;
+ break;
+ }
+ ++p;
+ }
+ }
if (skip_file)
{
@@ -143,9 +160,16 @@ add (argc, argv)
if (options) send_arg(options);
option_with_arg ("-m", message);
- repository = Name_Repository (NULL, NULL);
- send_a_repository ("", repository, "");
- free (repository);
+ /* If !found_slash, refrain from sending "Directory", for
+ CVS 1.9 compatibility. If we only tried to deal with servers
+ which are at least CVS 1.9.26 or so, we wouldn't have to
+ special-case this. */
+ if (found_slash)
+ {
+ repository = Name_Repository (NULL, NULL);
+ send_a_repository ("", repository, "");
+ free (repository);
+ }
for (i = 0; i < argc; ++i)
/* FIXME: Does this erroneously call Create_Admin in error
@@ -194,7 +218,8 @@ add (argc, argv)
Create_Admin (p, argv[i], rcsdir, tag, date,
nonbranch, 0);
- send_a_repository ("", repository, update_dir);
+ if (found_slash)
+ send_a_repository ("", repository, update_dir);
if (restore_cwd (&cwd, NULL))
error_exit ();
diff --git a/contrib/cvs/src/admin.c b/contrib/cvs/src/admin.c
index 3c50f4a..72cddac 100644
--- a/contrib/cvs/src/admin.c
+++ b/contrib/cvs/src/admin.c
@@ -701,15 +701,27 @@ admin_fileproc (callerdat, finfo)
rcs->path,
tag, n->data);
status = 1;
+ free (tag);
continue;
}
}
- /* Expand rev if necessary. */
- rev = RCS_gettag (rcs, p, 0, NULL);
- RCS_settag (rcs, tag, rev);
- if (rev != NULL)
+ /* Attempt to perform the requested tagging. */
+
+ if ((*p == 0 && (rev = RCS_head (rcs)))
+ || (rev = RCS_tag2rev (rcs, p))) /* tag2rev may exit */
+ {
+ RCS_check_tag (tag); /* exit if not a valid tag */
+ RCS_settag (rcs, tag, rev);
free (rev);
+ }
+ else
+ {
+ error (0, 0,
+ "%s: Symbolic name or revision %s is undefined",
+ rcs->path, p);
+ status = 1;
+ }
free (tag);
break;
case 's':
diff --git a/contrib/cvs/src/checkout.c b/contrib/cvs/src/checkout.c
index 46151eb..c6a8122 100644
--- a/contrib/cvs/src/checkout.c
+++ b/contrib/cvs/src/checkout.c
@@ -242,6 +242,13 @@ checkout (argc, argv)
error (1, 0, "tag `%s' must be a symbolic tag", tag);
}
+#ifdef SERVER_SUPPORT
+ if (server_active && where != NULL)
+ {
+ server_pathname_check (where);
+ }
+#endif
+
if (!safe_location()) {
error(1, 0, "Cannot check out files into the repository itself");
}
@@ -428,11 +435,15 @@ struct dir_to_build
/* The path to the directory. */
char *dirpath;
+ /* If set, don't build the directory, just change to it.
+ The caller will also want to set REPOSITORY to NULL. */
+ int just_chdir;
+
struct dir_to_build *next;
};
static int build_dirs_and_chdir PROTO ((struct dir_to_build *list,
- int sticky, int check_existing_dirs));
+ int sticky));
static void build_one_dir PROTO ((char *, char *, int));
@@ -723,6 +734,7 @@ internal error: %s doesn't start with %s in checkout_proc",
head->repository = NULL;
head->dirpath = xstrdup (where);
head->next = NULL;
+ head->just_chdir = 0;
/* Make a copy of the repository name to play with. */
@@ -760,7 +772,26 @@ internal error: %s doesn't start with %s in checkout_proc",
assert (strlen (where));
strcpy (new->dirpath, "/");
}
-
+ new->next = head;
+ head = new;
+
+ /* If where consists of multiple pathname components,
+ then we want to just cd into it, without creating
+ directories or modifying CVS directories as we go.
+ In CVS 1.9 and earlier, the code actually does a
+ CVS_CHDIR up-front; I'm not going to try to go back
+ to that exact code but this is somewhat similar
+ in spirit. */
+ if (where_orig != NULL
+ && cp - where < strlen (where_orig))
+ {
+ new->repository = NULL;
+ new->just_chdir = 1;
+ continue;
+ }
+
+ new->just_chdir = 0;
+
/* Now figure out what repository directory to generate.
The most complete case would be something like this:
@@ -771,12 +802,13 @@ internal error: %s doesn't start with %s in checkout_proc",
cvs co -d what/ever -N foo
The results in the CVS/Repository files should be:
- . -> . (this is where we executed the cmd)
- what -> Emptydir (generated dir -- not in repos)
+ . -> (don't touch CVS/Repository)
+ (I think this case might be buggy currently)
+ what -> (don't touch CVS/Repository)
ever -> . (same as "cd what/ever; cvs co -N foo")
bar -> Emptydir (generated dir -- not in repos)
baz -> quux (finally!) */
-
+
if (strcmp (reposcopy, CVSroot_directory) == 0)
{
/* We can't walk up past CVSROOT. Instead, the
@@ -835,9 +867,6 @@ internal error: %s doesn't start with %s in checkout_proc",
}
}
}
-
- new->next = head;
- head = new;
}
/* clean up */
@@ -852,12 +881,29 @@ internal error: %s doesn't start with %s in checkout_proc",
may not have a thing to do with where the sources are
being checked out. If it does, build_dirs_and_chdir
will take care of creating adm files here. */
-
- if (! where_is_absolute)
+ /* FIXME: checking where_is_absolute is a horrid kludge;
+ I suspect we probably can just skip the call to
+ build_one_dir whenever the -d command option was specified
+ to checkout. */
+
+ if (! where_is_absolute && top_level_admin)
{
/* It may be argued that we shouldn't set any sticky
bits for the top-level repository. FIXME? */
build_one_dir (CVSroot_directory, ".", *pargc <= 1);
+
+#ifdef SERVER_SUPPORT
+ /* We _always_ want to have a top-level admin
+ directory. If we're running in client/server mode,
+ send a "Clear-static-directory" command to make
+ sure it is created on the client side. (See 5.10
+ in cvsclient.dvi to convince yourself that this is
+ OK.) If this is a duplicate command being sent, it
+ will be ignored on the client side. */
+
+ if (server_active)
+ server_clear_entstat (".", CVSroot_directory);
+#endif
}
@@ -866,8 +912,7 @@ internal error: %s doesn't start with %s in checkout_proc",
contain a CVS subdir yet, but all the others contain
CVS and Entries.Static files */
- if (build_dirs_and_chdir (head, *pargc <= 1,
- where_is_absolute) != 0)
+ if (build_dirs_and_chdir (head, *pargc <= 1) != 0)
{
error (0, 0, "ignoring module %s", omodule);
err = 1;
@@ -1101,22 +1146,13 @@ emptydir_name ()
return repository;
}
-
-/* Build all the dirs along the path to DIRS with CVS subdirs with
- appropriate repositories. If ->repository is NULL, do not create a
- CVSADM directory for that subdirectory; just CVS_CHDIR into it. If
- check_existing_dirs is nonzero, don't create directories if they
- already exist, and don't try to write adm files in directories
- where we don't have write permission. We use this last option
- primarily when a user has specified an absolute path for checkout
- -- we will often not have permission to top-level directories, so
- we shouldn't complain. */
-
+/* Build all the dirs along the path to DIRS with CVS subdirs with appropriate
+ repositories. If ->repository is NULL, do not create a CVSADM directory
+ for that subdirectory; just CVS_CHDIR into it. */
static int
-build_dirs_and_chdir (dirs, sticky, check_existing_dirs)
+build_dirs_and_chdir (dirs, sticky)
struct dir_to_build *dirs;
int sticky;
- int check_existing_dirs;
{
int retval = 0;
struct dir_to_build *nextdir;
@@ -1124,16 +1160,12 @@ build_dirs_and_chdir (dirs, sticky, check_existing_dirs)
while (dirs != NULL)
{
char *dir = last_component (dirs->dirpath);
- int dir_is_writeable;
- if ((! check_existing_dirs) || (! isdir (dir)))
+ if (!dirs->just_chdir)
+ {
mkdir_if_needed (dir);
-
- Subdir_Register (NULL, NULL, dir);
-
- /* This is an expensive call -- only make it if necessary. */
- if (check_existing_dirs)
- dir_is_writeable = iswritable (dir);
+ Subdir_Register (NULL, NULL, dir);
+ }
if (CVS_CHDIR (dir) < 0)
{
@@ -1141,14 +1173,11 @@ build_dirs_and_chdir (dirs, sticky, check_existing_dirs)
retval = 1;
goto out;
}
-
- if ((dirs->repository != NULL)
- && ((! check_existing_dirs) || dir_is_writeable))
+ if (dirs->repository != NULL)
{
build_one_dir (dirs->repository, dirs->dirpath, sticky);
free (dirs->repository);
}
-
nextdir = dirs->next;
free (dirs->dirpath);
free (dirs);
diff --git a/contrib/cvs/src/classify.c b/contrib/cvs/src/classify.c
index b33c945..b0084a3 100644
--- a/contrib/cvs/src/classify.c
+++ b/contrib/cvs/src/classify.c
@@ -288,6 +288,14 @@ conflict: %s created independently by second party",
* There is no user file, so note that it was lost and
* extract a new version
*/
+ /* Comparing the command_name against "update", in
+ addition to being an ugly way to operate, means
+ that this message does not get printed by the
+ server. That might be considered just a straight
+ bug, although there is one subtlety: that case also
+ gets hit when a patch fails and the client fetches
+ a file. I'm not sure there is currently any way
+ for the server to distinguish those two cases. */
if (strcmp (command_name, "update") == 0)
if (!really_quiet)
error (0, 0, "warning: %s was lost", finfo->fullname);
@@ -367,6 +375,8 @@ conflict: %s created independently by second party",
{
/* There is no user file, so just get it */
+ /* See comment at other "update" compare, for more
+ thoughts on this comparison. */
if (strcmp (command_name, "update") == 0)
if (!really_quiet)
error (0, 0, "warning: %s was lost", finfo->fullname);
diff --git a/contrib/cvs/src/client.c b/contrib/cvs/src/client.c
index aa897d5..222e7f2 100644
--- a/contrib/cvs/src/client.c
+++ b/contrib/cvs/src/client.c
@@ -78,8 +78,19 @@ static Key_schedule sched;
#ifdef HAVE_GSSAPI
+#ifdef HAVE_GSSAPI_H
+#include <gssapi.h>
+#endif
+#ifdef HAVE_GSSAPI_GSSAPI_H
#include <gssapi/gssapi.h>
+#endif
+#ifdef HAVE_GSSAPI_GSSAPI_GENERIC_H
#include <gssapi/gssapi_generic.h>
+#endif
+
+#ifndef HAVE_GSS_C_NT_HOSTBASED_SERVICE
+#define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name
+#endif
/* This is needed for GSSAPI encryption. */
static gss_ctx_id_t gcontext;
@@ -949,17 +960,24 @@ call_in_directory (pathname, func, data)
error (1, errno, "could not chdir to %s", toplevel_wd);
newdir = 0;
- /* Create the CVS directory at the top level if needed.
- The isdir seems like an unneeded system call, but it *does*
- need to be called both if the CVS_CHDIR below succeeds (e.g.
- "cvs co .") or if it fails (e.g. basicb-1a in testsuite). */
+ /* Create the CVS directory at the top level if needed. The
+ isdir seems like an unneeded system call, but it *does*
+ need to be called both if the CVS_CHDIR below succeeds
+ (e.g. "cvs co .") or if it fails (e.g. basicb-1a in
+ testsuite). We only need to do this for the "." case,
+ since the server takes care of forcing this directory to be
+ created in all other cases. If we don't create CVSADM
+ here, the call to Entries_Open below will fail. FIXME:
+ perhaps this means that we should change our algorithm
+ below that calls Create_Admin instead of having this code
+ here? */
if (/* I think the reposdirname_absolute case has to do with
things like "cvs update /foo/bar". In any event, the
code below which tries to put toplevel_repos into
CVS/Repository is almost surely unsuited to
the reposdirname_absolute case. */
!reposdirname_absolute
-
+ && (strcmp (dir_name, ".") == 0)
&& ! isdir (CVSADM))
{
char *repo;
@@ -2909,19 +2927,19 @@ handle_wrapper_rcs_option (args, len)
as free-form as it looks. */
p = strchr (args, ' ');
if (p == NULL)
- goto error;
+ goto handle_error;
if (*++p != '-'
|| *++p != 'k'
|| *++p != ' '
|| *++p != '\'')
- goto error;
+ goto handle_error;
if (strchr (p, '\'') == NULL)
- goto error;
+ goto handle_error;
/* Add server-side cvswrappers line to our wrapper list. */
wrap_add (args, 0);
return;
- error:
+ handle_error:
error (0, errno, "protocol error: ignoring invalid wrappers %s", args);
}
@@ -3861,7 +3879,8 @@ connect_to_gserver (sock, hostinfo)
sprintf (buf, "cvs@%s", hostinfo->h_name);
tok_in.length = strlen (buf);
tok_in.value = buf;
- gss_import_name (&stat_min, &tok_in, gss_nt_service_name, &server_name);
+ gss_import_name (&stat_min, &tok_in, GSS_C_NT_HOSTBASED_SERVICE,
+ &server_name);
tok_in_ptr = GSS_C_NO_BUFFER;
gcontext = GSS_C_NO_CONTEXT;
@@ -5442,13 +5461,16 @@ option_with_arg (option, arg)
send_arg (arg);
}
-/*
- * Send a date to the server. This will passed a string which is the
- * result of Make_Date, and looks like YY.MM.DD.HH.MM.SS, where all
- * the letters are single digits. The time will be GMT. getdate on
- * the server can't parse that, so we turn it back into something
- * which it can parse.
- */
+/* Send a date to the server. The input DATE is in RCS format.
+ The time will be GMT.
+
+ We then convert that to the format required in the protocol
+ (including the "-D" option) and send it. According to
+ cvsclient.texi, RFC 822/1123 format is preferred, but for now we
+ use the format that we always have, for
+ conservatism/laziness/paranoia. As far as I know all servers
+ support the RFC 822/1123 format, so probably there would be no
+ particular danger in switching. */
void
client_senddate (date)
@@ -5457,10 +5479,10 @@ client_senddate (date)
int year, month, day, hour, minute, second;
char buf[100];
- if (sscanf (date, DATEFORM, &year, &month, &day, &hour, &minute, &second)
+ if (sscanf (date, SDATEFORM, &year, &month, &day, &hour, &minute, &second)
!= 6)
{
- error (1, 0, "diff_client_senddate: sscanf failed on date");
+ error (1, 0, "client_senddate: sscanf failed on date");
}
sprintf (buf, "%d/%d/%d %d:%d:%d GMT", month, day, year,
diff --git a/contrib/cvs/src/edit.c b/contrib/cvs/src/edit.c
index 6c6f040..aa0f4c4 100644
--- a/contrib/cvs/src/edit.c
+++ b/contrib/cvs/src/edit.c
@@ -521,6 +521,26 @@ unedit_fileproc (callerdat, finfo)
if (node != NULL)
{
entdata = (Entnode *) node->data;
+ if (baserev == NULL)
+ {
+ /* This can only happen if the CVS/Baserev file got
+ corrupted. We suspect it might be possible if the
+ user interrupts CVS, although I haven't verified
+ that. */
+ error (0, 0, "%s not mentioned in %s", finfo->fullname,
+ CVSADM_BASEREV);
+
+ /* Since we don't know what revision the file derives from,
+ keeping it around would be asking for trouble. */
+ if (unlink_file (finfo->file) < 0)
+ error (0, errno, "cannot remove %s", finfo->fullname);
+
+ /* This is cheesy, in a sense; why shouldn't we do the
+ update for the user? However, doing that would require
+ contacting the server, so maybe this is OK. */
+ error (0, 0, "run update to complete the unedit");
+ return 0;
+ }
Register (finfo->entries, finfo->file, baserev, entdata->timestamp,
entdata->options, entdata->tag, entdata->date,
entdata->conflict);
diff --git a/contrib/cvs/src/error.c b/contrib/cvs/src/error.c
index cb69bde..9dcc162 100644
--- a/contrib/cvs/src/error.c
+++ b/contrib/cvs/src/error.c
@@ -89,7 +89,15 @@ error_exit PROTO ((void))
thing for the server, whether the normal server_active (child process)
case or the error_use_protocol (parent process) case. The one exception
is that STATUS nonzero for error_use_protocol probably doesn't work yet;
- in that case still need to use the pending_error machinery in server.c. */
+ in that case still need to use the pending_error machinery in server.c.
+
+ error() does not molest errno; some code (e.g. Entries_Open) depends
+ on being able to say something like:
+ error (0, 0, "foo");
+ error (0, errno, "bar");
+
+ */
+
/* VARARGS */
void
#if defined (HAVE_VPRINTF) && defined (__STDC__)
@@ -102,6 +110,9 @@ error (status, errnum, message, va_alist)
va_dcl
#endif
{
+ /* Prevent strtoul (via int_vasprintf) from clobbering it. */
+ int save_errno = errno;
+
#ifdef HAVE_VPRINTF
if (message[0] != '\0')
{
@@ -211,6 +222,7 @@ error (status, errnum, message, va_alist)
if (status)
error_exit ();
+ errno = save_errno;
}
/* Print the program name and error message MESSAGE, which is a printf-style
diff --git a/contrib/cvs/src/fileattr.c b/contrib/cvs/src/fileattr.c
index a5abea0..4042d2a 100644
--- a/contrib/cvs/src/fileattr.c
+++ b/contrib/cvs/src/fileattr.c
@@ -111,6 +111,10 @@ fileattr_read ()
Node *newnode;
p = strchr (line, '\t');
+ if (p == NULL)
+ error (1, 0,
+ "file attribute database corruption: tab missing in %s",
+ fname);
*p++ = '\0';
newnode = getnode ();
newnode->type = FILEATTR;
@@ -130,6 +134,10 @@ fileattr_read ()
/* Currently nothing to skip here, but for future expansion,
ignore anything located here. */
p = strchr (line, '\t');
+ if (p == NULL)
+ error (1, 0,
+ "file attribute database corruption: tab missing in %s",
+ fname);
++p;
fileattr_default_attrs = xstrdup (p);
}
diff --git a/contrib/cvs/src/hardlink.c b/contrib/cvs/src/hardlink.c
index 51bd2a6..b279aa9 100644
--- a/contrib/cvs/src/hardlink.c
+++ b/contrib/cvs/src/hardlink.c
@@ -41,96 +41,6 @@ List *hardlist; /* Record hardlink information for working files */
char *working_dir; /* The top-level working directory, used for
constructing full pathnames. */
-/* For check_link_proc: list all of the files named in an inode list. */
-static int
-list_files_proc (node, vstrp)
- Node *node;
- void *vstrp;
-{
- char **strp, *file;
- int len;
-
- /* Get the file's basename. This is because -- VERY IMPORTANT --
- the `hardlinks' field is presently defined only to include links
- within a directory. So the hardlinks field might be `foo' or
- `mumble grump flink', but not `foo bar com/baz' or `wham ../bam
- ../thank/you'. Someday it would be nice to extend this to
- permit cross-directory links, but the issues involved are
- hideous. */
-
- file = strrchr (node->key, '/');
- if (file)
- ++file;
- else
- file = node->key;
-
- /* Is it safe to cast vstrp to (char **) here, and then play with
- the contents? I think so, since vstrp will have started out
- a char ** to begin with, so we should not have alignment bugs. */
- strp = (char **) vstrp;
- len = (*strp == NULL ? 0 : strlen (*strp));
- *strp = (char *) xrealloc (*strp, len + strlen (file) + 2);
- if (*strp == NULL)
- {
- error (0, errno, "could not allocate memory");
- return 1;
- }
- if (sprintf (*strp + len, "%s ", file) < 0)
- {
- error (0, errno, "could not compile file list");
- return 1;
- }
-
- return 0;
-}
-
-/* Set the link field of each hardlink_info node to `data', which is a
- list of linked files. */
-static int
-set_hardlink_field_proc (node, data)
- Node *node;
- void *data;
-{
- struct hardlink_info *hlinfo = (struct hardlink_info *) node->data;
- hlinfo->links = xstrdup ((char *) data);
-
- return 0;
-}
-
-/* For each file being checked in, compile a list of the files linked
- to it, and cache the list in the file's hardlink_info field. */
-int
-cache_hardlinks_proc (node, data)
- Node *node;
- void *data;
-{
- List *inode_links;
- char *p, *linked_files = NULL;
- int err;
-
- inode_links = (List *) node->data;
-
- /* inode->data is a list of hardlink_info structures: all the
- files linked to this inode. We compile a string of each file
- named in this list, in alphabetical order, separated by spaces.
- Then store this string in the `links' field of each
- hardlink_info structure, so that RCS_checkin can easily add
- it to the `hardlinks' field of a new delta node. */
-
- sortlist (inode_links, fsortcmp);
- err = walklist (inode_links, list_files_proc, &linked_files);
- if (err)
- return err;
-
- /* Trim trailing whitespace. */
- p = linked_files + strlen(linked_files) - 1;
- while (p > linked_files && isspace (*p))
- *p-- = '\0';
-
- err = walklist (inode_links, set_hardlink_field_proc, linked_files);
- return err;
-}
-
/* Return a pointer to FILEPATH's node in the hardlist. This means
looking up its inode, retrieving the list of files linked to that
inode, and then looking up FILE in that list. If the file doesn't
@@ -237,26 +147,28 @@ update_hardlink_info (file)
hlinfo = (struct hardlink_info *) n->data;
hlinfo->status = T_UPTODATE;
hlinfo->checked_out = 1;
- hlinfo->links = NULL;
}
-/* Return a string listing all the files known to be linked to FILE in
+/* Return a List with all the files known to be linked to FILE in
the working directory. Used by special_file_mismatch, to determine
- whether it is safe to merge two files. */
-char *
-list_files_linked_to (file)
- const char *file;
+ whether it is safe to merge two files.
+
+ FIXME: What is the memory allocation for the return value? We seem
+ to sometimes allocate a new list (getlist() call below) and sometimes
+ return an existing list (where we return n->data). */
+List *
+list_linked_files_on_disk (file)
+ char *file;
{
- char *inodestr, *filelist, *path;
+ char *inodestr, *path;
struct stat sb;
Node *n;
- int err;
/* If hardlist is NULL, we have not been doing an operation that
would permit us to know anything about the file's hardlinks
- (cvs update, cvs commit, etc). Return an empty string. */
+ (cvs update, cvs commit, etc). Return an empty list. */
if (hardlist == NULL)
- return xstrdup ("");
+ return getlist();
/* Get the full pathname of file (assuming the working directory) */
if (file[0] == '/')
@@ -288,11 +200,107 @@ list_files_linked_to (file)
n = findnode (hardlist, inodestr);
sortlist ((List *) n->data, fsortcmp);
- filelist = NULL;
- err = walklist ((List *) n->data, list_files_proc, &filelist);
- if (err)
- error (1, 0, "cannot get list of hardlinks for %s", file);
-
free (inodestr);
- return filelist;
+ return (List *) n->data;
}
+
+/* Compare the files in the `key' fields of two lists, returning 1 if
+ the lists are equivalent and 0 otherwise.
+
+ Only the basenames of each file are compared. This is an awful hack
+ that exists because list_linked_files_on_disk returns full paths
+ and the `hardlinks' structure of a RCSVers node contains only
+ basenames. That in turn is a result of the awful hack that only
+ basenames are stored in the RCS file. If anyone ever solves the
+ problem of correctly managing cross-directory hardlinks, this
+ function (along with most functions in this file) must be fixed. */
+
+int
+compare_linkage_lists (links1, links2)
+ List *links1;
+ List *links2;
+{
+ Node *n1, *n2;
+ char *p1, *p2;
+
+ sortlist (links1, fsortcmp);
+ sortlist (links2, fsortcmp);
+
+ n1 = links1->list->next;
+ n2 = links2->list->next;
+
+ while (n1 != links1->list && n2 != links2->list)
+ {
+ /* Get the basenames of both files. */
+ p1 = strrchr (n1->key, '/');
+ if (p1 == NULL)
+ p1 = n1->key;
+ else
+ ++p1;
+
+ p2 = strrchr (n2->key, '/');
+ if (p2 == NULL)
+ p2 = n2->key;
+ else
+ ++p2;
+
+ /* Compare the files' basenames. */
+ if (strcmp (p1, p2) != 0)
+ return 0;
+
+ n1 = n1->next;
+ n2 = n2->next;
+ }
+
+ /* At this point we should be at the end of both lists; if not,
+ one file has more links than the other, and return 1. */
+ return (n1 == links1->list && n2 == links2->list);
+}
+
+/* Find a checked-out file in a list of filenames. Used by RCS_checkout
+ when checking out a new hardlinked file, to decide whether this file
+ can be linked to any others that already exist. The return value
+ is not currently used. */
+
+int
+find_checkedout_proc (node, data)
+ Node *node;
+ void *data;
+{
+ Node **uptodate = (Node **) data;
+ Node *link;
+ char *dir = xgetwd();
+ char *path;
+ struct hardlink_info *hlinfo;
+
+ /* If we have already found a file, don't do anything. */
+ if (*uptodate != NULL)
+ return 0;
+
+ /* Look at this file in the hardlist and see whether the checked_out
+ field is 1, meaning that it has been checked out during this CVS run. */
+ path = (char *)
+ xmalloc (sizeof(char) * (strlen (dir) + strlen (node->key) + 2));
+ sprintf (path, "%s/%s", dir, node->key);
+ link = lookup_file_by_inode (path);
+ free (path);
+ free (dir);
+
+ if (link == NULL)
+ {
+ /* We haven't seen this file -- maybe it hasn't been checked
+ out yet at all. */
+ return 0;
+ }
+
+ hlinfo = (struct hardlink_info *) link->data;
+ if (hlinfo->checked_out)
+ {
+ /* This file has been checked out recently, so it's safe to
+ link to it. */
+ *uptodate = link;
+ }
+
+ return 0;
+}
+
diff --git a/contrib/cvs/src/hardlink.h b/contrib/cvs/src/hardlink.h
index cce3f33..f9df344 100644
--- a/contrib/cvs/src/hardlink.h
+++ b/contrib/cvs/src/hardlink.h
@@ -21,13 +21,13 @@ struct hardlink_info
{
Ctype status; /* as returned from Classify_File() */
int checked_out; /* has this file been checked out lately? */
- char *links; /* contents of `hardlinks' RCS field */
};
extern List *hardlist;
extern char *working_dir;
-int cache_hardlinks_proc PROTO ((Node *, void *));
Node *lookup_file_by_inode PROTO ((const char *));
void update_hardlink_info PROTO ((const char *));
-char *list_files_linked_to PROTO ((const char *));
+List *list_linked_files_on_disk PROTO ((char *));
+int compare_linkage_lists PROTO ((List *, List *));
+int find_checkedout_proc PROTO ((Node *, void *));
diff --git a/contrib/cvs/src/history.c b/contrib/cvs/src/history.c
index 223e5a7..8f1e254 100644
--- a/contrib/cvs/src/history.c
+++ b/contrib/cvs/src/history.c
@@ -200,7 +200,6 @@ static int accept_hrec PROTO((struct hrec * hr, struct hrec * lr));
static int select_hrec PROTO((struct hrec * hr));
static int sort_order PROTO((const PTR l, const PTR r));
static int within PROTO((char *find, char *string));
-static time_t date_and_time PROTO((char *date_str));
static void expand_modules PROTO((void));
static void read_hrecs PROTO((char *fname));
static void report_hrecs PROTO((void));
@@ -242,8 +241,8 @@ static char *tz_name = "+0000";
static char *since_rev;
static char *since_tag;
static char *backto;
-/* -D option, or 0 if not specified. */
-static time_t since_date;
+/* -D option, or 0 if not specified. RCS format. */
+static char * since_date;
static struct hrec *last_since_tag;
static struct hrec *last_backto;
@@ -364,18 +363,6 @@ sort_order (l, r)
return (left->idx - right->idx);
}
-static time_t
-date_and_time (date_str)
- char *date_str;
-{
- time_t t;
-
- t = get_date (date_str, (struct timeb *) NULL);
- if (t == (time_t) - 1)
- error (1, 0, "Can't parse date/time: %s", date_str);
- return (t);
-}
-
int
history (argc, argv)
int argc;
@@ -432,14 +419,16 @@ history (argc, argv)
error (0, 0, "date overriding rev/tag/backto");
*since_rev = *since_tag = *backto = '\0';
}
- since_date = date_and_time (optarg);
+ since_date = Make_Date (optarg);
break;
case 'b': /* Since specified file/Repos */
if (since_date || *since_rev || *since_tag)
{
error (0, 0, "backto overriding date/rev/tag");
*since_rev = *since_tag = '\0';
- since_date = 0;
+ if (since_date != NULL)
+ free (since_date);
+ since_date = NULL;
}
free (backto);
backto = xstrdup (optarg);
@@ -461,7 +450,9 @@ history (argc, argv)
{
error (0, 0, "rev overriding date/tag/backto");
*since_tag = *backto = '\0';
- since_date = 0;
+ if (since_date != NULL)
+ free (since_date);
+ since_date = NULL;
}
free (since_rev);
since_rev = xstrdup (optarg);
@@ -471,7 +462,9 @@ history (argc, argv)
{
error (0, 0, "tag overriding date/marker/file/repos");
*since_rev = *backto = '\0';
- since_date = 0;
+ if (since_date != NULL)
+ free (since_date);
+ since_date = NULL;
}
free (since_tag);
since_tag = xstrdup (optarg);
@@ -564,7 +557,7 @@ history (argc, argv)
if (histfile)
send_arg("-X");
if (since_date)
- option_with_arg ("-D", asctime (gmtime (&since_date)));
+ client_senddate (since_date);
if (backto[0] != '\0')
option_with_arg ("-b", backto);
for (f1 = file_list; f1 < &file_list[file_count]; ++f1)
@@ -683,6 +676,8 @@ history (argc, argv)
qsort ((PTR) hrec_head, hrec_count, sizeof (struct hrec), sort_order);
report_hrecs ();
free (fname);
+ if (since_date != NULL)
+ free (since_date);
free (since_rev);
free (since_tag);
free (backto);
@@ -1157,7 +1152,7 @@ select_hrec (hr)
/* "Since" checking: The argument parser guarantees that only one of the
* following four choices is set:
*
- * 1. If "since_date" is set, it contains a Unix time_t specified on the
+ * 1. If "since_date" is set, it contains the date specified on the
* command line. hr->date fields earlier than "since_date" are ignored.
* 2. If "since_rev" is set, it contains either an RCS "dotted" revision
* number (which is of limited use) or a symbolic TAG. Each RCS file
@@ -1177,8 +1172,12 @@ select_hrec (hr)
*/
if (since_date)
{
- if (hr->date < since_date)
+ char *ourdate = date_from_time_t (hr->date);
+
+ if (RCS_datecmp (ourdate, since_date) < 0)
return (0);
+
+ free (ourdate);
}
else if (*since_rev)
{
diff --git a/contrib/cvs/src/options.h.in b/contrib/cvs/src/options.h.in
index 144980e..67e8c40 100644
--- a/contrib/cvs/src/options.h.in
+++ b/contrib/cvs/src/options.h.in
@@ -15,13 +15,12 @@
* or the configure script directly. Sorry.
*/
-/*
- * For portability and heterogeneity reasons, CVS is shipped by
- * default using my own text-file version of the ndbm database library
- * in the src/myndbm.c file. If you want better performance and are
- * not concerned about heterogeneous hosts accessing your modules
- * file, turn this option off.
- */
+/* By default, CVS stores its modules and other such items in flat
+ text files (MY_NDBM enables this). Turning off MY_NDBM causes CVS
+ to look for a system-supplied ndbm database library and use it
+ instead. That may speed things up, but the default setting
+ generally works fine too. */
+
#ifndef MY_NDBM
#define MY_NDBM
#endif
diff --git a/contrib/cvs/src/parseinfo.c b/contrib/cvs/src/parseinfo.c
index a8a1b4a..9847ab9 100644
--- a/contrib/cvs/src/parseinfo.c
+++ b/contrib/cvs/src/parseinfo.c
@@ -346,6 +346,18 @@ warning: this CVS does not support PreservePermissions");
goto error_return;
}
}
+ else if (strcmp (line, "TopLevelAdmin") == 0)
+ {
+ if (strcmp (p, "no") == 0)
+ top_level_admin = 0;
+ else if (strcmp (p, "yes") == 0)
+ top_level_admin = 1;
+ else
+ {
+ error (0, 0, "unrecognized value '%s' for TopLevelAdmin", p);
+ goto error_return;
+ }
+ }
else
{
/* We may be dealing with a keyword which was added in a
diff --git a/contrib/cvs/src/rtag.c b/contrib/cvs/src/rtag.c
index 93539e2..3207c1b 100644
--- a/contrib/cvs/src/rtag.c
+++ b/contrib/cvs/src/rtag.c
@@ -477,7 +477,7 @@ pretag_proc(repository, filter)
run_arg (delete_flag ? "del" : force_tag_move ? "mov" : "add");
run_arg (repository);
walklist(tlist, pretag_list_proc, NULL);
- return (run_exec(RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL|RUN_REALLY));
+ return (run_exec (RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL));
}
static void
diff --git a/contrib/cvs/src/sanity.sh b/contrib/cvs/src/sanity.sh
index 1d877fe..f97e036 100755
--- a/contrib/cvs/src/sanity.sh
+++ b/contrib/cvs/src/sanity.sh
@@ -512,8 +512,12 @@ dotest_sort ()
dotest_internal "$@"
}
-# clean any old remnants
-rm -rf ${TESTDIR}
+# 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
mkdir ${TESTDIR}
cd ${TESTDIR}
# This will show up in cvs history output where it prints the working
@@ -549,24 +553,30 @@ RCSINIT=; export RCSINIT
if test x"$*" = x; then
# Basic/miscellaneous functionality
- tests="basica basicb basicc basic1 deep basic2"
+ tests="basica basicb basicc basic1 deep basic2 commit-readonly"
# Branching, tagging, removing, adding, multiple directories
tests="${tests} rdiff death death2 branches branches2"
- tests="${tests} rcslib multibranch import importb join join2 join3"
+ tests="${tests} rcslib multibranch import importb importc"
+ tests="${tests} join join2 join3"
tests="${tests} new newb conflicts conflicts2 conflicts3"
# Checking out various places (modules, checkout -d, &c)
tests="${tests} modules modules2 modules3 modules4"
- tests="${tests} cvsadm abspath toplevel"
+ tests="${tests} cvsadm emptydir abspath toplevel toplevel2"
# Log messages, error messages.
tests="${tests} mflag editor errmsg1 errmsg2"
# Watches, binary files, history browsing, &c.
tests="${tests} devcom devcom2 devcom3 watch4"
+ tests="${tests} unedit-without-baserev"
tests="${tests} ignore binfiles binfiles2 mcopy binwrap binwrap2"
- tests="${tests} binwrap3 mwrap info config"
- tests="${tests} serverpatch log log2 ann crerepos rcs big modes stamps"
+ tests="${tests} binwrap3 mwrap info taginfo config"
+ tests="${tests} serverpatch log log2 ann ann-id crerepos rcs rcs2"
+ tests="${tests} history"
+ tests="${tests} big modes modes2 stamps"
+ # PreservePermissions stuff: permissions, symlinks et al.
+ tests="${tests} perms symlinks hardlinks"
# More tag and branch tests, keywords.
tests="${tests} sticky keyword keywordlog"
- tests="${tests} head tagdate multibranch2"
+ tests="${tests} head tagdate multibranch2 tag8k"
# "cvs admin", reserved checkouts.
tests="${tests} admin reserved"
# Nuts and bolts of diffing/merging (diff library, &c)
@@ -888,15 +898,19 @@ done"
cd ..
rm -r 2
-: mkdir ${CVSROOT_DIRNAME}/first-dir
dotest basicb-1 "${testcvs} -q co first-dir" ''
- dotest basicb-1a "test -d CVS" ''
+
+ # 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" ''
# In 1b and 1c, the first string matches if we're using absolute
# paths, while the second matches if RELATIVE_REPOS is defined
# (we're using relative paths).
- dotest basicb-1b "cat CVS/Repository" \
+: dotest basicb-1b "cat CVS/Repository" \
"${TESTDIR}/cvsroot/\." \
"\."
dotest basicb-1c "cat first-dir/CVS/Repository" \
@@ -1001,13 +1015,16 @@ U first-dir1/sdir2/sfile2'
"${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'
- dotest basicb-9a "test -d CVS" ''
+
+ # basicb-9a and basicb-9b: see note about basicb-1a
+
+ dotest_fail basicb-9a "test -d CVS" ''
# In 9b through 9f, the first string matches if we're using
# absolute paths, while the second matches if RELATIVE_REPOS
# is defined (we're using relative paths).
- dotest basicb-9b "cat CVS/Repository" \
+: dotest basicb-9b "cat CVS/Repository" \
"${TESTDIR}/cvsroot/\." \
"\."
dotest basicb-9c "cat newdir/CVS/Repository" \
@@ -1063,33 +1080,24 @@ Checking in aa;
${TESTDIR}/cvsroot/second-dir/aa,v <-- aa
initial revision: 1\.1
done"
- cd ../..
- rm -r 1
+ cd ..
- # Let's see if we can add something to Emptydir.
- dotest basicb-18 "${testcvs} -q co -d t2/t3 first-dir second-dir" \
-"U t2/t3/first-dir/Emptydir/sfile1
-U t2/t3/first-dir/sdir2/sfile2
-U t2/t3/second-dir/aa"
- cd t2
- touch emptyfile
- # The fact that CVS lets us add a file here is a CVS bug, right?
- # I can just make this an error message (on the add and/or the
- # commit) without getting flamed, right?
- # Right?
- # Right?
- dotest basicb-19 "${testcvs} add emptyfile" \
-"${PROG} [a-z]*: scheduling file .emptyfile. for addition
-${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
- dotest basicb-20 "${testcvs} -q ci -m add" \
-"RCS file: ${TESTDIR}/cvsroot/CVSROOT/Emptydir/emptyfile,v
-done
-Checking in emptyfile;
-${TESTDIR}/cvsroot/CVSROOT/Emptydir/emptyfile,v <-- emptyfile
-initial revision: 1\.1
-done"
+ # Try to remove all revisions in a file.
+ dotest_fail basicb-o1 "${testcvs} admin -o1.1 topfile" \
+"RCS file: ${TESTDIR}/cvsroot/topfile,v
+deleting revision 1\.1
+${PROG} \[[a-z]* 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: ${TESTDIR}/cvsroot/first-dir/sdir2/sfile2,v
+deleting revision 1\.2
+deleting revision 1\.1
+${PROG} \[[a-z]* aborted\]: attempt to delete all revisions"
cd ..
- rm -r t2
+ rm -r 1
mkdir 1; cd 1
# Note that -H is an illegal option.
@@ -1105,18 +1113,6 @@ ${PROG} \[admin aborted\]: specify ${PROG} -H admin for usage information"
cd ..
rmdir 1
- # OK, while we have an Emptydir around, test a few obscure
- # things about it.
- mkdir edir; cd edir
- dotest basicb-edir-1 "${testcvs} -q co -l CVSROOT" \
-"U CVSROOT${DOTSTAR}"
- cd CVSROOT
- dotest_fail basicb-edir-2 "test -d Emptydir" ''
- # This tests the code in find_dirs which skips Emptydir.
- dotest basicb-edir-3 "${testcvs} -q -n update -d -P" ''
- cd ../..
- rm -r edir
-
if test "$keep" = yes; then
echo Keeping ${TESTDIR} and exiting due to --keep
exit 0
@@ -1124,7 +1120,6 @@ ${PROG} \[admin aborted\]: specify ${PROG} -H admin for usage information"
rm -rf ${CVSROOT_DIRNAME}/first-dir
rm -rf ${CVSROOT_DIRNAME}/second-dir
- rm -rf ${CVSROOT_DIRNAME}/CVSROOT/Emptydir
rm -f ${CVSROOT_DIRNAME}/topfile,v
;;
@@ -1141,10 +1136,11 @@ ${PROG} \[[a-z]* aborted\]: there is no version here; run .${PROG} checkout. fir
Directory ${TESTDIR}/cvsroot/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 avoid it currently is to let CVS create it, and
- # then blow it away. But that is perfectly legal; people who
- # are used to the old behavior especially may be interested.
- rm -r CVS
+ # 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.
+ rm -rf CVS
dotest basicc-4 "echo *" "first-dir second-dir"
dotest basicc-5 "${testcvs} update" \
"${PROG} [a-z]*: Updating first-dir
@@ -2051,6 +2047,47 @@ O [0-9/]* [0-9:]* ${PLUS}0000 ${username} \[1\.1\] first-dir =first-di
rm -rf ${CVSROOT_DIRNAME}/second-dir
;;
+ 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} [a-z]*: scheduling file .$file. for addition
+${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ dotest commit-readonly-4 "$testcvs -Q ci -m . $file" \
+"RCS file: ${TESTDIR}/cvsroot/$module/$file,v
+done
+Checking in $file;
+${TESTDIR}/cvsroot/$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;
+${TESTDIR}/cvsroot/$module/$file,v <-- $file
+new revision: 1\.2; previous revision: 1\.1
+done"
+
+ cd ../..
+ rm -rf 1
+ rm -rf ${CVSROOT_DIRNAME}/$module
+ ;;
+
+
rdiff)
# Test rdiff
# XXX for now this is just the most essential test...
@@ -3557,6 +3594,17 @@ two
3
[>]>>>>>> 1\.2"
+ # Test behavior of symlinks in the repository.
+ dotest rcslib-symlink-1 "ln -s file1,v ${CVSROOT_DIRNAME}/first-dir/file2,v"
+ 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;
+${TESTDIR}/cvsroot/first-dir/file1,v <-- file2
+new revision: 1\.1\.2\.2; previous revision: 1\.1\.2\.1
+done"
+ dotest rcslib-symlink-4 "test -L ${CVSROOT_DIRNAME}/first-dir/file2,v"
+
cd ..
if test "$keep" = yes; then
@@ -3657,6 +3705,7 @@ modify-on-br1
# 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
@@ -3787,6 +3836,7 @@ modify-on-br1
fail 106.5
fi
cd ..
+ rm imported-f2-orig.tmp
# co
if ${CVS} co first-dir ; then
@@ -3972,6 +4022,83 @@ add
rm -rf ${CVSROOT_DIRNAME}/first-dir ${CVSROOT_DIRNAME}/second-dir
;;
+ importc)
+ # Test importing a bunch o' files in a bunch o' directories.
+ 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 bdir/subdir/file1
+ touch cdir/cfile
+ dotest_sort importc-1 \
+"${testcvs} import -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} [a-z]*: Importing ${TESTDIR}/cvsroot/first-dir/adir
+${PROG} [a-z]*: Importing ${TESTDIR}/cvsroot/first-dir/adir/sub1
+${PROG} [a-z]*: Importing ${TESTDIR}/cvsroot/first-dir/adir/sub1/ssdir
+${PROG} [a-z]*: Importing ${TESTDIR}/cvsroot/first-dir/adir/sub2
+${PROG} [a-z]*: Importing ${TESTDIR}/cvsroot/first-dir/bdir
+${PROG} [a-z]*: Importing ${TESTDIR}/cvsroot/first-dir/bdir/subdir
+${PROG} [a-z]*: Importing ${TESTDIR}/cvsroot/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} [a-z]*: Updating adir/sub1
+${PROG} [a-z]*: Updating adir/sub1/ssdir"
+ dotest importc-4 "${testcvs} update adir/sub1 bdir/subdir" \
+"${PROG} [a-z]*: Updating adir/sub1
+${PROG} [a-z]*: Updating adir/sub1/ssdir
+${PROG} [a-z]*: 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" "M cdir/cfile"
+
+ if test "$remote" = no; then
+ # This checkin should just succeed. That it doesn't is a
+ # bug (CVS 1.9.16 through the present seem to have it; CVS
+ # 1.9 did not).
+ dotest_fail importc-7 "${testcvs} -q ci -m modify -r wip_test" \
+"${PROG} [a-z]*: in directory adir/sub1/ssdir:
+${PROG} \[[a-z]* aborted\]: there is no version here; do .cvs checkout. first"
+ # The workaround is to leave off the "-r wip_test".
+ dotest importc-8 "${testcvs} -q ci -m modify" \
+"Checking in cdir/cfile;
+${TESTDIR}/cvsroot/first-dir/cdir/cfile,v <-- cfile
+new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
+done"
+ else
+ # Remote doesn't have the bug in the first place.
+ dotest importc-7 "${testcvs} -q ci -m modify -r wip_test" \
+"Checking in cdir/cfile;
+${TESTDIR}/cvsroot/first-dir/cdir/cfile,v <-- cfile
+new revision: 1\.1\.1\.1\.2\.1; previous revision: 1\.1\.1\.1
+done"
+ fi
+ cd ..
+
+ cd ..
+ rm -r 1 2
+ 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:
@@ -5779,6 +5906,10 @@ ${PROG} [a-z]*: Rebuilding administrative file database"
dotest modules2-5 "test -d ampermodule/second-dir" ''
# Test ability of cvs release to handle 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.
cd ampermodule
if ${testcvs} release -d first-dir second-dir <<EOF >>${LOGFILE}
yes
@@ -5803,9 +5934,11 @@ EOF
"${PROG} [a-z]*: Updating first-dir
${PROG} [a-z]*: Updating second-dir"
touch ampermodule/first-dir/amper1
- dotest modules2-10 "${testcvs} add ampermodule/first-dir/amper1" \
-"${PROG} [a-z]*: scheduling file .ampermodule/first-dir/amper1. for addition
+ cd ampermodule
+ dotest modules2-10 "${testcvs} add first-dir/amper1" \
+"${PROG} [a-z]*: scheduling file .first-dir/amper1. for addition
${PROG} [a-z]*: 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
@@ -6131,6 +6264,7 @@ done"
cat >modules <<EOF
all -a first-dir
some -a !first-dir/subdir first-dir
+somewhat -a first-dir !first-dir/subdir
EOF
dotest modules4-8 "${testcvs} -q ci -m add-modules" \
"Checking in modules;
@@ -6152,6 +6286,21 @@ U first-dir/subdir/file2"
dotest_fail modules4-11 "test -d first-dir/subdir" ''
rm -r first-dir
+ if test "$remote" = no; then
+ # 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-11a "${testcvs} -q co somewhat" \
+"U first-dir/file1
+U first-dir/subdir/file2"
+ else
+ # But remote seems to do it the other way.
+ dotest modules4-11a "${testcvs} -q co somewhat" "U first-dir/file1"
+ dotest_fail modules4-11b "test -d first-dir/subdir" ''
+ fi
+ rm -r first-dir
+
cd ..
rm -r 2
@@ -6222,7 +6371,23 @@ add-it
# convenience variables
REP=${CVSROOT}
- # First, check out the modules file and edit it.
+ # 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;
+${TESTDIR}/cvsroot/CVSROOT/config,v <-- config
+new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
+done
+${PROG} [a-z]*: 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"
@@ -6278,26 +6443,27 @@ ${PROG} [a-z]*: Rebuilding administrative file database"
rm -rf CVS CVSROOT;
# Create the various modules
- mkdir ${CVSROOT_DIRNAME}/mod1
- mkdir ${CVSROOT_DIRNAME}/mod1-2
- mkdir ${CVSROOT_DIRNAME}/mod2
- mkdir ${CVSROOT_DIRNAME}/mod2/sub2
- mkdir ${CVSROOT_DIRNAME}/mod2-2
- mkdir ${CVSROOT_DIRNAME}/mod2-2/sub2-2
- dotest cvsadm-2 "${testcvs} co mod1 mod1-2 mod2 mod2-2" \
-"${PROG} [a-z]*: Updating mod1
-${PROG} [a-z]*: Updating mod1-2
-${PROG} [a-z]*: Updating mod2
-${PROG} [a-z]*: Updating mod2/sub2
-${PROG} [a-z]*: Updating mod2-2
-${PROG} [a-z]*: Updating mod2-2/sub2-2"
+ 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 ${TESTDIR}/cvsroot/mod1 added to the repository
+Directory ${TESTDIR}/cvsroot/mod1-2 added to the repository
+Directory ${TESTDIR}/cvsroot/mod2 added to the repository
+Directory ${TESTDIR}/cvsroot/mod2/sub2 added to the repository
+Directory ${TESTDIR}/cvsroot/mod2-2 added to the repository
+Directory ${TESTDIR}/cvsroot/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-2a "${testcvs} add mod1/file1 mod1-2/file1-2 mod2/sub2/file2 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} [a-z]*: scheduling file .mod1/file1. for addition
${PROG} [a-z]*: scheduling file .mod1-2/file1-2. for addition
${PROG} [a-z]*: scheduling file .mod2/sub2/file2. for addition
@@ -7287,68 +7453,71 @@ U dir/dir2d2-2/sub2d2-2/file2-2"
## on the command line, but use a longer path.
##################################################
+ dotest_fail cvsadm-2d3-1 "${testcvs} co -d dir/dir2 1mod" \
+"${PROG} [a-z]*: cannot chdir to dir: No such file or directory
+${PROG} [a-z]*: ignoring module 1mod"
+
+ if test "$remote" = no; then
+ # 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} [a-z]*: Updating dir/dir2
U dir/dir2/file1"
dotest cvsadm-2d3b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-2d3d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
+ dotest_fail cvsadm-2d3d "test -f dir/CVS/Repository" ""
dotest cvsadm-2d3f "cat dir/dir2/CVS/Repository" \
"${AREP}mod1"
rm -rf CVS dir
+ mkdir dir
dotest cvsadm-2d4 "${testcvs} co -d dir/dir2 2mod" \
"${PROG} [a-z]*: Updating dir/dir2
U dir/dir2/file2"
dotest cvsadm-2d4b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-2d4d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-2d4f "cat dir/dir2/CVS/Repository" \
"${AREP}mod2/sub2"
rm -rf CVS dir
+ mkdir dir
dotest cvsadm-2d5 "${testcvs} co -d dir/dir2 1d1mod" \
"${PROG} [a-z]*: Updating dir/dir2
U dir/dir2/file1"
dotest cvsadm-2d5b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-2d5d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-2d5f "cat dir/dir2/CVS/Repository" \
"${AREP}mod1"
rm -rf CVS dir
+ mkdir dir
dotest cvsadm-2d6 "${testcvs} co -d dir/dir2 1d2mod" \
"${PROG} [a-z]*: Updating dir/dir2
U dir/dir2/file2"
dotest cvsadm-2d6b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-2d6d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-2d6f "cat dir/dir2/CVS/Repository" \
"${AREP}mod2/sub2"
rm -rf CVS dir
+ mkdir dir
dotest cvsadm-2d7 "${testcvs} co -d dir/dir2 2d1mod" \
"${PROG} [a-z]*: Updating dir/dir2
U dir/dir2/file1"
dotest cvsadm-2d7b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-2d7d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-2d7f "cat dir/dir2/CVS/Repository" \
"${AREP}mod1"
rm -rf CVS dir
+ mkdir dir
dotest cvsadm-2d8 "${testcvs} co -d dir/dir2 2d2mod" \
"${PROG} [a-z]*: Updating dir/dir2
U dir/dir2/file2"
dotest cvsadm-2d8b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-2d8d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-2d8f "cat dir/dir2/CVS/Repository" \
"${AREP}mod2/sub2"
rm -rf CVS dir
@@ -7490,65 +7659,60 @@ U dir/dir2d2/sub2d2/file2"
## the ones in two-deep directories
+ mkdir dir
dotest cvsadm-N2d3 "${testcvs} co -N -d dir/dir2 1mod" \
"${PROG} [a-z]*: Updating dir/dir2/1mod
U dir/dir2/1mod/file1"
dotest cvsadm-N2d3b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-N2d3d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-N2d3f "cat dir/dir2/CVS/Repository" \
"${AREP}\."
dotest cvsadm-N2d3h "cat dir/dir2/1mod/CVS/Repository" \
"${AREP}mod1"
rm -rf CVS dir
+ mkdir dir
dotest cvsadm-N2d4 "${testcvs} co -N -d dir/dir2 2mod" \
"${PROG} [a-z]*: Updating dir/dir2/2mod
U dir/dir2/2mod/file2"
dotest cvsadm-N2d4b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-N2d4d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-N2d4f "cat dir/dir2/CVS/Repository" \
"${AREP}\."
dotest cvsadm-N2d4h "cat dir/dir2/2mod/CVS/Repository" \
"${AREP}mod2/sub2"
rm -rf CVS dir
+ mkdir dir
dotest cvsadm-N2d5 "${testcvs} co -N -d dir/dir2 1d1mod" \
"${PROG} [a-z]*: Updating dir/dir2/dir1d1
U dir/dir2/dir1d1/file1"
dotest cvsadm-N2d5b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-N2d5d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-N2d5f "cat dir/dir2/CVS/Repository" \
"${AREP}\."
dotest cvsadm-N2d5h "cat dir/dir2/dir1d1/CVS/Repository" \
"${AREP}mod1"
rm -rf CVS dir
+ mkdir dir
dotest cvsadm-N2d6 "${testcvs} co -N -d dir/dir2 1d2mod" \
"${PROG} [a-z]*: Updating dir/dir2/dir1d2
U dir/dir2/dir1d2/file2"
dotest cvsadm-N2d6b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-N2d6d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-N2d6f "cat dir/dir2/CVS/Repository" \
"${AREP}\."
dotest cvsadm-N2d6h "cat dir/dir2/dir1d2/CVS/Repository" \
"${AREP}mod2/sub2"
rm -rf CVS dir
+ mkdir dir
dotest cvsadm-N2d7 "${testcvs} co -N -d dir/dir2 2d1mod" \
"${PROG} [a-z]*: Updating dir/dir2/dir2d1/sub2d1
U dir/dir2/dir2d1/sub2d1/file1"
dotest cvsadm-N2d7b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-N2d7d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-N2d7f "cat dir/dir2/CVS/Repository" \
"${AREP}\."
dotest cvsadm-N2d7f "cat dir/dir2/dir2d1/CVS/Repository" \
@@ -7557,13 +7721,12 @@ U dir/dir2/dir2d1/sub2d1/file1"
"${AREP}mod1"
rm -rf CVS dir
+ mkdir dir
dotest cvsadm-N2d8 "${testcvs} co -N -d dir/dir2 2d2mod" \
"${PROG} [a-z]*: Updating dir/dir2/dir2d2/sub2d2
U dir/dir2/dir2d2/sub2d2/file2"
dotest cvsadm-N2d8b "cat CVS/Repository" \
"${AREP}\."
- dotest cvsadm-N2d8d "cat dir/CVS/Repository" \
-"${AREP}CVSROOT/Emptydir"
dotest cvsadm-N2d8f "cat dir/dir2/CVS/Repository" \
"${AREP}\."
dotest cvsadm-N2d8h "cat dir/dir2/dir2d2/CVS/Repository" \
@@ -7572,10 +7735,25 @@ U dir/dir2/dir2d2/sub2d2/file2"
"${AREP}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;
+${TESTDIR}/cvsroot/CVSROOT/config,v <-- config
+new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
+done
+${PROG} [a-z]*: Rebuilding administrative file database"
+ cd ..
+ rm -rf CVSROOT CVS
+
# remove our junk
cd ..
rm -rf 1
@@ -7589,6 +7767,90 @@ U dir/dir2/dir2d2/sub2d2/file2"
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/sub2d1 mod1" >> 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} [a-z]*: Rebuilding administrative file database"
+ rm -rf CVS CVSROOT
+
+ mkdir ${CVSROOT_DIRNAME}/mod1
+ # Populate. Not sure we really need to do this.
+ dotest emptydir-3 "${testcvs} co mod1" \
+"${PROG} [a-z]*: Updating mod1"
+ echo "file1" > mod1/file1
+ cd mod1
+ dotest emptydir-4 "${testcvs} add file1" \
+"${PROG} [a-z]*: scheduling file .file1. for addition
+${PROG} [a-z]*: use '${PROG} commit' to add this file permanently"
+ cd ..
+ dotest emptydir-5 "${testcvs} -q ci -m yup mod1" \
+"RCS file: ${CVSROOT_DIRNAME}/mod1/file1,v
+done
+Checking in mod1/file1;
+${CVSROOT_DIRNAME}/mod1/file1,v <-- file1
+initial revision: 1\.1
+done"
+ rm -rf mod1 CVS
+ # End Populate.
+
+ dotest emptydir-6 "${testcvs} co 2d1mod" \
+"${PROG} [a-z]*: Updating dir2d1/sub2d1
+U dir2d1/sub2d1/file1"
+ cd dir2d1
+ touch emptyfile
+ # The fact that CVS lets us add a file here is a CVS bug, right?
+ # I can just make this an error message (on the add and/or the
+ # commit) without getting flamed, right?
+ # Right?
+ # Right?
+ dotest emptydir-7 "${testcvs} add emptyfile" \
+"${PROG} [a-z]*: scheduling file .emptyfile. for addition
+${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ dotest emptydir-8 "${testcvs} -q ci -m add" \
+"RCS file: ${TESTDIR}/cvsroot/CVSROOT/Emptydir/emptyfile,v
+done
+Checking in emptyfile;
+${TESTDIR}/cvsroot/CVSROOT/Emptydir/emptyfile,v <-- emptyfile
+initial revision: 1\.1
+done
+${PROG} [a-z]*: Rebuilding administrative file database"
+ 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 ..
+
+ rm -r 1
+ rm -rf ${CVSROOT_DIRNAME}/mod1
+ # 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
@@ -7607,10 +7869,16 @@ ${PROG} [a-z]*: Updating mod2"
# Populate the module
echo "file1" > mod1/file1
echo "file2" > mod2/file2
- dotest abspath-1b "${testcvs} add mod1/file1 mod2/file2" \
-"${PROG} [a-z]*: scheduling file .mod1/file1. for addition
-${PROG} [a-z]*: scheduling file .mod2/file2. for addition
-${PROG} [a-z]*: use '${PROG} commit' to add these files permanently"
+ cd mod1
+ dotest abspath-1ba "${testcvs} add file1" \
+"${PROG} [a-z]*: scheduling file .file1. for addition
+${PROG} [a-z]*: use '${PROG} commit' to add this file permanently"
+ cd ..
+ cd mod2
+ dotest abspath-1bb "${testcvs} add file2" \
+"${PROG} [a-z]*: scheduling file .file2. for addition
+${PROG} [a-z]*: use '${PROG} commit' to add this file permanently"
+ cd ..
dotest abspath-1c "${testcvs} ci -m yup mod1 mod2" \
"${PROG} [a-z]*: Examining mod1
@@ -7632,9 +7900,17 @@ done"
# Done.
# Try checking out the module in a local directory
+ if test "$remote" = yes; then
+ dotest_fail abspath-2a "${testcvs} co -d ${TESTDIR}/1 mod1" \
+"${PROG} \[server aborted\]: absolute pathname .${TESTDIR}/1. illegal for server"
+ dotest abspath-2a-try2 "${testcvs} co -d 1 mod1" \
+"${PROG} [a-z]*: Updating 1
+U 1/file1"
+ else
dotest abspath-2a "${testcvs} co -d ${TESTDIR}/1 mod1" \
"${PROG} [a-z]*: Updating ${TESTDIR}/1
U ${TESTDIR}/1/file1"
+ fi # remote workaround
# Are we relative or absolute in our Repository file?
echo "${CVSROOT_DIRNAME}/mod1" > ${TESTDIR}/dotest.abs
@@ -7658,11 +7934,47 @@ U ${TESTDIR}/1/file1"
# 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 test "$remote" = no; then
+ dotest_fail abspath-3.1 "${testcvs} co -d ${TESTDIR}/1/2 mod1" \
+"${PROG} [a-z]*: cannot chdir to 1: No such file or directory
+${PROG} [a-z]*: ignoring module mod1"
+ fi
+ dotest_fail abspath-3.2 "${testcvs} co -d 1/2 mod1" \
+"${PROG} [a-z]*: cannot chdir to 1: No such file or directory
+${PROG} [a-z]*: ignoring module mod1"
+ mkdir 1
+
+ if test "$remote" = yes; 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} [a-z]*: cannot chdir to 1: No such file or directory
+${PROG} [a-z]*: ignoring module mod1"
+ cd 1
+ dotest abspath-3a-try2 "${testcvs} co -d 2 mod1" \
+"${PROG} [a-z]*: Updating 2
+U 2/file1"
+ cd ..
+ rm -rf 1/CVS
+ else
dotest abspath-3a "${testcvs} co -d ${TESTDIR}/1/2 mod1" \
"${PROG} [a-z]*: Updating ${TESTDIR}/1/2
U ${TESTDIR}/1/2/file1"
+ fi # remote workaround
dotest abspath-3b "cat ${TESTDIR}/1/2/CVS/Repository" \
"${AREP}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
@@ -7670,19 +7982,32 @@ U ${TESTDIR}/1/2/file1"
# Now try someplace where we don't have permission.
mkdir ${TESTDIR}/barf
chmod -w ${TESTDIR}/barf
- dotest_fail abspath-4 "${testcvs} co -d ${TESTDIR}/barf/sub mod1" \
+ if test "$remote" = yes; then
+ dotest_fail abspath-4 "${testcvs} co -d ${TESTDIR}/barf/sub mod1" \
+"${PROG} \[server aborted\]: absolute pathname .${TESTDIR}/barf/sub. illegal for server"
+ else
+ dotest_fail abspath-4 "${testcvs} co -d ${TESTDIR}/barf/sub mod1" \
"${PROG} \[[a-z]* aborted\]: cannot make directory sub: No such file or directory"
+ fi
chmod +w ${TESTDIR}/barf
rmdir ${TESTDIR}/barf
# Done. Nothing to clean up.
# Try checking out two modules into the same directory.
- dotest abspath-5a "${testcvs} co -d ${TESTDIR}/1 mod1 mod2" \
+ if test "$remote" = yes; then
+ dotest abspath-5a "${testcvs} co -d 1 mod1 mod2" \
+"${PROG} [a-z]*: Updating 1/mod1
+U 1/mod1/file1
+${PROG} [a-z]*: Updating 1/mod2
+U 1/mod2/file2"
+ else
+ dotest abspath-5a "${testcvs} co -d ${TESTDIR}/1 mod1 mod2" \
"${PROG} [a-z]*: Updating ${TESTDIR}/1/mod1
U ${TESTDIR}/1/mod1/file1
${PROG} [a-z]*: Updating ${TESTDIR}/1/mod2
U ${TESTDIR}/1/mod2/file2"
+ fi # end remote workaround
dotest abspath-5b "cat ${TESTDIR}/1/CVS/Repository" \
"${AREP}."
dotest abspath-5c "cat ${TESTDIR}/1/mod1/CVS/Repository" \
@@ -7694,7 +8019,17 @@ U ${TESTDIR}/1/mod2/file2"
# Try checking out the top-level module.
- dotest abspath-6a "${testcvs} co -d ${TESTDIR}/1 ." \
+ if test "$remote" = yes; then
+ dotest abspath-6a "${testcvs} co -d 1 ." \
+"${PROG} [a-z]*: Updating 1
+${PROG} [a-z]*: Updating 1/CVSROOT
+${DOTSTAR}
+${PROG} [a-z]*: Updating 1/mod1
+U 1/mod1/file1
+${PROG} [a-z]*: Updating 1/mod2
+U 1/mod2/file2"
+ else
+ dotest abspath-6a "${testcvs} co -d ${TESTDIR}/1 ." \
"${PROG} [a-z]*: Updating ${TESTDIR}/1
${PROG} [a-z]*: Updating ${TESTDIR}/1/CVSROOT
${DOTSTAR}
@@ -7702,6 +8037,7 @@ ${PROG} [a-z]*: Updating ${TESTDIR}/1/mod1
U ${TESTDIR}/1/mod1/file1
${PROG} [a-z]*: Updating ${TESTDIR}/1/mod2
U ${TESTDIR}/1/mod2/file2"
+ fi # end of remote workaround
dotest abspath-6b "cat ${TESTDIR}/1/CVS/Repository" \
"${AREP}."
dotest abspath-6c "cat ${TESTDIR}/1/CVSROOT/CVS/Repository" \
@@ -7713,17 +8049,45 @@ U ${TESTDIR}/1/mod2/file2"
# 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 test "$remote" = yes; then
+ dotest_fail abspath-7a "${testcvs} -q co -d ../2 mod2" \
+"${PROG} server: protocol error: .\.\./2. contains more leading \.\.
+${PROG} \[server aborted\]: than the 0 which Max-dotdot specified"
+ cd ..
+ dotest abspath-7a-try2 "${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 test "$remote" = yes; then
+ cd ../..
+ dotest abspath-7d "${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}/mod1
-
- # FIXME: the absolute pathname fixes create CVS directories
- # wherever they can. That means for the standard TESTDIR, a
- # /tmp/CVS directory will be created as well. It's not safe
- # to remove it, however.
+ rm -rf ${CVSROOT_DIRNAME}/mod1 ${CVSROOT_DIRNAME}/mod2
;;
@@ -7733,9 +8097,26 @@ U ${TESTDIR}/1/mod2/file2"
# Some test, somewhere, is creating Emptydir. That test
# should, perhaps, clean up for itself, but I don't know which
- # one it is.
+ # one it is (cvsadm, emptydir, &c).
+ # (On the other hand, should CVS care whether there is an
+ # Emptydir? That would seem a bit odd).
rm -rf ${CVSROOT_DIRNAME}/CVSROOT/Emptydir
+ # 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;
+${TESTDIR}/cvsroot/CVSROOT/config,v <-- config
+new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
+done
+${PROG} [a-z]*: Rebuilding administrative file database"
+ cd ../..
+ rm -r 1
+
mkdir 1; cd 1
dotest toplevel-1 "${testcvs} -q co -l ." ''
mkdir top-dir second-dir
@@ -7806,6 +8187,7 @@ ${PROG} [a-z]*: Updating top-dir"
dotest toplevel-10 "${testcvs} co top-dir" \
"${PROG} [a-z]*: 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" \
@@ -7819,12 +8201,124 @@ U top-dir/file1"
# Now set the permissions so we can't recreate it.
chmod -w ../1
# 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} [a-z]*: warning: cannot make directory CVS in \.: Permission denied
+${PROG} [a-z]*: Updating top-dir" \
+"${PROG} [a-z]*: warning: cannot make directory CVS in \.: Permission denied
+${PROG} [a-z]*: in directory \.:
+${PROG} [a-z]*: cannot open CVS/Entries for reading: No such file or directory
${PROG} [a-z]*: 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;
+${TESTDIR}/cvsroot/CVSROOT/config,v <-- config
+new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
+done
+${PROG} [a-z]*: 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;
+${TESTDIR}/cvsroot/CVSROOT/config,v <-- config
+new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
+done
+${PROG} [a-z]*: 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 ${TESTDIR}/cvsroot/top-dir added to the repository
+Directory ${TESTDIR}/cvsroot/second-dir added to the repository"
+ cd top-dir
+
+ touch file1
+ dotest toplevel2-3 "${testcvs} add file1" \
+"${PROG} [a-z]*: scheduling file .file1. for addition
+${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ dotest toplevel2-4 "${testcvs} -q ci -m add" \
+"RCS file: ${TESTDIR}/cvsroot/top-dir/file1,v
+done
+Checking in file1;
+${TESTDIR}/cvsroot/top-dir/file1,v <-- file1
+initial revision: 1\.1
+done"
+ cd ..
+
+ cd second-dir
+ touch file2
+ dotest toplevel2-3s "${testcvs} add file2" \
+"${PROG} [a-z]*: scheduling file .file2. for addition
+${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ dotest toplevel2-4s "${testcvs} -q ci -m add" \
+"RCS file: ${TESTDIR}/cvsroot/second-dir/file2,v
+done
+Checking in file2;
+${TESTDIR}/cvsroot/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} [a-z]*: Updating top-dir
+U top-dir/file1"
+
+ dotest toplevel2-6 "${testcvs} update top-dir" \
+"${PROG} [a-z]*: Updating top-dir"
+ dotest toplevel2-7 "${testcvs} update" \
+"${PROG} [a-z]*: Updating top-dir"
+
+ dotest toplevel2-8 "${testcvs} update -d top-dir" \
+"${PROG} [a-z]*: Updating top-dir"
+ # Contrast this with toplevel-9, which has TopLevelAdmin=yes.
+ dotest toplevel2-9 "${testcvs} update -d" \
+"${PROG} [a-z]*: Updating top-dir"
+
cd ..
+ rm -r 1; mkdir 1; cd 1
+ dotest toplevel2-10 "${testcvs} co top-dir" \
+"${PROG} [a-z]*: 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;
+${TESTDIR}/cvsroot/CVSROOT/config,v <-- config
+new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
+done
+${PROG} [a-z]*: Rebuilding administrative file database"
+ cd ../..
rm -r 1
rm -rf ${CVSROOT_DIRNAME}/top-dir ${CVSROOT_DIRNAME}/second-dir
;;
@@ -7894,7 +8388,7 @@ ${PROG} [a-z]*: Updating top-dir"
cat >${TESTDIR}/editme <<EOF
#!${TESTSHELL}
sleep 1
-sed <\$1 -e 's/^/x&/g' >${TESTDIR}/edit.new
+sed <\$1 -e 's/^/x/' >${TESTDIR}/edit.new
mv ${TESTDIR}/edit.new \$1
exit 0
EOF
@@ -8619,9 +9113,20 @@ Enew line here
G@#..!@#=&"
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} \[[a-z]* 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
+ rm -rf 1 2
rm -rf ${CVSROOT_DIRNAME}/first-dir
;;
@@ -8716,6 +9221,106 @@ C file1"
rm -rf ${CVSROOT_DIRNAME}/first-dir
;;
+ 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.
+ if echo "yes" | ${testcvs} -Q unedit $file \
+ >${TESTDIR}/test.tmp 2>&1 ; then
+ dotest unedit-without-baserev-4 "cat ${TESTDIR}/test.tmp" \
+"m has been modified; revert changes${QUESTION} ${PROG} unedit: m not mentioned in CVS/Baserev
+${PROG} unedit: run update to complete the unedit"
+ else
+ fail unedit-without-baserev-4
+ fi
+
+ # 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/.*"
+
+ if test "$remote" = yes; then
+ dotest unedit-without-baserev-6 "${testcvs} -q update" "U m"
+ else
+ dotest unedit-without-baserev-6 "${testcvs} -q update" \
+"${PROG} update: warning: m was lost
+U m"
+ fi
+
+ # 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;
+${TESTDIR}/cvsroot/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: ${TESTDIR}/cvsroot/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} [a-z]*: conflicts found in m
+C m"
+ rm CVS/Baserev
+ if (echo yes | ${testcvs} unedit m) >${TESTDIR}/test.tmp 2>&1; then
+ dotest unedit-without-baserev-14 "cat ${TESTDIR}/test.tmp" \
+"m has been modified; revert changes${QUESTION} ${PROG} unedit: m not mentioned in CVS/Baserev
+${PROG} unedit: run update to complete the unedit"
+ else
+ fail unedit-without-baserev-14
+ fi
+ if test "$remote" = yes; then
+ dotest unedit-without-baserev-15 "${testcvs} -q update" "U m"
+ else
+ dotest unedit-without-baserev-15 "${testcvs} -q update" \
+"${PROG} update: warning: m was lost
+U m"
+ fi
+ # 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.
@@ -9876,6 +10481,7 @@ ${PROG} [a-z]*: Rebuilding administrative file database"
# cvsignore: ignore
# verifymsg: info
# cvswrappers: mwrap
+ # taginfo: taginfo
# config: config
# On Windows, we can't check out CVSROOT, because the case
@@ -10009,6 +10615,9 @@ done
${PROG} [a-z]*: Rebuilding administrative file database"
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
@@ -10024,6 +10633,112 @@ ${PROG} [a-z]*: Rebuilding administrative file database"
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
+ # -d
+ # rtag
+
+ 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
+ chmod +x ${TESTDIR}/1/loggit
+ echo "ALL ${TESTDIR}/1/loggit" >taginfo
+ dotest taginfo-2 "${testcvs} -q ci -m check-in-taginfo" \
+"Checking in taginfo;
+${TESTDIR}/cvsroot/CVSROOT/taginfo,v <-- taginfo
+new revision: 1\.2; previous revision: 1\.1
+done
+${PROG} [a-z]*: 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} [a-z]*: scheduling file .file1. for addition
+${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ dotest taginfo-5 "${testcvs} -q ci -m add-it" \
+"RCS file: ${TESTDIR}/cvsroot/first-dir/file1,v
+done
+Checking in file1;
+${TESTDIR}/cvsroot/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" ""
+ echo add text on branch >>file1
+ dotest taginfo-9 "${testcvs} -q ci -m modify-on-br" \
+"Checking in file1;
+${TESTDIR}/cvsroot/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} [a-z]*: Pre-tag check failed
+${PROG} \[[a-z]* 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"
+
+ # 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 ${TESTDIR}/cvsroot/first-dir file1 1.1
+br add ${TESTDIR}/cvsroot/first-dir file1 1.1
+brtag mov ${TESTDIR}/cvsroot/first-dir file1 1.1.2.1"
+
+ cd ..
+ cd CVSROOT
+ echo '# Keep life simple' > taginfo
+ dotest taginfo-cleanup-1 "${testcvs} -q ci -m check-in-taginfo" \
+"Checking in taginfo;
+${TESTDIR}/cvsroot/CVSROOT/taginfo,v <-- taginfo
+new revision: 1\.3; previous revision: 1\.2
+done
+${PROG} [a-z]*: 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.
@@ -10036,10 +10751,12 @@ ${PROG} [a-z]*: Rebuilding administrative file database"
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;
${TESTDIR}/cvsroot/CVSROOT/config,v <-- config
-new revision: 1\.2; previous revision: 1\.1
+new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
done
${PROG} [a-z]*: Rebuilding administrative file database"
echo 'BogusOption=yes' >config
@@ -10047,7 +10764,7 @@ ${PROG} [a-z]*: Rebuilding administrative file database"
"${PROG} [a-z]*: syntax error in ${TESTDIR}/cvsroot/CVSROOT/config: line 'bogus line' is missing '='
Checking in config;
${TESTDIR}/cvsroot/CVSROOT/config,v <-- config
-new revision: 1\.3; previous revision: 1\.2
+new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
done
${PROG} [a-z]*: Rebuilding administrative file database"
echo '# No config is a good config' > config
@@ -10055,7 +10772,7 @@ ${PROG} [a-z]*: Rebuilding administrative file database"
"${PROG} [a-z]*: ${TESTDIR}/cvsroot/CVSROOT/config: unrecognized keyword 'BogusOption'
Checking in config;
${TESTDIR}/cvsroot/CVSROOT/config,v <-- config
-new revision: 1\.4; previous revision: 1\.3
+new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
done
${PROG} [a-z]*: Rebuilding administrative file database"
dotest config-6 "${testcvs} -q update" ''
@@ -10105,7 +10822,7 @@ done"
# Remove the tag. This will leave the tag string in the
# expansion of the Name keyword.
- dotest serverpatch-6 "${testcvs} -q update -A" ''
+ dotest serverpatch-6 "${testcvs} -q update -A first-dir" ''
# Modify and check in the first copy.
cd ../1/first-dir
@@ -10520,7 +11237,9 @@ date: [0-9/]* [0-9:]*; author: ${username}; state: Exp;
;;
ann)
- # Tests of "cvs annotate". See also basica-10.
+ # Tests of "cvs annotate". See also:
+ # basica-10 A simple annotate test
+ # rcs Annotate and the year 2000
mkdir 1; cd 1
dotest ann-1 "${testcvs} -q co -l ." ''
mkdir first-dir
@@ -10626,12 +11345,77 @@ done"
1\.2 (${username} *[0-9a-zA-Z-]*): line
1\.2\.2\.1 (${username} *[0-9a-zA-Z-]*): and some
1\.2\.2\.1 (${username} *[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 (${username} *[0-9a-zA-Z-]*): this
+1\.1 (${username} *[0-9a-zA-Z-]*): is
+1\.2 (${username} *[0-9a-zA-Z-]*): a
+1\.1 (${username} *[0-9a-zA-Z-]*): file
+1\.2 (${username} *[0-9a-zA-Z-]*):
+1\.2 (${username} *[0-9a-zA-Z-]*): with
+1\.2 (${username} *[0-9a-zA-Z-]*): a
+1\.2 (${username} *[0-9a-zA-Z-]*): blank
+1\.2 (${username} *[0-9a-zA-Z-]*): line
+1\.2\.2\.1 (${username} *[0-9a-zA-Z-]*): and some
+1\.2\.2\.1 (${username} *[0-9a-zA-Z-]*): branched content"
+ dotest_fail ann-14 "${testcvs} ann -r bill-clintons-chastity file1" \
+"${PROG} \[[a-z]* aborted\]: no such tag bill-clintons-chastity"
cd ../..
rm -r 1
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 ${TESTDIR}/cvsroot/$module added to the repository"
+ cd $module
+
+ file=m
+ echo '$Id''$' > $file
+
+ dotest ann-id-3 "$testcvs add $file" \
+"${PROG} [a-z]*: scheduling file .$file. for addition
+${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ dotest ann-id-4 "$testcvs -Q ci -m . $file" \
+"RCS file: ${TESTDIR}/cvsroot/$module/$file,v
+done
+Checking in $file;
+${TESTDIR}/cvsroot/$module/$file,v <-- $file
+initial revision: 1\.1
+done"
+
+ echo line2 >> $file
+ dotest ann-id-5 "$testcvs -Q ci -m . $file" \
+"Checking in $file;
+${TESTDIR}/cvsroot/$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 ($username *[0-9a-zA-Z-]*): "'\$'"Id: $file,v 1.1 [0-9/]* [0-9:]* $username Exp "'\$'"
+1.2 ($username *[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.
@@ -10673,7 +11457,7 @@ ${testcvs} -d ${TESTDIR}/crerepos release -d CVSROOT >>${LOGFILE}; then
else
fail crerepos-5
fi
- rm -r CVS
+ rm -rf CVS
cd ..
# The directory tmp should be empty
dotest crerepos-6 "rmdir tmp" ''
@@ -10777,7 +11561,7 @@ U first-dir/file1"
"${PROG} [a-z]*: Updating crerepos-dir
U crerepos-dir/cfile"
- if test x`cat CVS/Repository` = x.; then
+ if test x`cat crerepos-dir/CVS/Repository` = xcrerepos-dir; then
# RELATIVE_REPOS
# Fatal error so that we don't go traipsing through the
# directories which happen to have the same names from the
@@ -10984,8 +11768,33 @@ add file1
fail rcs-4
fi
+ # 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.
+ # 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;
@@ -11018,6 +11827,8 @@ start revision@
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"
@@ -11160,10 +11971,6 @@ a1 1
next branch revision
@"
- # For remote, the "update -p -D" usage seems not to work.
- # I'm not sure what is going on.
- if test "x$remote" = "xno"; then
-
if ${testcvs} -q update -p -D '1970-12-31 11:30 UT' file2 \
>${TESTDIR}/rcs4.tmp
then
@@ -11206,8 +12013,6 @@ next branch revision
fail rcs-13
fi
- fi # end of tests skipped for remote
-
# OK, now make sure cvs log doesn't have any trouble with the
# newphrases and such.
dotest rcs-14 "${testcvs} -q log file2" "
@@ -11258,6 +12063,145 @@ date: 1971/01/01 08:00:05; author: joe; state: Exp; lines: ${PLUS}1 -1
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
+ if ${testcvs} -q update -p -D '1999-09-09 11:30 UT' file1 \
+ >${TESTDIR}/rcs4.tmp
+ then
+ dotest rcs2-2 "cat ${TESTDIR}/rcs4.tmp" \
+"Tonight we're going to party like it's a certain year"
+ else
+ fail rcs2-2
+ fi
+ # 1 Jan 2001.
+ if ${testcvs} -q update -p -D '2001-01-01 11:30 UT' file1 \
+ >${TESTDIR}/rcs4.tmp
+ then
+ dotest rcs2-3 "cat ${TESTDIR}/rcs4.tmp" \
+"two year hiatus"
+ else
+ fail rcs2-3
+ fi
+ # 29 Feb 2000
+ if ${testcvs} -q update -p -D '2000-02-29 11:30 UT' file1 \
+ >${TESTDIR}/rcs4.tmp
+ then
+ dotest rcs2-4 "cat ${TESTDIR}/rcs4.tmp" \
+"2000 is also a good year for leaping"
+ else
+ fail rcs2-4
+ fi
+ # 29 Feb 2003 is invalid
+ if ${testcvs} -q update -p -D '2003-02-29 11:30 UT' file1 \
+ >${TESTDIR}/rcs4.tmp 2>&1
+ then
+ fail rcs2-5
+ else
+ dotest rcs2-5 "cat ${TESTDIR}/rcs4.tmp" \
+"${PROG} \[[a-z]* aborted\]: Can't parse date/time: 2003-02-29 11:30 UT"
+ fi
+ rm ${TESTDIR}/rcs4.tmp
+
+ cd ..
+ rm -r first-dir
+ rm -rf ${CVSROOT_DIRNAME}/first-dir
+ ;;
+
+ 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
+M339cafae|nk|<remote>|ccvs/src|1.229|sanity.sh
+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 06/04 19:48 ${PLUS}0000 anonymous ccvs =ccvs= <remote>/\*
+W 06/17 19:51 ${PLUS}0000 anonymous Makefile\.in ccvs/emx == <remote>/emx
+M 06/10 21:12 ${PLUS}0000 kingdon 1\.231 sanity\.sh ccvs/src == ~/work/ccvs/src
+C 06/10 11:51 ${PLUS}0000 kingdon 1\.3 README ccvs/emx == <remote>
+M 06/10 17:33 ${PLUS}0000 kingdon 1\.281 cvs\.texinfo ccvs/doc == ~/work/ccvs/doc
+M 06/10 01:36 ${PLUS}0000 nk 1\.229 sanity\.sh ccvs/src == <remote>"
+ if ${testcvs} history -e -a -D '10 Jun 1997 13:00 UT' \
+ >${TESTDIR}/output.tmp
+ then
+ dotest history-2 "cat ${TESTDIR}/output.tmp" \
+"W 06/17 19:51 ${PLUS}0000 anonymous Makefile\.in ccvs/emx == <remote>/emx
+M 06/10 21:12 ${PLUS}0000 kingdon 1\.231 sanity\.sh ccvs/src == ~/work/ccvs/src
+C 06/10 11:51 ${PLUS}0000 kingdon 1\.3 README ccvs/emx == <remote>
+M 06/10 17:33 ${PLUS}0000 kingdon 1\.281 cvs\.texinfo ccvs/doc == ~/work/ccvs/doc"
+ else
+ fail history-2
+ fi
+ if ${testcvs} history -e -a -D '10 Jun 2001 13:00 UT' \
+ >${TESTDIR}/output.tmp
+ then
+ # For reasons that are completely unclear to me, the number
+ # of spaces betwen "kingdon" and "1.281" is different than
+ # for the other tests.
+ dotest history-3 "cat ${TESTDIR}/output.tmp" \
+"M 06/10 17:33 ${PLUS}0000 kingdon 1\.281 cvs\.texinfo ccvs/doc == ~/work/ccvs/doc"
+ else
+ fail history-3
+ fi
+ rm ${TESTDIR}/output.tmp
+ ;;
+
big)
# Test ability to operate on big files. Intention is to
@@ -11441,6 +12385,52 @@ done"
# 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 ${TESTDIR}/cvsroot/first-dir added to the repository"
+ cd first-dir
+ touch aa
+ dotest modes2-3 "${testcvs} add aa" \
+"${PROG} [a-z]*: scheduling file .aa. for addition
+${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ dotest modes2-4 "${testcvs} -q ci -m add" \
+"RCS file: ${TESTDIR}/cvsroot/first-dir/aa,v
+done
+Checking in aa;
+${TESTDIR}/cvsroot/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;
+${TESTDIR}/cvsroot/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
+ 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"
+
+ chmod u+rwx aa
+ cd ../..
+ rm -r 1
+ rm -rf ${CVSROOT_DIRNAME}/first-dir
+ ;;
+
stamps)
# Test timestamps.
mkdir 1; cd 1
@@ -11581,6 +12571,202 @@ done"
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 ${TESTDIR}/cvsroot/first-dir added to the repository"
+ cd first-dir
+
+ touch foo
+ chmod 431 foo
+ dotest perms-3 "${testcvs} add foo" \
+"${PROG} [a-z]*: scheduling file .foo. for addition
+${PROG} [a-z]*: 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;
+${TESTDIR}/cvsroot/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 test "$remote" = no; then
+ # 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 ${TESTDIR}/cvsroot/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} [a-z]*: scheduling file .slink. for addition
+${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ if test "$remote" = yes; then
+ # Remote doesn't implement PreservePermissions, and in its
+ # absence the correct behavior is to follow the symlink.
+ dotest_fail symlinks-4 "${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;
+${TESTDIR}/cvsroot/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
+ ;;
+
+ 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 ${TESTDIR}/cvsroot/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} [a-z]*: scheduling file .aaaa. for addition
+${PROG} [a-z]*: scheduling file .b\.b\.b\.b. for addition
+${PROG} [a-z]*: scheduling file .dd dd dd. for addition
+${PROG} [a-z]*: 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;
+${TESTDIR}/cvsroot/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;
+${TESTDIR}/cvsroot/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;
+${TESTDIR}/cvsroot/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 test "$remote" = yes; then
+ # Remote does not implement PreservePermissions.
+ 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
+ dotest hardlinks-6 "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
@@ -12131,24 +13317,11 @@ add a line on trunk after trunktag"
"imported contents
add a line on trunk
add a line on trunk after trunktag"
- # But diff thinks that HEAD is "brtag". Case (c) from
- # cvs.texinfo (the "strange, maybe accidental" case).
- dotest_fail head-brtag-diff "${testcvs} -q diff -c -r HEAD -r br1" \
-"Index: file1
-===================================================================
-RCS file: ${TESTDIR}/cvsroot/first-dir/file1,v
-retrieving revision 1\.3\.2\.1
-retrieving revision 1\.3\.2\.2
-diff -c -r1\.3\.2\.1 -r1\.3\.2\.2
-\*\*\* file1 [0-9/]* [0-9:]* 1\.3\.2\.1
---- file1 [0-9/]* [0-9:]* 1\.3\.2\.2
-\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
-\*\*\* 2,4 \*\*\*\*
---- 2,5 ----
- add a line on trunk
- add a line on trunk after trunktag
- modify on branch
-${PLUS} modify on branch after brtag"
+
+ # 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.
@@ -12160,24 +13333,23 @@ add a line on trunk"
"imported contents
add a line on trunk
add a line on trunk after trunktag"
- # Like head-brtag-diff, HEAD is the sticky tag. Similarly
- # questionable.
+ # 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: ${TESTDIR}/cvsroot/first-dir/file1,v
-retrieving revision 1\.2
+retrieving revision 1\.3
retrieving revision 1\.3\.2\.2
-diff -c -r1\.2 -r1\.3\.2\.2
-\*\*\* file1 [0-9/]* [0-9:]* 1\.2
+diff -c -r1\.3 -r1\.3\.2\.2
+\*\*\* file1 [0-9/]* [0-9:]* 1\.3
--- file1 [0-9/]* [0-9:]* 1\.3\.2\.2
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
-\*\*\* 1,2 \*\*\*\*
+\*\*\* 1,3 \*\*\*\*
--- 1,5 ----
imported contents
add a line on trunk
-${PLUS} add a line on trunk after trunktag
+ add a line on trunk after trunktag
${PLUS} modify on branch
${PLUS} modify on branch after brtag"
@@ -12390,6 +13562,91 @@ done"
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} [a-z]*: scheduling file .$file. for addition
+${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ dotest tag8k-4 "$testcvs -Q ci -m . $file" \
+"RCS file: ${TESTDIR}/cvsroot/$module/$file,v
+done
+Checking in $file;
+${TESTDIR}/cvsroot/$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;
+${TESTDIR}/cvsroot/$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" ''
+
+ # Determine the length of the author value.
+ name=`sed -n 's/.*; author \([^;]*\);.*/\1/p' ${TESTDIR}/cvsroot/$module/$file,v|head -1`
+ name_len=`expr length $name`
+
+ # CAREFUL: this will lose if $name is longer than 16.
+ # Then, form a string of length 16 - $name_len.
+ add_len=`expr 16 - $name_len`
+ suffix=`expr substr 1234567890123456 1 $add_len`
+
+ # 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;
+${TESTDIR}/cvsroot/$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.
@@ -12401,6 +13658,7 @@ done"
# 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)
@@ -12996,6 +14254,192 @@ text
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: ${TESTDIR}/cvsroot/first-dir/file2,v
+done"
+
+ # br1 should be a branch
+ #
+ dotest admin-26-2 "${testcvs} admin -nbr1:br file2" \
+"RCS file: ${TESTDIR}/cvsroot/first-dir/file2,v
+done"
+
+ # Attach some tags using RCS versions
+ #
+ dotest admin-26-3 "${testcvs} admin -ntagthree:1.1 file2" \
+"RCS file: ${TESTDIR}/cvsroot/first-dir/file2,v
+done"
+
+ dotest admin-26-4 "${testcvs} admin -nbr2:1.1.2 file2" \
+"RCS file: ${TESTDIR}/cvsroot/first-dir/file2,v
+done"
+
+ dotest admin-26-5 "${testcvs} admin -nbr4:1.1.0.2 file2" \
+"RCS file: ${TESTDIR}/cvsroot/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 ${TESTDIR}/cvsroot/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;
+${TESTDIR}/cvsroot/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;
+${TESTDIR}/cvsroot/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: ${TESTDIR}/cvsroot/first-dir/file2,v
+done"
+
+ dotest_fail admin-27-4 "${testcvs} admin -ntagfour:1.3 file2" \
+"RCS file: ${TESTDIR}/cvsroot/first-dir/file2,v
+${PROG} [a-z]*: ${TESTDIR}/cvsroot/first-dir/file2,v: symbolic name tagfour already bound to 1\.1
+${PROG} [a-z]*: cannot modify RCS file for .file2."
+
+ # Succeed at reattaching existing tag, using -N
+ #
+ dotest admin-27-5 "${testcvs} admin -Ntagfour:1.3 file2" \
+"RCS file: ${TESTDIR}/cvsroot/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: ${TESTDIR}/cvsroot/first-dir/file2,v
+${PROG} \[[a-z]* aborted\]: tag .tagfive. does not exist"
+
+ # Try a some nonexisting numeric target tags
+ #
+ dotest_fail admin-28-2 "${testcvs} admin -ntagseven:2.1 file2" \
+"RCS file: ${TESTDIR}/cvsroot/first-dir/file2,v
+${PROG} \[[a-z]* aborted\]: revision .2\.1. does not exist"
+
+ dotest_fail admin-28-3 "${testcvs} admin -ntageight:2.1.2 file2" \
+"RCS file: ${TESTDIR}/cvsroot/first-dir/file2,v
+${PROG} \[[a-z]* 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: ${TESTDIR}/cvsroot/first-dir/file2,v
+${PROG} \[[a-z]* aborted\]: tag .1\.a\.2. must start with a letter"
+
+ dotest_fail admin-28-5 "${testcvs} admin -ntagten:BO+GUS file2" \
+"RCS file: ${TESTDIR}/cvsroot/first-dir/file2,v
+${PROG} \[[a-z]* aborted\]: tag .BO${PLUS}GUS. does not exist"
+
+ dotest_fail admin-28-6 "${testcvs} admin -nq.werty:tagfour file2" \
+"RCS file: ${TESTDIR}/cvsroot/first-dir/file2,v
+${PROG} \[[a-z]* aborted\]: tag .q\.werty. must not contain the characters ..*"
+
+ # Verify the archive
+ #
+ dotest admin-29 "cat ${TESTDIR}/cvsroot/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
+@"
+
cd ../..
rm -r 1
rm -rf ${CVSROOT_DIRNAME}/first-dir
@@ -13141,6 +14585,11 @@ ${PROG} [a-z]*: Rebuilding administrative file database"
"fred has file a-lock locked for version 1\.1
${PROG} [a-z]*: Pre-commit check failed
${PROG} \[[a-z]* 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: ${TESTDIR}/cvsroot/first-dir/a-lock,v
+${PROG} \[[a-z]* aborted\]: Revision 1\.1 is already locked by fred"
dotest reserved-14 "${testcvs} admin -u1.1 a-lock" \
"RCS file: ${TESTDIR}/cvsroot/first-dir/a-lock,v
@@ -13152,10 +14601,25 @@ ${TESTDIR}/cvsroot/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;/' ${TESTDIR}/cvsroot/first-dir/a-lock,v > a-lock,v
+ chmod 644 ${TESTDIR}/cvsroot/first-dir/a-lock,v
+ dotest reserved-16 \
+"mv a-lock,v ${TESTDIR}/cvsroot/first-dir/a-lock,v" ""
+ chmod 444 ${TESTDIR}/cvsroot/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" ""
+ echo edit it >>a-lock
+ dotest reserved-19 "${testcvs} -q ci -m modify a-lock" \
+"Checking in a-lock;
+${TESTDIR}/cvsroot/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-16 "${testcvs} -q ci -m back commitinfo" \
+ dotest reserved-cleanup-1 "${testcvs} -q ci -m back commitinfo" \
"Checking in commitinfo;
${TESTDIR}/cvsroot/CVSROOT/commitinfo,v <-- commitinfo
new revision: 1\.3; previous revision: 1\.2
diff --git a/contrib/cvs/src/status.c b/contrib/cvs/src/status.c
index 98be085..541a969 100644
--- a/contrib/cvs/src/status.c
+++ b/contrib/cvs/src/status.c
@@ -31,7 +31,7 @@ static const char *const status_usage[] =
};
int
-status (argc, argv)
+cvsstatus (argc, argv)
int argc;
char **argv;
{
diff --git a/contrib/cvs/src/tag.c b/contrib/cvs/src/tag.c
index a97da5c..a5b8794 100644
--- a/contrib/cvs/src/tag.c
+++ b/contrib/cvs/src/tag.c
@@ -275,8 +275,17 @@ check_fileproc (callerdat, finfo)
error (0, 0, "nothing known about %s", finfo->file);
return (1);
}
- p->data = RCS_getversion(vers->srcfile, numtag, date, force_tag_match,
- (int *) NULL);
+
+ /* Here we duplicate the calculation in tag_fileproc about which
+ version we are going to tag. There probably are some subtle races
+ (e.g. numtag is "foo" which gets moved between here and
+ tag_fileproc). */
+ if (numtag == NULL && date == NULL)
+ p->data = xstrdup (vers->vn_user);
+ else
+ p->data = RCS_getversion (vers->srcfile, numtag, date,
+ force_tag_match, NULL);
+
if (p->data != NULL)
{
int addit = 1;
@@ -377,7 +386,7 @@ pretag_proc(repository, filter)
run_arg (delete_flag ? "del" : force_tag_move ? "mov" : "add");
run_arg (repository);
walklist(tlist, pretag_list_proc, NULL);
- return (run_exec(RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL|RUN_REALLY));
+ return (run_exec (RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL));
}
static void
diff --git a/contrib/cvs/src/version.c b/contrib/cvs/src/version.c
index f386895..479e5e6 100644
--- a/contrib/cvs/src/version.c
+++ b/contrib/cvs/src/version.c
@@ -12,7 +12,8 @@
#include "cvs.h"
-char *version_string = "\nConcurrent Versions System (CVS) 1.9.26";
+/* NOTE: remember to remove `Halibut' when patching this code. */
+char *version_string = "\nConcurrent Versions System (CVS) 1.10 `Halibut'";
#ifdef CLIENT_SUPPORT
#ifdef SERVER_SUPPORT
diff --git a/contrib/cvs/src/wrapper.c b/contrib/cvs/src/wrapper.c
index 645ce5c..e7c540d 100644
--- a/contrib/cvs/src/wrapper.c
+++ b/contrib/cvs/src/wrapper.c
@@ -395,6 +395,11 @@ wrap_add (line, isTemp)
*line='\0';
switch(opt){
case 'f':
+ /* Before this is reenabled, need to address the problem in
+ commit.c (see http://www.cyclic.com/cvs/dev-wrap.txt). */
+ error (1, 0,
+ "-t/-f wrappers not supported by this version of CVS");
+
if(e.fromcvsFilter)
free(e.fromcvsFilter);
/* FIXME: error message should say where the bad value
@@ -404,6 +409,11 @@ wrap_add (line, isTemp)
error (1, 0, "Correct above errors first");
break;
case 't':
+ /* Before this is reenabled, need to address the problem in
+ commit.c (see http://www.cyclic.com/cvs/dev-wrap.txt). */
+ error (1, 0,
+ "-t/-f wrappers not supported by this version of CVS");
+
if(e.tocvsFilter)
free(e.tocvsFilter);
/* FIXME: error message should say where the bad value
OpenPOWER on IntegriCloud