Index: diff/ChangeLog
===================================================================
RCS file: e:/cvsroot/ccvs/diff/ChangeLog,v
retrieving revision 1.5
retrieving revision 1.2.2.5
diff -c -r1.5 -r1.2.2.5
*** diff/ChangeLog	1998/08/10 21:22:44	1.5
--- diff/ChangeLog	1998/08/10 22:07:07	1.2.2.5
***************
*** 12,17 ****
--- 12,22 ----
  	than printf_output callback.
  	* diff3.c (read_diff): Don't set my_callbacks.printf_output.
  
+ 1998-06-22  Murray Bishop  <mbishop@acnielsen.com.au>
+ 
+ 	* diff3.c (diff3_run): disconnect stdin from infile after
+ 	output_diff3_merge.
+ 
  Thu Jun 18 12:43:53 1998  Ian Lance Taylor  <ian@cygnus.com>
  
  	* diffrun.h: New file.
***************
*** 50,55 ****
--- 55,65 ----
  	* side.c: Likewise.
  	* Makefile.in (SOURCES): Add diffrun.h.
  	($(OBJECTS)): Depend upon diffrun.h.
+ 
+ Fri May 29 13:30:00 1998  Murray Bishop  <mbishop@acnielsen.com.au>
+ 
+ 	* diff.c (compare_files) [__EMX__]: Cope with "nul" file under 
+ 	OS/2 EMX using the hack from emx port of gnu diffutils.
  
  Fri Jan 16 14:58:19 1998  Larry Jones  <larry.jones@sdrc.com>
  
Index: diff/diff.c
===================================================================
RCS file: e:/cvsroot/ccvs/diff/diff.c,v
retrieving revision 1.3
retrieving revision 1.2.2.2
diff -c -r1.3 -r1.2.2.2
*** diff/diff.c	1998/06/23 15:31:06	1.3
--- diff/diff.c	1998/06/23 21:04:36	1.2.2.2
***************
*** 1011,1016 ****
--- 1011,1032 ----
  	  else
  	    stat_result = stat (inf[i].name, &inf[i].stat);
  
+ 	  /* EMX bug - we can't stat("nul",&sb),
+ 	   * (but can fd = open("nul",...), fstat(fd,&sb)
+ 	   * - but that doesn't really help us pass death2-diff-2 in sanity.sh
+ 	   * The kludge below is from the emx port of GNU diffutils
+ 	   */
+ #ifdef __EMX__
+          /* HACK: Treat 'nul' as a nonexistent file. */
+          if (stat_result != 0 && errno == EINVAL
+ 	  && stricmp (inf[i].name, "nul") == 0)
+ 	    {
+              stat_result = 0;
+              inf[i].desc = -1;
+ 	    }
+ #endif /*__EMX__*/
+ 
+ 
  	  if (stat_result != 0)
  	    {
  	      perror_with_name (inf[i].name);
Index: diff/diff3.c
===================================================================
RCS file: e:/cvsroot/ccvs/diff/diff3.c,v
retrieving revision 1.4
retrieving revision 1.2.2.3
diff -c -r1.4 -r1.2.2.3
*** diff/diff3.c	1998/07/13 15:24:47	1.4
--- diff/diff3.c	1998/07/16 00:03:40	1.2.2.3
***************
*** 459,464 ****
--- 459,475 ----
  			       tag_strings[0], tag_strings[1], tag_strings[2]);
    else if (merge)
      {
+       /* On Windows-NT 4.0 Service Pack 3, Novell Intranetware Client 4.11a,
+ 	Microsoft Visual C++ 4.2,
+ 	not disconnecting stdin from the disk file causes failure to
+ 	open( , O_CREAT | O_TRUNC ...) windows-NT/filesubr.c(copy_file)
+ 	in sanity.sh test conflicts-130.
+ 	(there is no problem with tests on local NTFS disk)
+ 	
+ 	work around by using dup */
+ 
+       int stdin_save = dup(0);
+ 
        if (! freopen (file[rev_mapping[FILE0]], "r", stdin))
  	diff3_perror_with_exit (file[rev_mapping[FILE0]]);
        conflicts_found
***************
*** 466,471 ****
--- 477,489 ----
  			      tag_strings[0], tag_strings[1], tag_strings[2]);
        if (ferror (stdin))
  	diff3_fatal ("read error");
+ 
+       /* close file[rev_mapping[FILE0]], re-connect stdin to where it was
+ 	before freopen. */
+       dup2( stdin_save, 0 );
+ 
+       /* give handle back to os */
+       close( stdin_save );
      }
    else
      {
Index: lib/ChangeLog
===================================================================
RCS file: e:/cvsroot/ccvs/lib/ChangeLog,v
retrieving revision 1.5
retrieving revision 1.5.2.3
diff -c -r1.5 -r1.5.2.3
*** lib/ChangeLog	1998/05/31 01:12:22	1.5
--- lib/ChangeLog	1998/07/16 00:05:08	1.5.2.3
***************
*** 1,6 ****
--- 1,24 ----
+ 1998-05-31  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* system.h: Added the CVS_CHMOD macro to allow for platform-
+ 	specific behaviour.
+ 
+ 1998-05-27  Murray Bishop  <mbishop@acnielsen.com.au>
+ 
+ 	* getdate.y (get_date): Use (Start == -1) rather than (Start < 0)
+ 	so that Convert failures are detected when time_t is unsigned
+ 	(as it is on EMX gcc port).
+ 
  Tue Mar 24 16:08:00 1998  Ian Lance Taylor  <ian@cygnus.com>
  
  	* Makefile.in (CFLAGS): Set to @CFLAGS@, not -g.
+ 
+ 1998-05-19  Murray Bishop <mbishop@acnielsen.com.au>
+ 
+ 	Murray Bishop applies the Andreas Huber <ahuber.ping.at>
+ 	patches for cvs-1.9.27
+ 	
+ 	* system.h (CVS_CHMOD): Define as chmod if undefined.
  
  1998-02-20  Jim Kingdon  <kingdon@harvey.cyclic.com>
  
Index: lib/getdate.c
===================================================================
RCS file: e:/cvsroot/ccvs/lib/getdate.c,v
retrieving revision 1.1
diff -c -r1.1 getdate.c
*** lib/getdate.c	1998/05/31 00:45:18	1.1
--- lib/getdate.c	1998/06/23 21:04:58
***************
*** 991,997 ****
      if (yyHaveDate || yyHaveTime || yyHaveDay) {
  	Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
  		    yyMeridian, yyDSTmode);
! 	if (Start < 0)
  	    return -1;
      }
      else {
--- 991,997 ----
      if (yyHaveDate || yyHaveTime || yyHaveDay) {
  	Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
  		    yyMeridian, yyDSTmode);
! 	if (Start == -1)
  	    return -1;
      }
      else {
Index: lib/getdate.y
===================================================================
RCS file: e:/cvsroot/ccvs/lib/getdate.y,v
retrieving revision 1.1
diff -c -r1.1 getdate.y
*** lib/getdate.y	1998/05/31 00:45:18	1.1
--- lib/getdate.y	1998/06/23 21:04:00
***************
*** 977,983 ****
      if (yyHaveDate || yyHaveTime || yyHaveDay) {
  	Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
  		    yyMeridian, yyDSTmode);
! 	if (Start < 0)
  	    return -1;
      }
      else {
--- 977,983 ----
      if (yyHaveDate || yyHaveTime || yyHaveDay) {
  	Start = Convert(yyMonth, yyDay, yyYear, yyHour, yyMinutes, yySeconds,
  		    yyMeridian, yyDSTmode);
! 	if (Start == -1)
  	    return -1;
      }
      else {
Index: lib/system.h
===================================================================
RCS file: e:/cvsroot/ccvs/lib/system.h,v
retrieving revision 1.4
retrieving revision 1.4.2.1
diff -c -r1.4 -r1.4.2.1
*** lib/system.h	1998/05/31 01:07:33	1.4
--- lib/system.h	1998/05/31 02:10:12	1.4.2.1
***************
*** 469,474 ****
--- 469,478 ----
  #define CVS_FNMATCH fnmatch
  #endif
  
+ #ifndef CVS_CHMOD
+ #define CVS_CHMOD chmod
+ #endif
+ 
  #if defined (__CYGWIN32__) || defined (WIN32)
  
  /* Under Windows NT, filenames are case-insensitive, and both / and \
Index: src/ChangeLog
===================================================================
RCS file: e:/cvsroot/ccvs/src/ChangeLog,v
retrieving revision 1.15
retrieving revision 1.5.2.21.2.1
diff -c -r1.15 -r1.5.2.21.2.1
*** src/ChangeLog	1998/08/13 21:08:04	1.15
--- src/ChangeLog	1998/08/15 11:03:17	1.5.2.21.2.1
***************
*** 1,3 ****
--- 1,8 ----
+ 1998-08-15  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* sanity.sh (rcslib): Don't run rcslib-symlink-* tests if
+ 	WONT_PRESERVE_PERMISSIONS is set.
+ 
  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'.
***************
*** 5,10 ****
--- 10,27 ----
  	* sanity.sh (rcslib): new tests to check behavior of symlinks in
   	the repository.
  
+ 1998-08-13  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* sanity.sh (unedit-without-baserev-5): Use ${DOTSTAR} to match
+ 	a second "D" line.
+ 
+ 1998-08-12  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* server.c (dirswitch):
+ 	Explicitly set dir_name to NULL so other functions
+ 	can determine wether we successfully changed the directory.
+ 	(server_write_entries) Don't write anything if dirswitch() failed.
+ 
  Wed Aug 12 15:39:38 1998  Noel Cragg  <noel@swish.red-bean.com>
  
  	* main.c (lookup_command_attribute): the `annotate' command
***************
*** 15,20 ****
--- 32,49 ----
  
  	* version.c: Change version number to 1.9.30.
  
+ 1998-08-10  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* client.c, client.h (client_process_import_file): In order for any
+ 	global -k option (not just -kb) to take precedence in
+ 	client/server mode, we need to pass it to the server.
+ 	Otherwise the results of specifying a -k option on the
+ 	command line would be inconsistent between client/server
+ 	and local mode.
+ 
+ 	* import.c (import_descend): Pass any global -k options to
+ 	client_process_import_file(), not just -kb.
+ 
  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
***************
*** 49,54 ****
--- 78,101 ----
  	* mkmodules.c: add comment about TopLevelAdmin for the initial
   	contents of CVSROOT/config.
  
+ 1998-08-01  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* server.c: Moved the definition of 'kopt' above receive_file.
+ 	(receive_file) Check kopt in case Entries is not yet available
+ 	(e.g. import) to see if the file needs to be opened in binary
+ 	mode. Corrected a minor style fauxpas.
+ 
+ 1998-07-31  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* sanity.sh:
+ 	Don't convert slashes to sloshes for CVS_SERVER. Instead,
+ 	require that rshd uses a unixy shell to run commands.
+ 
+ 	* sanity.sh:
+ 	Early detection of OS_COMPILER_EMU so we can add additional flags
+ 	to the rsh detection if required by the OS (OS/2 needs a -b).
+ 	CVS_SERVER needs slashes converted to sloshes on some OS's.
+ 
  1998-07-29  Jim Kingdon  <kingdon@harvey.cyclic.com>
  
  	* rcs.c (RCS_checkin): Only try to call xreadlink if HAVE_READLINK
***************
*** 61,66 ****
--- 108,123 ----
  	* rcs.c (RCS_checkin): add code to follow symbolic links in the
   	repository.
  
+ 1998-07-27  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* server.c (dirswitch): Check for an absolute path before trying to
+ 	create the directory. This is necessary for platforms, where
+ 	a path may contain a drive specification. It avoids a bogus
+ 	message for an error that is caught later in server_pathname_check().
+ 
+ 	* client.c (send_a_repository): Use isabsolute() to check update_dir
+ 	for an absolute path.
+ 
  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
***************
*** 128,133 ****
--- 185,212 ----
  	* 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-16  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* sanity.sh:
+ 	Applied Murray Bishop's <mbishop@acnielsen.com.au> patches.
+ 	(unedit_without_baserev-4, unedit_without_baserev-14)
+ 	Replaced "revert changes?" by "revert changes." to make the EMX port
+ 	of GNU expr from sh-utils 1.12 happy.
+ 	(unedit_without_baserev-5) Disabled the SunOS4.1.4 test
+ 	for CVS/Entries corruption.
+ 
+ 	* update.c  (do_update), client.c (get_reponses_and_close),
+ 	commit.c (commit):
+ 	Fixed a bug with code that was supposed to avoid time-stamp
+ 	races but didn't under specific circumstances.
+ 
+ 	* cvs.h: Applied Murray Bishop's <mbishop@acnielsen.com.au> patches.
+ 
+ 1998-07-15  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* update.c, sanity.sh, commit.c, cvs.h, client.c:
+ 	Applied Murray Bishop's <mbishop@acnielsen.com.au> patches.
+ 
  1998-07-14  Jim Kingdon  <kingdon@harvey.cyclic.com>
  
  	* tag.c (pretag_proc), rtag.c (pretag_proc): Don't pass RUN_REALLY
***************
*** 139,144 ****
--- 218,262 ----
  	happen.
  	* sanity.sh (taginfo): New tests taginfo-11 to taginfo-13, for this.
  
+ 1998-07-13  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* server.c (receive_file):
+ 	Shut up a warning about variables that might be used
+ 	uninitialized.
+ 
+ 1998-07-13  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* sanity.sh: Changed /tmp to ${TMPDIR}.
+ 	Changed argument parsing to accept drive specifications for
+ 	the CVS executable.
+ 	EDHACK_EDITOR is no longer necessary.
+ 	Added :local: to repository specifications.
+ 	(editor) Changed to sleep two seconds instead of one to avoid
+ 	time-stamp races on platforms where the time-stamp resolution
+ 	is two seconds.
+ 
+ 	* server.c (receive_file):
+ 	The server writes the files it receives from
+ 	the client to the temporary directory using the default binary
+ 	translation mode. While this works on *nix platforms, it certainly
+ 	doesn't on OS/2. 'Entries' is now searched for a -kb to determine
+ 	the proper translation mode before creating the file.
+ 	(server_updated) The server writes the files it is about to send to
+ 	the client to the temporary directory using the proper translation
+ 	mode (in RCS_checkout), but reads the file in binary mode. The file
+ 	is now read in the same mode it was written. finfo->rcs->expand is
+ 	examined to determine the proper translation mode.
+ 
+ 	* logmsg.c (logfile_write):
+ 	Changed the quoting character back to `'. Quoting
+ 	is now handled correctly by os2_popen().
+ 
+ 	* client.c (get_responses_and_close), commit.c (commit),
+ 	update.c (do_update):
+ 	Changed to sleep two seconds instead of one to avoid time-stamp
+ 	races. This is required for platforms where the time-stamp
+ 	resolution is two seconds (e.g. OS/2).
+ 
  1998-07-12  Jim Kingdon  <kingdon@harvey.cyclic.com>
  
  	* sanity.sh (ann-id): Write the test so that it tests for the
***************
*** 176,181 ****
--- 294,317 ----
  	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-07  Murray Bishop  <mbishop@acnielsen.com.au>
+ 
+ 	* sanity.sh: Make local mode mostly runnable on various platforms :
+ 	- Windows-NT with cygwin32 b19.1
+ 	- Windows-95 with MKS Toolkit
+ 	- OS/2 with EMX
+ 	(and test local mode on Linux too)
+ 	* cvs.h [FILESYSTEM_TICK]: Define as 1 (second) unless defined.
+ 
+ 1998-07-06  Murray Bishop  <mbishop@acnielsen.com.au>
+ 
+ 	* client.c(get_responses_and_close): Wait FILESYSTEM_TICK
+ 	instead of 1 second to avoid time-stamp races.
+ 	* commit.c(commit): Wait FILESYSTEM_TICK
+ 	instead of 1 second to avoid time-stamp races.
+ 	* update.c(do_update): Wait FILESYSTEM_TICK
+ 	instead of 1 second to avoid time-stamp races.
+ 
  1998-07-02  Jim Kingdon  <kingdon@harvey.cyclic.com>
  
  	* sanity.sh (unedit-without-baserev): Move the test itself to be
***************
*** 243,248 ****
--- 379,408 ----
  
  	* sanity.sh (modes2): Touch the file before chmod'ing it.
  
+ 1998-06-23  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* server.c (mkdir_p): Search for the first occurrence of '/' instead
+ 	of just skipping the first character. This is required for platforms,
+ 	where absolute path names do not necessarily start with a '/'.
+ 
+ 	* server.c (serve_root): Added a :local: prefix for platforms, where a
+ 	path may contain ':'.
+ 
+ 	* server.c (receive_file): Look up the file in Entries first to see if
+ 	it has a '-kb' option attached to it. Then create the file accordingly.
+ 
+ 	* server.c (server_updated): Look at finfo->rcs->expand first, to see
+ 	if it includes a '-kb'. If it does, open the file in binary mode. We
+ 	also need to use buf_read_file_to_eof() and buf_chain_length() now.
+ 
+ 	* logmsg.c (logfile_write): Changed the quoting character from
+ 	`' to `".
+ 
+ 	* expand_path.c (expand_variable): Replaced CVSroot_original by
+ 	CVSroot_directory, since former may include the access method.
+ 	This is for platforms, where paths may contain ':' and a :local:
+ 	prefix is required.
+ 
  1998-06-21  Ian Lance Taylor  <ian@cygnus.com>
  
  	* update.c (merge_files): Revert changes of 1998-06-19.  Instead,
***************
*** 285,290 ****
--- 445,459 ----
  	directory.
  	(zlib.o): Depend upon zlib.h.
  
+ 1998-06-16  Murray Bishop  <mbishop@acnielsen.com.au>
+ 
+ 	* sanity.sh: Modify to run test for windows-NT using cygwin32
+ 	with compiler MS Visual C++ 4.2.
+ 
+ 1998-06-12  Murray Bishop  <mbishop@acnielsen.com.au>
+ 
+ 	* sanity.sh: Modify as was run for OS/2 EMX testing.
+ 
  1998-06-09  Mike Sutton@SAIC
  
  	Make it compile with Sun's bundled K&R C compiler:
***************
*** 332,343 ****
--- 501,541 ----
  
  	* sanity.sh (tag8k): Add a test for the 1998-05-02 rcs.c bug fix.
  
+ 1998-05-31  Andreas Huber  <ahuber@ping.at>
+ 
+ 	* client.c, commit.c, filesubr.c, import.c, rcs.c, update.c:
+ 	Replaced all occurrences of chmod() by CVS_CHMOD().
+ 
+ 	* client.c (start_rsh_server) [START_RSH_WITH_POPEN_RW]:
+ 	Slightly reordered the arguments to rsh to match the ordering in the
+ 	!START_RSH_WITH_POPEN_RW case.
+ 
+ 	* client.c (start_rsh_server) [!START_RSH_WITH_POPEN_RW,
+ 	RSH_NEEDS_BINARY]: Added missing '-b' to the rsh argument list.
+ 
+ 	* filesubr.c: Replaced one occurrence of rename() by CVS_RENAME().
+ 
+ 	* rcs.c, rcs.h: Added two new functions: RCS_get_cached() and
+ 	RCS_cache_close(). On some platforms, it is not possible to rename()
+ 	or chmod() open files. The new functions are used to check if a
+ 	particular file is currently kept open in the RCS cache and to close
+ 	it, if necessary.
+ 
+ 	* server.c (server) [RSHD_NOT_TRANSPARENT]: On some platforms with a
+ 	non-tranparent rshd, the standard handles need to be switched to
+ 	binary mode.
+ 
  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-25  Murray Bishop  <mbishop@acnielsen.com.au>
+ 
+ 	* commit.c (commit): Open the -F logfile in text rather than
+ 	binary mode to pass log-11 and keywordlog-7 under OS/2 EMX.
+ 
  1998-05-24  Jim Kingdon  <kingdon@harvey.cyclic.com>
  
  	* sanity.sh (importc): New tests importc-5 through importc-8 test
***************
*** 374,379 ****
--- 572,604 ----
  	* wrapper.c (wrap_add): Disable -t/-f wrappers at least until the
  	serious bug can be fixed.
  
+ 1998-05-19  Murray Bishop  <mbishop@acnielsen.com.au>
+ 
+ 	* sanity.sh: Modify to run for OS/2 EMX testing.
+ 	* commit.c (commit): Open the -F logfile in text rather than
+ 	binary mode to pass log-11 and keywordlog-7 under OS/2 EMX.
+ 	* parseinfo.c (parse_config): have fp_info closed before 
+ 	returning, even if goto error_return happened. Pass config-5.
+ 
+ 1998-05-19  Murray Bishop <mbishop@acnielsen.com.au>
+ 
+ 	Murray Bishop applies the Andreas Huber <ahuber.ping.at>
+ 	patches for cvs-1.9.27
+ 	
+ 	* client.c (change_mode) [!CHMOD_BROKEN]: Call CVS_CHMOD 
+ 	instead of chmod.
+ 	* client.c (start_rsh_server): Move -b flag after hostname.
+ 	* commit.c (fix_rcs_modes): Use CVS_CHMOD in place of chmod.
+ 	* filesubr.c (xchmod): Use CVS_CHMOD in place of chmod.
+ 	* filesubr.c (rename_file): Use CVS_RENAME in place of rename.
+ 	* import.c (add_rcs_file): Use CVS_CHMOD in place of chmod.
+ 	* rcs.c (RCS_checkout): Use CVS_CHMOD in place of chmod.
+ 	* rcs.c (RCS_get_cached): Add function.
+ 	* rcs.c (RCS_cache_close): Add function.
+ 	* rcs.h: add prototypes for RCS_get_cached and RCS_cache_close.
+ 	* server.c (server): Set stdin, stdout, stderr into binary mode.
+ 	* update.c (patch_file): Use CVS_CHMOD in place of chmod.
+ 	
  1998-05-15  Jim Kingdon  <kingdon@harvey.cyclic.com>
  
  	* checkout.c (checkout): Call server_pathname_check on the
Index: src/client.c
===================================================================
RCS file: e:/cvsroot/ccvs/src/client.c,v
retrieving revision 1.7
retrieving revision 1.5.2.7
diff -c -r1.7 -r1.5.2.7
*** src/client.c	1998/07/27 10:17:13	1.7
--- src/client.c	1998/08/10 22:00:47	1.5.2.7
***************
*** 301,307 ****
  	mode &= ~oumask;
      }
  
!     if (chmod (filename, mode) < 0)
  	return errno;
      return 0;
  #endif /* ! CHMOD_BROKEN */
--- 301,307 ----
  	mode &= ~oumask;
      }
  
!     if (CVS_CHMOD (filename, mode) < 0)
  	return errno;
      return 0;
  #endif /* ! CHMOD_BROKEN */
***************
*** 2746,2752 ****
  	     * sure it matters what toplevel_repos we get, but it does
  	     * matter that we don't hit the "internal error" code below).
  	     */
! 	    if (update_dir[0] == '/')
  		toplevel_repos = Name_Repository (update_dir, update_dir);
  	    else
  	    {
--- 2746,2752 ----
  	     * sure it matters what toplevel_repos we get, but it does
  	     * matter that we don't hit the "internal error" code below).
  	     */
! 	    if (isabsolute (update_dir))
  		toplevel_repos = Name_Repository (update_dir, update_dir);
  	    else
  	    {
***************
*** 3405,3412 ****
  	time_t now;
  
  	(void) time (&now);
! 	if (now == last_register_time)
! 	    sleep (1);			/* to avoid time-stamp races */
      }
  
      return errs;
--- 3405,3415 ----
  	time_t now;
  
  	(void) time (&now);
! 	if (now < last_register_time + FILESYSTEM_TICK)
! 	{
! 	    /* to avoid time-stamp races */
! 	    sleep (last_register_time + FILESYSTEM_TICK - now);
! 	}
      }
  
      return errs;
***************
*** 4439,4444 ****
--- 4442,4448 ----
  
      /* The command line starts out with rsh. */
      rsh_argv[i++] = cvs_rsh;
+     rsh_argv[i++] = CVSroot_hostname;
  
  #ifdef RSH_NEEDS_BINARY_FLAG
      /* "-b" for binary, under OS/2. */
***************
*** 4452,4458 ****
  	rsh_argv[i++] = CVSroot_username;
      }
  
-     rsh_argv[i++] = CVSroot_hostname;
      rsh_argv[i++] = cvs_server;
      rsh_argv[i++] = "server";
  
--- 4456,4461 ----
***************
*** 4515,4520 ****
--- 4518,4528 ----
  	*p++ = cvs_rsh;
  	*p++ = CVSroot_hostname;
  
+ #ifdef RSH_NEEDS_BINARY_FLAG
+ 	/* "-b" for binary, under OS/2. */
+ 	*p++ = "-b";
+ #endif /* RSH_NEEDS_BINARY_FLAG */
+ 
  	/* If the login names differ between client and server
  	 * pass it on to rsh.
  	 */
***************
*** 5224,5237 ****
   */
  int
  client_process_import_file (message, vfile, vtag, targc, targv, repository,
!                             all_files_binary)
      char *message;
      char *vfile;
      char *vtag;
      int targc;
      char *targv[];
      char *repository;
!     int all_files_binary;
  {
      char *update_dir;
      char *fullname;
--- 5232,5245 ----
   */
  int
  client_process_import_file (message, vfile, vtag, targc, targv, repository,
!                             kopt)
      char *message;
      char *vfile;
      char *vtag;
      int targc;
      char *targv[];
      char *repository;
!     char *kopt;
  {
      char *update_dir;
      char *fullname;
***************
*** 5260,5269 ****
      }
  
      send_a_repository ("", repository, update_dir);
!     if (all_files_binary)
      {
! 	vers.options = xmalloc (4); /* strlen("-kb") + 1 */
! 	strcpy (vers.options, "-kb");
      }
      else
      {
--- 5268,5278 ----
      }
  
      send_a_repository ("", repository, update_dir);
!     if (kopt != NULL)
      {
! 	vers.options = xmalloc (strlen(kopt) + 3);
! 	strcpy (vers.options, "-k");
! 	strcat (vers.options, kopt);
      }
      else
      {
Index: src/client.h
===================================================================
RCS file: e:/cvsroot/ccvs/src/client.h,v
retrieving revision 1.4
retrieving revision 1.4.2.1
diff -c -r1.4 -r1.4.2.1
*** src/client.h	1998/05/31 01:07:59	1.4
--- src/client.h	1998/08/10 22:00:21	1.4.2.1
***************
*** 195,201 ****
  extern void client_import_setup PROTO((char *repository));
  extern int client_process_import_file
      PROTO((char *message, char *vfile, char *vtag,
! 	   int targc, char *targv[], char *repository, int all_files_binary));
  extern void client_import_done PROTO((void));
  extern void client_notify PROTO((char *, char *, char *, int, char *));
  #endif /* CLIENT_SUPPORT */
--- 195,201 ----
  extern void client_import_setup PROTO((char *repository));
  extern int client_process_import_file
      PROTO((char *message, char *vfile, char *vtag,
! 	   int targc, char *targv[], char *repository, char *kopt));
  extern void client_import_done PROTO((void));
  extern void client_notify PROTO((char *, char *, char *, int, char *));
  #endif /* CLIENT_SUPPORT */
Index: src/commit.c
===================================================================
RCS file: e:/cvsroot/ccvs/src/commit.c,v
retrieving revision 1.6
retrieving revision 1.4.2.6
diff -c -r1.6 -r1.4.2.6
*** src/commit.c	1998/08/10 21:22:53	1.6
--- src/commit.c	1998/08/10 22:06:01	1.4.2.6
***************
*** 423,430 ****
  	if (saved_message)
  	    error (1, 0, "cannot specify both a message and a log file");
  
! 	/* FIXME: Why is this binary?  Needs more investigation.  */
! 	if ((logfd = CVS_OPEN (logfile, O_RDONLY | OPEN_BINARY)) < 0)
  	    error (1, errno, "cannot open log file %s", logfile);
  
  	if (fstat(logfd, &statbuf) < 0)
--- 423,434 ----
  	if (saved_message)
  	    error (1, 0, "cannot specify both a message and a log file");
  
! 	/* What we have here is the name of file whose contents are
! 	 * the log message. I guess it's better to open text mode for
! 	 * those OS where it makes a difference.
! 	 * (sanity.sh probably works better on EMX OS/2 with text mode)
! 	 */
! 	if ((logfd = CVS_OPEN (logfile, O_RDONLY)) < 0)
  	    error (1, errno, "cannot open log file %s", logfile);
  
  	if (fstat(logfd, &statbuf) < 0)
***************
*** 673,681 ****
  	time_t now;
  
  	(void) time (&now);
! 	if (now == last_register_time)
  	{
! 	    sleep (1);			/* to avoid time-stamp races */
  	}
      }
  
--- 677,686 ----
  	time_t now;
  
  	(void) time (&now);
! 	if (now < last_register_time + FILESYSTEM_TICK)
  	{
! 	    /* to avoid time-stamp races */
! 	    sleep (last_register_time + FILESYSTEM_TICK - now);
  	}
      }
  
***************
*** 2327,2333 ****
      if (sb.st_mode & S_IXUSR)
  	rcs_mode |= S_IXUSR | S_IXGRP | S_IXOTH;
      rcs_mode &= ~cvsumask;
!     if (chmod (rcs, rcs_mode) < 0)
  	error (0, errno, "warning: cannot change mode of %s", rcs);
  }
  
--- 2332,2338 ----
      if (sb.st_mode & S_IXUSR)
  	rcs_mode |= S_IXUSR | S_IXGRP | S_IXOTH;
      rcs_mode &= ~cvsumask;
!     if (CVS_CHMOD (rcs, rcs_mode) < 0)
  	error (0, errno, "warning: cannot change mode of %s", rcs);
  }
  
Index: src/cvs.h
===================================================================
RCS file: e:/cvsroot/ccvs/src/cvs.h,v
retrieving revision 1.7
retrieving revision 1.5.2.3
diff -c -r1.7 -r1.5.2.3
*** src/cvs.h	1998/07/27 10:17:14	1.7
--- src/cvs.h	1998/07/27 15:26:00	1.5.2.3
***************
*** 866,868 ****
--- 866,885 ----
  #if defined(SERVER_SUPPORT) || defined(CLIENT_SUPPORT)
  #include "server.h"
  #endif
+ 
+ 
+ /*
+  * In various places, CVS waits a tick of the filesystem clock to make
+  * sure that files have different timestamps. This was coded as sleep (1).
+  * For some filesystems (eg FAT, FAT32) 2 seconds are needed.
+  * I've defined FILESYSTEM_TICK in windows-NT/options.h,
+  * and in src/cvs.h a default of 1 second is defined.
+  *
+  * I'm pretty sure that CVS doesn't do enough waiting, but it's too
+  * hard for me to figure out where to add more.
+  * See sanity.sh [FILESYSTEM_TICK] for more information.
+  */
+ #ifndef FILESYSTEM_TICK
+ #define FILESYSTEM_TICK 1
+ #endif
+ 
Index: src/expand_path.c
===================================================================
RCS file: e:/cvsroot/ccvs/src/expand_path.c,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -c -r1.1 -r1.1.2.1
*** src/expand_path.c	1998/05/31 00:45:30	1.1
--- src/expand_path.c	1998/06/23 10:43:18	1.1.2.1
***************
*** 269,275 ****
      int line;
  {
      if (strcmp (name, CVSROOT_ENV) == 0)
! 	return CVSroot_original;
      else if (strcmp (name, "RCSBIN") == 0)
      {
  	error (0, 0, "RCSBIN internal variable is no longer supported");
--- 269,275 ----
      int line;
  {
      if (strcmp (name, CVSROOT_ENV) == 0)
! 	return CVSroot_directory;
      else if (strcmp (name, "RCSBIN") == 0)
      {
  	error (0, 0, "RCSBIN internal variable is no longer supported");
Index: src/filesubr.c
===================================================================
RCS file: e:/cvsroot/ccvs/src/filesubr.c,v
retrieving revision 1.4
retrieving revision 1.3.2.2
diff -c -r1.4 -r1.3.2.2
*** src/filesubr.c	1998/05/31 01:18:40	1.4
--- src/filesubr.c	1998/06/23 10:28:24	1.3.2.2
***************
*** 388,394 ****
      if (noexec)
  	return;
  
!     if (chmod (fname, mode) < 0)
  	error (0, errno, "cannot change mode of file %s", fname);
  }
  
--- 388,394 ----
      if (noexec)
  	return;
  
!     if (CVS_CHMOD (fname, mode) < 0)
  	error (0, errno, "cannot change mode of file %s", fname);
  }
  
***************
*** 410,416 ****
      if (noexec)
  	return;
  
!     if (rename (from, to) < 0)
  	error (1, errno, "cannot rename file %s to %s", from, to);
  }
  
--- 410,416 ----
      if (noexec)
  	return;
  
!     if (CVS_RENAME (from, to) < 0)
  	error (1, errno, "cannot rename file %s to %s", from, to);
  }
  
Index: src/import.c
===================================================================
RCS file: e:/cvsroot/ccvs/src/import.c,v
retrieving revision 1.5
retrieving revision 1.5.2.2
diff -c -r1.5 -r1.5.2.2
*** src/import.c	1998/05/31 01:12:48	1.5
--- src/import.c	1998/08/10 21:46:22	1.5.2.2
***************
*** 417,424 ****
  		    err += client_process_import_file (message, dp->d_name,
                                                         vtag, targc, targv,
                                                         repository,
!                                                        keyword_opt != NULL &&
!                                                        keyword_opt[0] == 'b');
  		else
  #endif
  		    err += process_import_file (message, dp->d_name,
--- 417,423 ----
  		    err += client_process_import_file (message, dp->d_name,
                                                         vtag, targc, targv,
                                                         repository,
!                                                        keyword_opt);
  		else
  #endif
  		    err += process_import_file (message, dp->d_name,
***************
*** 1315,1321 ****
  	    (sb.st_mode & S_IRWXU) >> 6) &
  	   ~cvsumask &
  	   ~(S_IWRITE | S_IWGRP | S_IWOTH);
!     if (chmod (rcs, mode) < 0)
      {
  	ierrno = errno;
  	if (add_logfp != NULL)
--- 1314,1320 ----
  	    (sb.st_mode & S_IRWXU) >> 6) &
  	   ~cvsumask &
  	   ~(S_IWRITE | S_IWGRP | S_IWOTH);
!     if (CVS_CHMOD (rcs, mode) < 0)
      {
  	ierrno = errno;
  	if (add_logfp != NULL)
Index: src/parseinfo.c
===================================================================
RCS file: e:/cvsroot/ccvs/src/parseinfo.c,v
retrieving revision 1.3
retrieving revision 1.2.2.2
diff -c -r1.3 -r1.2.2.2
*** src/parseinfo.c	1998/07/27 10:17:14	1.3
--- src/parseinfo.c	1998/07/27 15:26:01	1.2.2.2
***************
*** 205,211 ****
      char *cvsroot;
  {
      char *infopath;
!     FILE *fp_info;
      char *line = NULL;
      size_t line_allocated = 0;
      size_t len;
--- 205,211 ----
      char *cvsroot;
  {
      char *infopath;
!     FILE *fp_info = NULL; /* look like fopen failed */
      char *line = NULL;
      size_t line_allocated = 0;
      size_t len;
***************
*** 392,397 ****
--- 392,401 ----
      return 0;
  
   error_return:
+     if (fp_info != NULL)
+        {
+        fclose( fp_info );
+        }
      if (infopath != NULL)
  	free (infopath);
      if (line != NULL)
Index: src/rcs.c
===================================================================
RCS file: e:/cvsroot/ccvs/src/rcs.c,v
retrieving revision 1.12
retrieving revision 1.5.2.8
diff -c -r1.12 -r1.5.2.8
*** src/rcs.c	1998/08/10 21:22:54	1.12
--- src/rcs.c	1998/08/10 22:06:02	1.5.2.8
***************
*** 4630,4636 ****
  		       workfile);
  	}
  
! 	ret = chmod (workfile,
  		     change_rcs_mode
  		     ? rcs_mode
  		     : sb.st_mode & ~(S_IWRITE | S_IWGRP | S_IWOTH));
--- 4630,4636 ----
  		       workfile);
  	}
  
! 	ret = CVS_CHMOD (workfile,
  		     change_rcs_mode
  		     ? rcs_mode
  		     : sb.st_mode & ~(S_IWRITE | S_IWGRP | S_IWOTH));
***************
*** 4641,4647 ****
  	    return 1;
  	}
  
! 	ret = chmod (workfile,
  		     sb.st_mode & ~(S_IWRITE | S_IWGRP | S_IWOTH));
  #endif
  	if (ret < 0)
--- 4641,4647 ----
  	    return 1;
  	}
  
! 	ret = CVS_CHMOD (workfile,
  		     sb.st_mode & ~(S_IWRITE | S_IWGRP | S_IWOTH));
  #endif
  	if (ret < 0)
***************
*** 8681,8683 ****
--- 8681,8695 ----
      return label;
  }
  
+ FILE* RCS_get_cached (name)
+     const char* name;
+ {
+     return cached_rcs != NULL &&
+         strcmp (cached_rcs->path, name) == 0 ?
+         cached_rcsbuf.fp : NULL;
+ }
+ 
+ void RCS_cache_close ()
+ {
+     rcsbuf_cache_close ();
+ }
Index: src/rcs.h
===================================================================
RCS file: e:/cvsroot/ccvs/src/rcs.h,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -c -r1.3 -r1.3.2.1
*** src/rcs.h	1998/05/31 01:12:54	1.3
--- src/rcs.h	1998/05/31 02:10:22	1.3.2.1
***************
*** 236,238 ****
--- 236,241 ----
  extern int add_rcs_file PROTO ((char *, char *, char *, char *, char *,
  				char *, char *, int, char **,
  				char *, size_t, FILE *));
+ 
+ FILE* RCS_get_cached PROTO ((const char *));
+ void RCS_cache_close PROTO ((void));
Index: src/sanity.sh
===================================================================
RCS file: e:/cvsroot/ccvs/src/sanity.sh,v
retrieving revision 1.16
diff -c -r1.16 sanity.sh
*** src/sanity.sh	1998/08/14 22:19:03	1.16
--- src/sanity.sh	1998/08/21 10:21:36
***************
*** 43,52 ****
  # required to make this script work properly.
  unset CVSREAD
  
! # The default value of /tmp/cvs-sanity for TESTDIR is dubious,
  # because it loses if two people/scripts try to run the tests
  # at the same time.  Some possible solutions:
! # 1.  Use /tmp/cvs-test$$.  One disadvantage is that the old
  #     cvs-test* directories would pile up, because they wouldn't
  #     necessarily get removed.
  # 2.  Have everyone/everything running the testsuite set
--- 43,52 ----
  # required to make this script work properly.
  unset CVSREAD
  
! # The default value of ${TMPDIR}/cvs-sanity for TESTDIR is dubious,
  # because it loses if two people/scripts try to run the tests
  # at the same time.  Some possible solutions:
! # 1.  Use ${TMPDIR}/cvs-test$$.  One disadvantage is that the old
  #     cvs-test* directories would pile up, because they wouldn't
  #     necessarily get removed.
  # 2.  Have everyone/everything running the testsuite set
***************
*** 59,77 ****
  #     So this would be lost if everything was `pwd`-based.  I suppose
  #     if we wanted to get baroque we could start making symlinks
  #     to ensure the two are different.
! TESTDIR=${TESTDIR:-/tmp/cvs-sanity}
  
  # "debugger"
  #set -x
  
  echo 'This test should produce no other output than this line, and a final "OK".'
  
  if test x"$1" = x"-r"; then
  	shift
  	remote=yes
  	# If we're going to do remote testing, make sure 'rsh' works first.
          host="`hostname`"
! 	if test "x`${CVS_RSH-rsh} $host -n 'echo hi'`" != "xhi"; then
  	    echo "ERROR: cannot test remote CVS, because \`rsh $host' fails." >&2
  	    exit 1
  	fi
--- 59,93 ----
  #     So this would be lost if everything was `pwd`-based.  I suppose
  #     if we wanted to get baroque we could start making symlinks
  #     to ensure the two are different.
! TESTDIR=${TESTDIR:-${TMPDIR}/cvs-sanity}
  
  # "debugger"
  #set -x
  
  echo 'This test should produce no other output than this line, and a final "OK".'
  
+ # FIXME: The detection of OS_COMPILER_EMU only tests for OS.
+ # Is there some way to tell what compiled cvs? If so, then things
+ # like cygwin32 compiled cvs might be handled.
+ 
+ OS_COMPILER_EMU=""
+ if test x"${OS2_SHELL}" != x; then
+   OS_COMPILER_EMU="os2_gcc_emx"
+   RSH_FLAGS="-b"
+ fi
+ if test x"${OS}" = x"Windows_NT"; then
+   OS_COMPILER_EMU="win32_msvc_cygwin32"
+ fi
+ if test "x`uname`" = "xWindows_95"; then
+   OS_COMPILER_EMU="win95_msvc_mks"
+ fi
+   
  if test x"$1" = x"-r"; then
  	shift
  	remote=yes
  	# If we're going to do remote testing, make sure 'rsh' works first.
          host="`hostname`"
! 	if test "x`${CVS_RSH-rsh} $host $RSH_FLAGS -n 'echo hi'`" != "xhi"; then
  	    echo "ERROR: cannot test remote CVS, because \`rsh $host' fails." >&2
  	    exit 1
  	fi
***************
*** 80,86 ****
  fi
  
  # The --keep option will eventually cause all the tests to leave around the
! # contents of the /tmp directory; right now only some implement it.  Not
  # useful if you are running more than one test.
  # FIXME: need some real option parsing so this doesn't depend on the order
  # in which they are specified.
--- 96,102 ----
  fi
  
  # The --keep option will eventually cause all the tests to leave around the
! # contents of the ${TMPDIR} directory; right now only some implement it.  Not
  # useful if you are running more than one test.
  # FIXME: need some real option parsing so this doesn't depend on the order
  # in which they are specified.
***************
*** 94,100 ****
  # Use full path for CVS executable, so that CVS_SERVER gets set properly
  # for remote.
  case $1 in
! /*)
  	testcvs=$1
  	;;
  *)
--- 110,116 ----
  # Use full path for CVS executable, so that CVS_SERVER gets set properly
  # for remote.
  case $1 in
! /*|[a-zA-Z]:/*)
  	testcvs=$1
  	;;
  *)
***************
*** 129,134 ****
--- 145,324 ----
    fi
  fi
  
+ 
+ 
+ 
+ # Here are a bunch of things that let sanity.sh run better on EMX
+ # and on windows-NT.
+ 
+ case $OS_COMPILER_EMU in
+   os2_gcc_emx)
+ 	echo "Bending sanity.sh for ${OS_COMPILER_EMU}"
+ 
+ 	# Regexp to match the name of a temporary file (from cvs_temp_name).
+ 	# redefine to allow colon
+ 	tempname="[-a-zA-Z0-9/.%_:]*"
+ 
+ 	# when asked `type -p sh`, pd korn shell for OS/2 5.27 says 
+ 	# "sh is a tracked alias for d:\gnu\bin/sh.exe"
+ 	TESTSHELL=sh
+ 
+ 	# On OS/2 and Windows-NT, we can't make directories readonly with 
+ 	# chmod -w
+ 	# When the line below is uncommented, test needing that are not run
+ 	CANT_PROTECT_DIRS=1
+ 
+ 	# On OS/2 and Windows-NT, sometimes we can't run shell scripts by 
+ 	# naming them.
+ 	# When the line below is uncommented, hack around such problems
+ 	# Andreas Huber says when he is finished his port of 1.9.28.1
+ 	# scripts will run ok.
+ 	CANT_RUN_SCRIPTS=1
+ 
+ 	# On OS/2 with EMX, invoke edhack.exe instead of a shell script editme
+ 	# You'll need edhack.exe on your path for this one
+ 	# You can find a copy below in this file (look for edhack.c)
+ 	#EDHACK_EDITOR=1
+ 
+ 	# On OS/2 and Win-NT do tests for PreservePermissions only if asked
+ 	# (that way, default sanity.sh run is easy)
+ 	WONT_PRESERVE_PERMISSIONS=1
+ 
+ 	# OS/2 (EMX) ls - GNU file utilities 3.13 shows things like drwxa--
+ 	# rather than -r--r--r--. this breaks most of modes) test, so don't
+ 	# do it unless asked.
+ 	BROKEN_LS_L=1
+ 
+ 	# DEVNULL is used for expr comparison (like macro in src/cvs.h 
+ 	# (/dev/null) and also in windows-NT/config.h (nul) for 
+ 	# OS/2 emx gcc and Windows-NT MSVC++ want nul
+ 	DEVNULL=nul
+ 	DEVNULL_TIME="[a-zA-Z0-9: ]*"
+ 
+ 	# OS/2 EMX and cygwin32 have cat and echo emit lines with crlf at end
+ 	# This is no good for For making RCS files, so the kludge crlf2lf.exe
+ 	# can be used instead (you'll need it on your path)
+ 	# You can find a copy below in this file (look for crlf2lf.c)
+ 	CRLF_ENDLINES=1
+ 
+ 
+ 	SLASH="/"
+   ;;
+   win32_msvc_cygwin32)
+ 	echo "Bending sanity.sh for ${OS_COMPILER_EMU}"
+ 	tempname="[-a-zA-Z0-9/\\.%_:]*"
+ 
+ 	# reserved-13b works like this
+ 	TESTSHELL=sh
+ 
+ 	CANT_PROTECT_DIRS=1
+ 	CANT_RUN_SCRIPTS=1
+ 	EDHACK_EDITOR=1
+ 	WONT_PRESERVE_PERMISSIONS=1
+ 
+ 	# FIXME: cygwyn32 is a lot less broken than emx, and may possibly
+ 	# be made to work. 
+         # For instance, emx fails at modes-5, but nt fails at modes-7b
+ 	# when the BROKEN_LS_L isn't defined.
+ 	# On the other hand, maybe cygwin32 not passing modes) is a real bug.
+ 	BROKEN_LS_L=1
+ 	DEVNULL=nul
+ 	CRLF_ENDLINES=1
+ 
+ 	# Some RCS outputs have \ rather than / on windows-NT when
+ 	# compiled by MS Visual C++
+   	SLASH="[/\\]"
+ 
+ 	# death2-diff tests give ? as filetime of nul
+ 	DEVNULL_TIME="?"
+   ;;
+   win95_msvc_mks)
+ 	echo "Bending sanity.sh for ${OS_COMPILER_EMU}"
+ 	tempname="[-a-zA-Z0-9/\\.%_:]*"
+ 
+ 	# MKS ksh seems to run DOS type rather than *nix type, so
+ 	# shell detection just doesn't work.
+ 	TESTSHELL=sh
+ 
+ 	CANT_PROTECT_DIRS=1
+ 	CANT_RUN_SCRIPTS=1
+ 	EDHACK_EDITOR=1
+ 	WONT_PRESERVE_PERMISSIONS=1
+ 
+ 	# FIXME: cygwyn32 is a lot less broken than emx, and may possibly
+ 	# be made to work. 
+         # For instance, emx fails at modes-5, but nt fails at modes-7b
+ 	# when the BROKEN_LS_L isn't defined.
+ 	# On the other hand, maybe cygwin32 not passing modes) is a real bug.
+ 	BROKEN_LS_L=1
+ 	DEVNULL=nul
+ 	CRLF_ENDLINES=1
+ 
+ 	# Some RCS outputs have \ rather than / on windows-NT when
+ 	# compiled by MS Visual C++
+   	SLASH="[/\\]"
+ 
+ 	# death2-diff tests give ? as filetime of nul
+ 	DEVNULL_TIME="?"
+  	DEVNULL_TIME="[a-zA-Z0-9: ]*"
+   ;;
+   *)
+ 	DEVNULL=/dev/null
+ 	SLASH="/"
+ 	DEVNULL_TIME="[a-zA-Z0-9: ]*"
+ 	FILESYSTEM_TICK=0
+   ;;
+ esac
+ 
+ 
+ # here is a hack that converts files with cr lf end lines to lf endlines
+ lf_endlines ()
+ {
+   if test x"${CRLF_ENDLINES}" = x; then
+     return 0
+   fi
+   crlf2lf <$1 ${TMPDIR}/lf$$
+   cp ${TMPDIR}/lf$$ $1
+   rm -f ${TMPDIR}/lf$$
+   return 0
+ }
+ # /* crlf2lf.c */
+ # #include <stdio.h>
+ # 
+ # int Usage( const char * pszPgmname )
+ # {
+ #    fprintf( stdout, "Usage: %s OUTFILE\n", pszPgmname );
+ #    fprintf( stdout,
+ #       "\n"
+ #       "Copy stdin to OUTFILE replacing crlf by lf.\n");
+ #    return 1;
+ # }
+ # 
+ # int main(int argc, const char * argv[])
+ # {
+ #    FILE *         pOutFile;
+ #    int i;
+ # 
+ #    if (argc != 2)
+ #       {
+ #       return Usage(argv[0]);
+ #       }
+ #    pOutFile = fopen( argv[1], "wb");
+ #    if (0 == pOutFile)
+ #       {
+ #       printf("Can't open %s for writing\n", argv[1]);
+ #       return Usage(argv[0]);
+ #       }
+ # 
+ #    while (EOF != (i= getc(stdin)))
+ #       putc(i, pOutFile);
+ #    return 0;
+ # 
+ #    fflush( pOutFile );
+ # }
+ 
+ 
+ 
  # FIXME: try things (what things? checkins?) without -m.
  #
  # Some of these tests are written to expect -Q.  But testing with
***************
*** 528,540 ****
  # likely that we test whether CVS is distinguishing between TMPPWD
  # and TESTDIR.  However, there is no guarantee that will test it anyway.
  # If we really care, we should do something along the lines of:
! #   cd /tmp/cvs-sanity  # In reality, overridable with environment variable?
  #   mkdir realdir
  #   ln -s realdir testdir
! #   TESTDIR=/tmp/cvs-sanity/testdir
! #   TMPPWD=/tmp/cvs-sanity/realdir
! TMPPWD=`pwd`
  
  # Avoid picking up any stray .cvsrc, etc., from the user running the tests
  mkdir home
  HOME=${TESTDIR}/home; export HOME
--- 718,824 ----
  # likely that we test whether CVS is distinguishing between TMPPWD
  # and TESTDIR.  However, there is no guarantee that will test it anyway.
  # If we really care, we should do something along the lines of:
! #   cd ${TMPDIR}/cvs-sanity  # In reality, overridable with environment variable?
  #   mkdir realdir
  #   ln -s realdir testdir
! #   TESTDIR=${TMPDIR}/cvs-sanity/testdir
! #   TMPPWD=${TMPDIR}/cvs-sanity/realdir
! 
! # allow overide of TMPPWD from outside sanity.sh
! 
! if test x"${TMPPWD}" = x; then
!   if test x"${SLASH}" = x"/"; then
!     TMPPWD=`pwd`
!   else
!     if test x"${TESTDIR}" = x"/tmp/cvs-sanity"; then
! 
!       # but here's a hack that makes basic2-64 happier with winnt, MS Visual C++ 4.0
!       # and cygwin32 beta19 bash by accepting optional drive letter and slosh
!       # instead of slash
!       TMPPWD=[A-Za-z:]*${SLASH}tmp${SLASH}cvs-sanity
! 
!     else
!       echo '${SLASH} != / and ${TESTDIR} != /tmp/cvs-sanity. TMPPWD will be wrongly set'
!     fi
!   fi
! fi
! 
! 
! # In various places, CVS waits a tick of the filesystem clock to make
! # sure that files have different timestamps. This was coded as sleep (1).
! # For some filesystems (eg FAT, FAT32) 2 seconds are needed.
! # In my local cvs, I've defined FILESYSTEM_TICK in windows-NT/options.h,
! # and in src/cvs.h a default of 1 second is defined.
! #
! # I found some timing problems using sanity.sh Windows-95 on Pentium 90
! # with MKS Toolkit and FAT. These are worse on Pentium-II 333.
! # On the other hand, I didn't see these problems withPentium 133 NT and
! # cygwin32 on a netware 4.10 server for which the script below reports
! # 2 seconds per filesystem tick.
! # Nor did I see these problems with OS/2 HPFS using EMX port.
! #
! # Perhaps part of the problem is not 
! #
! # I suspect that CVS doesn't sleep in enough places for this to work 
! # properly.
! #
! # multibranch2 often fails, as does the second ci here :
! #   cvs add file1
! #   cvs ci
! #   echo foo >file1
! #   cvs ci
! #
! # Windows_95 on Pentium 90 using FAT I found that I had about 18 mostly
! # consistent failures where sanity.sh expected a file just modified
! # in the sandbox to be checked in and cvs didn't do that.
! # When I ran on Pentium-II 333 (FAT32) I got about 30.
! # Eventually, I tried putting sleep before the echo command modifying
! # the file - problem gone.
! # I'm told FAT doesn't keep the low order bit of time in seconds.
! #
! # The code below works out the number of seconds (>=0) to wait between
! # creating files to be sure that they have different timestamps.
! # I've put sleeps where they seem to be needed (before
! # echo cat or cp before ci modified, 
! # before update -r,
! # before tag -b branch)
! #
! # Having different timestamps on fileX and in CVS/Entries for fileX is
! # how cvs decides file is modified since checkout. Detection would be
! # more robust if bytesize was also compared. 
! # Would changing the Entries file be a bad thing?
! #
! # Murray Bishop, 1 July 98
! 
! if test "x${FILESYSTEM_TICK}" = "x"; then
!   seconds=0
!   while test "x${FILESYSTEM_TICK}" = "x"; do
!     echo tock >tick1
!     sleep ${seconds}
!     echo tock >tick2
!     sleep ${seconds}
!     echo tock >tick3
!     sleep ${seconds}
!     echo tock >tick4
!     sleep ${seconds}
!     echo tock >tick5
!     if test  tick1 -ot tick2 \
! 	-a tick2 -ot tick3 \
! 	-a tick3 -ot tick4 \
! 	-a tick4 -ot tick5; then
!       FILESYSTEM_TICK=${seconds}
!     fi
!     seconds=`expr ${seconds} + 1`
!   done
!   rm tick1 tick2 tick3 tick4 tick5
! fi
! if test "x${FILESYSTEM_TICK}" != "x0"; then
!   : When we depart from distribution behavior - say so.
!   echo "Waiting ${FILESYSTEM_TICK} seconds between creating files gives different modified times."
! fi
  
+ 
+ 
  # Avoid picking up any stray .cvsrc, etc., from the user running the tests
  mkdir home
  HOME=${TESTDIR}/home; export HOME
***************
*** 571,579 ****
  	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 tag8k"
--- 855,873 ----
  	tests="${tests} binwrap3 mwrap info taginfo config"
  	tests="${tests} serverpatch log log2 ann ann-id crerepos rcs rcs2"
  	tests="${tests} history"
! 	tests="${tests} big"
! 	if test x"${BROKEN_LS_L}" = x; then
! 	  tests="${tests} modes modes2"
! 	else
! 	  echo "Won't run modes modes2 tests - BROKEN_LS_L"
! 	fi
! 	tests="${tests} stamps"
! 	if test x"${WONT_PRESERVE_PERMISSIONS}" = x; then
! 	  # PreservePermissions stuff: permissions, symlinks et al.
! 	  tests="${tests} perms symlinks hardlinks"
! 	else
! 	  echo "Won't run perms symlinks hardlinks tests - WONT_PRESERVE_PERMISSIONS"
! 	fi
  	# More tag and branch tests, keywords.
  	tests="${tests} sticky keyword keywordlog"
  	tests="${tests} head tagdate multibranch2 tag8k"
***************
*** 598,611 ****
  	ISDIFF=false
  
  	cd $DIR_1
! 	find . -print | fgrep -v /CVS | sort > /tmp/dc$$d1
  
  	# go back where we were to avoid symlink hell...
  	cd $OLDPWD
  	cd $DIR_2
! 	find . -print | fgrep -v /CVS | sort > /tmp/dc$$d2
  
! 	if diff /tmp/dc$$d1 /tmp/dc$$d2 >/dev/null 2>&1
  	then
  		:
  	else
--- 892,906 ----
  	ISDIFF=false
  
  	cd $DIR_1
! 	# EMX gnu find 4.1 emits CVS rather than ./CVS
! 	find . -print | fgrep -v CVS | sort > ${TMPDIR}/dc$$d1
  
  	# go back where we were to avoid symlink hell...
  	cd $OLDPWD
  	cd $DIR_2
! 	find . -print | fgrep -v CVS | sort > ${TMPDIR}/dc$$d2
  
! 	if diff ${TMPDIR}/dc$$d1 ${TMPDIR}/dc$$d2 >/dev/null 2>&1
  	then
  		:
  	else
***************
*** 621,633 ****
  				ISDIFF=true
  			fi
  		fi
! 	done < /tmp/dc$$d1
! 	rm -f /tmp/dc$$*
  }
  
  # Set up CVSROOT (the crerepos tests will test operating without CVSROOT set).
  CVSROOT_DIRNAME=${TESTDIR}/cvsroot
! CVSROOT=${CVSROOT_DIRNAME} ; export CVSROOT
  if test "x$remote" = xyes; then
  	# Use rsh so we can test it without having to muck with inetd
  	# or anything like that.  Also needed to get CVS_SERVER to
--- 916,928 ----
  				ISDIFF=true
  			fi
  		fi
! 	done < ${TMPDIR}/dc$$d1
! 	rm -f ${TMPDIR}/dc$$*
  }
  
  # Set up CVSROOT (the crerepos tests will test operating without CVSROOT set).
  CVSROOT_DIRNAME=${TESTDIR}/cvsroot
! CVSROOT=:local:${CVSROOT_DIRNAME} ; export CVSROOT
  if test "x$remote" = xyes; then
  	# Use rsh so we can test it without having to muck with inetd
  	# or anything like that.  Also needed to get CVS_SERVER to
***************
*** 787,796 ****
  	  # The .* here will normally be "No such file or directory",
  	  # but if memory serves some systems (AIX?) have a different message.
  :	  dotest_fail basica-9 \
! 	    "${testcvs} -q -d ${TESTDIR}/nonexist update" \
  "${PROG}: cannot access cvs root ${TESTDIR}/nonexist: .*"
  	  dotest_fail basica-9 \
! 	    "${testcvs} -q -d ${TESTDIR}/nonexist update" \
  "${PROG} \[[a-z]* aborted\]: ${TESTDIR}/nonexist/CVSROOT: .*"
  
  	  dotest basica-10 "${testcvs} annotate" \
--- 1082,1091 ----
  	  # The .* here will normally be "No such file or directory",
  	  # but if memory serves some systems (AIX?) have a different message.
  :	  dotest_fail basica-9 \
! 	    "${testcvs} -q -d :local:${TESTDIR}/nonexist update" \
  "${PROG}: cannot access cvs root ${TESTDIR}/nonexist: .*"
  	  dotest_fail basica-9 \
! 	    "${testcvs} -q -d :local:${TESTDIR}/nonexist update" \
  "${PROG} \[[a-z]* aborted\]: ${TESTDIR}/nonexist/CVSROOT: .*"
  
  	  dotest basica-10 "${testcvs} annotate" \
***************
*** 972,977 ****
--- 1267,1273 ----
  ${TESTDIR}/cvsroot/first-dir/sdir2/sfile2,v  <--  sfile2
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo sfile1 develops >Emptydir/sfile1
  	  dotest basicb-6 "${testcvs} -q ci -m modify" \
  "Checking in Emptydir/sfile1;
***************
*** 1755,1760 ****
--- 2051,2057 ----
  			cd $i
  
  			# modify a file
+ 			sleep ${FILESYSTEM_TICK}
  			echo file6 >>file6
  
  			# delete a file
***************
*** 1895,1901 ****
  		fi
  
  		# directory copies are done in an oblique way in order to avoid a bug in sun's tmp filesystem.
! 		mkdir first-dir.cpy ; (cd first-dir ; tar cf - . | (cd ../first-dir.cpy ; tar xf -))
  
  		directory_cmp first-dir export-dir
  
--- 2192,2209 ----
  		fi
  
  		# directory copies are done in an oblique way in order to avoid a bug in sun's tmp filesystem.
! 		if test "x${OS_COMPILER_EMU}" = "xwin95_msvc_mks"; then
! 		  # MKS Toolkit on win95 sometimes chokes on the usual way
! 		  mkdir first-dir.cpy
! 		  cd first-dir
! 		  tar cf ${TESTDIR}/ball.tar .
! 		  cd ../first-dir.cpy
! 		  tar xf ${TESTDIR}/ball.tar
! 		  rm ${TESTDIR}/ball.tar
! 		  cd ..
! 		else
! 		 mkdir first-dir.cpy ; (cd first-dir ; tar cf - . | (cd ../first-dir.cpy ; tar xf -))
! 		fi
  
  		directory_cmp first-dir export-dir
  
***************
*** 1943,1949 ****
  
  		rm -r export-dir first-dir
  		mkdir first-dir
! 		(cd first-dir.cpy ; tar cf - . | (cd ../first-dir ; tar xf -))
  
  		# update the top, cancelling sticky tags, retag, update other copy, compare.
  		cd first-dir
--- 2251,2267 ----
  
  		rm -r export-dir first-dir
  		mkdir first-dir
! 		if test "x${OS_COMPILER_EMU}" = "xwin95_msvc_mks"; then
! 		  # MKS Toolkit on win95 sometimes chokes on the usual way
! 		  cd first-dir.cpy
! 		  tar cf ${TESTDIR}/ball.tar .
! 		  cd ../first-dir
! 		  tar xf ${TESTDIR}/ball.tar
! 		  rm ${TESTDIR}/ball.tar
! 		  cd ..
! 		else
! 		  (cd first-dir.cpy ; tar cf - . | (cd ../first-dir ; tar xf -))
! 		fi
  
  		# update the top, cancelling sticky tags, retag, update other copy, compare.
  		cd first-dir
***************
*** 2022,2029 ****
  T [0-9/]* [0-9:]* ${PLUS}0000 ${username} first-dir \[rtagged-by-tag:rtagged-by-head\]
  T [0-9/]* [0-9:]* ${PLUS}0000 ${username} first-dir \[rtagged-by-revision:1\.1\]
  O [0-9/]* [0-9:]* ${PLUS}0000 ${username} \[1\.1\] first-dir           =first-dir= ${TMPPWD}/\*
! U [0-9/]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file6     first-dir           == ${TMPPWD}/first-dir
! U [0-9/]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file7     first-dir           == ${TMPPWD}/first-dir" \
  "O [0-9/]* [0-9:]* ${PLUS}0000 ${username} first-dir           =first-dir= <remote>/\*
  A [0-9/]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file6     first-dir           == <remote>
  A [0-9/]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file7     first-dir           == <remote>
--- 2340,2347 ----
  T [0-9/]* [0-9:]* ${PLUS}0000 ${username} first-dir \[rtagged-by-tag:rtagged-by-head\]
  T [0-9/]* [0-9:]* ${PLUS}0000 ${username} first-dir \[rtagged-by-revision:1\.1\]
  O [0-9/]* [0-9:]* ${PLUS}0000 ${username} \[1\.1\] first-dir           =first-dir= ${TMPPWD}/\*
! U [0-9/]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file6     first-dir           == ${TMPPWD}${SLASH}first-dir
! U [0-9/]* [0-9:]* ${PLUS}0000 ${username} 1\.2 file7     first-dir           == ${TMPPWD}${SLASH}first-dir" \
  "O [0-9/]* [0-9:]* ${PLUS}0000 ${username} first-dir           =first-dir= <remote>/\*
  A [0-9/]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file6     first-dir           == <remote>
  A [0-9/]* [0-9:]* ${PLUS}0000 ${username} 1\.1 file7     first-dir           == <remote>
***************
*** 2112,2117 ****
--- 2430,2436 ----
  U trdiff/bar
  U trdiff/foo"
  		cd trdiff
+ 		sleep ${FILESYSTEM_TICK}
  		echo something >> foo
  		dotest rdiff-3 \
  		  "${testcvs} ci -m added-something foo" \
***************
*** 2174,2181 ****
  ! \$''Name: local-v0 \$
  ! something
  Index: trdiff/new
! diff -c /dev/null trdiff/new:1\.1
! \*\*\* /dev/null	.*
  --- trdiff/new	.*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
--- 2493,2500 ----
  ! \$''Name: local-v0 \$
  ! something
  Index: trdiff/new
! diff -c '"${DEVNULL}"' trdiff/new:1\.1
! \*\*\* '"${DEVNULL}"'	.*
  --- trdiff/new	.*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
***************
*** 2329,2334 ****
--- 2648,2654 ----
  T file2'
  
  		# branch1
+ 		sleep ${FILESYSTEM_TICK}
  		if ${CVS} tag -b branch1  ; then
  		    pass 73
  		else
***************
*** 2336,2341 ****
--- 2656,2662 ----
  		fi
  
  		# and move to the branch.
+ 		sleep ${FILESYSTEM_TICK}
  		if ${CVS} update -r branch1  ; then
  		    pass 74
  		else
***************
*** 2362,2369 ****
  		dotest death-76a0 \
  "${testcvs} -q rdiff -r bp_branch1 -r branch1 first-dir" \
  "Index: first-dir/file3
! diff -c /dev/null first-dir/file3:1\.1\.2\.1
! \*\*\* /dev/null	.*
  --- first-dir/file3	.*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
--- 2683,2690 ----
  		dotest death-76a0 \
  "${testcvs} -q rdiff -r bp_branch1 -r branch1 first-dir" \
  "Index: first-dir/file3
! diff -c ${DEVNULL} first-dir/file3:1\.1\.2\.1
! \*\*\* ${DEVNULL}	.*
  --- first-dir/file3	.*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
***************
*** 2526,2531 ****
--- 2847,2853 ----
  		fi
  
  		# typo; try to get to the branch and fail
+ 		sleep ${FILESYSTEM_TICK}
  		dotest_fail 92.1a "${testcvs} update -r brnach1" \
  		  "${PROG}"' \[[a-z]* aborted\]: no such tag brnach1'
  		# Make sure we are still on the trunk
***************
*** 2541,2546 ****
--- 2863,2869 ----
  		fi
  
  		# back to branch1
+ 		sleep ${FILESYSTEM_TICK}
  		if ${CVS} update -r branch1  2>> ${LOGFILE}; then
  		    pass 93
  		else
***************
*** 2602,2607 ****
--- 2925,2931 ----
  done"
  
  	  # Make a branch and a non-branch tag.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest death2-4 "${testcvs} -q tag -b branch" \
  'T file1
  T file4'
***************
*** 2610,2615 ****
--- 2934,2940 ----
  T file4'
  
  	  # Switch over to the branch.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest death2-6 "${testcvs} -q update -r branch" ''
  
  	  # Delete the file on the branch.
***************
*** 2631,2637 ****
  RCS file: file1
  diff -N file1
  \*\*\* ${tempname}[ 	][	]*[a-zA-Z0-9: ]*
! --- /dev/null[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 1 \*\*\*\*
  - first revision
--- 2956,2962 ----
  RCS file: file1
  diff -N file1
  \*\*\* ${tempname}[ 	][	]*[a-zA-Z0-9: ]*
! --- ${DEVNULL}[ 	][ 	]*${DEVNULL_TIME}
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 1 \*\*\*\*
  - first revision
***************
*** 2655,2661 ****
  RCS file: file1
  diff -N file1
  \*\*\* ${tempname}[ 	][	]*[a-zA-Z0-9: ]*
! --- /dev/null[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 1 \*\*\*\*
  - first revision
--- 2980,2986 ----
  RCS file: file1
  diff -N file1
  \*\*\* ${tempname}[ 	][	]*[a-zA-Z0-9: ]*
! --- ${DEVNULL}[ 	][ 	]*${DEVNULL_TIME}
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 1 \*\*\*\*
  - first revision
***************
*** 2670,2676 ****
  RCS file: file1
  diff -N file1
  \*\*\* ${tempname}[ 	][	]*[a-zA-Z0-9: ]*
! --- /dev/null[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 1 \*\*\*\*
  - first revision
--- 2995,3001 ----
  RCS file: file1
  diff -N file1
  \*\*\* ${tempname}[ 	][	]*[a-zA-Z0-9: ]*
! --- ${DEVNULL}[ 	][ 	]*${DEVNULL_TIME}
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 1 \*\*\*\*
  - first revision
***************
*** 2705,2711 ****
  ===================================================================
  RCS file: file1
  diff -N file1
! \*\*\* /dev/null[ 	][ 	]*[a-zA-Z0-9: ]*
  --- ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
--- 3030,3036 ----
  ===================================================================
  RCS file: file1
  diff -N file1
! \*\*\* ${DEVNULL}[ 	][ 	]*${DEVNULL_TIME}
  --- ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
***************
*** 2758,2763 ****
--- 3083,3089 ----
  	  # The ``no longer in the repository'' message doesn't really
  	  # look right to me, but that's what CVS currently prints for
  	  # this case.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest death2-14 "${testcvs} -q update -r branch" \
  "[UP] file1
  ${PROG} [a-z]*: file2 is no longer in the repository
***************
*** 2796,2802 ****
  ===================================================================
  RCS file: file3
  diff -N file3
! \*\*\* /dev/null[ 	][ 	]*[a-zA-Z0-9: ]*
  --- ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
--- 3122,3128 ----
  ===================================================================
  RCS file: file3
  diff -N file3
! \*\*\* ${DEVNULL}[ 	][ 	]*${DEVNULL_TIME}
  --- ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
***************
*** 2839,2845 ****
  ===================================================================
  RCS file: file2
  diff -N file2
! \*\*\* /dev/null[ 	][ 	]*[a-zA-Z0-9: ]*
  --- ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
--- 3165,3171 ----
  ===================================================================
  RCS file: file2
  diff -N file2
! \*\*\* ${DEVNULL}[ 	][ 	]*${DEVNULL_TIME}
  --- ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
***************
*** 2849,2855 ****
  ===================================================================
  RCS file: file3
  diff -N file3
! \*\*\* /dev/null[ 	][ 	]*[a-zA-Z0-9: ]*
  --- ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
--- 3175,3181 ----
  ===================================================================
  RCS file: file3
  diff -N file3
! \*\*\* ${DEVNULL}[ 	][ 	]*${DEVNULL_TIME}
  --- ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
***************
*** 2860,2872 ****
  RCS file: file4
  diff -N file4
  \*\*\* ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
! --- /dev/null[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 1 \*\*\*\*
  - file4 first revision
  --- 0 ----"
  
  	  # Switch to the nonbranch tag.
  	  dotest death2-19 "${testcvs} -q update -r tag" \
  "[UP] file1
  ${PROG} [a-z]*: file2 is no longer in the repository
--- 3186,3199 ----
  RCS file: file4
  diff -N file4
  \*\*\* ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
! --- ${DEVNULL}[ 	][ 	]*${DEVNULL_TIME}
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 1 \*\*\*\*
  - file4 first revision
  --- 0 ----"
  
  	  # Switch to the nonbranch tag.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest death2-19 "${testcvs} -q update -r tag" \
  "[UP] file1
  ${PROG} [a-z]*: file2 is no longer in the repository
***************
*** 2884,2890 ****
  ===================================================================
  RCS file: file1
  diff -N file1
! \*\*\* /dev/null[ 	][ 	]*[a-zA-Z0-9: ]*
  --- ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
--- 3211,3217 ----
  ===================================================================
  RCS file: file1
  diff -N file1
! \*\*\* ${DEVNULL}[ 	][ 	]*${DEVNULL_TIME}
  --- ${tempname}[ 	][ 	]*[a-zA-Z0-9: ]*
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  \*\*\* 0 \*\*\*\*
***************
*** 2936,2941 ****
--- 3263,3269 ----
  initial revision: 1.1
  done
  HERE
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 4:trunk-2 >file4
  	  dotest branches-3.2 "${testcvs} -q ci -m trunk-before-branch" \
  "Checking in file4;
***************
*** 2949,2961 ****
--- 3277,3292 ----
  T file2
  T file3
  T file4"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest branches-4 "${testcvs} tag -b br1" "${PROG}"' [a-z]*: Tagging \.
  T file1
  T file2
  T file3
  T file4'
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest branches-5 "${testcvs} update -r br1" \
  "${PROG}"' [a-z]*: Updating \.'
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 1:br1 >file1
  	  echo 2:br1 >file2
  	  echo 4:br1 >file4
***************
*** 2972,2982 ****
--- 3303,3316 ----
  ${TESTDIR}/cvsroot/first-dir/file4,v  <--  file4
  new revision: 1\.2\.2\.1; previous revision: 1\.2
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest branches-7 "${testcvs} -q tag -b brbr" 'T file1
  T file2
  T file3
  T file4'
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest branches-8 "${testcvs} -q update -r brbr" ''
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 1:brbr >file1
  	  echo 4:brbr >file4
  	  dotest branches-9 "${testcvs} -q ci -m modify" \
***************
*** 2992,2997 ****
--- 3326,3332 ----
  2:br1
  3:ancest
  4:brbr'
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest branches-11 "${testcvs} -q update -r br1" \
  '[UP] file1
  [UP] file4'
***************
*** 2999,3004 ****
--- 3334,3340 ----
  2:br1
  3:ancest
  4:br1'
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 4:br1-2 >file4
  	  dotest branches-12.2 "${testcvs} -q ci -m change-on-br1" \
  "Checking in file4;
***************
*** 3012,3017 ****
--- 3348,3354 ----
  2:ancest
  3:ancest
  4:trunk-2'
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 4:trunk-3 >file4
  	  dotest branches-14.2 \
  	    "${testcvs} -q ci -m trunk-change-after-branch" \
***************
*** 3152,3158 ****
--- 3489,3497 ----
  	  dotest branches2-4 "${testcvs} -q tag tag1" 'T file1'
  
  	  # Make two branches.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest branches2-5 "${testcvs} -q rtag -b -r tag1 b1 first-dir" ''
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest branches2-6 "${testcvs} -q rtag -b -r tag1 b2 first-dir" ''
  
  	  # Create some files and a subdirectory on branch b1.
***************
*** 3419,3424 ****
--- 3758,3764 ----
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  I am the first foo, and my name is \$""Name: first \$\."
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "I am the second foo, and my name is $""Name$." > foo.c
  	  dotest rcsdiff-6 "${testcvs} commit -m rev2 foo.c" \
  "Checking in foo\.c;
***************
*** 3447,3452 ****
--- 3787,3793 ----
  ---
  > I am the second foo, and my name is \$""Name:  \$\."
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "I am the once and future foo, and my name is $""Name$." > foo.c
  	  dotest_fail rcsdiff-10 "${testcvs} diff -r first" \
  "${PROG} [a-z]*: Diffing \.
***************
*** 3485,3490 ****
--- 3826,3832 ----
  ${TESTDIR}/cvsroot/first-dir/rgx\.c,v  <--  rgx\.c
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  cat >rgx.c <<EOF
  test_regex (whiz, bang)
  {
***************
*** 3549,3561 ****
--- 3891,3906 ----
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  sed -e 's/2/two/' file1 > f; mv f file1
  	  dotest rcslib-merge-6 "${testcvs} -q commit -m '' file1" \
  "Checking in file1;
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  new revision: 1\.2; previous revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest rcslib-merge-7 "${testcvs} -q tag -b -r 1.1 patch1" "T file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest rcslib-merge-8 "${testcvs} -q update -r patch1" "[UP] file1"
  	  dotest rcslib-merge-9 "${testcvs} -q status" \
  "===================================================================
***************
*** 3570,3575 ****
--- 3915,3921 ----
  '$''Revision: 1\.1 $
  2
  3'
+ 	  sleep ${FILESYSTEM_TICK}
  	  sed -e 's/3/three/' file1 > f; mv f file1
  	  dotest rcslib-merge-11 "${testcvs} -q commit -m '' file1" \
  "Checking in file1;
***************
*** 3594,3609 ****
  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 ..
  
--- 3940,3959 ----
  3
  [>]>>>>>> 1\.2"
  
! 	  if test x"${WONT_PRESERVE_PERMISSIONS}" = x; then
! 	    # 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"
! 	  else
! 	    echo "Won't run rcslib-symlink-* tests - WONT_PRESERVE_PERMISSIONS"
! 	  fi
  
  	  cd ..
  
***************
*** 3634,3661 ****
--- 3984,4019 ----
  initial revision: 1.1
  done
  HERE
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch-4 "${testcvs} tag -b br1" \
  "${PROG} [a-z]*: Tagging \.
  T file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch-5 "${testcvs} tag -b br2" \
  "${PROG} [a-z]*: Tagging \.
  T file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch-6 "${testcvs} -q update -r br1" ''
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo on-br1 >file1
  	  dotest multibranch-7 "${testcvs} -q ci -m modify-on-br1" \
  "Checking in file1;
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  new revision: 1\.1\.2\.1; previous revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch-8 "${testcvs} -q update -r br2" '[UP] file1'
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo br2 adds a line >>file1
  	  dotest multibranch-9 "${testcvs} -q ci -m modify-on-br2" \
  "Checking in file1;
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  new revision: 1\.1\.4\.1; previous revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch-10 "${testcvs} -q update -r br1" '[UP] file1'
  	  dotest multibranch-11 "cat file1" 'on-br1'
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch-12 "${testcvs} -q update -r br2" '[UP] file1'
  	  dotest multibranch-13 "cat file1" '1:trunk-1
  br2 adds a line'
***************
*** 3772,3777 ****
--- 4130,4136 ----
  		fi
  
  		# change
+ 		sleep ${FILESYSTEM_TICK}
  		echo local-change >> imported-f2
  
  		# commit
***************
*** 3789,3794 ****
--- 4148,4154 ----
  		fi
  
  		# update into the vendor branch.
+ 		sleep ${FILESYSTEM_TICK}
  		if ${CVS} update -rvendor-branch  ; then
  		    pass 102
  		else
***************
*** 3820,3825 ****
--- 4180,4186 ----
  
  		# second import - file4 deliberately unchanged
  		cd ../import-dir
+ 		sleep ${FILESYSTEM_TICK}
  		for i in 1 2 3 ; do
  			echo rev 2 of file $i >> imported-f"$i"
  		done
***************
*** 3862,3867 ****
--- 4223,4229 ----
  		done
  
  		# check vendor branch for file4
+ 		sleep ${FILESYSTEM_TICK}
  		if ${CVS} update -rvendor-branch  ; then
  		    pass 110
  		else
***************
*** 4077,4083 ****
  	    # 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;
--- 4439,4445 ----
  	    # 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 .${PROG} checkout. first"
  	    # The workaround is to leave off the "-r wip_test".
  	    dotest importc-8 "${testcvs} -q ci -m modify" \
  "Checking in cdir/cfile;
***************
*** 4214,4219 ****
--- 4576,4582 ----
  done"
  
  	  # Make a branch.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join-4 "${testcvs} -q tag -b branch ." \
  'T file3
  T file4
***************
*** 4222,4227 ****
--- 4585,4591 ----
  
  	  # Add file2 and file7, modify file4, and remove file6 and file8.
  	  echo 'first revision of file2' > file2
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'second revision of file4' > file4
  	  echo 'first revision of file7' > file7
  	  rm file6 file8
***************
*** 4273,4278 ****
--- 4637,4643 ----
  
  	  # Modify the files on the branch, so that T1 is not an
  	  # ancestor of the main line, and add file5
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'first branch revision of file3' > file3
  	  echo 'first branch revision of file4' > file4
  	  echo 'first branch revision of file6' > file6
***************
*** 4440,4445 ****
--- 4805,4811 ----
  	  # single revision.
  	  # The file2 handling is a bug; see above join-20.
  	  cd first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'third revision of file4' > file4
  	  dotest join-23 "${testcvs} -q update -jbranch ." \
  "U file1
***************
*** 4470,4480 ****
--- 4836,4848 ----
  U first-dir/file4
  U first-dir/file7'
  	  cd first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join-26 "${testcvs} -q tag -b br2" \
  "T file2
  T file3
  T file4
  T file7"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join-27 "${testcvs} -q update -r br2" ""
  	  # The handling of file8 here looks fishy to me.  I don't see
  	  # why it should be different from the case where we merge to
***************
*** 4523,4530 ****
--- 4891,4901 ----
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join2-5 "${testcvs} -q tag -b br1" "T file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join2-6 "${testcvs} -q update -r br1" ""
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'modify on branch' >>file1
  	  touch bradd
  	  dotest join2-6a "${testcvs} add bradd" \
***************
*** 4584,4589 ****
--- 4955,4961 ----
  	  # OK, the above is all well and good and has worked for some
  	  # time.  Now try the case where the file had been added on
  	  # the branch.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join2-16 "${testcvs} -q update -r br1" "[UP] file1"
  	  # The workaround is to update the whole directory.
  	  # The non-circumvented version won't work.  The reason is that
***************
*** 4641,4647 ****
--- 5013,5021 ----
  initial revision: 1\.1
  done"
  	  dotest join3-5 "${testcvs} -q tag -b br1" "T file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join3-6 "${testcvs} -q update -r br1" ""
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'br1:line1' >>file1
  	  dotest join3-7 "${testcvs} -q ci -m modify" \
  "Checking in file1;
***************
*** 4652,4662 ****
--- 5026,5039 ----
  	  # Now back to the trunk for:
  	  # another revision and another branch for file1.
  	  # add file2, which will exist on trunk and br2 but not br1.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join3-8 "${testcvs} -q update -A" "[UP] file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'trunk:line1' > file2
  	  dotest join3-8a "${testcvs} add file2" \
  "${PROG} [a-z]*: scheduling file .file2. for addition
  ${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'trunk:line1' >>file1
  	  dotest join3-9 "${testcvs} -q ci -m modify" \
  "Checking in file1;
***************
*** 4669,4678 ****
--- 5046,5057 ----
  ${TESTDIR}/cvsroot/first-dir/file2,v  <--  file2
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join3-10 "${testcvs} -q tag -b br2" "T file1
  T file2"
  
  	  # Before we actually have any revision on br2, let's try a join
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join3-11 "${testcvs} -q update -r br1" "[UP] file1
  ${PROG} [a-z]*: file2 is no longer in the repository"
  	  dotest join3-12 "${testcvs} -q update -j br2" \
***************
*** 4692,4700 ****
--- 5071,5081 ----
  	  rm file1
  
  	  # OK, we'll try the same thing with a revision on br2.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest join3-14 "${testcvs} -q update -r br2 file1" \
  "${PROG} [a-z]*: warning: file1 was lost
  U file1" "U file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'br2:line1' >>file1
  	  dotest join3-15 "${testcvs} -q ci -m modify file1" \
  "Checking in file1;
***************
*** 4703,4708 ****
--- 5084,5090 ----
  done"
  
  	  # OK, now we can join br2 to br1
+ 	  sleep ${FILESYSTEM_TICK} 
  	  dotest join3-16 "${testcvs} -q update -r br1 file1" "[UP] file1"
  	  # It may seem odd, to merge a higher branch into a lower
  	  # branch, but in fact CVS defines the ancestor as 1.1
***************
*** 4772,4777 ****
--- 5154,5160 ----
  		    pass 122
  		fi
  
+ 		sleep ${FILESYSTEM_TICK}
  		if ${CVS} update -rHEAD 2>&1 | grep longer ; then
  		    fail 123
  		else
***************
*** 4807,4812 ****
--- 5190,5196 ----
  done"
  
  	  # Make a branch.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest newb-123d "${testcvs} -q tag -b branch" "T a"
  
  	  # Check out the branch.
***************
*** 4911,4917 ****
  "${PROG} [a-z]*: Updating first-dir
  ===================================================================
  Checking out first-dir/a
! RCS:  ${TMPPWD}/cvsroot/first-dir/a,v
  VERS: 1\.1
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*"
  		if ${CVS} co first-dir ; then
--- 5295,5301 ----
  "${PROG} [a-z]*: Updating first-dir
  ===================================================================
  Checking out first-dir/a
! RCS:  ${TMPPWD}${SLASH}cvsroot${SLASH}first-dir${SLASH}a,v
  VERS: 1\.1
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*"
  		if ${CVS} co first-dir ; then
***************
*** 4927,4932 ****
--- 5311,5317 ----
  		fi
  
  		cd ../../1/first-dir
+ 		sleep ${FILESYSTEM_TICK}
  		echo add a line >>a
  		mkdir dir1
  		dotest conflicts-127b "${testcvs} add dir1" \
***************
*** 4948,4954 ****
  "${PROG} [a-z]*: Updating first-dir
  ===================================================================
  Checking out first-dir/a
! RCS:  ${TMPPWD}/cvsroot/first-dir/a,v
  VERS: 1\.2
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  add a line"
--- 5333,5339 ----
  "${PROG} [a-z]*: Updating first-dir
  ===================================================================
  Checking out first-dir/a
! RCS:  ${TMPPWD}${SLASH}cvsroot${SLASH}first-dir${SLASH}a,v
  VERS: 1\.2
  \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
  add a line"
***************
*** 4958,4963 ****
--- 5343,5349 ----
  		# Now go over the to the other working directory and
  		# start testing conflicts
  		cd 2/first-dir
+ 		sleep ${FILESYSTEM_TICK}
  		echo add a conflicting line >>a
  		dotest_fail conflicts-129 "${testcvs} -q ci -m changed" \
  "${PROG}"' [a-z]*: Up-to-date check failed for `a'\''
***************
*** 5007,5012 ****
--- 5393,5399 ----
  "${PROG} [a-z]*: file .a. had a conflict and has not been modified
  ${PROG} \[[a-z]* aborted\]: correct above errors first!"
  
+ 		sleep ${FILESYSTEM_TICK}
  		echo lame attempt at resolving it >>a
  		# Try to check in the file with the conflict markers in it.
  		dotest conflicts-status-2 "${testcvs} status a" \
***************
*** 5027,5032 ****
--- 5414,5420 ----
  
  		# OK, the user saw the warning (good user), and now
  		# resolves it for real.
+ 		sleep ${FILESYSTEM_TICK}
  		echo resolve conflict >a
  		dotest conflicts-status-3 "${testcvs} status a" \
  "===================================================================
***************
*** 5494,5499 ****
--- 5882,5888 ----
  U CVSROOT/rcsinfo
  U CVSROOT/taginfo
  U CVSROOT/verifymsg'
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "# made a change" >>CVSROOT/modules
  	  dotest modules-1d "${testcvs} -q ci -m add-modules" \
  "Checking in CVSROOT/modules;
***************
*** 5518,5523 ****
--- 5907,5913 ----
  U CVSROOT/rcsinfo
  U CVSROOT/taginfo
  U CVSROOT/verifymsg'
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "# made a change" >>CVSROOT/modules
  	  dotest modules-2d "${testcvs} -q ci -m add-modules" \
  "Checking in CVSROOT/modules;
***************
*** 5545,5550 ****
--- 5935,5941 ----
  U CVSROOT/rcsinfo
  U CVSROOT/taginfo
  U CVSROOT/verifymsg'
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "# made a change" >>CVSROOT/modules
  	  dotest modules-3g "${testcvs} -q ci -m add-modules" \
  "Checking in CVSROOT/modules;
***************
*** 5610,5615 ****
--- 6001,6007 ----
  	      fail 147
  	  fi
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo realmodule first-dir/subdir a >CVSROOT/modules
  	  echo dirmodule first-dir/subdir >>CVSROOT/modules
  	  echo namedmodule -d nameddir first-dir/subdir >>CVSROOT/modules
***************
*** 5736,5741 ****
--- 6128,6134 ----
  	  else
  	    fail 150h2
  	  fi
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo add line >>nameddir/a
  	  dotest 150h3 "${testcvs} -q co namedmodule" 'M nameddir/a'
  	  rm nameddir/a
***************
*** 5758,5763 ****
--- 6151,6157 ----
  	  else
  	      pass 152
  	  fi
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo abc >>first-dir/subdir/a
  	  if (${testcvs} -q co aliasmodule | tee test153.tmp) \
  	      >>${LOGFILE}; then
***************
*** 5888,5893 ****
--- 6282,6288 ----
  	  dotest modules2-1 "${testcvs} -q co CVSROOT/modules" \
  'U CVSROOT/modules'
  	  cd CVSROOT
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'ampermodule &first-dir &second-dir' > modules
  	  echo 'combmodule third-dir file3 &first-dir' >> modules
  	  # Depending on whether the user also ran the modules test
***************
*** 6020,6025 ****
--- 6415,6421 ----
  	  dotest modules2-a0.5 "${testcvs} -q co CVSROOT/modules" \
  'U CVSROOT/modules'
  	  cd CVSROOT
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'aliasopt -a -d onedir first-dir' >modules
  	  dotest modules2-a0 "${testcvs} -q ci -m add-modules" \
  "Checking in modules;
***************
*** 6071,6076 ****
--- 6467,6473 ----
  	  dotest modules3-4 "${testcvs} -q update -d CVSROOT" \
  "U CVSROOT${DOTSTAR}"
  	  cd CVSROOT
+ 	  sleep ${FILESYSTEM_TICK}
  	  cat >modules <<EOF
  mod1 -a first-dir/file1
  bigmod -a mod1 first-dir/file1
***************
*** 6261,6266 ****
--- 6658,6664 ----
  	  dotest modules4-7 "${testcvs} -q update -d CVSROOT" \
  "U CVSROOT${DOTSTAR}"
  	  cd CVSROOT
+ 	  sleep ${FILESYSTEM_TICK}
  	  cat >modules <<EOF
  all -a first-dir
  some -a !first-dir/subdir first-dir
***************
*** 7775,7780 ****
--- 8173,8179 ----
  	  mkdir 1; cd 1
  	  dotest emptydir-1 "${testcvs} co CVSROOT/modules" \
  "U CVSROOT/modules"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "# Module defs for emptydir tests" > CVSROOT/modules
  	  echo "2d1mod -d dir2d1/sub2d1 mod1" >> CVSROOT/modules
  
***************
*** 7979,7984 ****
--- 8378,8384 ----
  	  rm -rf ${TESTDIR}/1
  
  
+ 	if test x"${CANT_PROTECT_DIRS}" = x; then
  	  # Now try someplace where we don't have permission.
  	  mkdir ${TESTDIR}/barf
  	  chmod -w ${TESTDIR}/barf
***************
*** 7992,7997 ****
--- 8392,8400 ----
  	  chmod +w ${TESTDIR}/barf
  	  rmdir ${TESTDIR}/barf
  	  # Done.  Nothing to clean up.
+ 	else
+ 	  echo "didn't run abspath-4 - CANT_PROTECT_DIRS"
+ 	fi
  
  
  	  # Try checking out two modules into the same directory.
***************
*** 8083,8089 ****
  	  rm -r 1 2 3
  
  	  #
! 	  # FIXME: do other functions here (e.g. update /tmp/foo)
  	  #
  
  	  # Finished with all tests.  Remove the module.
--- 8486,8492 ----
  	  rm -r 1 2 3
  
  	  #
! 	  # FIXME: do other functions here (e.g. update ${TMPDIR}/foo)
  	  #
  
  	  # Finished with all tests.  Remove the module.
***************
*** 8193,8198 ****
--- 8596,8602 ----
  	  dotest toplevel-11 "${testcvs} -q update -d second-dir" \
  "U second-dir/file2"
  
+ 	if test x"${CANT_PROTECT_DIRS}" = x; then
  	  # Now remove the CVS directory (people may do this manually,
  	  # especially if they formed their habits with CVS
  	  # 1.9 and older, which didn't create it.  Or perhaps the working
***************
*** 8211,8216 ****
--- 8615,8623 ----
  ${PROG} [a-z]*: Updating top-dir"
  
  	  chmod +w ../1
+ 	else
+ 	  echo "didn't run toplevel-12 - CANT_PROTECT_DIRS"
+ 	fi
  
  	  dotest toplevel-cleanup-1 "${testcvs} -q co CVSROOT/config" \
  "U CVSROOT/config"
***************
*** 8387,8399 ****
  	  # can see the "CVS:" lines.
  	  cat >${TESTDIR}/editme <<EOF
  #!${TESTSHELL}
! sleep 1
! sed <\$1 -e 's/^/x/' >${TESTDIR}/edit.new
! mv ${TESTDIR}/edit.new \$1
  exit 0
  EOF
  	  chmod +x ${TESTDIR}/editme
  
  	  mkdir 1; cd 1
  	  dotest editor-1 "${testcvs} -q co -l ." ''
  	  mkdir first-dir
--- 8794,8865 ----
  	  # can see the "CVS:" lines.
  	  cat >${TESTDIR}/editme <<EOF
  #!${TESTSHELL}
! sleep 2
! sed <\$1 -e 's/^/x&/g' >${TESTDIR}/edit.new
! rm \$1
! sleep 2
! cp ${TESTDIR}/edit.new \$1
! rm ${TESTDIR}/edit.new
  exit 0
  EOF
+ 
+ # /* edhack.c */
+ # #include <stdio.h>
+ # #include <stdlib.h>
+ # 
+ # int main( int argc, const char * argv[] )
+ # {
+ #    static char editor[1024];
+ #    const char * testdir;
+ #    const char * testshell;
+ #    int argi;
+ # 
+ #    int iRc = system( NULL );
+ #    if (0 == iRc)
+ #       {
+ #       printf("Can't find a command processor to run system()\n");
+ #       return 1;
+ #       }
+ # 
+ #    testshell = getenv( "TESTSHELL" );
+ #    if (testshell)
+ #       {
+ #       strcpy( editor, testshell );
+ #       }
+ #    else
+ #       {
+ #       strcpy( editor, "sh" );
+ #       }
+ #    strcat( editor, " ");
+ # 
+ #    testdir = getenv( "TESTDIR" );
+ #    if (testdir)
+ #       {
+ #       strcat( editor, testdir );
+ #       strcat( editor, "/" );
+ #       }
+ #    strcat( editor, "editme" );
+ #    
+ #    for (argi = 1; argi < argc; ++argi)
+ #       {
+ #       strcat(editor," ");
+ #       strcat(editor, argv[argi] );
+ #       }
+ #    
+ # /*   printf("about to run:\"%s\"\n", editor); */
+ #    iRc = system( editor );
+ #    return iRc;
+ # }
+ 
  	  chmod +x ${TESTDIR}/editme
  
+ 	  if test x"${EDHACK_EDITOR}" = x; then
+ 	    EDITME_DO=${TESTDIR}/editme
+ 	  else
+ 	    EDITME_DO=edhack
+ 	    export TESTDIR
+ 	  fi
+ 
  	  mkdir 1; cd 1
  	  dotest editor-1 "${testcvs} -q co -l ." ''
  	  mkdir first-dir
***************
*** 8405,8411 ****
  "${PROG} [a-z]*: scheduling file .file1. for addition
  ${PROG} [a-z]*: scheduling file .file2. for addition
  ${PROG} [a-z]*: use .${PROG} commit. to add these files permanently"
! 	  dotest editor-4 "${testcvs} -e ${TESTDIR}/editme -q ci" \
  "RCS file: ${TESTDIR}/cvsroot/first-dir/file1,v
  done
  Checking in file1;
--- 8871,8877 ----
  "${PROG} [a-z]*: scheduling file .file1. for addition
  ${PROG} [a-z]*: scheduling file .file2. for addition
  ${PROG} [a-z]*: use .${PROG} commit. to add these files permanently"
! 	  dotest editor-4 "${testcvs} -e ${EDITME_DO} -q ci" \
  "RCS file: ${TESTDIR}/cvsroot/first-dir/file1,v
  done
  Checking in file1;
***************
*** 8418,8428 ****
  ${TESTDIR}/cvsroot/first-dir/file2,v  <--  file2
  initial revision: 1\.1
  done"
  	  dotest editor-5 "${testcvs} -q tag -b br" "T file1
  T file2"
  	  dotest editor-6 "${testcvs} -q update -r br" ''
  	  echo modify >>file1
! 	  dotest editor-7 "${testcvs} -e ${TESTDIR}/editme -q ci" \
  "Checking in file1;
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  new revision: 1\.1\.2\.1; previous revision: 1\.1
--- 8884,8897 ----
  ${TESTDIR}/cvsroot/first-dir/file2,v  <--  file2
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest editor-5 "${testcvs} -q tag -b br" "T file1
  T file2"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest editor-6 "${testcvs} -q update -r br" ''
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo modify >>file1
! 	  dotest editor-7 "${testcvs} -e ${EDITME_DO} -q ci" \
  "Checking in file1;
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  new revision: 1\.1\.2\.1; previous revision: 1\.1
***************
*** 8433,8440 ****
  	  # already on the branch.  If there were a revision on the branch,
  	  # CVS would correctly give an up-to-date check failed.
  	  dotest editor-8 "${testcvs} -q update -A" "U file1"
  	  echo add a line >>file2
! 	  dotest editor-9 "${testcvs} -q -e ${TESTDIR}/editme ci -rbr file2" \
  "Checking in file2;
  ${TESTDIR}/cvsroot/first-dir/file2,v  <--  file2
  new revision: 1\.1\.2\.1; previous revision: 1\.1
--- 8902,8910 ----
  	  # already on the branch.  If there were a revision on the branch,
  	  # CVS would correctly give an up-to-date check failed.
  	  dotest editor-8 "${testcvs} -q update -A" "U file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo add a line >>file2
! 	  dotest editor-9 "${testcvs} -q -e ${EDITME_DO} ci -rbr file2" \
  "Checking in file2;
  ${TESTDIR}/cvsroot/first-dir/file2,v  <--  file2
  new revision: 1\.1\.2\.1; previous revision: 1\.1
***************
*** 8601,8606 ****
--- 9071,9077 ----
  	  fi
  
  	  cd ../../2/1dir
+ 	if test x"${CANT_PROTECT_DIRS}" = x; then
  	  # FIXME: should be using dotest.
  	  ${testcvs} -q update 2>../tst167.err
  	  cat ../tst167.err >>${LOGFILE}
***************
*** 8615,8620 ****
--- 9086,9094 ----
  	  else
  	      fail 168
  	  fi
+ 	else
+ 	  echo "didn't run 168 (errmsg1) - CANT_PROTECT_DIRS"
+ 	fi
  
  	  cd ..
  	  chmod u+w 1dir
***************
*** 8818,8823 ****
--- 9292,9298 ----
  	      pass 178a
  	  fi
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  if ${testcvs} edit abb; then
  	      pass 179
  	  else
***************
*** 8836,8841 ****
--- 9311,9317 ----
  	      fail 181
  	  fi
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo aaaa >>abb
  	  if ${testcvs} ci -m modify abb >>${LOGFILE} 2>&1; then
  	      pass 182
***************
*** 8857,8868 ****
  	      pass 184
  	  fi
  
! 	  if test -w abb; then
! 	      fail 185
  	  else
! 	      pass 185
  	  fi
  
  	  if ${testcvs} edit abc; then
  	      pass 186a1
  	  else
--- 9333,9347 ----
  	      pass 184
  	  fi
  
! 
! 	  if test "x${OS_COMPILER_EMU}" = xwin32_msvc_cygwin32; then
! 	      echo 'devcom: (cygwin32 b19.1 test -w strange) - using attrib'
! 	      dotest 185 "attrib abb"  "A    R ${DOTSTAR}"
  	  else
! 	      dotest_fail 185 "test -w abb" ''
  	  fi
  
+ 
  	  if ${testcvs} edit abc; then
  	      pass 186a1
  	  else
***************
*** 8879,8884 ****
--- 9358,9364 ----
  	  else
  	      fail 186a3
  	  fi
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo changedabc >abc
  	  # Try to unedit a modified file; cvs should ask for confirmation
  	  if (echo no | ${testcvs} unedit abc) >>${LOGFILE}; then
***************
*** 8975,8982 ****
  	  cd 3
  	  dotest devcom-some1 "${testcvs} -q co first-dir" 'U first-dir/abb
  U first-dir/abc'
! 	  dotest devcom-some2 "test -w first-dir/abb" ''
! 	  dotest_fail devcom-some3 "test -w first-dir/abc" ''
  	  cd ..
  
  	  if test "$keep" = yes; then
--- 9455,9468 ----
  	  cd 3
  	  dotest devcom-some1 "${testcvs} -q co first-dir" 'U first-dir/abb
  U first-dir/abc'
! 	  if test "x${OS_COMPILER_EMU}" = xwin32_msvc_cygwin32; then
! 	    echo 'devcom: cygwin32 b19.1 test -w is very weird - using attrib instead'
! 	    dotest devcom-some2 "attrib first-dir\\abb" "A      ${DOTSTAR}"
! 	    dotest devcom-some2 "attrib first-dir\\abc" "A    R ${DOTSTAR}"
! 	  else
! 	    dotest devcom-some2 "test -w first-dir/abb" ''
! 	    dotest_fail devcom-some3 "test -w first-dir/abc" ''
! 	  fi
  	  cd ..
  
  	  if test "$keep" = yes; then
***************
*** 9031,9040 ****
  U first-dir/w1
  U first-dir/w2
  U first-dir/w3'
! 	  dotest devcom2-8 "test -w first-dir/nw1" ''
! 	  dotest_fail devcom2-9 "test -w first-dir/w1" ''
! 	  dotest_fail devcom2-10 "test -w first-dir/w2" ''
! 	  dotest_fail devcom2-11 "test -w first-dir/w3" ''
  
  	  cd first-dir
  	  # OK, now we want to try files in various states with cvs edit.
--- 9517,9534 ----
  U first-dir/w1
  U first-dir/w2
  U first-dir/w3'
! 	  if test "x${OS_COMPILER_EMU}" = xwin32_msvc_cygwin32; then
! 	    echo 'devcom2: cygwin32 b19.1 test -w is very weird - using attrib instead'
! 	    dotest devcom2-8 "attrib first-dir\\nw1" "A      ${DOTSTAR}"
! 	    dotest devcom2-9 "attrib first-dir\\w1" "A    R ${DOTSTAR}"
! 	    dotest devcom2-10 "attrib first-dir\\w2" "A    R ${DOTSTAR}"
! 	    dotest devcom2-11 "attrib first-dir\\w3" "A    R ${DOTSTAR}"
! 	  else
! 	    dotest devcom2-8 "test -w first-dir/nw1" ''
! 	    dotest_fail devcom2-9 "test -w first-dir/w1" ''
! 	    dotest_fail devcom2-10 "test -w first-dir/w2" ''
! 	    dotest_fail devcom2-11 "test -w first-dir/w3" ''
! 	  fi
  
  	  cd first-dir
  	  # OK, now we want to try files in various states with cvs edit.
***************
*** 9175,9186 ****
--- 9669,9684 ----
  	  dotest_fail watch4-8 "test -w first-dir/file1" ''
  	  dotest_fail watch4-9 "test -w first-dir/subdir/sfile" ''
  	  cd first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest watch4-10 "${testcvs} edit file1" ''
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'edited in 2' >file1
  	  cd ../..
  
  	  cd 1/first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest watch4-11 "${testcvs} edit file1" ''
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'edited in 1' >file1
  	  dotest watch4-12 "${testcvs} -q ci -m edit-in-1" \
  "Checking in file1;
***************
*** 9249,9256 ****
  
  	  # 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"
--- 9747,9756 ----
  
  	  # SunOS4.1.4 systems make it this far, but with a corrupted
  	  # CVS/Entries file.  Demonstrate the corruption!
+ 	  # Note there will tend to be a second "D" line which the DOTSTAR
+ 	  # matches.
  	  dotest unedit-without-baserev-5 "cat CVS/Entries" \
! 	    "/$file/1\.1\.1\.1/${DOTSTAR}"
  
  	  if test "$remote" = yes; then
  	    dotest unedit-without-baserev-6 "${testcvs} -q update" "U m"
***************
*** 9483,9488 ****
--- 9983,9989 ----
  	    </dev/null >binfile.dat
  	  cat binfile.dat binfile.dat >binfile2.dat
  	  cd first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  cp ../binfile.dat binfile
  	  dotest binfiles-2 "${testcvs} add -kb binfile" \
  "${PROG}"' [a-z]*: scheduling file `binfile'\'' for addition
***************
*** 9533,9538 ****
--- 10034,10040 ----
  	  rm -r 3
  	  cd 2/first-dir
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  cp ../../1/binfile2.dat binfile
  	  dotest binfiles-6 "${testcvs} -q ci -m modify-it" \
  "Checking in binfile;
***************
*** 9544,9549 ****
--- 10046,10052 ----
  	  dotest binfiles-8 "cmp ../binfile2.dat binfile" ''
  
  	  # Now test handling of conflicts with binary files.
+ 	  sleep ${FILESYSTEM_TICK}
  	  cp ../binfile.dat binfile
  	  dotest binfiles-con0 "${testcvs} -q ci -m modify-it" \
  "Checking in binfile;
***************
*** 9551,9556 ****
--- 10054,10060 ----
  new revision: 1\.3; previous revision: 1\.2
  done"
  	  cd ../../2/first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'edits in dir 2' >binfile
  	  dotest binfiles-con1 "${testcvs} -q update" \
  "U binfile
***************
*** 9561,9566 ****
--- 10065,10071 ----
  	  dotest binfiles-con2 "cmp binfile ../../1/binfile.dat" ''
  	  dotest binfiles-con3 "cat .#binfile.1.2" 'edits in dir 2'
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  cp ../../1/binfile2.dat binfile
  	  dotest binfiles-con4 "${testcvs} -q ci -m resolve-it" \
  "Checking in binfile;
***************
*** 9597,9603 ****
--- 10102,10110 ----
  	  rm -r 3
  
  	  cd 2/first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'this file is $''RCSfile$' >binfile
+ 	  lf_endlines binfile
  	  dotest binfiles-14a "${testcvs} -q ci -m modify-it" \
  "Checking in binfile;
  ${TESTDIR}/cvsroot/first-dir/binfile,v  <--  binfile
***************
*** 9782,9795 ****
--- 10289,10305 ----
  ${TESTDIR}/cvsroot/first-dir/brmod-wdmod,v  <--  brmod-wdmod
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest binfiles2-2 "${testcvs} -q tag -b br" 'T brmod
  T brmod-trmod
  T brmod-wdmod'
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest binfiles2-3 "${testcvs} -q update -r br" ''
  	  cp ../binfile binfile.dat
  	  dotest binfiles2-4 "${testcvs} add -kb binfile.dat" \
  "${PROG} [a-z]*: scheduling file .binfile\.dat. for addition on branch .br.
  ${PROG} [a-z]*: use .${PROG} commit. to add this file permanently"
+ 	  sleep ${FILESYSTEM_TICK}
  	  cp ../binfile2 brmod
  	  cp ../binfile2 brmod-trmod
  	  cp ../binfile2 brmod-wdmod
***************
*** 9819,9830 ****
--- 10329,10342 ----
  [UP] brmod-wdmod"
  	  dotest_fail binfiles2-7 "test -f binfile.dat" ''
  	  dotest binfiles2-7-brmod "cmp ../binfile brmod"
+ 	  sleep ${FILESYSTEM_TICK}
  	  cp ../binfile3 brmod-trmod
  	  dotest binfiles2-7a "${testcvs} -q ci -m tr-modify" \
  "Checking in brmod-trmod;
  ${TESTDIR}/cvsroot/first-dir/brmod-trmod,v  <--  brmod-trmod
  new revision: 1\.2; previous revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  cp ../binfile3 brmod-wdmod
  
  	  dotest binfiles2-8 "${testcvs} -q update -j br" \
***************
*** 9974,9984 ****
--- 10486,10499 ----
  	  # both.
  	  CVSWRAPPERS="* -m 'COPY'"
  	  export CVSWRAPPERS
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest mcopy-2 "${testcvs} -q tag -b br" 'T \.cvswrappers
  T brmod
  T brmod-trmod
  T brmod-wdmod'
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest mcopy-3 "${testcvs} -q update -r br" ''
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'modify brmod on br' >brmod
  	  echo 'modify brmod-trmod on br' >brmod-trmod
  	  echo 'modify brmod-wdmod on br' >brmod-wdmod
***************
*** 9995,10000 ****
--- 10510,10516 ----
  ${TESTDIR}/cvsroot/first-dir/brmod-wdmod,v  <--  brmod-wdmod
  new revision: 1\.1\.2\.1; previous revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest mcopy-6 "${testcvs} -q update -A" \
  "[UP] brmod
  [UP] brmod-trmod
***************
*** 10004,10015 ****
--- 10520,10533 ----
  brmod-trmod initial contents
  brmod-wdmod initial contents"
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'modify brmod-trmod again on trunk' >brmod-trmod
  	  dotest mcopy-7a "${testcvs} -q ci -m tr-modify" \
  "Checking in brmod-trmod;
  ${TESTDIR}/cvsroot/first-dir/brmod-trmod,v  <--  brmod-trmod
  new revision: 1\.2; previous revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'modify brmod-wdmod in working dir' >brmod-wdmod
  
  	  dotest mcopy-8 "${testcvs} -q update -j br" \
***************
*** 10250,10255 ****
--- 10768,10774 ----
            # This destroys anything currently in cvswrappers, but
  	  # presumably other tests will take care of it themselves if
  	  # they use cvswrappers:
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "foo*.sb  -k 'b'" > cvswrappers
  	  dotest binwrap3-2 "${testcvs} -q ci -m cvswrappers-mod" \
  "Checking in cvswrappers;
***************
*** 10409,10414 ****
--- 10928,10934 ----
  
  	  dotest mwrap-c1 "${testcvs} -q co CVSROOT" "[UP] CVSROOT${DOTSTAR}"
  	  cd CVSROOT
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "* -m 'COPY'" >>cvswrappers
  	  dotest mwrap-c2 "${testcvs} -q ci -m wrapper-mod" \
  "Checking in cvswrappers;
***************
*** 10438,10443 ****
--- 10958,10964 ----
  	  mkdir m2; cd m2
  	  dotest mwrap-5 "${testcvs} -q co first-dir" "U first-dir/aa"
  	  cd first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "changed in m2" >aa
  	  dotest mwrap-6 "${testcvs} -q ci -m m2-mod" \
  "Checking in aa;
***************
*** 10491,10504 ****
  
  	  dotest info-1 "${testcvs} -q co CVSROOT" "[UP] CVSROOT${DOTSTAR}"
  	  cd CVSROOT
  	  echo "ALL sh -c \"echo x\${=MYENV}\${=OTHER}y\${=ZEE}=\$USER=\$CVSROOT= >>$TESTDIR/testlog; cat >/dev/null\"" > loginfo
            # The following cases test the format string substitution
!           echo "ALL echo %{sVv} >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
!           echo "ALL echo %{v} >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
!           echo "ALL echo %s >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
!           echo "ALL echo %{V}AX >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
!           echo "first-dir echo %sux >>$TESTDIR/testlog2; cat >/dev/null" \
!             >> loginfo
  
  	  # Might be nice to move this to crerepos tests; it should
  	  # work to create a loginfo file if you didn't create one
--- 11012,11035 ----
  
  	  dotest info-1 "${testcvs} -q co CVSROOT" "[UP] CVSROOT${DOTSTAR}"
  	  cd CVSROOT
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "ALL sh -c \"echo x\${=MYENV}\${=OTHER}y\${=ZEE}=\$USER=\$CVSROOT= >>$TESTDIR/testlog; cat >/dev/null\"" > loginfo
            # The following cases test the format string substitution
!  	  if test x"${CANT_RUN_SCRIPTS}" = x; then
!            echo "ALL echo %{sVv} >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
!            echo "ALL echo %{v} >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
!            echo "ALL echo %s >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
!            echo "ALL echo %{V}AX >>$TESTDIR/testlog2; cat >/dev/null" >> loginfo
!            echo "first-dir echo %sux >>$TESTDIR/testlog2; cat >/dev/null" \
!               >> loginfo
! 	  else
! 	    echo "ALL ${TESTSHELL} -c \"echo %{sVv} >>$TESTDIR/testlog2; cat >/dev/null\"" >> loginfo
! 	    echo "ALL ${TESTSHELL} -c \"echo %{v} >>$TESTDIR/testlog2; cat >/dev/null\"" >> loginfo
! 	    echo "ALL ${TESTSHELL} -c \"echo %s >>$TESTDIR/testlog2; cat >/dev/null\"" >> loginfo
! 	    echo "ALL ${TESTSHELL} -c \"echo %{V}AX >>$TESTDIR/testlog2; cat >/dev/null\"" >> loginfo
! 	    echo "first-dir ${TESTSHELL} -c \"echo %sux >>$TESTDIR/testlog2; cat >/dev/null\"" \
!               >> loginfo
! 	  fi
  
  	  # Might be nice to move this to crerepos tests; it should
  	  # work to create a loginfo file if you didn't create one
***************
*** 10531,10537 ****
--- 11062,11070 ----
  initial revision: 1\.1
  done
  ${PROG} [a-z]*: loginfo:1: no such user variable \${=ZEE}"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo line1 >>file1
+ #	  dotest info-7 "${testcvs} -t -s OTHER=value -s ZEE=z ci -m mod-it" \
  	  dotest info-7 "${testcvs} -q -s OTHER=value -s ZEE=z ci -m mod-it" \
  "Checking in file1;
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
***************
*** 10539,10544 ****
--- 11072,11084 ----
  done"
  	  cd ..
  	  dotest info-9 "cat $TESTDIR/testlog" "xenv-valueyz=${username}=${TESTDIR}/cvsroot="
+ 
+ 	  # Windows-NT, Microsoft Visual C++ 4.2 does badly on info-10
+ 	  # for files that have %{sVv} substitutions.
+ 	  # src/logmsg.c(logfile_write) puts apostrophe around strings,
+ 	  # windows-NT/run.c(requote) changes these to quote.
+ 	  # windows-NT/run.c(run_popen) passes these to CMD.EXE.
+ 	  # 
            dotest info-10 "cat $TESTDIR/testlog2" 'first-dir file1,NONE,1.1
  first-dir 1.1
  first-dir file1
***************
*** 10551,10556 ****
--- 11091,11097 ----
  first-dir file1ux'
  
  	  cd CVSROOT
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo '# do nothing' >loginfo
  	  dotest info-11 "${testcvs} -q -s ZEE=garbage ci -m nuke-loginfo" \
  "Checking in loginfo;
***************
*** 10570,10576 ****
  fi
  EOF
  	  chmod +x ${TESTDIR}/vscript
! 	  echo "^first-dir ${TESTDIR}/vscript" >>verifymsg
  	  dotest info-v1 "${testcvs} -q ci -m add-verification" \
  "Checking in verifymsg;
  ${TESTDIR}/cvsroot/CVSROOT/verifymsg,v  <--  verifymsg
--- 11111,11121 ----
  fi
  EOF
  	  chmod +x ${TESTDIR}/vscript
! 	  if test x"${CANT_RUN_SCRIPTS}" = x; then
! 	    echo "^first-dir ${TESTDIR}/vscript" >>verifymsg
! 	  else
! 	    echo "^first-dir ${TESTSHELL} ${TESTDIR}/vscript" >>verifymsg
! 	  fi
  	  dotest info-v1 "${testcvs} -q ci -m add-verification" \
  "Checking in verifymsg;
  ${TESTDIR}/cvsroot/CVSROOT/verifymsg,v  <--  verifymsg
***************
*** 10606,10611 ****
--- 11151,11157 ----
  	  rmdir another-dir
  
  	  cd CVSROOT
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo '# do nothing' >verifymsg
  	  dotest info-cleanup-verifymsg "${testcvs} -q ci -m nuke-verifymsg" \
  "Checking in verifymsg;
***************
*** 10750,10755 ****
--- 11296,11302 ----
  
  	  dotest config-1 "${testcvs} -q co CVSROOT" "U CVSROOT/${DOTSTAR}"
  	  cd CVSROOT
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'bogus line' >config
  	  # We can't rely on specific revisions, since other tests
  	  # might need to modify CVSROOT/config
***************
*** 10759,10764 ****
--- 11306,11312 ----
  new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
  done
  ${PROG} [a-z]*: Rebuilding administrative file database"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'BogusOption=yes' >config
  	  dotest config-4 "${testcvs} -q ci -m change-to-bogus-opt" \
  "${PROG} [a-z]*: syntax error in ${TESTDIR}/cvsroot/CVSROOT/config: line 'bogus line' is missing '='
***************
*** 10767,10772 ****
--- 11315,11321 ----
  new revision: 1\.[0-9]*; previous revision: 1\.[0-9]*
  done
  ${PROG} [a-z]*: Rebuilding administrative file database"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo '# No config is a good config' > config
  	  dotest config-5 "${testcvs} -q ci -m change-to-comment" \
  "${PROG} [a-z]*: ${TESTDIR}/cvsroot/CVSROOT/config: unrecognized keyword 'BogusOption'
***************
*** 10885,10890 ****
--- 11434,11440 ----
  done"
  	  rm -f ${TESTDIR}/comment.tmp
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'second revision' > file1
  	  dotest log-4 "${testcvs} -q ci -m2 file1" \
  "Checking in file1;
***************
*** 10892,10899 ****
--- 11442,11451 ----
  new revision: 1\.2; previous revision: 1\.1
  done"
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest log-5 "${testcvs} -q tag -b branch file1" 'T file1'
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'third revision' > file1
  	  dotest log-6 "${testcvs} -q ci -m3 file1" \
  "Checking in file1;
***************
*** 10901,10908 ****
--- 11453,11462 ----
  new revision: 1\.3; previous revision: 1\.2
  done"
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest log-7 "${testcvs} -q update -r branch" '[UP] file1'
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'first branch revision' > file1
  	  dotest log-8 "${testcvs} -q ci -m1b file1" \
  "Checking in file1;
***************
*** 10912,10917 ****
--- 11466,11472 ----
  
  	  dotest log-9 "${testcvs} -q tag tag file1" 'T file1'
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'second branch revision' > file1
  	  dotest log-10 "${testcvs} -q ci -m2b file1" \
  "Checking in file1;
***************
*** 11263,11268 ****
--- 11818,11824 ----
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  cat >file1 <<EOF
  this
  is
***************
*** 11279,11285 ****
--- 11835,11843 ----
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  new revision: 1\.2; previous revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest ann-6 "${testcvs} -q tag -b br" "T file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  cat >file1 <<EOF
  this
  is
***************
*** 11296,11302 ****
--- 11854,11862 ----
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  new revision: 1\.3; previous revision: 1\.2
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest ann-8 "${testcvs} -q update -r br" "[UP] file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  cat >file1 <<EOF
  this
  is
***************
*** 11427,11445 ****
  
  	    # First, if the repository doesn't exist at all...
  	    dotest_fail crerepos-1 \
! "${testcvs} -d ${TESTDIR}/crerepos co cvs-sanity" \
  "${PROG} \[[a-z]* aborted\]: ${TESTDIR}/crerepos/CVSROOT: .*"
  	    mkdir crerepos
  
  	    # The repository exists but CVSROOT doesn't.
  	    dotest_fail crerepos-2 \
! "${testcvs} -d ${TESTDIR}/crerepos co cvs-sanity" \
  "${PROG} \[[a-z]* aborted\]: ${TESTDIR}/crerepos/CVSROOT: .*"
  	    mkdir crerepos/CVSROOT
  
  	    # Checkout of nonexistent module
  	    dotest_fail crerepos-3 \
! "${testcvs} -d ${TESTDIR}/crerepos co cvs-sanity" \
  "${PROG} [a-z]*: cannot find module .cvs-sanity. - ignored"
  
  	    # Now test that CVS works correctly without a modules file
--- 11987,12005 ----
  
  	    # First, if the repository doesn't exist at all...
  	    dotest_fail crerepos-1 \
! "${testcvs} -d :local:${TESTDIR}/crerepos co cvs-sanity" \
  "${PROG} \[[a-z]* aborted\]: ${TESTDIR}/crerepos/CVSROOT: .*"
  	    mkdir crerepos
  
  	    # The repository exists but CVSROOT doesn't.
  	    dotest_fail crerepos-2 \
! "${testcvs} -d :local:${TESTDIR}/crerepos co cvs-sanity" \
  "${PROG} \[[a-z]* aborted\]: ${TESTDIR}/crerepos/CVSROOT: .*"
  	    mkdir crerepos/CVSROOT
  
  	    # Checkout of nonexistent module
  	    dotest_fail crerepos-3 \
! "${testcvs} -d :local:${TESTDIR}/crerepos co cvs-sanity" \
  "${PROG} [a-z]*: cannot find module .cvs-sanity. - ignored"
  
  	    # Now test that CVS works correctly without a modules file
***************
*** 11449,11458 ****
  	    # been created with an old version of CVS.
  	    mkdir tmp; cd tmp
  	    dotest crerepos-4 \
! "${testcvs} -q -d ${TESTDIR}/crerepos co CVSROOT" \
  ''
  	    if echo yes | \
! ${testcvs} -d ${TESTDIR}/crerepos release -d CVSROOT >>${LOGFILE}; then
  	      pass crerepos-5
  	    else
  	      fail crerepos-5
--- 12009,12018 ----
  	    # been created with an old version of CVS.
  	    mkdir tmp; cd tmp
  	    dotest crerepos-4 \
! "${testcvs} -q -d :local:${TESTDIR}/crerepos co CVSROOT" \
  ''
  	    if echo yes | \
! ${testcvs} -d :local:${TESTDIR}/crerepos release -d CVSROOT >>${LOGFILE}; then
  	      pass crerepos-5
  	    else
  	      fail crerepos-5
***************
*** 11462,11468 ****
  	    # The directory tmp should be empty
  	    dotest crerepos-6 "rmdir tmp" ''
  
! 	    CREREPOS_ROOT=${TESTDIR}/crerepos
  
  	  else
  	    # For remote, just create the repository.  We don't yet do
--- 12022,12028 ----
  	    # The directory tmp should be empty
  	    dotest crerepos-6 "rmdir tmp" ''
  
! 	    CREREPOS_ROOT=:local:${TESTDIR}/crerepos
  
  	  else
  	    # For remote, just create the repository.  We don't yet do
***************
*** 11686,11691 ****
--- 12246,12252 ----
  @d2 12
  @
  EOF
+ 	  lf_endlines ${CVSROOT_DIRNAME}/first-dir/file1,v
  	  dotest rcs-1 "${testcvs} -q co first-dir" 'U first-dir/file1'
  	  cd first-dir
  	  dotest rcs-2 "${testcvs} -q log" "
***************
*** 11795,11800 ****
--- 12356,12384 ----
  	  # 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.
+ 
+ 	  # Windows-NT, Microsoft Visual C++ 4.2, Novell IntraNetware
+ 	  # Client 4.11a does badly on rcs-5 when the /tmp is on Netware
+ 	  # server.
+ 	  # src/vers-ts.c(Version-TS) does utime (finfo->file, &t) with
+ 	  # t.actime = t.modtime = 31564805 which causes modified time 
+ 	  # of file2 to be set to 1 jan 2099 (rather than 1 jan 1971).
+ 	  # Looks to me like Netware counts file times from 1 jan 1980 0:0:0.
+ 	  # Here is some mush to use dates in 1980 rather than 1971 when
+ 	  # it looks like we have Netware
+ 
+ 	  DECADE="7"
+ 	  if touch -t123123591979.59 netware; then
+ 	    if $EXPR "`ls -l netware`" : \
+ 	       "${DOTSTAR}1979${DOTSTAR}" >/dev/null; then
+ 	      : base date probably before 1980
+ 	    else
+ 	      echo "I think you are using a Netware Fileserver"
+ 	      DECADE="8"
+ 	    fi
+ 	  fi
+ 	  rm netware
+ 	  
  	  cat <<EOF >${CVSROOT_DIRNAME}/first-dir/file2,v
  head			 	1.5                 ;
       branch        1.2.6;
***************
*** 11802,11813 ****
  symbols branch:1.2.6;
  locks;
  testofanewphrase @without newphrase we'd have trouble extending @@ all@ ;
! 1.5 date 71.01.01.01.00.00; author joe; state bogus; branches; next 1.4;
! 1.4 date 71.01.01.00.00.05; author joe; state bogus; branches; next 1.3;
! 1.3 date 70.12.31.15.00.05; author joe; state bogus; branches; next 1.2;
! 1.2 date 70.12.31.12.15.05; author me; state bogus; branches 1.2.6.1; next 1.1;
! 1.1 date 70.12.31.11.00.05; author joe; state bogus; branches; next; newph;
! 1.2.6.1 date 71.01.01.08.00.05; author joe; state Exp; branches; next;
  desc @@
  1.5 log @@ newphrase1; newphrase2 42; text @head revision@
  1.4 log @@ text @d1 1
--- 12386,12397 ----
  symbols branch:1.2.6;
  locks;
  testofanewphrase @without newphrase we'd have trouble extending @@ all@ ;
! 1.5 date ${DECADE}1.01.01.01.00.00; author joe; state bogus; branches; next 1.4;
! 1.4 date ${DECADE}1.01.01.00.00.05; author joe; state bogus; branches; next 1.3;
! 1.3 date ${DECADE}0.12.31.15.00.05; author joe; state bogus; branches; next 1.2;
! 1.2 date ${DECADE}0.12.31.12.15.05; author me; state bogus; branches 1.2.6.1; next 1.1;
! 1.1 date ${DECADE}0.12.31.11.00.05; author joe; state bogus; branches; next; newph;
! 1.2.6.1 date ${DECADE}1.01.01.08.00.05; author joe; state Exp; branches; next;
  desc @@
  1.5 log @@ newphrase1; newphrase2 42; text @head revision@
  1.4 log @@ text @d1 1
***************
*** 11829,11841 ****
--- 12413,12429 ----
  EOF
  	  # ' Match the single quote in above here doc -- for font-lock mode.
  
+ 	  lf_endlines ${CVSROOT_DIRNAME}/first-dir/file2,v
+ 
  	  # First test the default branch.
  	  dotest rcs-5 "${testcvs} -q update file2" "U file2"
  	  dotest rcs-6 "cat file2" "branch revision"
  
  	  # Check in a revision on the branch to force CVS to
  	  # interpret every revision in the file.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest rcs-6a "${testcvs} -q update -r branch file2" ""
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "next branch revision" > file2
  	  dotest rcs-6b "${testcvs} -q ci -m mod file2" \
  "Checking in file2;
***************
*** 11866,11899 ****
  testofanewphrase	@without newphrase we'd have trouble extending @@ all@;
  
  1\.5
! date	71\.01\.01\.01\.00\.00;	author joe;	state bogus;
  branches;
  next	1\.4;
  
  1\.4
! date	71\.01\.01\.00\.00\.05;	author joe;	state bogus;
  branches;
  next	1\.3;
  
  1\.3
! date	70\.12\.31\.15\.00\.05;	author joe;	state bogus;
  branches;
  next	1\.2;
  
  1\.2
! date	70\.12\.31\.12\.15\.05;	author me;	state bogus;
  branches
  	1\.2\.6\.1;
  next	1\.1;
  
  1\.1
! date	70\.12\.31\.11\.00\.05;	author joe;	state bogus;
  branches;
  next	;
  newph	;
  
  1\.2\.6\.1
! date	71\.01\.01\.08\.00\.05;	author joe;	state Exp;
  branches;
  next	1\.2\.6\.2;
  
--- 12454,12487 ----
  testofanewphrase	@without newphrase we'd have trouble extending @@ all@;
  
  1\.5
! date	${DECADE}1\.01\.01\.01\.00\.00;	author joe;	state bogus;
  branches;
  next	1\.4;
  
  1\.4
! date	${DECADE}1\.01\.01\.00\.00\.05;	author joe;	state bogus;
  branches;
  next	1\.3;
  
  1\.3
! date	${DECADE}0\.12\.31\.15\.00\.05;	author joe;	state bogus;
  branches;
  next	1\.2;
  
  1\.2
! date	${DECADE}0\.12\.31\.12\.15\.05;	author me;	state bogus;
  branches
  	1\.2\.6\.1;
  next	1\.1;
  
  1\.1
! date	${DECADE}0\.12\.31\.11\.00\.05;	author joe;	state bogus;
  branches;
  next	;
  newph	;
  
  1\.2\.6\.1
! date	${DECADE}1\.01\.01\.08\.00\.05;	author joe;	state Exp;
  branches;
  next	1\.2\.6\.2;
  
***************
*** 11971,11977 ****
  next branch revision
  @"
  
! 	  if ${testcvs} -q update -p -D '1970-12-31 11:30 UT' file2 \
  	      >${TESTDIR}/rcs4.tmp
  	  then
  	    dotest rcs-9 "cat ${TESTDIR}/rcs4.tmp" "start revision"
--- 12559,12565 ----
  next branch revision
  @"
  
! 	  if ${testcvs} -q update -p -D "19${DECADE}0-12-31 11:30 UT" file2 \
  	      >${TESTDIR}/rcs4.tmp
  	  then
  	    dotest rcs-9 "cat ${TESTDIR}/rcs4.tmp" "start revision"
***************
*** 11979,11985 ****
  	    fail rcs-9
  	  fi
  
! 	  if ${testcvs} -q update -p -D '1970-12-31 12:30 UT' file2 \
  	      >${TESTDIR}/rcs4.tmp
  	  then
  	    dotest rcs-10 "cat ${TESTDIR}/rcs4.tmp" "mid revision"
--- 12567,12573 ----
  	    fail rcs-9
  	  fi
  
! 	  if ${testcvs} -q update -p -D "19${DECADE}0-12-31 12:30 UT" file2 \
  	      >${TESTDIR}/rcs4.tmp
  	  then
  	    dotest rcs-10 "cat ${TESTDIR}/rcs4.tmp" "mid revision"
***************
*** 11987,11993 ****
  	    fail rcs-10
  	  fi
  
! 	  if ${testcvs} -q update -p -D '1971-01-01 00:30 UT' file2 \
  	      >${TESTDIR}/rcs4.tmp
  	  then
  	    dotest rcs-11 "cat ${TESTDIR}/rcs4.tmp" "new year revision"
--- 12575,12581 ----
  	    fail rcs-10
  	  fi
  
! 	  if ${testcvs} -q update -p -D "19${DECADE}1-01-01 00:30 UT" file2 \
  	      >${TESTDIR}/rcs4.tmp
  	  then
  	    dotest rcs-11 "cat ${TESTDIR}/rcs4.tmp" "new year revision"
***************
*** 11996,12002 ****
  	  fi
  
  	  # Same test as rcs-10, but with am/pm.
! 	  if ${testcvs} -q update -p -D 'December 31, 1970 12:30pm UT' file2 \
  	      >${TESTDIR}/rcs4.tmp
  	  then
  	    dotest rcs-12 "cat ${TESTDIR}/rcs4.tmp" "mid revision"
--- 12584,12590 ----
  	  fi
  
  	  # Same test as rcs-10, but with am/pm.
! 	  if ${testcvs} -q update -p -D "December 31, 19${DECADE}0 12:30pm UT" file2 \
  	      >${TESTDIR}/rcs4.tmp
  	  then
  	    dotest rcs-12 "cat ${TESTDIR}/rcs4.tmp" "mid revision"
***************
*** 12005,12011 ****
  	  fi
  
  	  # Same test as rcs-11, but with am/pm.
! 	  if ${testcvs} -q update -p -D 'January 1, 1971 12:30am UT' file2 \
  	      >${TESTDIR}/rcs4.tmp
  	  then
  	    dotest rcs-13 "cat ${TESTDIR}/rcs4.tmp" "new year revision"
--- 12593,12599 ----
  	  fi
  
  	  # Same test as rcs-11, but with am/pm.
! 	  if ${testcvs} -q update -p -D "January 1, 19${DECADE}1 12:30am UT" file2 \
  	      >${TESTDIR}/rcs4.tmp
  	  then
  	    dotest rcs-13 "cat ${TESTDIR}/rcs4.tmp" "new year revision"
***************
*** 12029,12052 ****
  description:
  ----------------------------
  revision 1\.5
! date: 1971/01/01 01:00:00;  author: joe;  state: bogus;  lines: ${PLUS}1 -1
  \*\*\* empty log message \*\*\*
  ----------------------------
  revision 1\.4
! date: 1971/01/01 00:00:05;  author: joe;  state: bogus;  lines: ${PLUS}1 -1
  \*\*\* empty log message \*\*\*
  ----------------------------
  revision 1\.3
! date: 1970/12/31 15:00:05;  author: joe;  state: bogus;  lines: ${PLUS}1 -1
  \*\*\* empty log message \*\*\*
  ----------------------------
  revision 1\.2
! date: 1970/12/31 12:15:05;  author: me;  state: bogus;  lines: ${PLUS}1 -1
  branches:  1\.2\.6;
  \*\*\* empty log message \*\*\*
  ----------------------------
  revision 1\.1
! date: 1970/12/31 11:00:05;  author: joe;  state: bogus;
  \*\*\* empty log message \*\*\*
  ----------------------------
  revision 1\.2\.6\.2
--- 12617,12640 ----
  description:
  ----------------------------
  revision 1\.5
! date: 19${DECADE}1/01/01 01:00:00;  author: joe;  state: bogus;  lines: ${PLUS}1 -1
  \*\*\* empty log message \*\*\*
  ----------------------------
  revision 1\.4
! date: 19${DECADE}1/01/01 00:00:05;  author: joe;  state: bogus;  lines: ${PLUS}1 -1
  \*\*\* empty log message \*\*\*
  ----------------------------
  revision 1\.3
! date: 19${DECADE}0/12/31 15:00:05;  author: joe;  state: bogus;  lines: ${PLUS}1 -1
  \*\*\* empty log message \*\*\*
  ----------------------------
  revision 1\.2
! date: 19${DECADE}0/12/31 12:15:05;  author: me;  state: bogus;  lines: ${PLUS}1 -1
  branches:  1\.2\.6;
  \*\*\* empty log message \*\*\*
  ----------------------------
  revision 1\.1
! date: 19${DECADE}0/12/31 11:00:05;  author: joe;  state: bogus;
  \*\*\* empty log message \*\*\*
  ----------------------------
  revision 1\.2\.6\.2
***************
*** 12054,12060 ****
  mod
  ----------------------------
  revision 1\.2\.6\.1
! date: 1971/01/01 08:00:05;  author: joe;  state: Exp;  lines: ${PLUS}1 -1
  \*\*\* empty log message \*\*\*
  ============================================================================="
  	  cd ..
--- 12642,12648 ----
  mod
  ----------------------------
  revision 1\.2\.6\.1
! date: 19${DECADE}1/01/01 08:00:05;  author: joe;  state: Exp;  lines: ${PLUS}1 -1
  \*\*\* empty log message \*\*\*
  ============================================================================="
  	  cd ..
***************
*** 12106,12111 ****
--- 12694,12700 ----
  EOF
  	  # ' Match the 3rd single quote in the here doc -- for font-lock mode.
  
+ 	  lf_endlines ${CVSROOT_DIRNAME}/first-dir/file1,v
  	  dotest rcs2-1 "${testcvs} -q co first-dir" 'U first-dir/file1'
  	  cd first-dir
  
***************
*** 12170,12175 ****
--- 12759,12765 ----
  C3b235f50|kingdon|<remote>|ccvs/emx|1.3|README
  M3b23af50|kingdon|~/work/*0|ccvs/doc|1.281|cvs.texinfo
  EOF
+ 	  lf_endlines ${CVSROOT_DIRNAME}/CVSROOT/history
  	  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
***************
*** 12348,12355 ****
--- 12938,12947 ----
  
  	  # OK, now add a file on a branch.  Check that the mode gets
  	  # set the same way (it is a different code path in CVS).
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest modes-11 "${testcvs} -q tag -b br" 'T aa
  T ab'
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest modes-12 "${testcvs} -q update -r br" ''
  	  touch ac
  	  dotest modes-13 "${testcvs} add ac" \
***************
*** 12797,12802 ****
--- 13389,13395 ----
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  new revision: 1\.2; previous revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest sticky-7 "${testcvs} -q update -r tag1" "[UP] file1"
  	  dotest sticky-8 "cat file1" ''
  	  dotest sticky-9 "${testcvs} -q update" ''
***************
*** 12819,12824 ****
--- 13412,13418 ----
  done"
  
  	  # Now back to tag1
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest sticky-15 "${testcvs} -q update -r tag1" "[UP] file1
  ${PROG} [a-z]*: file2 is no longer in the repository"
  
***************
*** 12832,12837 ****
--- 13426,13432 ----
  	  dotest sticky-17 "${testcvs} -q ci -m remove-it" ""
  	  dotest sticky-18 "${testcvs} -q update -A" "U file1
  U file2"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest sticky-19 "${testcvs} -q update -r tag1" \
  "${PROG} [a-z]*: file1 is no longer in the repository
  ${PROG} [a-z]*: file2 is no longer in the repository"
***************
*** 12839,12844 ****
--- 13434,13440 ----
  U file2"
  
  	  # Now try with a numeric revision.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest sticky-21 "${testcvs} -q update -r 1.1 file1" "U file1"
  	  rm file1
  	  dotest sticky-22 "${testcvs} rm file1" \
***************
*** 13034,13041 ****
--- 13630,13639 ----
  
  	  # Test the Name keyword.  First go back to normal expansion.
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest keyword-17 "${testcvs} update -A file1" "U file1"
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo '$''Name$' > file1
  	  dotest keyword-18 "${testcvs} ci -m modify file1" \
  "Checking in file1;
***************
*** 13043,13054 ****
--- 13641,13654 ----
  new revision: 1\.2; previous revision: 1\.1
  done"
  	  dotest keyword-19 "${testcvs} -q tag tag1" "T file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "change" >> file1
  	  dotest keyword-20 "${testcvs} -q ci -m mod2 file1" \
  "Checking in file1;
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  new revision: 1\.3; previous revision: 1\.2
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest keyword-21 "${testcvs} -q update -r tag1" "[UP] file1"
  
  	  # FIXME: This test fails when remote.  The second expect
***************
*** 13094,13099 ****
--- 13694,13700 ----
  	  dotest keywordlog-4a "${testcvs} -q co first-dir" "U first-dir/file1"
  	  cd ../1/first-dir
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'xx $''Log$' > file1
  	  cat >${TESTDIR}/comment.tmp <<EOF
  First log line
***************
*** 13105,13110 ****
--- 13706,13712 ----
  new revision: 1\.2; previous revision: 1\.1
  done"
  	  rm -f ${TESTDIR}/comment.tmp
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest keywordlog-6 "${testcvs} -q tag -b br" "T file1"
  	  dotest keywordlog-7 "cat file1" \
  "xx "'\$'"Log: file1,v "'\$'"
***************
*** 13123,13128 ****
--- 13725,13731 ----
  xx"
  	  cd ../../1/first-dir
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "change" >> file1
  	  dotest keywordlog-10 "${testcvs} ci -m modify file1" \
  "Checking in file1;
***************
*** 13154,13160 ****
--- 13757,13765 ----
  change"
  
  	  cd ../../1/first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest keywordlog-14 "${testcvs} -q update -r br" "[UP] file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo br-change >>file1
  	  dotest keywordlog-15 "${testcvs} -q ci -m br-modify" \
  "Checking in file1;
***************
*** 13172,13177 ****
--- 13777,13783 ----
  xx
  br-change"
  	  cd ../../2/first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest keywordlog-17 "${testcvs} -q update -r br" "[UP] file1"
  	  dotest keywordlog-18 "cat file1" \
  "xx "'\$'"Log: file1,v "'\$'"
***************
*** 13243,13248 ****
--- 13849,13855 ----
  "U first-dir/file1
  U first-dir/file2"
  	  cd first-dir
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'add a line on trunk' >> file1
  	  dotest head-3 "${testcvs} -q ci -m modify" \
  "Checking in file1;
***************
*** 13251,13265 ****
--- 13858,13876 ----
  done"
  	  dotest head-4 "${testcvs} -q tag trunktag" "T file1
  T file2"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'add a line on trunk after trunktag' >> file1
  	  dotest head-5 "${testcvs} -q ci -m modify" \
  "Checking in file1;
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  new revision: 1\.3; previous revision: 1\.2
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest head-6 "${testcvs} -q tag -b br1" "T file1
  T file2"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest head-7 "${testcvs} -q update -r br1" ""
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'modify on branch' >>file1
  	  dotest head-8 "${testcvs} -q ci -m modify" \
  "Checking in file1;
***************
*** 13268,13273 ****
--- 13879,13885 ----
  done"
  	  dotest head-9 "${testcvs} -q tag brtag" "T file1
  T file2"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'modify on branch after brtag' >>file1
  	  dotest head-10 "${testcvs} -q ci -m modify" \
  "Checking in file1;
***************
*** 13276,13281 ****
--- 13888,13894 ----
  done"
  	  # With no sticky tags, HEAD is the head of the trunk.
  	  dotest head-trunk-setup "${testcvs} -q update -A" "[UP] file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest head-trunk-update "${testcvs} -q update -r HEAD -p file1" \
  "imported contents
  add a line on trunk
***************
*** 13301,13307 ****
--- 13914,13922 ----
  ${PLUS} modify on branch after brtag"
  
  	  # With a branch sticky tag, HEAD is the head of the trunk.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest head-br1-setup "${testcvs} -q update -r br1" "[UP] file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest head-br1-update "${testcvs} -q update -r HEAD -p file1" \
  "imported contents
  add a line on trunk
***************
*** 13312,13318 ****
--- 13927,13935 ----
  
  	  # With a nonbranch sticky tag on a branch,
  	  # HEAD is the head of the trunk
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest head-brtag-setup "${testcvs} -q update -r brtag" "[UP] file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest head-brtag-update "${testcvs} -q update -r HEAD -p file1" \
  "imported contents
  add a line on trunk
***************
*** 13325,13334 ****
--- 13942,13953 ----
  
  	  # With a nonbranch sticky tag on the trunk, HEAD is the head
  	  # of the trunk, I think.
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest head-trunktag-setup "${testcvs} -q update -r trunktag" \
  "[UP] file1"
  	  dotest head-trunktag-check "cat file1" "imported contents
  add a line on trunk"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest head-trunktag-update "${testcvs} -q update -r HEAD -p file1" \
  "imported contents
  add a line on trunk
***************
*** 13403,13410 ****
--- 14022,14032 ----
  ${TESTDIR}/cvsroot/first-dir/file1,v  <--  file1
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest tagdate-5 "${testcvs} -q tag -b br1" "T file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest tagdate-6 "${testcvs} -q tag -b br2" "T file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo trunk-2 >file1
  	  dotest tagdate-7 "${testcvs} -q ci -m modify-on-trunk" \
  "Checking in file1;
***************
*** 13415,13421 ****
--- 14037,14045 ----
  	  # any revisions.  First the case where br2 doesn't have any
  	  # revisions either:
  	  dotest tagdate-8 "${testcvs} -q update -p -r br1 -D now" "trunk-1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest tagdate-9 "${testcvs} -q update -r br2" "[UP] file1"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo br2-1 >file1
  	  dotest tagdate-10 "${testcvs} -q ci -m modify-on-br2" \
  "Checking in file1;
***************
*** 13461,13472 ****
--- 14085,14100 ----
  ${TESTDIR}/cvsroot/first-dir/file2,v  <--  file2
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch2-5 "${testcvs} -q tag -b A" "T file1
  T file2"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch2-6 "${testcvs} -q tag -b B" "T file1
  T file2"
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch2-7 "${testcvs} -q update -r B" ''
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo branch-B >file1
  	  echo branch-B >file2
  	  dotest multibranch2-8 "${testcvs} -q ci -m modify-on-B" \
***************
*** 13479,13486 ****
--- 14107,14116 ----
  new revision: 1\.1\.4\.1; previous revision: 1\.1
  done"
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch2-9 "${testcvs} -q update -r A" '[UP] file1
  [UP] file2'
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo branch-A >file1
  	  # When using cvs-1.9.20, this commit gets a failed assertion in rcs.c.
  	  dotest multibranch2-10 "${testcvs} -q ci -m modify-on-A" \
***************
*** 13544,13551 ****
--- 14174,14183 ----
  	  # bring the changes from B to A.  Probably tests many of the
  	  # same code paths but might as well keep it separate, I guess.
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch2-13 "${testcvs} -q update -r B" "[UP] file1
  [UP] file2"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest multibranch2-14 "${testcvs} -q update -r A -j B file2" \
  "[UP] file2
  RCS file: ${TESTDIR}/cvsroot/first-dir/file2,v
***************
*** 13704,13712 ****
--- 14336,14347 ----
  ${TESTDIR}/cvsroot/first-dir/file2,v  <--  file2
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest admin-7 "${testcvs} -q tag -b br" "T file1
  T file2"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest admin-8 "${testcvs} -q update -r br" ""
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'add a line on the branch' >> file1
  	  dotest admin-9 "${testcvs} -q ci -m modify-on-branch" \
  "Checking in file1;
***************
*** 13974,13979 ****
--- 14609,14615 ----
  	  fi # end of tests skipped for remote
  
  	  # Add another revision to file2, so we can delete one.
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo 'add a line' >> file2
  	  dotest admin-21 "${testcvs} -q ci -m modify file2" \
  "Checking in file2;
***************
*** 14001,14030 ****
--- 14637,14671 ----
  ${TESTDIR}/cvsroot/first-dir/aaa,v  <--  aaa
  initial revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo second rev >> aaa
  	  dotest admin-22-o3 "${testcvs} -q ci -m second aaa" \
  "Checking in aaa;
  ${TESTDIR}/cvsroot/first-dir/aaa,v  <--  aaa
  new revision: 1\.2; previous revision: 1\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo third rev >> aaa
  	  dotest admin-22-o4 "${testcvs} -q ci -m third aaa" \
  "Checking in aaa;
  ${TESTDIR}/cvsroot/first-dir/aaa,v  <--  aaa
  new revision: 1\.3; previous revision: 1\.2
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo fourth rev >> aaa
  	  dotest admin-22-o5 "${testcvs} -q ci -m fourth aaa" \
  "Checking in aaa;
  ${TESTDIR}/cvsroot/first-dir/aaa,v  <--  aaa
  new revision: 1\.4; previous revision: 1\.3
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo fifth rev >>aaa
  	  dotest admin-22-o6 "${testcvs} -q ci -m fifth aaa" \
  "Checking in aaa;
  ${TESTDIR}/cvsroot/first-dir/aaa,v  <--  aaa
  new revision: 1\.5; previous revision: 1\.4
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo sixth rev >> aaa
  	  dotest admin-22-o7 "${testcvs} -q ci -m sixth aaa" \
  "Checking in aaa;
***************
*** 14094,14101 ****
--- 14735,14745 ----
  first
  ============================================================================="
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest admin-22-o14 "${testcvs} tag -b -r1.3 br1 aaa" "T aaa"
+ 	  sleep ${FILESYSTEM_TICK}
  	  dotest admin-22-o15 "${testcvs} update -rbr1 aaa" "U aaa"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo new branch rev >> aaa
  	  dotest admin-22-o16 "${testcvs} ci -m new-branch aaa" \
  "Checking in aaa;
***************
*** 14117,14134 ****
--- 14761,14781 ----
  second rev
  third rev
  fourth rev"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo second branch rev >> aaa
  	  dotest admin-22-o19 "${testcvs} ci -m branch-two aaa" \
  "Checking in aaa;
  ${TESTDIR}/cvsroot/first-dir/aaa,v  <--  aaa
  new revision: 1\.3\.2\.2; previous revision: 1\.3\.2\.1
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo third branch rev >> aaa
  	  dotest admin-22-o20 "${testcvs} ci -m branch-three aaa" \
  "Checking in aaa;
  ${TESTDIR}/cvsroot/first-dir/aaa,v  <--  aaa
  new revision: 1\.3\.2\.3; previous revision: 1\.3\.2\.2
  done"
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo fourth branch rev >> aaa
  	  dotest admin-22-o21 "${testcvs} ci -m branch-four aaa" \
  "Checking in aaa;
***************
*** 14309,14314 ****
--- 14956,14962 ----
        	  
  	  # Add a couple more revisions
  	  #
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "nuthr_line" >> file2
  	  dotest admin-27-1 "${testcvs} commit -m nuthr_line file2"  \
  "Checking in file2;
***************
*** 14316,14321 ****
--- 14964,14970 ----
  new revision: 1\.3; previous revision: 1\.2
  done"
  
+ 	  sleep ${FILESYSTEM_TICK}
  	  echo "yet_another" >> file2
  	  dotest admin-27-2 "${testcvs} commit -m yet_another file2"  \
  "Checking in file2;
***************
*** 14565,14571 ****
  	    fail reserved-11
  	  fi
  	  cd CVSROOT
! 	  echo "DEFAULT ${TESTDIR}/lockme" >>commitinfo
  	  dotest reserved-12 "${testcvs} -q ci -m rcslock commitinfo" \
  "Checking in commitinfo;
  ${TESTDIR}/cvsroot/CVSROOT/commitinfo,v  <--  commitinfo
--- 15214,15225 ----
  	    fail reserved-11
  	  fi
  	  cd CVSROOT
! 	  sleep ${FILESYSTEM_TICK}
! 	  if test x"${CANT_RUN_SCRIPTS}" = x; then
! 	    echo "DEFAULT ${TESTDIR}/lockme" >>commitinfo
! 	  else
! 	    echo "DEFAULT ${TESTSHELL} ${TESTDIR}/lockme" >>commitinfo
! 	  fi
  	  dotest reserved-12 "${testcvs} -q ci -m rcslock commitinfo" \
  "Checking in commitinfo;
  ${TESTDIR}/cvsroot/CVSROOT/commitinfo,v  <--  commitinfo
***************
*** 15475,15480 ****
--- 16129,16135 ----
          CPen *pMinorPen;        // pen to use for drawing minor grid lines
  d472 12
  @" > diffmerge2/sgrid.h,v
+ 	  lf_endlines diffmerge2/sgrid.h,v
  
  	  # We have to put the RCS file in the repository by hand for
  	  # this test:
***************
*** 15538,15544 ****
  # End of TODO list.
  
  # Remove the test directory, but first change out of it.
! cd /tmp
  rm -rf ${TESTDIR}
  
  # end of sanity.sh
--- 16193,16199 ----
  # End of TODO list.
  
  # Remove the test directory, but first change out of it.
! cd ${TMPDIR}
  rm -rf ${TESTDIR}
  
  # end of sanity.sh
Index: src/server.c
===================================================================
RCS file: e:/cvsroot/ccvs/src/server.c,v
retrieving revision 1.9
retrieving revision 1.5.2.9
diff -c -r1.9 -r1.5.2.9
*** src/server.c	1998/08/10 21:22:59	1.9
--- src/server.c	1998/08/12 10:22:42	1.5.2.9
***************
*** 364,370 ****
       * Skip over leading slash if present.  We won't bother to try to
       * make '/'.
       */
!     p = dir + 1;
      while (1)
      {
  	while (*p != '/' && *p != '\0')
--- 364,370 ----
       * Skip over leading slash if present.  We won't bother to try to
       * make '/'.
       */
!     p = strchr(dir, '/') + 1;
      while (1)
      {
  	while (*p != '/' && *p != '\0')
***************
*** 624,636 ****
      free (path);
  
  #ifdef HAVE_PUTENV
!     env = malloc (strlen (CVSROOT_ENV) + strlen (CVSroot_directory) + 1 + 1);
      if (env == NULL)
      {
  	pending_error = ENOMEM;
  	return;
      }
!     (void) sprintf (env, "%s=%s", CVSROOT_ENV, CVSroot_directory);
      (void) putenv (env);
      /* do not free env, as putenv has control of it */
  #endif
--- 624,636 ----
      free (path);
  
  #ifdef HAVE_PUTENV
!     env = malloc (strlen (CVSROOT_ENV) + strlen (CVSroot_directory) + 8 + 1);
      if (env == NULL)
      {
  	pending_error = ENOMEM;
  	return;
      }
!     (void) sprintf (env, "%s=:local:%s", CVSROOT_ENV, CVSroot_directory);
      (void) putenv (env);
      /* do not free env, as putenv has control of it */
  #endif
***************
*** 717,723 ****
--- 717,726 ----
      if (error_pending()) return;
  
      if (dir_name != NULL)
+     {
  	free (dir_name);
+ 	dir_name = NULL;
+     }
  
      dir_len = strlen (dir);
  
***************
*** 734,739 ****
--- 737,745 ----
  	return;
      }
  
+     if (isabsolute (dir))
+ 	return;
+ 
      dir_name = malloc (strlen (server_temp_dir) + dir_len + 40);
      if (dir_name == NULL)
      {
***************
*** 1046,1051 ****
--- 1052,1067 ----
      }
  }
  
+ /* Kopt for the next file sent in Modified or Is-modified.  */
+ static char *kopt;
+ 
+ struct an_entry {
+     struct an_entry *next;
+     char *entry;
+ };
+ 
+ static struct an_entry *entries;
+ 
  /* Receive SIZE bytes, write to filename FILE.  */
  static void
  receive_file (size, file, gzipped)
***************
*** 1057,1065 ****
      char *arg = file;
      pid_t gzip_pid = 0;
      int gzip_status;
  
      /* Write the file.  */
!     fd = CVS_OPEN (arg, O_WRONLY | O_CREAT | O_TRUNC, 0600);
      if (fd < 0)
      {
  	pending_error_text = malloc (40 + strlen (arg));
--- 1073,1104 ----
      char *arg = file;
      pid_t gzip_pid = 0;
      int gzip_status;
+     int len, bin;
+     struct an_entry *ent;
+     char *p = NULL;
+ 
+     len = strlen (arg);
+     for (ent = entries; ent != NULL; ent = ent->next)
+     {
+ 	if ((p = strchr (ent->entry, '/')) == NULL)
+ 	   continue;
+ 	if (strncmp (p+1, arg, len) == 0 && p[1+len] == '/')
+ 	   break;
+     }
+     bin = 0;
+     if (ent != NULL)
+     {
+ 	p += 1+len;
+ 	if ((p = strchr(p+1, '/')) != NULL &&
+ 	    (p = strchr(p+1, '/')) != NULL &&
+ 	    strncmp(p, "/-kb/", 4) == 0)
+ 	    bin = OPEN_BINARY;
+     }
+     else if (kopt != NULL && strcmp(kopt, "-kb") == 0)
+ 	bin = OPEN_BINARY;
  
      /* Write the file.  */
!     fd = CVS_OPEN (arg, O_WRONLY | O_CREAT | O_TRUNC | bin, 0600);
      if (fd < 0)
      {
  	pending_error_text = malloc (40 + strlen (arg));
***************
*** 1112,1120 ****
      }
  }
  
- /* Kopt for the next file sent in Modified or Is-modified.  */
- static char *kopt;
- 
  static void serve_modified PROTO ((char *));
  
  static void
--- 1151,1156 ----
***************
*** 1247,1259 ****
  {
  }
  
- struct an_entry {
-     struct an_entry *next;
-     char *entry;
- };
- 
- static struct an_entry *entries;
- 
  static void serve_unchanged PROTO ((char *));
  
  static void
--- 1283,1288 ----
***************
*** 1455,1461 ****
  
      f = NULL;
      /* Note that we free all the entries regardless of errors.  */
!     if (!error_pending ())
      {
  	/* We open in append mode because we don't want to clobber an
             existing Entries file.  If we are checking out a module
--- 1484,1490 ----
  
      f = NULL;
      /* Note that we free all the entries regardless of errors.  */
!     if (dir_name != NULL && !error_pending ())
      {
  	/* We open in append mode because we don't want to clobber an
             existing Entries file.  If we are checking out a module
***************
*** 1474,1480 ****
      {
  	if (!error_pending ())
  	{
! 	    if (fprintf (f, "%s\n", p->entry) < 0)
  	    {
  		pending_error = errno;
  		if (alloc_pending (80 + strlen(CVSADM_ENT)))
--- 1503,1509 ----
      {
  	if (!error_pending ())
  	{
! 	    if (f != NULL && fprintf (f, "%s\n", p->entry) < 0)
  	    {
  		pending_error = errno;
  		if (alloc_pending (80 + strlen(CVSADM_ENT)))
***************
*** 3563,3568 ****
--- 3592,3598 ----
  	    {
  		int status, fd, gzip_status;
  		pid_t gzip_pid;
+ 		int bin = 0;
  
  		/* Callers must avoid passing us a buffer if
                     file_gzip_level is set.  We could handle this case,
***************
*** 3571,3578 ****
  		if (filebuf != NULL)
  		    error (1, 0, "\
  CVS server internal error: unhandled case in server_updated");
! 
! 		fd = CVS_OPEN (finfo->file, O_RDONLY | OPEN_BINARY, 0);
  		if (fd < 0)
  		    error (1, errno, "reading %s", finfo->fullname);
  		fd = filter_through_gzip (fd, 1, file_gzip_level, &gzip_pid);
--- 3601,3610 ----
  		if (filebuf != NULL)
  		    error (1, 0, "\
  CVS server internal error: unhandled case in server_updated");
! 		if (finfo->rcs->expand != NULL &&
! 			strcmp(finfo->rcs->expand, "b") == 0)
! 		    bin = OPEN_BINARY;
! 		fd = CVS_OPEN (finfo->file, O_RDONLY | bin, 0);
  		if (fd < 0)
  		    error (1, errno, "reading %s", finfo->fullname);
  		fd = filter_through_gzip (fd, 1, file_gzip_level, &gzip_pid);
***************
*** 3597,3607 ****
  	    else if (filebuf == NULL)
  	    {
  		long status;
  
! 		f = CVS_FOPEN (finfo->file, "rb");
  		if (f == NULL)
  		    error (1, errno, "reading %s", finfo->fullname);
! 		status = buf_read_file (f, size, &list, &last);
  		if (status == -2)
  		    (*protocol->memory_error) (protocol);
  		else if (status != 0)
--- 3629,3643 ----
  	    else if (filebuf == NULL)
  	    {
  		long status;
+ 		int bin = 0;
  
! 		if (finfo->rcs->expand != NULL &&
! 			strcmp(finfo->rcs->expand, "b") == 0)
! 		    bin = 1;
! 		f = CVS_FOPEN (finfo->file, bin ? "rb" : "r");
  		if (f == NULL)
  		    error (1, errno, "reading %s", finfo->fullname);
! 		status = buf_read_file_to_eof (f, &list, &last);
  		if (status == -2)
  		    (*protocol->memory_error) (protocol);
  		else if (status != 0)
***************
*** 3609,3614 ****
--- 3645,3651 ----
  			   finfo->fullname);
  		if (fclose (f) == EOF)
  		    error (1, errno, "reading %s", finfo->fullname);
+ 		size = buf_chain_length (list);
  	    }
  	}
  
***************
*** 4395,4400 ****
--- 4432,4442 ----
       int argc;
       char **argv;
  {
+ #ifdef RSHD_NOT_TRANSPARENT
+     setmode (STDIN_FILENO, O_BINARY);
+     setmode (STDOUT_FILENO, O_BINARY);
+     setmode (STDERR_FILENO, O_BINARY);
+ #endif
      if (argc == -1)
      {
  	static const char *const msg[] =
Index: src/update.c
===================================================================
RCS file: e:/cvsroot/ccvs/src/update.c,v
retrieving revision 1.7
retrieving revision 1.5.2.5
diff -c -r1.7 -r1.5.2.5
*** src/update.c	1998/07/13 15:25:02	1.7
--- src/update.c	1998/07/16 00:33:55	1.5.2.5
***************
*** 487,494 ****
  	time_t now;
  
  	(void) time (&now);
! 	if (now == last_register_time)
! 	    sleep (1);			/* to avoid time-stamp races */
      }
  
      return (err);
--- 487,497 ----
  	time_t now;
  
  	(void) time (&now);
! 	if (now < last_register_time + FILESYSTEM_TICK)
! 	{
! 	    /* to avoid time-stamp races */
! 	    sleep (last_register_time + FILESYSTEM_TICK - now);
! 	}
      }
  
      return (err);
***************
*** 1685,1691 ****
  	       violation.  */
  	    if (CVS_STAT (vers_ts->srcfile->path, file_info) < 0)
  		error (1, errno, "could not stat %s", vers_ts->srcfile->path);
! 	    if (chmod (finfo->file,
  		       file_info->st_mode & ~(S_IWRITE | S_IWGRP | S_IWOTH))
  		< 0)
  		error (0, errno, "cannot change mode of file %s", finfo->file);
--- 1688,1694 ----
  	       violation.  */
  	    if (CVS_STAT (vers_ts->srcfile->path, file_info) < 0)
  		error (1, errno, "could not stat %s", vers_ts->srcfile->path);
! 	    if (CVS_CHMOD (finfo->file,
  		       file_info->st_mode & ~(S_IWRITE | S_IWGRP | S_IWOTH))
  		< 0)
  		error (0, errno, "cannot change mode of file %s", finfo->file);
Index: windows-NT/ChangeLog
===================================================================
RCS file: e:/cvsroot/ccvs/windows-NT/ChangeLog,v
retrieving revision 1.7
retrieving revision 1.5.2.3
diff -c -r1.7 -r1.5.2.3
*** windows-NT/ChangeLog	1998/07/13 15:25:15	1.7
--- windows-NT/ChangeLog	1998/07/16 00:07:30	1.5.2.3
***************
*** 1,3 ****
--- 1,13 ----
+ 1998-07-06  Murray Bishop  <bishop@acnielsen.com.au>
+ 
+ 	* options.h [FILESYSTEM_TICK]: Define seconds per tick as 2 for FAT.
+ 
+ 1998-07-02  Murray Bishop  <bishop@acnielsen.com.au>
+ 
+ 	* run.c (run_popen): Don't change ' to " (breaks sanity.sh info-10).
+ 	* run.c (requote): Remove. Useless for Windows-NT CMD.EXE and also
+ 	for Windows-95 COMMAND.COM.
+ 
  1998-07-01  Jim Kingdon  <kingdon@harvey.cyclic.com>
  
  	* startserver.c (wnt_shutdown_server): Check for errors from close().
***************
*** 11,18 ****
--- 21,60 ----
  	(wnt_shutdown_server): use the new global to decide whether or not
  	to call socket routines or simply use close.
  	
+ 1998-06-23  Murray Bishop  <bishop@acnielsen.com.au>
+ 
+ 	* filesubr.c (rename_file): If either from or to is open in RCS
+ 	cache, close RCS cache before any other file operations.
+ 
+ 1998-06-19  Murray Bishop  <bishop@acnielsen.com.au>
  
+ 	* filesubr.c (rename_readonly_file): add function so renames
+ 	work when using Novell IntranetWare client.
+ 	* filesubr.c (rename_file): try rename_readonly_file before 
+         calling error.
+ 	* filesubr.c (wnt_rename): try rename_readonly_file before
+         returning < 0.
+ 
+ 1998-06-16  Murray Bishop  <bishop@acnielsen.com.au>
+ 
+ 	* config.h (CVS_RENAME): Define.
+ 	* filesubr.c (wnt_rename): If the oldname is open in rcs cache,
+ 	close it before attempting rename(). - under windows and OS/2
+ 	you can't rename an open file (nor pass binfiles2-10, join2-20,
+ 	(death-)71.
+ 	See also http://www.cyclic.com/cvs/dev-emx27.txt, which suggests
+ 	identical function (os2_rename) in emx-new/system.c.
+ 	* filesubr.c (expand_wild): When path whose last component is
+ 	"." is passed as argument, copy that rather than replacing by
+ 	last component of parent directory.
+ 
  1998-06-11  Jim Kingdon
+ 
+ 	* config.h (CVS_STAT, CVS_LSTAT): Define.
+ 	* filesubr.c, config.h (wnt_stat, wnt_lstat, check_statbuf):
+ 	New functions.
+ 
+ Thu Jun 11 21:58:58 1998 by kingdon
  
  	* config.h (CVS_STAT, CVS_LSTAT): Define.
  	* filesubr.c, config.h (wnt_stat, wnt_lstat, check_statbuf):
Index: windows-NT/config.h
===================================================================
RCS file: e:/cvsroot/ccvs/windows-NT/config.h,v
retrieving revision 1.4
retrieving revision 1.3.2.2
diff -c -r1.4 -r1.3.2.2
*** windows-NT/config.h	1998/06/23 15:32:10	1.4
--- windows-NT/config.h	1998/07/16 00:07:30	1.3.2.2
***************
*** 240,245 ****
--- 240,249 ----
  #define CVS_LSTAT wnt_lstat
  extern int wnt_lstat ();
  
+ /* Windows NT rename needs 'to' doesn't exist and 'from' isn't open */
+ #define CVS_RENAME wnt_rename
+ extern int wnt_rename(const char * from, const char * to);
+ 
  /* This function doesn't exist under Windows NT; we
     provide a stub.  */
  extern int readlink (char *path, char *buf, int buf_size);
Index: windows-NT/filesubr.c
===================================================================
RCS file: e:/cvsroot/ccvs/windows-NT/filesubr.c,v
retrieving revision 1.6
retrieving revision 1.5.2.2
diff -c -r1.6 -r1.5.2.2
*** windows-NT/filesubr.c	1998/06/23 15:32:11	1.6
--- windows-NT/filesubr.c	1998/07/16 00:07:30	1.5.2.2
***************
*** 23,28 ****
--- 23,29 ----
  #include "cvs.h"
  
  static int deep_remove_dir PROTO((const char *path));
+ static int rename_readonly_file PROTO((const char *from, const char *to));
  
  /* Copies "from" to "to".  Note that the functionality here is similar
     to the win32 function CopyFile, but (1) we copy LastAccessTime and
***************
*** 387,396 ****
      if (noexec)
  	return;
  
!     /* Win32 unlink is stupid --- it fails if the file is read-only  */
!     chmod(to, S_IWRITE);
!     unlink(to);
!     if (rename (from, to) < 0)
  	error (1, errno, "cannot rename file %s to %s", from, to);
  }
  
--- 388,394 ----
      if (noexec)
  	return;
  
!     if (wnt_rename (from, to) < 0)
  	error (1, errno, "cannot rename file %s to %s", from, to);
  }
  
***************
*** 413,418 ****
--- 411,421 ----
  
      /* Win32 unlink is stupid - it fails if the file is read-only */
      chmod (f, _S_IWRITE);
+ 
+     /* And also if the file is open */
+     if (RCS_get_cached ( f ) != NULL)
+ 	RCS_cache_close ();
+ 
      return (unlink (f));
  }
  
***************
*** 436,443 ****
  	return (0);
  
      /* Win32 unlink is stupid - it fails if the file is read-only */
!     chmod (f, _S_IWRITE);
!     if (unlink (f) != 0)
      {
  	/* under Windows NT, unlink returns EACCES if the path
  	   is a directory.  Under Windows 95, ENOENT.  */
--- 439,445 ----
  	return (0);
  
      /* Win32 unlink is stupid - it fails if the file is read-only */
!     if (unlink_file (f) != 0)
      {
  	/* under Windows NT, unlink returns EACCES if the path
  	   is a directory.  Under Windows 95, ENOENT.  */
***************
*** 484,491 ****
  	    sprintf (buf, "%s/%s", path, dp->d_name);
  
  	    /* Win32 unlink is stupid - it fails if the file is read-only */
! 	    chmod (buf, _S_IWRITE);
! 	    if (unlink (buf) != 0 )
  	    {
  		/* Under Windows NT, unlink returns EACCES if the path
  		   is a directory.  Under Windows 95, ENOENT.  It
--- 486,492 ----
  	    sprintf (buf, "%s/%s", path, dp->d_name);
  
  	    /* Win32 unlink is stupid - it fails if the file is read-only */
! 	    if (unlink_file (buf) != 0 )
  	    {
  		/* Under Windows NT, unlink returns EACCES if the path
  		   is a directory.  Under Windows 95, ENOENT.  It
***************
*** 755,760 ****
--- 756,772 ----
  	   As nearly as I can guess, this bug has existed since
  	   expand_wild was first created.  At least, it is in CVS 1.9 (I
  	   just tried it).  */
+ 	/* I (Murray Bishop) got failures on sanity.sh death2-diff-5,
+           branches2-11 and join-4, using Windows NT 4.0 fixpack 3,
+ 	   Microsoft Visual C++ 4.2.
+ 	   After getting nowhere with the debugger, I found the note above
+ 	   and did some experiments on 17 June 98.
+ 	   FindFirstFile does these strange things when cvs (1.9.27) is
+ 	   run in /tmp/cvs-sanity/1/first-dir :
+ 
+ 	   argv[i]		fdata.cFileName
+ 	   .			first-dir
+ 	   ../first-dir/.	first-dir */
  
  	/* FindFirstFile doesn't return pathnames, so we have to do
  	   this ourselves.  Luckily, it's no big deal, since globbing
***************
*** 822,834 ****
  
  		/* Copy the file name. */
  		
! 		if (fncmp (argv[i] + dirname_length, fdata.cFileName) == 0)
  		    /* We didn't expand a wildcard; we just matched a filename.
  		       Use the file name as specified rather than the filename
  		       which exists in the directory (they may differ in case).
  		       This is needed to make cvs add on a directory consistently
  		       use the name specified on the command line, but it is
  		       probably a good idea in other contexts too.  */
  		    strcpy (new_argv[new_argc], argv[i]);
  		else
  		    strcat (new_argv[new_argc], fdata.cFileName);
--- 834,850 ----
  
  		/* Copy the file name. */
  		
! 		if (fncmp (argv[i] + dirname_length, fdata.cFileName) == 0
! 		    || strcmp (argv[i] + dirname_length, ".") == 0)
  		    /* We didn't expand a wildcard; we just matched a filename.
  		       Use the file name as specified rather than the filename
  		       which exists in the directory (they may differ in case).
  		       This is needed to make cvs add on a directory consistently
  		       use the name specified on the command line, but it is
  		       probably a good idea in other contexts too.  */
+ 		    /* comparison with "." copes with FindFirstFile returning
+ 			name of parent directory when given "." (Thats not a
+ 			feature, its a bug) */
  		    strcpy (new_argv[new_argc], argv[i]);
  		else
  		    strcat (new_argv[new_argc], fdata.cFileName);
***************
*** 902,904 ****
--- 918,1044 ----
      check_statbuf (file, sb);
      return retval;
  }
+ 
+ /*
+    With Windows-NT 4.0 Service Pack 3 and Novell IntranetWare Client 4.11a
+    and Microsoft Visual C++ 4.2,
+    attempts to rename readonly files fail with "Permission denied".
+    (This doesn't happen with Microsoft Netware Client, nor on NTFS local
+    file system)
+ 
+    In addition, with a Netware server version 4.11 that was built by an
+    upgrade from 4.10 without doing the filesystem backup and restore
+    Novell recommended, I get flakey failures to rename readonly files
+    (about 4 per pass of sanity.sh). The retry code below works around
+    that.
+    On a different server where 4.11 was installed on a clean machine,
+    no such problem happened.
+ 
+    Make from not readonly, try rename, restore modes on file.
+    Return what rename did.
+  */
+ int
+ rename_readonly_file (from, to)
+     const char *from;
+     const char *to;
+ {
+     struct stat sb;
+     int rename_rc;
+     const char *final_name;
+     int rename_errno;
+     static int retrying_rename = 0;
+ 
+     if (trace)
+ #ifdef SERVER_SUPPORT
+ 	(void) fprintf (stderr, "%c-> rename_readonly_file(%s,%s)\n",
+ 			(server_active) ? 'S' : ' ', from, to);
+ #else
+ 	(void) fprintf (stderr, "-> rename_readonly_file(%s,%s)\n", from, to);
+ #endif
+     if (noexec)
+ 	return 0;
+ 
+     /* If we can't stat from, we probably won't be able to rename it */
+     if (stat (from, &sb) < 0)
+ 	return -1;
+ 
+     if (chmod (from, sb.st_mode | S_IWRITE | S_IWGRP | S_IWOTH) < 0)
+ 	error (0, errno, "cannot change mode of file %s", from);
+ 
+     rename_rc = rename (from, to);
+     rename_errno = errno;
+ 
+     final_name = (rename_rc < 0) ? from : to;
+     if (chmod (final_name, sb.st_mode) < 0)
+ 	error (0, errno, "cannot restore mode of file %s", final_name);
+ 
+     /*
+ 	With Windows-NT 4.0 Service Pack 3 and Novell IntranetWare Client 4.11a
+ 	and Microsoft Visual C++ 4.2, in sanity.sh we get occasional
+ 	"cannot rename file .../,file3, to .../file3,v: File exists"
+ 	in various places (not always in same place).
+ 	(This doesn't happen or on NTFS local file system)
+    */
+     if (rename_rc < 0)
+ 	{
+ 	++retrying_rename;
+ 	if (retrying_rename <= 3)
+ 	    {
+ 	    error (0, rename_errno,
+ 		" rename_readonly_file(%s,%s) failed. "
+ 		"waiting %d seconds before retry\n",
+ 		from, to, retrying_rename);
+ 	    sleep( retrying_rename /*seconds*/ );
+ 	    rename_rc = wnt_rename( from, to );
+ 	    }
+ 	--retrying_rename;
+ 	if (retrying_rename == 0 && rename_rc == 0)
+ 	    {
+ #ifdef SERVER_SUPPORT
+ 	    (void) fprintf (stderr, "%c retry succeeded.\n",
+ 		(server_active) ? 'S' : ' ');
+ #else
+ 	    (void) fprintf (stderr, " retry succeeded.\n");
+ #endif
+ 	    }
+ 	}
+ 
+     return rename_rc;
+ }
+ 
+ int wnt_rename(const char * from, const char * to)
+ {
+     int rename_rc;
+ 
+     if (trace)
+ #ifdef SERVER_SUPPORT
+ 	(void) fprintf (stderr, "%c-> wnt_rename(%s,%s)\n",
+ 			(server_active) ? 'S' : ' ', from, to);
+ #else
+ 	(void) fprintf (stderr, "-> wnt_rename(%s,%s)\n", from, to);
+ #endif
+     if (noexec)
+ 	return 0;
+ 
+     /* Win32 unlink is stupid --- it fails if the file is read-only  */
+     /* Win32 unlink also fails when file is open via Novell IntranetWare */
+     /*
+ 	Under windows and OS/2 you can't rename an open file, and
+ 	the target file must not exist before rename.
+ 	If you're Windows-NT on a Netware fileserver via IntranetWare,
+ 	the source file must not be readonly.
+ 	See also http://www.cyclic.com/cvs/dev-emx27.txt, which suggests
+ 	identical function (os2_rename) in emx-new/system.c
+ 	and provides the two RCS functions mentioned here.
+     */
+     unlink_file ( to );
+     if (RCS_get_cached ( from ) != NULL)
+ 	RCS_cache_close ();
+     rename_rc = rename ( from, to);
+     if (rename_rc < 0)
+ 	{
+ 	rename_rc = rename_readonly_file ( from, to);
+ 	}
+     return rename_rc;
+ }
+ 
Index: windows-NT/options.h
===================================================================
RCS file: e:/cvsroot/ccvs/windows-NT/options.h,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -c -r1.3 -r1.3.2.1
*** windows-NT/options.h	1998/05/31 01:02:56	1.3
--- windows-NT/options.h	1998/07/16 00:07:30	1.3.2.1
***************
*** 165,167 ****
--- 165,184 ----
  #ifndef STDC_HEADERS
  extern void exit ();
  #endif
+ 
+ /*
+  * In various places, CVS waits a tick of the filesystem clock to make
+  * sure that files have different timestamps. This was coded as sleep (1).
+  * For some filesystems (eg FAT, FAT32) 2 seconds are needed.
+  * I've defined FILESYSTEM_TICK in windows-NT/options.h,
+  * and in src/cvs.h a default of 1 second is defined.
+  *
+  * I'm pretty sure that CVS doesn't do enough waiting, but it's too
+  * hard for me to figure out where to add more.
+  * See sanity.sh [FILESYSTEM_TICK] for more information.
+  */
+ #ifndef FILESYSTEM_TICK
+ #define FILESYSTEM_TICK 2
+ /* #define FILESYSTEM_TICK 1 */
+ #endif
+ 
Index: windows-NT/run.c
===================================================================
RCS file: e:/cvsroot/ccvs/windows-NT/run.c,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -c -r1.3 -r1.3.2.1
*** windows-NT/run.c	1998/05/31 01:02:57	1.3
--- windows-NT/run.c	1998/07/16 00:07:31	1.3.2.1
***************
*** 296,316 ****
      }
  }
  
- static char *
- requote (const char *cmd)
- {
-     char *requoted = xmalloc (strlen (cmd) + 1);
-     char *p = requoted;
- 
-     strcpy (requoted, cmd);
-     while ((p = strchr (p, '\'')) != NULL)
-     {
-         *p++ = '"';
-     }
- 
-     return requoted;
- }
- 
  FILE *
  run_popen (cmd, mode)
      const char *cmd;
--- 296,301 ----
***************
*** 326,335 ****
      if (noexec)
  	return (NULL);
  
!     /* If the command string uses single quotes, turn them into
!        double quotes.  */
      {
-         char *requoted = requote (cmd);
  	/* Save and restore our file descriptors to work around
  	   apparent bugs in _popen.  We are perhaps better off using
  	   the win32 functions instead of _popen.  */
--- 311,321 ----
      if (noexec)
  	return (NULL);
  
!     /* If the command string uses single quotes, don't turn them into
!        double quotes like for OS/2 CMD.EXE.
! 	Windows-NT CMD.EXE and Windows-95 COMMAND.COM don't recognize
! 	" as a quoting mechanism. */
      {
  	/* Save and restore our file descriptors to work around
  	   apparent bugs in _popen.  We are perhaps better off using
  	   the win32 functions instead of _popen.  */
***************
*** 337,343 ****
  	int old_stdout = dup (STDOUT_FILENO);
  	int old_stderr = dup (STDERR_FILENO);
  
! 	FILE *result = popen (requoted, mode);
  
  	dup2 (old_stdin, STDIN_FILENO);
  	dup2 (old_stdout, STDOUT_FILENO);
--- 323,329 ----
  	int old_stdout = dup (STDOUT_FILENO);
  	int old_stderr = dup (STDERR_FILENO);
  
! 	FILE *result = popen (cmd, mode);
  
  	dup2 (old_stdin, STDIN_FILENO);
  	dup2 (old_stdout, STDOUT_FILENO);
***************
*** 346,352 ****
  	close (old_stdout);
  	close (old_stderr);
  
- 	free (requoted);
  	return result;
      }
  }
--- 332,337 ----
