Import cvs-1.11.17 onto vendor branch.

This commit is contained in:
Peter Wemm 2004-06-10 19:05:38 +00:00
parent b0e9f4d203
commit 83c36f7f98
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/vendor/cvs/dist/; revision=130303
50 changed files with 7125 additions and 568 deletions

View File

@ -47,12 +47,6 @@ writing files. If your repository does not allow any write access, symlinks
are never a problem, whether or not LockDir is in use.
* "make remotecheck" sometimes fails on test 187a3 with
cvs server: in directory .:
cvs [server aborted]: *PANIC* administration files missing
This does not happen every time. (-kingdon, Nov 96, Red Hat linux 3.0.3).
* The -m option to "cvs add" does not work with client/server CVS.
CVS will accept the option, but it won't actually set the
file's description.
@ -84,121 +78,6 @@ file's description.
P.S. Is anyone working on fixing these bugs?
* From: Roland McGrath <roland@gnu.ai.mit.edu>
To: Cyclic CVS Hackers <info-cvs@prep.ai.mit.edu>
Subject: weird bug
Date: Sat, 25 Mar 1995 16:41:41 -0500
X-Windows: Even your dog won't like it.
I just noticed some droppings on my disk from what must be a pretty weird
bug in remote CVS.
In my home directory on a repository machine I use, I find:
drwxr-xr-x 4 roland staff 512 Mar 7 14:08 cvs-serv28962
drwxr-xr-x 4 roland staff 512 Mar 7 14:11 cvs-serv28978
drwxr-xr-x 4 roland staff 512 Mar 7 15:13 cvs-serv29141
OK, so these are leftover cruft from some cvs run that got aborted.
Well, it should clean up after itself, but so what.
The last one is pretty dull; the real weirdness is the contents of the
first two directories.
duality 77 # ls -RF cvs-serv28978/
CVS/ cvs-serv28978/
cvs-serv28978/CVS:
Entries Repository
cvs-serv28978/cvs-serv28978:
arpa/
cvs-serv28978/cvs-serv28978/arpa:
CVS/ cvs-serv28978/
cvs-serv28978/cvs-serv28978/arpa/CVS:
Entries Repository
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978:
assert/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert:
CVS/ cvs-serv28978/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/CVS:
Entries Repository
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978:
bare/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare:
CVS/ cvs-serv28978/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/CVS:
Entries Repository
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978:
conf/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf:
CVS/ cvs-serv28978/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/CVS:
Entries Repository
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/cvs-serv28978:
crypt/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/cvs-serv28978/crypt:
CVS/ cvs-serv28978/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/cvs-serv28978/crypt/CVS:
Entries Repository
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/cvs-serv28978/crypt/cvs-serv28978:
csu/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/cvs-serv28978/crypt/cvs-serv28978/csu:
CVS/ cvs-serv28978/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/cvs-serv28978/crypt/cvs-serv28978/csu/CVS:
Entries Repository
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/cvs-serv28978/crypt/cvs-serv28978/csu/cvs-serv28978:
ctype/
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/cvs-serv28978/crypt/cvs-serv28978/csu/cvs-serv28978/ctype:
CVS/ cvs-serv28978/
[...]
ls: cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/cvs-serv28978/crypt/cvs-serv28978/csu/cvs-serv28978/ctype/cvs-serv28978/dirent/cvs-serv28978/elf/cvs-serv28978/gnu/cvs-serv28978/gnulib/cvs-serv28978/grp/cvs-serv28978/hurd/cvs-serv28978/hurd/hurd/cvs-serv28978/inet/cvs-serv28978/inet/arpa/cvs-serv28978/inet/netinet[...]/cvs-serv28978/posix/cvs-serv28978/posix/glob/cvs-serv28978/posix/gnu/cvs-serv28978/posix/sys/cvs-serv28978/protocols/cvs-serv28978/pwd/cvs-serv28978/resolv/cvs-serv28978/resolv/arpa/cvs-serv28978/resolv/sys/cvs-serv28978/resource/cvs-serv28978/resource/sys/cvs-serv28978/rpc/cvs-serv28978/setjmp/cvs-serv28978/signal/cvs-serv28978/signal/sys/cvs-serv28978/socket/cvs-serv28978/socket: File name too long
cvs-serv28978/cvs-serv28978/arpa/cvs-serv28978/assert/cvs-serv28978/bare/cvs-serv28978/conf/cvs-serv28978/crypt/cvs-serv28978/csu/cvs-serv28978/ctype/cvs-serv28978/dirent/cvs-serv28978/elf/cvs-serv28978/gnu/cvs-serv28978/gnulib/cvs-serv28978/grp/cvs-serv28978/hurd/cvs-serv28978/hurd/hurd/cvs-serv28978/inet/cvs-serv28978/inet/arpa/cvs-serv28978/inet/netinet[...]/cvs-serv28978/posix/glob/cvs-serv28978/posix/gnu/cvs-serv28978/posix/sys/cvs-serv28978/protocols/cvs-serv28978/pwd/cvs-serv28978/resolv/cvs-serv28978/resolv/arpa/cvs-serv28978/resolv/sys/cvs-serv28978/resource/cvs-serv28978/resource/sys/cvs-serv28978/rpc/cvs-serv28978/setjmp/cvs-serv28978/signal/cvs-serv28978/signal/sys/cvs-serv28978/socket/cvs-serv28978:
* From: Roland McGrath <roland@gnu.ai.mit.edu>
To: Cyclic CVS Hackers <info-cvs@prep.ai.mit.edu>
Subject: bizarre failure mode
Date: Tue, 7 Mar 95 14:17:28 -0500
This is pretty weird:
CVS_SERVER='TMPDIR=. /usr/local/bin/cvs' ../cvs-build/src/cvs update -q
cvs [server aborted]: could not get working directory: Result too large
[Exit 1]
asylum 29 % grep 'Result too large' /usr/include/sys/errno.h
#define ERANGE 34 /* Result too large */
Now, getcwd fails with ERANGE when the buffer is too small. But I don't
know why that would be the case; I don't think there are exceptionally long
directory names involved. It would be robust to notice ERANGE and use a
bigger buffer. But I suspect something weirder is going on.
The repository in question in duality.gnu.ai.mit.edu:/gd4/gnu/cvsroot/libc.
Send me a PGP-signed message if you want the password to use the machine
where the problem showed up.
* CVS does not always seem to be waiting to the next filesystem timestamp
quanta after commits. So far this has only shown up in testing under the BSDI
OS. The symptoms are that ocassionally CVS will not notice that modified files
@ -208,18 +87,22 @@ suspected cause is that one of the calls to sleep_past() is being called with
an incorrect value, though this does not explain why symptoms have only been
noticed under BSDI.
* Spaces in arguments to `cvs diff' are currently split on spaces and tabs
before being passed to diff. This can often cause diff to abort since it can
no longer interpret its options string and if it can, coincidentally,
interpret its option string, then the problem may be output in unexpected
formats.
* `release' of a project subdir does not remove the `subdir' entry from
`./CVS/Entries'.
* The Windows Microsoft Visual C++ project files are out of date, but the
project can still be built under Windows using `nmake'. See the INSTALL
file for more.
* Most of the remote commands are encountering assertion failures when listing
the toplevel of the repository (e.g. `cvs rlog .'). This appears to be
related to the symlinked CVS root fix.
* Status

View File

@ -1,3 +1,83 @@
2004-06-09 Derek Price <derek@ximbiot.com>
* NEWS: Note Stefan & Sebastian's security fixes.
* acinclude.m4 (gl_SIZE_MAX, gl_XSIZE): Import from GNULIB.
* configure.in: Call gl_XSIZE.
2004-06-09 Derek Price <derek@ximbiot.com>
* NEWS: Note CAN-2004-0414 fix.
2004-05-19 Derek Price <derek@ximbiot.com>
* NEWS: Note CAN-2004-0396 fix.
2004-05-17 Derek Price <derek@ximbiot.com>
* BUGS: Note assertion failure of r* commands.
2004-05-17 Derek Price <derek@ximbiot.com>
* BUGS: Remove out of date comment about out of date Windows build
files and several bug reports that are so old, without similar recent
reports, that I'm assuming that the problems have been fixed.
2004-05-15 Derek Price <derek@ximbiot.com>
* cvsnt.dsp: Header file list updated.
* cvsnt.dep: Regenerated for "cvsnt.dsp" change.
* cvsnt.mak: Regenerated for "cvsnt.dsp" change.
(Patch from Conrad Pino <conrad@pino.com>.)
2004-05-13 Derek Price <derek@ximbiot.com>
* NEWS: Note MSVC++ project file regeneration.
2004-05-13 Derek Price <derek@ximbiot.com>
* cvsnt.dsw: Rename "zlib/zlib.*" to "zlib/libz.*".
Add project "lib/libcvs".
* cvsnt.dsp: Revised for "cvsnt.dsw" changes. Move "lib/*.c" to
project "lib/libcvs". Upgraded to Visual C++ 6.0 format.
* cvsnt.dep: Added for "cvsnt.dsp" change.
* cvsnt.mak: Regenerated for "cvsnt.dsp" change.
(Patch from Conrad Pino <conrad@pino.com>.)
* configure.in: Generate windows-NT/fix-msvc-mak.
2004-04-30 Derek Price <derek@ximbiot.com>
* NEWS: Note that man page is generated from cvs.texinfo now.
* configure.in: Build doc/mkman.
* configure, Makefile.in: Regenerated.
2004-04-26 Derek Price <derek@ximbiot.com>
* NEWS: Note that :ext: no longer relies on an external transport with
a GNU argument processor.
2004-04-20 Derek Price <derek@ximbiot.com>
* NEWS: Note XP directory deletion fix.
2004-04-16 Derek Price <derek@ximbiot.com>
* NEWS: Correct CVS name for piped checkout issue now that we have one.
2004-04-15 Derek Price <derek@ximbiot.com>
* NEWS: Retroactively add CVE issue name for the piped etc issue.
2004-04-15 Derek Price <derek@ximbiot.com>
* NEWS: Retroactively add CVE issue name for the trojan server issue.
2004-04-14 Derek Price <derek@ximbiot.com>
* INSTALL (Building from source code under Unix): Move Autoconf &
Automake notes...
* HACKING (Regenerating Build Files): ...here.
2004-04-13 Derek Price <derek@ximbiot.com>
* NEWS: Note validation of paths passed to the client.

View File

@ -104,6 +104,25 @@ Filenames for .c and .h files may contain _ but should not contain -
(the latter causes Visual C++ 2.1 to create makefiles which Visual C++
4.0 cannot use).
* Regenerating Build Files
On UNIX, if you wish to change the Build files, you will need Autoconf and
Automake.
Some combinations of Automake and Autoconf versions may break the
CVS build if file timestamps aren't set correctly and people don't
have the same versions the developers do, so the rules to run them
automatically aren't included in the generated Makefiles unless you run
configure with the --enable-maintainer-mode option.
The CVS Makefiles and configure script were built using Automake 1.7.9 and
Autoconf 2.58, respectively.
There is a known bug in Autoconf 2.57 that will prevent the configure
scripts it generates from working on some platforms. Other combinations of
autotool versions may or may not work. If you get other versions to work,
please send a report to <bug-cvs@gnu.org>.
* Writing patches (strategy)
Only some kinds of changes are suitable for inclusion in the

View File

@ -257,21 +257,7 @@ VAX:
Building from source code under Unix:
1) Some combinations of Automake and Autoconf versions may break the
CVS build if file timestamps aren't set correctly and people don't
have the same versions the developers do, so the rules to run them
automatically aren't included in the generated Makefiles unless you run
configure with --enable-maintainer-mode.
The CVS Makefiles and configure script were built using Automake 1.7.9 and
Autoconf 2.58, respectively.
There is a known bug in Autoconf 2.57 that will prevent the configure
scripts it generates from working on some platforms. Other combinations of
autotool versions may or may not work. If you get other versions to work,
please send a report to <bug-cvs@gnu.org>.
2) Run "configure":
1) Run "configure":
$ ./configure
@ -385,7 +371,7 @@ Building from source code under Unix:
END OF NOTE FOR NDBM GUNK.
3) Try to build it:
2) Try to build it:
$ make
@ -396,7 +382,7 @@ Building from source code under Unix:
compiler information, make output, and anything else you think
will be helpful.
3a) Run the regression tests (optional).
3) Run the regression tests (optional).
You may also wish to validate the correctness of the new binary by
running the regression tests. If they succeed, that is nice to

View File

@ -35,6 +35,7 @@ EXTRA_DIST = \
TESTS \
build.com \
cvs-format.el \
cvsnt.dep \
cvsnt.dsp \
cvsnt.dsw \
cvsnt.mak \

View File

@ -161,6 +161,7 @@ EXTRA_DIST = \
TESTS \
build.com \
cvs-format.el \
cvsnt.dep \
cvsnt.dsp \
cvsnt.dsw \
cvsnt.mak \
@ -372,7 +373,7 @@ distcleancheck_listfiles = find . -type f -print
distdir: $(DISTFILES)
$(am__remove_distdir)
mkdir $(distdir)
$(mkinstalldirs) $(distdir)/. $(distdir)/contrib $(distdir)/emx $(distdir)/os2 $(distdir)/src $(distdir)/zlib
$(mkinstalldirs) $(distdir)/. $(distdir)/contrib $(distdir)/doc $(distdir)/emx $(distdir)/os2 $(distdir)/src $(distdir)/windows-NT $(distdir)/zlib
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \

View File

@ -1,18 +1,62 @@
Changes since 1.11.14:
Changes since 1.11.16:
**********************
SERVER SECURITY FIXES
* Thanks to Stefan Esser & Sebastian Krahmer, several potential security
problems have been fixed. The ones which were considered dangerous enough
to catalogue were assigned issue numbers CAN-2004-0416, CAN-2004-0417, &
CAN-2004-0418 by the Common Vulnerabilities and Exposures Project. Please
see <http://www.cve.mitre.org> for more information.
* A potential buffer overflow vulnerability in the server has been fixed.
This addresses the Common Vulnerabilities and Exposures Project's issue
#CAN-2004-0414. Please see <http://www.cve.mitre.org> for more information.
Changes from 1.11.15 to 1.11.16:
********************************
SERVER SECURITY FIXES
* A potential buffer overflow vulnerability in the server has been fixed.
Prior to this patch, a malicious client could potentially use carefully
crafted server requests to run arbitrary programs on the CVS server machine.
This addresses the Common Vulnerabilities and Exposures Project's issue
#CAN-2004-0396. Please see <http://www.cve.mitre.org> for more information.
BUG FIXES
* The Microsoft Visual C++ workspace and project files have been repaired and
regenerated with MSVC++ 6.0.
* The cvs.1 man page is now generated automatically from a section of the CVS
Manual.
* Thanks to a report from Mark Andrews at the Internet Systems Consortium, the
:ext: connection method no longer relies on a transparent transport that uses
an argument processor that can handle arbitrary ordering of options and other
arguments when using a username other than the caller's.
* Thanks to Ken Raeburn at MIT, directory deletion, whether via `cvs release'
or empty directory pruning, now works on network shares under Windows XP.
Changes from 1.11.14 to 1.11.15:
********************************
SERVER SECURITY ISSUES
* Piped checkouts of paths above $CVSROOT no longer work. Previously, clients
could have requested the contents of RCS archive files anywhere on a CVS
server.
server. This addresses CVE issue CAN-2004-0405. Please see
<http://www.cve.mitre.org> for more information.
CLIENT SECURITY ISSUES
* Clients now check paths from the server to verify that they are within one of
the sandboxes the user requested be updated. Previously, a trojan server
could have written or overwritten files anywhere the user had access,
presenting a serious security risk.
presenting a serious security risk. This addresses CVE issue CAN-2004-1080.
Please see <http://www.cve.mitre.org> for more information.
GENERAL USER ISSUES

View File

@ -267,3 +267,85 @@ when using GSSAPI.])
AC_SEARCH_LIBS([gss_import_name], [gssapi_krb5 gssapi])
fi
])dnl
# size_max.m4 serial 2
dnl Copyright (C) 2003 Free Software Foundation, Inc.
dnl This file is free software, distributed under the terms of the GNU
dnl General Public License. As a special exception to the GNU General
dnl Public License, this file may be distributed as part of a program
dnl that contains a configuration script generated by Autoconf, under
dnl the same distribution terms as the rest of that program.
dnl From Bruno Haible.
AC_DEFUN([gl_SIZE_MAX],
[
AC_CHECK_HEADERS(stdint.h)
dnl First test whether the system already has SIZE_MAX.
AC_MSG_CHECKING([for SIZE_MAX])
result=
AC_EGREP_CPP([Found it], [
#include <limits.h>
#if HAVE_STDINT_H
#include <stdint.h>
#endif
#ifdef SIZE_MAX
Found it
#endif
], result=yes)
if test -z "$result"; then
dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
dnl than the type 'unsigned long'.
dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr',
dnl which is guaranteed to work from LONG_MIN to LONG_MAX.
_AC_COMPUTE_INT([~(size_t)0 / 10], res_hi,
[#include <stddef.h>], result=?)
_AC_COMPUTE_INT([~(size_t)0 % 10], res_lo,
[#include <stddef.h>], result=?)
_AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint,
[#include <stddef.h>], result=?)
if test "$fits_in_uint" = 1; then
dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
AC_TRY_COMPILE([#include <stddef.h>
extern size_t foo;
extern unsigned long foo;
], [], fits_in_uint=0)
fi
if test -z "$result"; then
if test "$fits_in_uint" = 1; then
result="$res_hi$res_lo"U
else
result="$res_hi$res_lo"UL
fi
else
dnl Shouldn't happen, but who knows...
result='~(size_t)0'
fi
fi
AC_MSG_RESULT([$result])
if test "$result" != yes; then
AC_DEFINE_UNQUOTED([SIZE_MAX], [$result],
[Define as the maximum value of type 'size_t', if the system doesn't define it.])
fi
])
# xsize.m4 serial 3
dnl Copyright (C) 2003-2004 Free Software Foundation, Inc.
dnl This file is free software, distributed under the terms of the GNU
dnl General Public License. As a special exception to the GNU General
dnl Public License, this file may be distributed as part of a program
dnl that contains a configuration script generated by Autoconf, under
dnl the same distribution terms as the rest of that program.
AC_DEFUN([gl_XSIZE],
[
dnl Prerequisites of lib/xsize.h.
AC_REQUIRE([gl_SIZE_MAX])
AC_REQUIRE([AC_C_INLINE])
AC_CHECK_HEADERS(stdint.h)
])

View File

@ -281,6 +281,88 @@ when using GSSAPI.])
fi
])dnl
# size_max.m4 serial 2
dnl Copyright (C) 2003 Free Software Foundation, Inc.
dnl This file is free software, distributed under the terms of the GNU
dnl General Public License. As a special exception to the GNU General
dnl Public License, this file may be distributed as part of a program
dnl that contains a configuration script generated by Autoconf, under
dnl the same distribution terms as the rest of that program.
dnl From Bruno Haible.
AC_DEFUN([gl_SIZE_MAX],
[
AC_CHECK_HEADERS(stdint.h)
dnl First test whether the system already has SIZE_MAX.
AC_MSG_CHECKING([for SIZE_MAX])
result=
AC_EGREP_CPP([Found it], [
#include <limits.h>
#if HAVE_STDINT_H
#include <stdint.h>
#endif
#ifdef SIZE_MAX
Found it
#endif
], result=yes)
if test -z "$result"; then
dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
dnl than the type 'unsigned long'.
dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr',
dnl which is guaranteed to work from LONG_MIN to LONG_MAX.
_AC_COMPUTE_INT([~(size_t)0 / 10], res_hi,
[#include <stddef.h>], result=?)
_AC_COMPUTE_INT([~(size_t)0 % 10], res_lo,
[#include <stddef.h>], result=?)
_AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint,
[#include <stddef.h>], result=?)
if test "$fits_in_uint" = 1; then
dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
AC_TRY_COMPILE([#include <stddef.h>
extern size_t foo;
extern unsigned long foo;
], [], fits_in_uint=0)
fi
if test -z "$result"; then
if test "$fits_in_uint" = 1; then
result="$res_hi$res_lo"U
else
result="$res_hi$res_lo"UL
fi
else
dnl Shouldn't happen, but who knows...
result='~(size_t)0'
fi
fi
AC_MSG_RESULT([$result])
if test "$result" != yes; then
AC_DEFINE_UNQUOTED([SIZE_MAX], [$result],
[Define as the maximum value of type 'size_t', if the system doesn't define it.])
fi
])
# xsize.m4 serial 3
dnl Copyright (C) 2003-2004 Free Software Foundation, Inc.
dnl This file is free software, distributed under the terms of the GNU
dnl General Public License. As a special exception to the GNU General
dnl Public License, this file may be distributed as part of a program
dnl that contains a configuration script generated by Autoconf, under
dnl the same distribution terms as the rest of that program.
AC_DEFUN([gl_XSIZE],
[
dnl Prerequisites of lib/xsize.h.
AC_REQUIRE([gl_SIZE_MAX])
AC_REQUIRE([AC_C_INLINE])
AC_CHECK_HEADERS(stdint.h)
])
# Do all the work for Automake. -*- Autoconf -*-
# This macro actually does too much some checks are only needed if

View File

@ -425,6 +425,10 @@
*/
#undef SERVER_SUPPORT
/* Define as the maximum value of type 'size_t', if the system doesn't define
it. */
#undef SIZE_MAX
/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
#undef STAT_MACROS_BROKEN
@ -486,6 +490,12 @@
/* Define to `int' if <sys/types.h> doesn't define. */
#undef gid_t
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#undef inline
#endif
/* Define to `int' if <sys/types.h> does not define. */
#undef mode_t

1483
contrib/cvs/configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
dnl configure.in for cvs
AC_INIT([Concurrent Versions System (CVS)],[1.11.15],[bug-cvs@gnu.org],[cvs])
AC_INIT([Concurrent Versions System (CVS)],[1.11.17],[bug-cvs@gnu.org],[cvs])
AC_CONFIG_SRCDIR(src/cvs.h)
AM_INIT_AUTOMAKE([gnu 1.7.9 dist-bzip2 no-define])
AC_PREREQ(2.58)
@ -191,6 +191,7 @@ AC_REPLACE_FUNCS(\
dnl
dnl Begin GNULIB stuff.
dnl
gl_XSIZE
dnl We always want to use the GNULIB getpass, so define its name to something
dnl that won't conflict with system declarations.
@ -1020,7 +1021,10 @@ AC_CONFIG_FILES(contrib/pvcs2rcs, [chmod +x contrib/pvcs2rcs])
AC_CONFIG_FILES(contrib/rcs2log:contrib/rcs2log.sh, [chmod +x contrib/rcs2log])
AC_CONFIG_FILES(contrib/rcslock, [chmod +x contrib/rcslock])
AC_CONFIG_FILES(contrib/sccs2rcs, [chmod +x contrib/sccs2rcs])
AC_CONFIG_FILES(doc/mkman, [chmod +x doc/mkman])
AC_CONFIG_FILES(src/cvsbug, [chmod +x src/cvsbug])
AC_CONFIG_FILES(windows-NT/fix-msvc-mak:windows-NT/fix-msvc-mak-head.pl:windows-NT/fix-msvc-mak.pl,
[chmod +x windows-NT/fix-msvc-mak])
dnl the bulk files
AC_CONFIG_FILES([Makefile \

View File

@ -1,3 +1,18 @@
2004-05-15 Derek Price <derek@ximbiot.com>
* libdiff.dsp: Header file list updated.
* libdiff.dep: Regenerated for "libdiff.dsp" changes.
* libdiff.mak: Regenerated for "libdiff.dsp" changes.
(Patch from Conrad Pino <conrad@pino.com>.)
2004-05-13 Derek Price <derek@ximbiot.com>
* .cvsignore: Changed for "libdiff.dsp" changes.
* libdiff.dep: Added for "../cvsnt.dsw" changes.
* libdiff.dsp: Changed for "../cvsnt.dsw" changes.
* libdiff.mak: Regenerated for "../cvsnt.dsw" changes.
(Patch from Conrad Pino <conrad@pino.com>.)
2004-03-20 Derek Price <derek@ximbiot.com>
* diff.c (diff_run): Update string arg to const.

View File

@ -21,4 +21,5 @@ libdiff_a_SOURCES = diff.c diff3.c analyze.c cmpbuf.c cmpbuf.h io.c \
context.c ed.c normal.c ifdef.c util.c dir.c version.c diff.h \
side.c system.h diffrun.h
EXTRA_DIST = ChangeLog build_diff.com diagmeet.note libdiff.dsp
EXTRA_DIST = ChangeLog build_diff.com diagmeet.note \
libdiff.dep libdiff.dsp libdiff.mak

View File

@ -134,7 +134,9 @@ libdiff_a_SOURCES = diff.c diff3.c analyze.c cmpbuf.c cmpbuf.h io.c \
side.c system.h diffrun.h
EXTRA_DIST = ChangeLog build_diff.com diagmeet.note libdiff.dsp
EXTRA_DIST = ChangeLog build_diff.com diagmeet.note \
libdiff.dep libdiff.dsp libdiff.mak
subdir = diff
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs

View File

@ -1,3 +1,129 @@
2004-05-28 Derek Price <derek@ximbiot.com>
* cvs.texinfo (Global options): Remove reference to global -l option.
(Report from Kevin Bulgrien <Kevin.Bulgrien@TriPointGlobal.com>.)
2004-05-14 Mark D. Baushke <mdb@cvshome.org>
* cvs.texinfo: Fix makeinfo error.
* cvs.texinfo (Adding files): Minor cleanup.
(Using keywords): Minor cleanup.
(annotate): Move into the manual section, split into three nodes.
(annotate options): New node.
(annotate example): New node.
(based on patch from Steve McIntyre <steve@einval.com>.)
(Locks, GSSAPI authenticated): Minor cleanup.
(Sticky tags): Clarify operation.
(Locks): Spelling fix.
(Merging adds and removals): Ditto.
(Invoking CVS): Ditto
(Builds): Grammar fix.
(Line group formats): Ditto
(Line group formats, Line formats): Ditto
(commit files): Ditto.
* cvs.1, stamp-vti, version.texi: Regenerated
2004-05-12 Derek Price <derek@ximbiot.com>
* mkman.in: Clarify status messages.
2004-05-10 Derek Price <derek@ximbiot.com>
* mkman.in: Organize & tidy comments. Check for unprocessed texinfo
commands. Output better error messages on finding unprocessed texinfo
commands.
(do_keyword, keyword_mode): Accept $file argument for error messages.
2004-05-06 Derek Price <derek@ximbiot.com>
* mkman.in: Require Perl 5.005. Add comments. Remove duplicate s///.
Handle @:.
2004-05-06 Derek Price <derek@ximbiot.com>
* cvs.man.header: Minor text correction.
* mkman.in: Ignore @need keyword. Restore previous font for nested
keywords.
(do_keyword): Ditto on fonts. Move some functionality to...
(keyword_mode): ...this new function.
2004-05-06 Derek Price <derek@ximbiot.com>
* mkman.in: Handle keywords that cross multiple lines.
(do_keyword): New function.
2004-05-04 Derek Price <derek@ximbiot.com>
* cvs.man.header, cvs.man.footer: Reference `info CVS' rather than
`info cvs' to send users to the top node.
2004-05-03 Derek Price <derek@ximbiot.com>
* Makefile.am: mkman is built in the build dir, not $(srcdir).
(Report from Mark D. Baushke <mdb@cvshome.org>.)
2004-05-03 Derek Price <derek@ximbiot.com>
* HACKING.DOCS: Fix spelling error. Add reference for @strong.
(Report from Mark D. Baushke <mdb@cvshome.org>.)
* HACKING.DOCS: Note dependency on `makeinfo' 3.11 & greater.
2004-04-30 Derek Price <derek@ximbiot.com>
* mkman.in: Handle single quotes better. Parse out some redundancy
from node and section names.
* cvs.man.footer: Replace some quotes with the usual bold font.
Reformat links in the SEE ALSO section.
* cvs.1: Regenerated.
2004-04-30 Derek Price <derek@ximbiot.com>
* mkman.in: Handle examples better. Protect a few more characters.
* cvs.1, stamp-vti, version.texi: Regenerated.
2004-04-30 Derek Price <derek@ximbiot.com>
* cvs.man.header: Add copyright notice.
* cvs.1: Regenerated.
2004-04-30 Derek Price <derek@ximbiot.com>
* mkman.in: Add copyright and license notice.
2004-04-30 Derek Price <derek@ximbiot.com>
* mkman.in: Handle @@.
* cvs.1: Regenerated.
2004-04-30 Derek Price <derek@ximbiot.com>
First pass at closing issue #3 on cvshome.org.
* .cvsignore: Ignore mkman.
* cvs.1, mkman.in, cvs.man.header, cvs.man.footer: New files.
* cvs.texinfo: Add cut tags for mkman.
* Makefile.in (man_MANS): Add cvs.1.
(EXTRA_DIST): Add cvs.man.header & cvs.man.footer.
(cvs.1, mkman): New targets.
* Makefile.in: Regenerated.
2004-04-23 Derek Price <derek@ximbiot.com>
* cvs.texinfo: Update years in Copyright.
* stamp-vti, version.texi: Regenerated.
2004-04-21 Derek Price <derek@ximbiot.com>
* cvs.texinfo: Use splitrcskeyword macro consistently in a failed
attempt to avoid a warning during PDF generation.
* stamp-vti, version.texi: Regenerated.
2004-04-18 Derek Price <derek@ximbiot.com>
* cvs.texinfo: Various spelling, typo, and capitalization fixes.
(Patch from Ville Skyttä <scop@cvshome.org>.)
2004-04-06 Larry Jones <lawrence.jones@ugsplm.com>
* cvs.texinfo (Assigning revisions): Note that client/server mode

View File

@ -15,6 +15,7 @@
# GNU General Public License for more details.
info_TEXINFOS = cvs.texinfo cvsclient.texi
man_MANS = cvs.1
PSS = \
cvs.ps \
@ -36,7 +37,10 @@ EXTRA_DIST = \
ChangeLog.fsf \
RCSFILES \
mdate-sh \
cvs-paper.ms
cvs.1 \
cvs-paper.ms \
cvs.man.header \
cvs.man.footer
MOSTLYCLEANFILES = \
$(TXTS)
@ -72,9 +76,13 @@ cvs-paper.ps: cvs-paper.ms
cvs-paper.pdf: cvs-paper.ps
ps2pdf $< $@
SUFFIXES = .txt
# Targets to build a man page from cvs.texinfo.
cvs.1: @MAINTAINER_MODE_TRUE@ mkman cvs.man.header cvs.texinfo cvs.man.footer
./mkman $(srcdir)/cvs.man.header $(srcdir)/cvs.texinfo \
$(srcdir)/cvs.man.footer >$@
# texinfo based targets automake neglects to include
SUFFIXES = .txt
.texinfo.txt:
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
--no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<

View File

@ -141,6 +141,7 @@ sysconfdir = @sysconfdir@
target_alias = @target_alias@
info_TEXINFOS = cvs.texinfo cvsclient.texi
man_MANS = cvs.1
PSS = \
cvs.ps \
@ -165,7 +166,10 @@ EXTRA_DIST = \
ChangeLog.fsf \
RCSFILES \
mdate-sh \
cvs-paper.ms
cvs.1 \
cvs-paper.ms \
cvs.man.header \
cvs.man.footer
MOSTLYCLEANFILES = \
@ -178,19 +182,24 @@ MAINTAINERCLEANFILES = \
$(PSS)
# texinfo based targets automake neglects to include
SUFFIXES = .txt
subdir = doc
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_FILES = mkman
DIST_SOURCES =
am__TEXINFO_TEX_DIR = $(srcdir)
INFO_DEPS = cvs.info cvsclient.info
DVIS = cvs.dvi cvsclient.dvi
TEXINFOS = cvs.texinfo cvsclient.texi
NROFF = nroff
MANS = $(man_MANS)
DIST_COMMON = $(srcdir)/Makefile.in ChangeLog Makefile.am mdate-sh \
stamp-1 stamp-vti texinfo.tex version-client.texi version.texi
mkman.in stamp-1 stamp-vti texinfo.tex version-client.texi \
version.texi
all: all-am
.SUFFIXES:
@ -200,6 +209,8 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configu
$(AUTOMAKE) --gnu doc/Makefile
Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
mkman: $(top_builddir)/config.status mkman.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
.texinfo.info:
@rm -f $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]
@ -328,6 +339,53 @@ maintainer-clean-aminfo:
echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
done
man1dir = $(mandir)/man1
install-man1: $(man1_MANS) $(man_MANS)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(DESTDIR)$(man1dir)
@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
for i in $$l2; do \
case "$$i" in \
*.1*) list="$$list $$i" ;; \
esac; \
done; \
for i in $$list; do \
if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
else file=$$i; fi; \
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
case "$$ext" in \
1*) ;; \
*) ext='1' ;; \
esac; \
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
inst=`echo $$inst | sed -e 's/^.*\///'`; \
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
$(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
done
uninstall-man1:
@$(NORMAL_UNINSTALL)
@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
for i in $$l2; do \
case "$$i" in \
*.1*) list="$$list $$i" ;; \
esac; \
done; \
for i in $$list; do \
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
case "$$ext" in \
1*) ;; \
*) ext='1' ;; \
esac; \
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
inst=`echo $$inst | sed -e 's/^.*\///'`; \
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
rm -f $(DESTDIR)$(man1dir)/$$inst; \
done
tags: TAGS
TAGS:
@ -371,10 +429,10 @@ distdir: $(DISTFILES)
dist-info
check-am: all-am
check: check-am
all-am: Makefile $(INFO_DEPS)
all-am: Makefile $(INFO_DEPS) $(MANS)
installdirs:
$(mkinstalldirs) $(DESTDIR)$(infodir)
$(mkinstalldirs) $(DESTDIR)$(infodir) $(DESTDIR)$(man1dir)
install: install-am
install-exec: install-exec-am
install-data: install-data-am
@ -417,7 +475,7 @@ info: info-am
info-am: $(INFO_DEPS)
install-data-am: install-info-am
install-data-am: install-info-am install-man
install-exec-am:
@ -449,7 +507,7 @@ install-info-am: $(INFO_DEPS)
install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$relfile || :;\
done; \
else : ; fi
install-man:
install-man: install-man1
installcheck-am:
@ -472,18 +530,21 @@ ps: ps-am
ps-am: $(PSS)
uninstall-am: uninstall-info-am
uninstall-am: uninstall-info-am uninstall-man
uninstall-man: uninstall-man1
.PHONY: all all-am check check-am clean clean-generic dist-info \
distclean distclean-generic distdir dvi dvi-am info info-am \
install install-am install-data install-data-am install-exec \
install-exec-am install-info install-info-am install-man \
install-strip installcheck installcheck-am installdirs \
maintainer-clean maintainer-clean-1 maintainer-clean-aminfo \
maintainer-clean-generic maintainer-clean-vti mostlyclean \
mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \
mostlyclean-vti pdf pdf-am ps ps-am uninstall uninstall-am \
uninstall-info-am
install-man1 install-strip installcheck installcheck-am \
installdirs maintainer-clean maintainer-clean-1 \
maintainer-clean-aminfo maintainer-clean-generic \
maintainer-clean-vti mostlyclean mostlyclean-1 \
mostlyclean-aminfo mostlyclean-generic mostlyclean-vti pdf \
pdf-am ps ps-am uninstall uninstall-am uninstall-info-am \
uninstall-man uninstall-man1
doc: info ps
@ -512,7 +573,10 @@ cvs-paper.ps: cvs-paper.ms
cvs-paper.pdf: cvs-paper.ps
ps2pdf $< $@
# texinfo based targets automake neglects to include
# Targets to build a man page from cvs.texinfo.
cvs.1: @MAINTAINER_MODE_TRUE@ mkman cvs.man.header cvs.texinfo cvs.man.footer
./mkman $(srcdir)/cvs.man.header $(srcdir)/cvs.texinfo \
$(srcdir)/cvs.man.footer >$@
.texinfo.txt:
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
--no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<

3708
contrib/cvs/doc/cvs.1 Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,60 @@
.SH "AUTHORS"
.TP
Dick Grune
Original author of the
.B cvs
shell script version posted to
.B comp.sources.unix
in the volume6 release of December, 1986.
Credited with much of the
.B cvs
conflict resolution algorithms.
.TP
Brian Berliner
Coder and designer of the
.B cvs
program itself in April, 1989, based on the original work done by Dick.
.TP
Jeff Polk
Helped Brian with the design of the
.B cvs
module and vendor branch support and author of the
.BR checkin ( 1 )
shell script (the ancestor of \fBcvs import\fP).
.TP
Larry Jones, Derek R. Price, and Mark D. Baushke
Have helped maintain
.B cvs
for many years.
.TP
And many others too numerous to mention here.
.SH "SEE ALSO"
The most comprehensive manual for CVS is
Version Management with CVS by Per Cederqvist et al. Depending on
your system, you may be able to get it with the
.B info CVS
command or it may be available as cvs.pdf (Portable Document Format),
cvs.ps (PostScript), cvs.texinfo (Texinfo source), or cvs.html.
.SP
For CVS updates, more information on documentation, software related
to CVS, development of CVS, and more, see:
.in +1i
.SP
.PD 0
.IP "" 4
.B http://cvshome.org
.IP "" 4
.B http://www.loria.fr/~molli/cvs-index.html
.in -1i
.SP
.BR ci ( 1 ),
.BR co ( 1 ),
.BR cvs ( 5 ),
.BR cvsbug ( 8 ),
.BR diff ( 1 ),
.BR grep ( 1 ),
.BR patch ( 1 ),
.BR rcs ( 1 ),
.BR rcsdiff ( 1 ),
.BR rcsmerge ( 1 ),
.BR rlog ( 1 ).

View File

@ -0,0 +1,61 @@
.\" This is the man page for CVS. It is auto-generated from the
.\" cvs.man.header, cvs.texinfo, & cvs.man.footer files. Please make changes
.\" there. A full copyright & license notice may also be found in cvs.texinfo.
.\"
.\" Copyright 2004 The Free Software Foundation,
.\" Derek R. Price,
.\" & Ximbiot <http://ximbiot.com>
.\"
.\" This documentation is free software; you can redistribute it and/or modify
.\" it under the terms of the GNU General Public License as published by
.\" the Free Software Foundation; either version 2, or (at your option)
.\" any later version.
.\"
.\" This documentation is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public License
.\" along with this documentation; if not, write to the Free Software
.\" Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
.de Id
.ds Rv \\$3
.ds Dt \\$4
..
.TH CVS 1 "\*(Dt"
.\" Full space in nroff; half space in troff
.de SP
.if n .sp
.if t .sp .5
..
.\" quoted command
.de `
.RB ` "\|\\$1\|" '\\$2
..
.SH "NAME"
cvs \- Concurrent Versions System
.SH "SYNOPSIS"
.TP
\fBcvs\fP [ \fIcvs_options\fP ]
.I cvs_command
[
.I command_options
] [
.I command_args
]
.SH "NOTE"
.IX "revision control system" "\fLcvs\fR"
.IX cvs "" "\fLcvs\fP \- concurrent versions system"
.IX "concurrent versions system \- \fLcvs\fP"
.IX "release control system" "cvs command" "" "\fLcvs\fP \- concurrent versions system"
.IX "source control system" "cvs command" "" "\fLcvs\fP \- concurrent versions system"
.IX revisions "cvs command" "" "\fLcvs\fP \- source control"
This manpage is a summary of some of the features of
\fBcvs\fP. It is auto-generated from an appendix of the CVS manual.
For more in-depth documentation, please consult the
Cederqvist manual (via the
.B info CVS
command or otherwise,
as described in the SEE ALSO section of this manpage). Cross-references
in this man page refer to nodes in the same.

View File

@ -4,12 +4,14 @@
@macro copyleftnotice
@noindent
Copyright @copyright{} 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2001, 2002, 2003 Free Software Foundation, Inc.
2001, 2002, 2003, 2004 Free Software Foundation, Inc.
@multitable @columnfractions .12 .88
@item Portions
@item @tab Copyright @copyright{} 1999, 2000, 2001, 2002, 2003 Derek R. Price,
@item @tab Copyright @copyright{} 2002, 2003 Ximbiot @url{http://ximbiot.com},
@item @tab Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004
Derek R. Price,
@item @tab Copyright @copyright{} 2002, 2003, 2004
Ximbiot @url{http://ximbiot.com},
@item @tab Copyright @copyright{} 1992, 1993, 1999 Signum Support AB,
@item @tab and Copyright @copyright{} others.
@end multitable
@ -255,7 +257,7 @@ module and vendor branch support.
@cindex Source, getting CVS source
You can get @sc{cvs} in a variety of ways, including
free download from the internet. For more information
free download from the Internet. For more information
on downloading @sc{cvs} and other @sc{cvs} topics, see:
@example
@ -271,10 +273,10 @@ devoted to @sc{cvs}. To subscribe or
unsubscribe
write to
@email{info-cvs-request@@gnu.org}.
If you prefer a usenet group, there is a one-way mirror (posts to the email
If you prefer a Usenet group, there is a one-way mirror (posts to the email
list are usually sent to the news group, but not visa versa) of
@email{info-cvs@@gnu.org} at @url{news:gnu.cvs.help}. The right
usenet group for posts is @url{news:comp.software.config-mgmt} which is for
Usenet group for posts is @url{news:comp.software.config-mgmt} which is for
@sc{cvs} discussions (along with other configuration
management systems). In the future, it might be
possible to create a
@ -291,7 +293,7 @@ if there is sufficient @sc{cvs} traffic on
You can also subscribe to the @email{bug-cvs@@gnu.org} mailing list,
described in more detail in @ref{BUGS}. To subscribe
send mail to @email{bug-cvs-request@@gnu.org}. There is a two-way
usenet mirror (posts to the usenet group are usually sent to the email list and
Usenet mirror (posts to the Usenet group are usually sent to the email list and
visa versa) of @email{bug-cvs@@gnu.org} named @url{news:gnu.cvs.bug}.
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -421,11 +423,11 @@ nothing falls through the cracks.
@item @sc{cvs} is not an automated testing program
It should be possible to enforce mandatory use of a
testsuite using the @code{commitinfo} file. I haven't
test suite using the @code{commitinfo} file. I haven't
heard a lot about projects trying to do that or whether
there are subtle gotchas, however.
@item @sc{cvs} does not have a builtin process model
@item @sc{cvs} does not have a built-in process model
Some systems provide ways to ensure that changes or
releases go through various steps, with various
@ -1002,7 +1004,7 @@ rules see @ref{Tags}.
@c FIXME: we need to somehow reflect "permissions in
@c repository" versus "permissions in working
@c directory" in the index entries.
@cindex Group, UNIX file premissions, in repository
@cindex Group, UNIX file permissions, in repository
@cindex Read-only files, in repository
All @samp{,v} files are created read-only, and you
should not change the permission of those files. The
@ -1211,7 +1213,7 @@ files.
This behavior is implemented only by @sc{cvs} 1.7 and
later; for details see @ref{Watches Compatibility}.
The format of the fileattr file is a series of entries
The format of the @file{fileattr} file is a series of entries
of the following form (where @samp{@{} and @samp{@}}
means the text between the braces can be repeated zero
or more times):
@ -1234,7 +1236,7 @@ Note that the order of the lines is not significant;
a program writing the fileattr file may
rearrange them at its convenience.
There is currently no way of quoting tabs or linefeeds in the
There is currently no way of quoting tabs or line feeds in the
filename, @samp{=} in @var{attrname},
@samp{;} in @var{attrval}, etc. Note: some implementations also
don't handle a NUL character in any of the fields, but
@ -1244,7 +1246,7 @@ By convention, @var{attrname} starting with @samp{_} is for an attribute given
special meaning by @sc{cvs}; other @var{attrname}s are for user-defined attributes
(or will be, once implementations start supporting user-defined attributes).
Builtin attributes:
Built-in attributes:
@table @code
@item _watched
@ -1303,7 +1305,7 @@ For an introduction to @sc{cvs} locks focusing on
user-visible behavior, see @ref{Concurrency}. The
following section is aimed at people who are writing
tools which want to access a @sc{cvs} repository without
interfering with other tools acessing the same
interfering with other tools accessing the same
repository. If you find yourself confused by concepts
described here, like @dfn{read lock}, @dfn{write lock},
and @dfn{deadlock}, you might consult the literature on
@ -1320,7 +1322,7 @@ The directory @file{#cvs.lock} serves as a master
lock. That is, one must obtain this lock first before
creating any of the other locks.
To obtain a readlock, first create the @file{#cvs.lock}
To obtain a read lock, first create the @file{#cvs.lock}
directory. This operation must be atomic (which should
be true for creating a directory under most operating
systems). If it fails because the directory already
@ -1334,8 +1336,8 @@ Then proceed with reading the repository. When you are
done, remove the @file{#cvs.rfl} file to release the
read lock.
To obtain a writelock, first create the
@file{#cvs.lock} directory, as with a readlock. Then
To obtain a write lock, first create the
@file{#cvs.lock} directory, as with read locks. Then
check that there are no files whose names start with
@file{#cvs.rfl.}. If there are, remove
@file{#cvs.lock}, wait for a while, and try again. If
@ -1351,7 +1353,7 @@ informational; it has no effect on the locking operation
beyond what is provided by holding on to the
@file{#cvs.lock} lock itself.
Note that each lock (writelock or readlock) only locks
Note that each lock (write lock or read lock) only locks
a single directory in the repository, including
@file{Attic} and @file{CVS} but not including
subdirectories which represent other directories under
@ -1360,11 +1362,11 @@ lock each directory (note that if you fail to obtain
any lock you need, you must release the whole tree
before waiting and trying again, to avoid deadlocks).
Note also that @sc{cvs} expects writelocks to control
Note also that @sc{cvs} expects write locks to control
access to individual @file{foo,v} files. @sc{rcs} has
a scheme where the @file{,foo,} file serves as a lock,
but @sc{cvs} does not implement it and so taking out a
@sc{cvs} writelock is recommended. See the comments at
@sc{cvs} write lock is recommended. See the comments at
rcs_internal_lockfile in the @sc{cvs} source code for
further discussion/rationale.
@ -2068,7 +2070,7 @@ described in @ref{Connecting via rsh}.
* Connecting via rsh:: Using the @code{rsh} program to connect
* Password authenticated:: Direct connections using passwords
* GSSAPI authenticated:: Direct connections using GSSAPI
* Kerberos authenticated:: Direct connections with kerberos
* Kerberos authenticated:: Direct connections with Kerberos
* Connecting via fork:: Using a forked @code{cvs server} to connect
@end menu
@ -2688,7 +2690,7 @@ authenticating with GSSAPI.
To do this, @sc{cvs} needs to be compiled with GSSAPI
support; when configuring @sc{cvs} it tries to detect
whether GSSAPI libraries using kerberos version 5 are
whether GSSAPI libraries using Kerberos version 5 are
present. You can also use the @file{--with-gssapi}
flag to configure.
@ -2720,7 +2722,7 @@ cvs/@var{hostname}, where @var{hostname} is the
canonical name of the server host. You will have to
set this up as required by your GSSAPI mechanism.
To connect using GSSAPI, use @samp{:gserver:}. For
To connect using GSSAPI, use the @samp{:gserver:} method. For
example,
@example
@ -2728,27 +2730,27 @@ cvs -d :gserver:faun.example.org:/usr/local/cvsroot checkout foo
@end example
@node Kerberos authenticated
@subsection Direct connection with kerberos
@subsection Direct connection with Kerberos
@cindex Kerberos, using :kserver:
@cindex Security, kerberos
@cindex Security, Kerberos
@cindex :kserver:, setting up
The easiest way to use kerberos is to use the kerberos
The easiest way to use Kerberos is to use the Kerberos
@code{rsh}, as described in @ref{Connecting via rsh}.
The main disadvantage of using rsh is that all the data
needs to pass through additional programs, so it may be
slower. So if you have kerberos installed you can
slower. So if you have Kerberos installed you can
connect via a direct @sc{tcp} connection,
authenticating with kerberos.
authenticating with Kerberos.
This section concerns the kerberos network security
This section concerns the Kerberos network security
system, version 4. Kerberos version 5 is supported via
the GSSAPI generic network security interface, as
described in the previous section.
To do this, @sc{cvs} needs to be compiled with kerberos
To do this, @sc{cvs} needs to be compiled with Kerberos
support; when configuring @sc{cvs} it tries to detect
whether kerberos is present or you can use the
whether Kerberos is present or you can use the
@file{--with-krb4} flag to configure.
The data transmitted is @emph{not} encrypted by
@ -3173,6 +3175,9 @@ $ cd tc
$ cvs import -m "Created directory structure" yoyodyne/@var{dir} yoyo start
@end example
This will add yoyodyne/@var{dir} as a directory under
@code{$CVSROOT}.
Then, use @code{add} to add files (and new directories)
as they appear.
@ -3810,8 +3815,8 @@ File: driver.c Status: Up-to-date
@cindex Deleting sticky tags
The sticky tags will remain on your working files until
you delete them with @samp{cvs update -A}. The
@samp{-A} option retrieves the version of the file from
the head of the trunk, removing any sticky tags,
@samp{-A} option merges local changes into the version of the
file from the head of the trunk, removing any sticky tags,
dates, or options. See @ref{update} for more on the operation
of @code{cvs update}.
@ -3916,7 +3921,7 @@ out release 1.0 (@pxref{Tags}) and find the bug
(which turns out to have a trivial fix). However, the current revision
of the sources are in a state of flux and are not expected to be stable
for at least another month. There is no way to make a
bugfix release based on the newest sources.
bug fix release based on the newest sources.
The thing to do in a situation like this is to create a @dfn{branch} on
the revision trees for all the files that make up
@ -4461,7 +4466,7 @@ branch since @sc{cvs} does not automatically add static tags to dead revisions.
The exception to this rule occurs when
a static tag has been attached to a dead revision manually. Use the branch tag
to merge all changes from the branch or use two static tags as merge endpoints
to be sure that all intended changes are propogated in the merge.
to be sure that all intended changes are propagated in the merge.
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@node Merging and keywords
@ -4505,7 +4510,7 @@ results from a merge:
@example
$ cat file1
key $@splitrcskeyword{}Revision: 1.2 $
key $@splitrcskeyword{Revision}: 1.2 $
. . .
$ cvs update -j br1
U file1
@ -4516,9 +4521,9 @@ Merging differences between 1.1 and 1.1.2.1 into file1
rcsmerge: warning: conflicts during merge
$ cat file1
@asis{}<<<<<<< file1
key $@splitrcskeyword{}Revision: 1.2 $
key $@splitrcskeyword{Revision}: 1.2 $
@asis{}=======
key $@splitrcskeyword{}Revision: 1.1.2.1 $
key $@splitrcskeyword{Revision}: 1.1.2.1 $
@asis{}>>>>>>> 1.1.2.1
. . .
@end example
@ -4535,7 +4540,7 @@ Here is what happens if you had used @samp{-kk}:
@example
$ cat file1
key $@splitrcskeyword{}Revision: 1.2 $
key $@splitrcskeyword{Revision}: 1.2 $
. . .
$ cvs update -kk -j br1
U file1
@ -4544,7 +4549,7 @@ retrieving revision 1.1
retrieving revision 1.1.2.1
Merging differences between 1.1 and 1.1.2.1 into file1
$ cat file1
key $@splitrcskeyword{}Revision$
key $@splitrcskeyword{Revision}$
. . .
@end example
@ -4731,15 +4736,17 @@ directory.
@c changing right away.
Unlike most other commands, the @code{add} command is
not recursive. You cannot even type @samp{cvs add
foo/bar}! Instead, you have to
@c FIXCVS: This is, of course, not a feature. It is
@c just that no one has gotten around to fixing "cvs add
@c foo/bar".
not recursive. You have to expcicitly name files and
directories that you wish to add to the repository.
However, each directory will need to be added
separately before you will be able to add new files
to those directories.
@example
$ cd foo
$ cvs add bar
$ mkdir -p foo/bar
$ cp ~/myfile foo/bar/myfile
$ cvs add foo foo/bar
$ cvs add foo/bar/myfile
@end example
@cindex add (subcommand)
@ -5294,7 +5301,6 @@ through the history.
* log messages:: Log messages
* history database:: The history database
* user-defined logging:: User-defined logging
* annotate:: What revision modified each line of a file?
@end menu
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -5390,10 +5396,6 @@ Note: you can control what is logged to this file by using the
@node user-defined logging
@section User-defined logging
@c FIXME: should probably also mention the fact the -l
@c global option can disable most of the mechanisms
@c discussed here (why? What is the -l global option for?).
@c
@c FIXME: probably should centralize this information
@c here, at least to some extent. Maybe by moving the
@c loginfo, etc., nodes here and replacing
@ -5421,45 +5423,6 @@ the @code{cvs watch add} command (@pxref{Getting
Notified}); this command is useful even if you are not
using @code{cvs watch on}.
@node annotate
@section Annotate command
@cindex annotate (subcommand)
@deffn Command {cvs annotate} [@code{-FflR}] [@code{-r rev}|@code{-D date}] files @dots{}
For each file in @var{files}, print the head revision
of the trunk, together with information on the last
modification for each line. For example:
@example
$ cvs annotate ssfile
Annotations for ssfile
***************
1.1 (mary 27-Mar-96): ssfile line 1
1.2 (joe 28-Mar-96): ssfile line 2
@end example
The file @file{ssfile} currently contains two lines.
The @code{ssfile line 1} line was checked in by
@code{mary} on March 27. Then, on March 28, @code{joe}
added a line @code{ssfile line 2}, without modifying
the @code{ssfile line 1} line. This report doesn't
tell you anything about lines which have been deleted
or replaced; you need to use @code{cvs diff} for that
(@pxref{diff}).
@end deffn
The options to @code{cvs annotate} are listed in
@ref{Invoking CVS}, and can be used to select the files
and revisions to annotate. The options are described
in more detail there and in @ref{Common options}.
@c FIXME: maybe an example using the options? Just
@c what it means to select a revision might be worth a
@c few words of explanation ("you want to see who
@c changed this line *before* 1.4"...).
@c ---------------------------------------------------------------------
@node Binary files
@chapter Handling binary files
@ -5558,7 +5521,7 @@ Here is an example of how you can create a new file
using the @samp{-kb} flag:
@example
$ echo '$@splitrcskeyword{}Id$' > kotest
$ echo '$@splitrcskeyword{Id}$' > kotest
$ cvs add -kb -m"A test file" kotest
$ cvs ci -m"First checkin; contains a keyword" kotest
@end example
@ -5568,7 +5531,7 @@ one can use the @code{cvs admin} command to recover.
For example:
@example
$ echo '$@splitrcskeyword{}Id$' > kotest
$ echo '$@splitrcskeyword{Id}$' > kotest
$ cvs add -m"A test file" kotest
$ cvs ci -m"First checkin; contains a keyword" kotest
$ cvs admin -kb kotest
@ -5747,7 +5710,7 @@ to RCS wouldn't think to use chmod anyway).
Implementation: use file attributes or use RCS
locking. The former avoids more dependence on RCS
behaviors we will need to reimplement as we librarify
behaviors we will need to re-implement as we librarify
RCS, and makes it easier to import/export RCS files (in
that context, want to ignore the locker field). But
note that RCS locks are per-branch, which is the
@ -6820,7 +6783,7 @@ a new revision of the file.
* Using keywords:: Using keywords
* Avoiding substitution:: Avoiding substitution
* Substitution modes:: Substitution modes
* Log keyword:: Problems with the $@splitrcskeyword{}Log$ keyword.
* Log keyword:: Problems with the $@splitrcskeyword{Log}$ keyword.
@end menu
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -6876,7 +6839,7 @@ The log message supplied during commit, preceded by a
header containing the @sc{rcs} filename, the revision
number, the author, and the date (UTC). Existing log
messages are @emph{not} replaced. Instead, the new log
message is inserted after @code{$@splitrcskeyword{Log:@dots{}}$}.
message is inserted after @code{$@splitrcskeyword{Log}:@dots{}$}.
Each new line is prefixed with the same string which
precedes the @code{$Log} keyword. For example, if the
file contains:
@ -6884,7 +6847,7 @@ file contains:
@example
/* Here is what people have been up to:
*
* $@splitrcskeyword{}Log: frob.c,v $
* $@splitrcskeyword{Log}: frob.c,v $
* Revision 1.1 1997/01/03 14:23:51 joe
* Add the superfrobnicate option
*
@ -6926,10 +6889,12 @@ assigned with @code{cvs admin -s}---see @ref{admin options}.
To include a keyword string you simply include the
relevant text string, such as @code{$@splitrcskeyword{Id}$}, inside the
file, and commit the file. @sc{cvs} will automatically
file, and commit the file. @sc{cvs} will automatically (Or,
more accurately, as part of the update run that
automatically happens after a commit.)
expand the string as part of the commit operation.
It is common to embed the @code{$@splitrcskeyword{}Id$} string in
It is common to embed the @code{$@splitrcskeyword{Id}$} string in
the source files so that it gets passed through to
generated files. For example, if you are managing
computer program source code, you might include a
@ -6955,11 +6920,11 @@ binary files.
@example
$ ident samp.c
samp.c:
$@splitrcskeyword{}Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
$@splitrcskeyword{Id}: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
$ gcc samp.c
$ ident a.out
a.out:
$@splitrcskeyword{}Id: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
$@splitrcskeyword{Id}: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
@end example
@cindex What (shell command)
@ -6973,7 +6938,7 @@ command. Simply prefix the keyword with the
magic @sc{sccs} phrase, like this:
@example
static char *id="@@(#) $@splitrcskeyword{}Id: ab.c,v 1.5 1993/10/19 14:57:32 ceder Exp $";
static char *id="@@(#) $@splitrcskeyword{Id}: ab.c,v 1.5 1993/10/19 14:57:32 ceder Exp $";
@end example
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -6982,9 +6947,9 @@ static char *id="@@(#) $@splitrcskeyword{}Id: ab.c,v 1.5 1993/10/19 14:57:32 ced
Keyword substitution has its disadvantages. Sometimes
you might want the literal text string
@samp{$@splitrcskeyword{}Author$} to appear inside a file without
@samp{$@splitrcskeyword{Author}$} to appear inside a file without
@sc{cvs} interpreting it as a keyword and expanding it
into something like @samp{$@splitrcskeyword{}Author: ceder $}.
into something like @samp{$@splitrcskeyword{Author}: ceder $}.
There is unfortunately no way to selectively turn off
keyword substitution. You can use @samp{-ko}
@ -6995,7 +6960,7 @@ In many cases you can avoid using keywords in
the source, even though they appear in the final
product. For example, the source for this manual
contains @samp{$@@asis@{@}Author$} whenever the text
@samp{$@splitrcskeyword{}Author$} should appear. In @code{nroff}
@samp{$@splitrcskeyword{Author}$} should appear. In @code{nroff}
and @code{troff} you can embed the null-character
@code{\&} inside the keyword for a similar effect.
@ -7035,7 +7000,7 @@ The modes available are:
@table @samp
@item -kkv
Generate keyword strings using the default form, e.g.
@code{$@splitrcskeyword{}Revision: 5.7 $} for the @code{Revision}
@code{$@splitrcskeyword{Revision}: 5.7 $} for the @code{Revision}
keyword.
@item -kkvl
@ -7047,8 +7012,8 @@ The locker's name is only relevant if @code{cvs admin
@item -kk
Generate only keyword names in keyword strings; omit
their values. For example, for the @code{Revision}
keyword, generate the string @code{$@splitrcskeyword{}Revision$}
instead of @code{$@splitrcskeyword{}Revision: 5.7 $}. This option
keyword, generate the string @code{$@splitrcskeyword{Revision}$}
instead of @code{$@splitrcskeyword{Revision}: 5.7 $}. This option
is useful to ignore differences due to keyword
substitution when comparing different revisions of a
file (@pxref{Merging and keywords}).
@ -7057,8 +7022,8 @@ file (@pxref{Merging and keywords}).
Generate the old keyword string, present in the working
file just before it was checked in. For example, for
the @code{Revision} keyword, generate the string
@code{$@splitrcskeyword{}Revision: 1.1 $} instead of
@code{$@splitrcskeyword{}Revision: 5.7 $} if that is how the
@code{$@splitrcskeyword{Revision}: 1.1 $} instead of
@code{$@splitrcskeyword{Revision}: 5.7 $} if that is how the
string appeared when the file was checked in.
@item -kb
@ -7074,10 +7039,10 @@ only to terminate lines, this is the same as
@item -kv
Generate only keyword values for keyword strings. For
example, for the @code{Revision} keyword, generate the string
@code{5.7} instead of @code{$@splitrcskeyword{}Revision: 5.7 $}.
@code{5.7} instead of @code{$@splitrcskeyword{Revision}: 5.7 $}.
This can help generate files in programming languages
where it is hard to strip keyword delimiters like
@code{$@splitrcskeyword{}Revision: $} from a string. However,
@code{$@splitrcskeyword{Revision}: $} from a string. However,
further keyword substitution cannot be performed once
the keyword names are removed, so this option should be
used with care.
@ -7090,18 +7055,18 @@ handle an export containing binary files correctly.
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@node Log keyword
@section Problems with the $@splitrcskeyword{}Log$ keyword.
@section Problems with the $@splitrcskeyword{Log}$ keyword.
The @code{$@splitrcskeyword{}Log$} keyword is somewhat
The @code{$@splitrcskeyword{Log}$} keyword is somewhat
controversial. As long as you are working on your
development system the information is easily accessible
even if you do not use the @code{$@splitrcskeyword{}Log$}
even if you do not use the @code{$@splitrcskeyword{Log}$}
keyword---just do a @code{cvs log}. Once you export
the file the history information might be useless
anyhow.
A more serious concern is that @sc{cvs} is not good at
handling @code{$@splitrcskeyword{}Log$} entries when a branch is
handling @code{$@splitrcskeyword{Log}$} entries when a branch is
merged onto the main trunk. Conflicts often result
from the merging operation.
@c Might want to check whether the CVS implementation
@ -7115,7 +7080,7 @@ errors). If that is done the information from
information inside the file. This may or may not be a
problem in real life.
It has been suggested that the @code{$@splitrcskeyword{}Log$}
It has been suggested that the @code{$@splitrcskeyword{Log}$}
keyword should be inserted @emph{last} in the file, and
not in the files header, if it is to be used at all.
That way the long list of change messages will not
@ -7435,7 +7400,7 @@ to break a project down into smaller
@c may not use the modules file.
separately-compiled subsystems, and arrange a way of
releasing them internally so that each developer need
check out only those subsystems which are they are
check out only those subsystems which they are
actively working on.
Another approach is to set up a structure which allows
@ -7575,6 +7540,7 @@ supported.
@end ignore
@c ---------------------------------------------------------------------
@c ----- START MAN 1 -----
@node CVS commands
@appendix Guide to CVS commands
@ -7604,6 +7570,7 @@ reference to @sc{cvs} commands, @pxref{Invoking CVS}).
* Global options:: Options you give to the left of cvs_command
* Common options:: Options you give to the right of cvs_command
* admin:: Administration
* annotate:: What revision modified each line of a file?
* checkout:: Checkout sources for editing
* commit:: Check files into the repository
* diff:: Show differences between revisions
@ -7655,10 +7622,10 @@ Arguments to the commands.
There is unfortunately some confusion between
@code{cvs_options} and @code{command_options}.
@samp{-l}, when given as a @code{cvs_option}, only
affects some of the commands. When it is given as a
@code{command_option} is has a different meaning, and
is accepted by more commands. In other words, do not
When given as a @code{cvs_option}, some options only
affect some of the commands. When given as a
@code{command_option} it may have a different meaning, and
be accepted by more commands. In other words, do not
take the above categorization too seriously. Look at
the documentation instead.
@ -7844,10 +7811,6 @@ a command name, @samp{cvs -H} displays overall help for
@c every time that we add a --help-foo option. But
@c perhaps that is confusing...
@item -l
Do not log the @samp{cvs_command} in the command history (but execute it
anyway). @xref{history}, for information on command history.
@cindex Read-only mode
@item -n
Do not change any files. Attempt to execute the
@ -8574,7 +8537,7 @@ stable), and @samp{Rel} (for released). By default,
the state of a new revision is set to @samp{Exp} when
it is created. The state is visible in the output from
@var{cvs log} (@pxref{log}), and in the
@samp{$@splitrcskeyword{}Log$} and @samp{$@splitrcskeyword{}State$} keywords
@samp{$@splitrcskeyword{Log}$} and @samp{$@splitrcskeyword{State}$} keywords
(@pxref{Keyword substitution}). Note that @sc{cvs}
uses the @code{dead} state for its own purposes; to
take a file to or from the @code{dead} state use
@ -8644,6 +8607,91 @@ this option has never done anything useful.
@end table
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@node annotate
@appendixsec annotate---What revision modified each line of a file?
@cindex annotate (subcommand)
@itemize @bullet
@item
Synopsis: annotate [options] files@dots{}
@item
Requires: repository.
@item
Changes: nothing.
@end itemize
For each file in @var{files}, print the head revision
of the trunk, together with information on the last
modification for each line.
@menu
* annotate options:: annotate options
* annotate example:: annotate example
@end menu
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
@node annotate options
@appendixsubsec annotate options
These standard options are supported by @code{annotate}
(@pxref{Common options}, for a complete description of
them):
@table @code
@item -l
Local directory only, no recursion.
@item -R
Process directories recursively.
@item -f
Use head revision if tag/date not found.
@item -F
Annotate binary files.
@item -r @var{revision}
Annotate file as of specified revision/tag.
@item -D @var{date}
Annotate file as of specified date.
@end table
@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
@node annotate example
@appendixsubsec annotate example
For example:
@example
$ cvs annotate ssfile
Annotations for ssfile
***************
1.1 (mary 27-Mar-96): ssfile line 1
1.2 (joe 28-Mar-96): ssfile line 2
@end example
The file @file{ssfile} currently contains two lines.
The @code{ssfile line 1} line was checked in by
@code{mary} on March 27. Then, on March 28, @code{joe}
added a line @code{ssfile line 2}, without modifying
the @code{ssfile line 1} line. This report doesn't
tell you anything about lines which have been deleted
or replaced; you need to use @code{cvs diff} for that
(@pxref{diff}).
The options to @code{cvs annotate} are listed in
@ref{Invoking CVS}, and can be used to select the files
and revisions to annotate. The options are described
in more detail there and in @ref{Common options}.
@c FIXME: maybe an example using the options? Just
@c what it means to select a revision might be worth a
@c few words of explanation ("you want to see who
@c changed this line *before* 1.4"...).
@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@node checkout
@appendixsec checkout---Check out sources for editing
@ -9464,7 +9512,7 @@ it is specified; otherwise it is a format that outputs the line group as-is.
@item --new-group-format=@var{format}
These line groups are hunks containing only lines from the second
file. The default new group format is same as the the changed group
file. The default new group format is same as the changed group
format if it is specified; otherwise it is a format that outputs the
line group as-is.
@ -9555,7 +9603,7 @@ This format spec is equivalent to @var{T} if
@var{A}'s value equals @var{B}'s; otherwise it is equivalent to @var{E}.
For example, @samp{%(N=0?no:%dN) line%(N=1?:s)} is equivalent to
@samp{no lines} if @var{N} (the number of lines in the group in the the
@samp{no lines} if @var{N} (the number of lines in the group in the
new file) is 0, to @samp{1 line} if @var{N} is 1, and to @samp{%dN lines}
otherwise.
@end table
@ -9607,11 +9655,11 @@ following forms.
@table @samp
@item %l
stands for the the contents of the line, not counting its trailing
stands for the contents of the line, not counting its trailing
newline (if any). This format ignores whether the line is incomplete.
@item %L
stands for the the contents of the line, including its trailing newline
stands for the contents of the line, including its trailing newline
(if any). If a line is incomplete, this format preserves its
incompleteness.
@ -10484,7 +10532,7 @@ $$ Mail -s 'The patches you asked for' foo@@example.net
@end example
Suppose you have made release 1.3, and forked a branch
called @samp{R_1_3fix} for bugfixes. @samp{R_1_3_1}
called @samp{R_1_3fix} for bug fixes. @samp{R_1_3_1}
corresponds to release 1.3.1, which was made some time
ago. Now, you want to see how much development has been
done on the branch. This command can be used:
@ -10849,6 +10897,8 @@ description of the @samp{-I} option, and
@pxref{cvsignore}).
@end table
@c ----- END MAN 1 -----
@c ---------------------------------------------------------------------
@node Invoking CVS
@appendix Quick reference to CVS commands
@cindex Command reference
@ -10897,10 +10947,6 @@ options}.
@itemx --help
Print a help message. See @ref{Global options}.
@item -l
Do not log in @file{$CVSROOT/CVSROOT/history} file. See @ref{Global
options}.
@item -n
Do not change any files. See @ref{Global options}.
@ -10945,9 +10991,9 @@ See @ref{Global options}.
Keyword expansion modes (@pxref{Substitution modes}):
@example
-kkv $@splitrcskeyword{}Id: file1,v 1.1 1993/12/09 03:21:13 joe Exp $
-kkvl $@splitrcskeyword{}Id: file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
-kk $@splitrcskeyword{}Id$
-kkv $@splitrcskeyword{Id}: file1,v 1.1 1993/12/09 03:21:13 joe Exp $
-kkvl $@splitrcskeyword{Id}: file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
-kk $@splitrcskeyword{Id}$
-kv file1,v 1.1 1993/12/09 03:21:13 joe Exp
-ko @i{no expansion}
-kb @i{no expansion, file is binary}
@ -10956,17 +11002,17 @@ Keyword expansion modes (@pxref{Substitution modes}):
Keywords (@pxref{Keyword list}):
@example
$@splitrcskeyword{}Author: joe $
$@splitrcskeyword{}Date: 1993/12/09 03:21:13 $
$@splitrcskeyword{}Header: /home/files/file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
$@splitrcskeyword{}Id: file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
$@splitrcskeyword{}Locker: harry $
$@splitrcskeyword{}Name: snapshot_1_14 $
$@splitrcskeyword{}RCSfile: file1,v $
$@splitrcskeyword{}Revision: 1.1 $
$@splitrcskeyword{}Source: /home/files/file1,v $
$@splitrcskeyword{}State: Exp $
$@splitrcskeyword{}Log: file1,v $
$@splitrcskeyword{Author}: joe $
$@splitrcskeyword{Date}: 1993/12/09 03:21:13 $
$@splitrcskeyword{Header}: /home/files/file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
$@splitrcskeyword{Id}: file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
$@splitrcskeyword{Locker}: harry $
$@splitrcskeyword{Name}: snapshot_1_14 $
$@splitrcskeyword{RCSfile}: file1,v $
$@splitrcskeyword{Revision}: 1.1 $
$@splitrcskeyword{Source}: /home/files/file1,v $
$@splitrcskeyword{State}: Exp $
$@splitrcskeyword{Log}: file1,v $
Revision 1.1 1993/12/09 03:30:17 joe
Initial revision
@ -11572,7 +11618,7 @@ be tagged. See @ref{Tagging add/remove}.
Create a branch named @var{tag}. See @ref{Branching and merging}.
@item -B
Used in conjuntion with -F or -d, enables movement and deletion of
Used in conjunction with -F or -d, enables movement and deletion of
branch tags. Use with extreme caution.
@item -D @var{date}
@ -12314,7 +12360,7 @@ committed (@pxref{modules}). The files described in
this section provide other, more flexible, ways to run
programs whenever something is committed.
There are three kind of programs that can be run on
There are three kinds of programs that can be run on
commit. They are specified in files in the repository,
as described below. The following table summarizes the
file names and the purpose of the corresponding
@ -13440,7 +13486,7 @@ log message after running the program specified by @file{verifymsg}.
the log message should always be reread; @samp{no}
or @samp{never}, indicating that it should never be
reread; or @var{value} may be @samp{stat}, indicating
that the file should be checked with the filesystem
that the file should be checked with the file system
@samp{stat()} function to see if it has changed (see warning below)
before rereading. The default value is @samp{always}.
@ -13686,7 +13732,7 @@ The remote protocol is interoperable going back to @sc{cvs} 1.5, but no
further (1.5 was the first official release with the remote protocol,
but some older versions might still be floating around). In many
cases you need to upgrade both the client and the server to take
advantage of new features and bugfixes, however.
advantage of new features and bug fixes, however.
@c Perhaps should be saying something here about the
@c "D" lines in Entries (written by CVS 1.9; 1.8 and
@ -13787,7 +13833,7 @@ This message has been happening in a non-reproducible,
occasional way when we run the client/server testsuite,
both on Red Hat Linux 3.0.3 and 4.1. We haven't been
able to figure out what causes it, nor is it known
whether it is specific to linux (or even to this
whether it is specific to Linux (or even to this
particular machine!). If the problem does occur on
other unices, @samp{Operation not permitted} would be
likely to read @samp{Not owner} or whatever the system
@ -14056,9 +14102,9 @@ called from the @file{loginfo} administrative file.
Check that the arguments passed in @file{loginfo} match
what your version of @file{log.pl} expects. In
particular, the @file{log.pl} from @sc{cvs} 1.3 and
older expects the logfile as an argument whereas the
older expects the log file as an argument whereas the
@file{log.pl} from @sc{cvs} 1.5 and newer expects the
logfile to be specified with a @samp{-f} option. Of
log file to be specified with a @samp{-f} option. Of
course, if you don't need @file{log.pl} you can just
comment it out of @file{loginfo}.

314
contrib/cvs/doc/mkman.in Executable file
View File

@ -0,0 +1,314 @@
#! @PERL@
#
# Generate a man page from sections of a Texinfo manual.
#
# Copyright 2004 The Free Software Foundation,
# Derek R. Price,
# & Ximbiot <http://ximbiot.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Need Perl 5.005 or greater for re 'eval'.
require 5.005;
# The usual.
use strict;
use IO::File;
###
### GLOBALS
###
my $texi_num = 0; # Keep track of how many texinfo files have been encountered.
my @parent; # This needs to be global to be used inside of a regex later.
###
### FUNCTIONS
###
sub keyword_mode
{
my ($keyword, $file) = @_;
return "\\fR"
if $keyword =~ /^(|r|t)$/;
return "\\fB"
if $keyword =~ /^(strong|sc|code|file|samp)$/;
return "\\fI"
if $keyword =~ /^(emph|var|dfn)$/;
die "no handler for keyword \`$keyword', found at line $. of file \`$file'\n";
}
# Return replacement for \@$keyword{$content}.
sub do_keyword
{
my ($file, $parent, $keyword, $content) = @_;
return "see node \`$content\\(aq in the CVS manual"
if $keyword =~ /^(p?x)?ref$/;
return "\\fP\\fP$content"
if $keyword =~ /^splitrcskeyword$/;
my $endmode = keyword_mode $parent;
my $startmode = keyword_mode $keyword, $file;
return "$startmode$content$endmode";
}
###
### MAIN
###
for my $file (@ARGV)
{
my $fh = new IO::File "< $file"
or die "Failed to open file \`$file': $!";
if ($file !~ /\.(texinfo|texi|txi)$/)
{
print stderr "Passing \`$file' through unprocessed.\n";
# Just cat any file that doesn't look like a Texinfo source.
while (my $line = $fh->getline)
{
print $line;
}
next;
}
print stderr "Processing \`$file'.\n";
$texi_num++;
my $gotone = 0;
my $inblank = 0;
my $indent = 0;
my $inexample = 0;
my $inmenu = 0;
my $intable = 0;
my $last_header = "";
my @table_headers;
my @table_footers;
my $table_header = "";
my $table_footer = "";
my $last;
while ($_ = $fh->getline)
{
if (!$gotone && /^\@c ----- START MAN $texi_num -----$/)
{
$gotone = 1;
next;
}
# Skip ahead until our man section.
next unless $gotone;
# If we find the end tag we are done.
last if /^\@c ----- END MAN $texi_num -----$/;
# Need to do this everywhere. i.e., before we print example
# lines, since literal back slashes can appear there too.
s/\\/\\\\/g;
s/^\./\\&./;
s/([\s])\./$1\\&./;
s/'/\\(aq/g;
s/`/\\`/g;
s/(?<!-)---(?!-)/\\(em/g;
s/\@bullet({}|\b)/\\(bu/g;
s/\@dots({}|\b)/\\&.../g;
# Examples should be indented and otherwise untouched
if (/^\@example$/)
{
$indent += 2;
print qq{.SP\n.PD 0\n};
$inexample = 1;
next;
}
if ($inexample)
{
if (/^\@end example$/)
{
$indent -= 2;
print qq{\n.PD\n.IP "" $indent\n};
$inexample = 0;
next;
}
if (/^[ ]*$/)
{
print ".SP\n";
next;
}
# Preserve the newline.
$_ = qq{.IP "" $indent\n} . $_;
}
# Compress blank lines into a single line. This and its
# corresponding skip purposely bracket the @menu and comment
# removal so that blanks on either side of a menu are
# compressed after the menu is removed.
if (/^[ ]*$/)
{
$inblank = 1;
next;
}
# Not used
if (/^\@(ignore|menu)$/)
{
$inmenu++;
next;
}
# Delete menu contents.
if ($inmenu)
{
next unless /^\@end (ignore|menu)$/;
$inmenu--;
next;
}
# Remove comments
next if /^\@c(omment)?\b/;
# It's okay to ignore this keyword - we're not using any
# first-line indent commands at all.
next if s/^\@noindent\s*$//;
# @need is only significant in printed manuals.
next if s/^\@need\s+.*$//;
# If we didn't hit the previous check and $inblank is set, then
# we just finished with some number of blanks. Print the man
# page blank symbol before continuing processing of this line.
if ($inblank)
{
print ".SP\n";
$inblank = 0;
}
# Chapter headers.
$last_header = $1 if s/^\@node\s+(.*)$/.SH "$1"/;
if (/^\@appendix\w*\s+(.*)$/)
{
my $content = $1;
$content =~ s/^$last_header(\\\(em|\s+)?//;
next if $content =~ /^\s*$/;
s/^\@appendix\w*\s+.*$/.SS "$content"/;
}
# Tables are similar to examples, except we need to handle the
# keywords.
if (/^\@(itemize|table)(\s+(.*))?$/)
{
$indent += 2;
push @table_headers, $table_header;
push @table_footers, $table_footer;
my $content = $3;
if (/^\@itemize/)
{
my $bullet = $content;
$table_header = qq{.IP "$bullet" $indent\n};
$table_footer = "";
}
else
{
my $hi = $indent - 2;
$table_header = qq{.IP "" $hi\n};
$table_footer = qq{\n.IP "" $indent};
if ($content)
{
$table_header .= "$content\{";
$table_footer = "\}$table_footer";
}
}
$intable++;
next;
}
if ($intable)
{
if (/^\@end (itemize|table)$/)
{
$table_header = pop @table_headers;
$table_footer = pop @table_footers;
$indent -= 2;
$intable--;
next;
}
s/^\@itemx?(\s+(.*))?$/$table_header$2$table_footer/;
# Fall through so the rest of the table lines are
# processed normally.
}
# Index entries.
s/^\@cindex\s+(.*)$/.IX "$1"/;
$_ = "$last$_" if $last;
undef $last;
# Trap keywords
my $nk = qr/
\@(\w+)\{
(?{ push @parent, $1 }) # Keep track of the last keyword
# keyword we encountered.
((?:
(?> (?:[^{}]|(?<=\@)[{}])*) # Non-braces without backtracking
|
(??{ $nk }) # Nested keywords
)*)
\}
(?{ pop (@parent) }) # Lose track of the current keyword.
/x;
@parent = ("");
while (s/$nk/do_keyword $file, $parent[$#parent], $1, $2/e)
{
# Do nothing except replace our last-replacement
# tracker - the replacement regex above is handling
# everything else.
@parent = ("");
}
s/$nk/do_keyword $file, $parent[$#parent], $1, $2/ge;
if (/\@\w+\{/)
{
# If there is still an opening keyword left, we need to
# find the close bracket. Set $last to append the next
# line in the next pass.
$last = $_;
next;
}
# Finally, unprotect texinfo special characters.
s/\@://g;
s/\@([{}])/$1/g;
# Verify we haven't left commands unprocessed.
die "Unprocessed command at line $. of file \`$file': "
. ($1 ? "$1\n" : "<EOL>\n")
if /^(?>(?:[^\@]|\@\@)*)\@(\w+|.|$)/;
# Unprotect @@.
s/\@\@/\@/g;
# And print whatever's left.
print $_;
}
}

View File

@ -1,4 +1,4 @@
@set UPDATED 3 February 2004
@set UPDATED-MONTH February 2004
@set EDITION 1.11.15
@set VERSION 1.11.15
@set EDITION 1.11.17
@set VERSION 1.11.17

View File

@ -1,4 +1,4 @@
@set UPDATED 6 April 2004
@set UPDATED-MONTH April 2004
@set EDITION 1.11.15
@set VERSION 1.11.15
@set UPDATED 27 May 2004
@set UPDATED-MONTH May 2004
@set EDITION 1.11.17
@set VERSION 1.11.17

View File

@ -1,4 +1,4 @@
@set UPDATED 3 February 2004
@set UPDATED-MONTH February 2004
@set EDITION 1.11.15
@set VERSION 1.11.15
@set EDITION 1.11.17
@set VERSION 1.11.17

View File

@ -1,4 +1,4 @@
@set UPDATED 6 April 2004
@set UPDATED-MONTH April 2004
@set EDITION 1.11.15
@set VERSION 1.11.15
@set UPDATED 27 May 2004
@set UPDATED-MONTH May 2004
@set EDITION 1.11.17
@set VERSION 1.11.17

View File

@ -1,3 +1,31 @@
2004-05-28 Derek Price <derek@ximbiot.com>
* xsize.h: New file from GNULIB.
* Makefile.am (libcvs_a_SOURCES): Add xsize.h.
2004-05-15 Derek Price <derek@ximbiot.com>
* libcvs.dsp: Header file list updated.
* libcvs.dep: Regenerated for "libcvs.dsp" changes.
* libcvs.mak: Regenerated for "libcvs.dsp" changes.
(Patch from Conrad Pino <conrad@pino.com>.)
2004-05-13 Derek Price <derek@ximbiot.com>
* .cvsignore: Changed for "libcvs.dsp" changes.
* libcvs.dsp: Added for "../cvsnt.dsw" changes.
* libcvs.dep: Added for "libcvs.dsp" addition.
* libcvs.mak: Added for "libcvs.dsp" addition.
(Patch from Conrad Pino <conrad@pino.com>.)
2004-04-20 Derek Price <derek@ximbiot.com>
* system.h: Correct comments.
2004-04-19 Derek Price <derek@ximbiot.com>
* system.h: Gratuitous reformatting.
2004-04-07 Derek Price <derek@ximbiot.com>
* regex.c: Revise "FREE_VAR" macro to eliminate C4090/C4022 warnings

View File

@ -85,8 +85,12 @@ EXTRA_DIST = \
.cvsignore \
ChangeLog.fsf \
build_lib.com \
libcvs.dep libcvs.dsp libcvs.mak \
xgssapi.h
# For the xsize module from GNULIB.
libcvs_a_SOURCES += xsize.h
# Until Automake gets its act together
distclean-local:
rm -f fnmatch.h

View File

@ -166,6 +166,8 @@ noinst_LIBRARIES = libcvs.a
# Also should look into unifying regular expression matching in CVS
# with the diff library (perhaps to have the caller, CVS, do the
# matching?)
# For the xsize module from GNULIB.
libcvs_a_SOURCES = \
argmatch.c \
getdate.y \
@ -189,14 +191,15 @@ libcvs_a_SOURCES = \
system.h \
wait.h \
xselect.h \
xtime.h
xtime.h\
xsize.h
libcvs_a_LIBADD = @LIBOBJS@
EXTRA_DIST = \
.cvsignore \
ChangeLog.fsf \
build_lib.com \
libcvs.dep libcvs.dsp libcvs.mak \
xgssapi.h
subdir = lib

View File

@ -289,7 +289,7 @@ int utime ();
#ifdef STDC_HEADERS
#include <stdlib.h>
# include <stdlib.h>
#else
char *getenv ();
char *malloc ();
@ -300,7 +300,7 @@ extern int errno;
/* SunOS4 apparently does not define this in stdlib.h. */
#ifndef EXIT_FAILURE
#define EXIT_FAILURE 1
# define EXIT_FAILURE 1
#endif
/* check for POSIX signals */
@ -323,26 +323,26 @@ extern int errno;
/* Under OS/2, this must be included _after_ stdio.h; that's why we do
it here. */
#ifdef USE_OWN_TCPIP_H
#include "tcpip.h"
# include "tcpip.h"
#endif
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
# include <fcntl.h>
#else
#include <sys/file.h>
# include <sys/file.h>
#endif
#ifndef SEEK_SET
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
# define SEEK_SET 0
# define SEEK_CUR 1
# define SEEK_END 2
#endif
#ifndef F_OK
#define F_OK 0
#define X_OK 1
#define W_OK 2
#define R_OK 4
# define F_OK 0
# define X_OK 1
# define W_OK 2
# define R_OK 4
#endif
#if HAVE_DIRENT_H
@ -367,7 +367,7 @@ extern int errno;
#define convert_blocks(b, k) ((k) ? ((b) + 1) / 2 : (b))
#ifndef S_ISLNK
#define lstat stat
# define lstat stat
#endif
/*
@ -375,13 +375,13 @@ extern int errno;
* because "config.h" is always included last.
*/
#ifndef S_IWRITE
#define S_IWRITE 0000200 /* write permission, owner */
# define S_IWRITE 0000200 /* write permission, owner */
#endif
#ifndef S_IWGRP
#define S_IWGRP 0000020 /* write permission, grougroup */
# define S_IWGRP 0000020 /* write permission, grougroup */
#endif
#ifndef S_IWOTH
#define S_IWOTH 0000002 /* write permission, other */
# define S_IWOTH 0000002 /* write permission, other */
#endif
/* Under non-UNIX operating systems (MS-DOS, WinNT, MacOS), many filesystem
@ -390,71 +390,71 @@ extern int errno;
can hang their own definitions. */
#ifndef CVS_ACCESS
#define CVS_ACCESS access
# define CVS_ACCESS access
#endif
#ifndef CVS_CHDIR
#define CVS_CHDIR chdir
# define CVS_CHDIR chdir
#endif
#ifndef CVS_CREAT
#define CVS_CREAT creat
# define CVS_CREAT creat
#endif
#ifndef CVS_FOPEN
#define CVS_FOPEN fopen
# define CVS_FOPEN fopen
#endif
#ifndef CVS_FDOPEN
#define CVS_FDOPEN fdopen
# define CVS_FDOPEN fdopen
#endif
#ifndef CVS_MKDIR
#define CVS_MKDIR mkdir
# define CVS_MKDIR mkdir
#endif
#ifndef CVS_OPEN
#define CVS_OPEN open
# define CVS_OPEN open
#endif
#ifndef CVS_READDIR
#define CVS_READDIR readdir
# define CVS_READDIR readdir
#endif
#ifndef CVS_CLOSEDIR
#define CVS_CLOSEDIR closedir
# define CVS_CLOSEDIR closedir
#endif
#ifndef CVS_OPENDIR
#define CVS_OPENDIR opendir
# define CVS_OPENDIR opendir
#endif
#ifndef CVS_RENAME
#define CVS_RENAME rename
# define CVS_RENAME rename
#endif
#ifndef CVS_RMDIR
#define CVS_RMDIR rmdir
# define CVS_RMDIR rmdir
#endif
#ifndef CVS_STAT
#define CVS_STAT stat
# define CVS_STAT stat
#endif
/* Open question: should CVS_STAT be lstat by default? We need
to use lstat in order to handle symbolic links correctly with
the PreservePermissions option. -twp */
#ifndef CVS_LSTAT
#define CVS_LSTAT lstat
# define CVS_LSTAT lstat
#endif
#ifndef CVS_UNLINK
#define CVS_UNLINK unlink
# define CVS_UNLINK unlink
#endif
/* Wildcard matcher. Should be case-insensitive if the system is. */
#ifndef CVS_FNMATCH
#define CVS_FNMATCH fnmatch
# define CVS_FNMATCH fnmatch
#endif
#ifdef WIN32
@ -483,7 +483,7 @@ extern int errno;
#ifdef FILENAMES_CASE_INSENSITIVE
# if defined (__CYGWIN32__) || defined (WOE32)
/* Under Windows NT, filenames are case-insensitive, and both / and \
/* Under Windows, filenames are case-insensitive, and both / and \
are path component separators. */
# define FOLD_FN_CHAR(c) (WNT_filename_classes[(unsigned char) (c)])
extern unsigned char WNT_filename_classes[];
@ -492,12 +492,14 @@ extern unsigned char WNT_filename_classes[];
# define ISDIRSEP(c) (FOLD_FN_CHAR(c) == '/')
# define ISABSOLUTE(s) (ISDIRSEP(s[0]) || FOLD_FN_CHAR(s[0]) >= 'a' && FOLD_FN_CHAR(s[0]) <= 'z' && s[1] == ':' && ISDIRSEP(s[2]))
# else /* ! WOE32 */
/* As far as I know, both Cygwin and Macintosh OS X can make it here,
/* As far as I know, just Macintosh OS X can make it here,
* but since the OS X fold just folds a-z into A-Z or visa-versa, I'm just
* using it for Cygwin too. The var name below could probably use a
* rename.
* allowing it to be used for any case insensitive system which we aren't
* yet making other specific folds or exceptions for (basically, anything
* case insensitive other than Windows, where \ and C:\ style absolute paths
* also need to be accounted for).
*
* Under Mac OS X & Cygwin, filenames are case-insensitive.
* Under Mac OS X, filenames are case-insensitive.
*/
# define FOLD_FN_CHAR(c) (OSX_filename_classes[(unsigned char) (c)])
extern unsigned char OSX_filename_classes[];

108
contrib/cvs/lib/xsize.h Normal file
View File

@ -0,0 +1,108 @@
/* xsize.h -- Checked size_t computations.
Copyright (C) 2003 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#ifndef _XSIZE_H
#define _XSIZE_H
/* Get size_t. */
#include <stddef.h>
/* Get SIZE_MAX. */
#include <limits.h>
#if HAVE_STDINT_H
# include <stdint.h>
#endif
/* The size of memory objects is often computed through expressions of
type size_t. Example:
void* p = malloc (header_size + n * element_size).
These computations can lead to overflow. When this happens, malloc()
returns a piece of memory that is way too small, and the program then
crashes while attempting to fill the memory.
To avoid this, the functions and macros in this file check for overflow.
The convention is that SIZE_MAX represents overflow.
malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
implementation that uses mmap --, it's recommended to use size_overflow_p()
or size_in_bounds_p() before invoking malloc().
The example thus becomes:
size_t size = xsum (header_size, xtimes (n, element_size));
void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
*/
/* Convert an arbitrary value >= 0 to type size_t. */
#define xcast_size_t(N) \
((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
/* Sum of two sizes, with overflow check. */
static inline size_t
#if __GNUC__ >= 3
__attribute__ ((__pure__))
#endif
xsum (size_t size1, size_t size2)
{
size_t sum = size1 + size2;
return (sum >= size1 ? sum : SIZE_MAX);
}
/* Sum of three sizes, with overflow check. */
static inline size_t
#if __GNUC__ >= 3
__attribute__ ((__pure__))
#endif
xsum3 (size_t size1, size_t size2, size_t size3)
{
return xsum (xsum (size1, size2), size3);
}
/* Sum of four sizes, with overflow check. */
static inline size_t
#if __GNUC__ >= 3
__attribute__ ((__pure__))
#endif
xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
{
return xsum (xsum (xsum (size1, size2), size3), size4);
}
/* Maximum of two sizes, with overflow check. */
static inline size_t
#if __GNUC__ >= 3
__attribute__ ((__pure__))
#endif
xmax (size_t size1, size_t size2)
{
/* No explicit check is needed here, because for any n:
max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX. */
return (size1 >= size2 ? size1 : size2);
}
/* Multiplication of a count with an element size, with overflow check.
The count must be >= 0 and the element size must be > 0.
This is a macro, not an inline function, so that it works correctly even
when N is of a wider tupe and N > SIZE_MAX. */
#define xtimes(N, ELSIZE) \
((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
/* Check for overflow. */
#define size_overflow_p(SIZE) \
((SIZE) == SIZE_MAX)
/* Check against overflow. */
#define size_in_bounds_p(SIZE) \
((SIZE) != SIZE_MAX)
#endif /* _XSIZE_H */

View File

@ -1,3 +1,10 @@
2004-04-30 Derek Price <derek@ximbiot.com>
First pass at closing issue #3 from cvshome.org.
* Makefile.am (man_MANS): Remove cvs.1.
* cvs.1: Removed.
* Makefile.in: Regenerated.
2004-02-12 Derek Price <derek@ximbiot.com>
Close issue #162.

View File

@ -14,7 +14,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
man_MANS = cvs.1 cvs.5 cvsbug.8
man_MANS = cvs.5 cvsbug.8
EXTRA_DIST = \
.cvsignore \
$(man_MANS)

View File

@ -140,7 +140,7 @@ sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
man_MANS = cvs.1 cvs.5 cvsbug.8
man_MANS = cvs.5 cvsbug.8
EXTRA_DIST = \
.cvsignore \
$(man_MANS)
@ -165,53 +165,6 @@ Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.s
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
uninstall-info-am:
man1dir = $(mandir)/man1
install-man1: $(man1_MANS) $(man_MANS)
@$(NORMAL_INSTALL)
$(mkinstalldirs) $(DESTDIR)$(man1dir)
@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
for i in $$l2; do \
case "$$i" in \
*.1*) list="$$list $$i" ;; \
esac; \
done; \
for i in $$list; do \
if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
else file=$$i; fi; \
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
case "$$ext" in \
1*) ;; \
*) ext='1' ;; \
esac; \
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
inst=`echo $$inst | sed -e 's/^.*\///'`; \
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
$(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
done
uninstall-man1:
@$(NORMAL_UNINSTALL)
@list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
for i in $$l2; do \
case "$$i" in \
*.1*) list="$$list $$i" ;; \
esac; \
done; \
for i in $$list; do \
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
case "$$ext" in \
1*) ;; \
*) ext='1' ;; \
esac; \
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
inst=`echo $$inst | sed -e 's/^.*\///'`; \
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
rm -f $(DESTDIR)$(man1dir)/$$inst; \
done
man5dir = $(mandir)/man5
install-man5: $(man5_MANS) $(man_MANS)
@$(NORMAL_INSTALL)
@ -348,7 +301,7 @@ check: check-am
all-am: Makefile $(MANS)
installdirs:
$(mkinstalldirs) $(DESTDIR)$(man1dir) $(DESTDIR)$(man5dir) $(DESTDIR)$(man8dir)
$(mkinstalldirs) $(DESTDIR)$(man5dir) $(DESTDIR)$(man8dir)
install: install-am
install-exec: install-exec-am
install-data: install-data-am
@ -395,7 +348,7 @@ install-exec-am:
install-info: install-info-am
install-man: install-man1 install-man5 install-man8
install-man: install-man5 install-man8
installcheck-am:
@ -417,17 +370,17 @@ ps-am:
uninstall-am: uninstall-info-am uninstall-man
uninstall-man: uninstall-man1 uninstall-man5 uninstall-man8
uninstall-man: uninstall-man5 uninstall-man8
.PHONY: all all-am check check-am clean clean-generic distclean \
distclean-generic distdir dvi dvi-am info info-am install \
install-am install-data install-data-am install-exec \
install-exec-am install-info install-info-am install-man \
install-man1 install-man5 install-man8 install-strip \
installcheck installcheck-am installdirs maintainer-clean \
install-man5 install-man8 install-strip installcheck \
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
pdf-am ps ps-am uninstall uninstall-am uninstall-info-am \
uninstall-man uninstall-man1 uninstall-man5 uninstall-man8
uninstall-man uninstall-man5 uninstall-man8
# for backwards compatibility with the old makefiles

View File

@ -1,3 +1,111 @@
2004-06-09 Derek Price <derek@ximbiot.com>
* commit.c, filesubr.c, history.c, server.c, wrapper.c: Various
security fixes.
(Original patch from Stefan Essler <s.esser@e-matters.de> & Sebastian
Krahmer <krahmer@suse.de>.)
* cvs.h: Include xsize.h.
2004-06-09 Derek Price <derek@ximbiot.com>
* server.c (serve_entry, serve_is_modified, serve_unchanged): Protect
against malformed entries.
* sanity.sh (server): Tests for same.
2004-06-07 Larry Jones <lawrence.jones@ugsplm.com>
* sanity.sh (basica): More tests for string-based revision inc.
2004-06-04 Larry Jones <lawrence.jones@ugsplm.com>
* subr.c (increment_revnum): Rewrite ala RCS to work directly on
the string rather than converting to int to avoid overflow.
* sanity.sh (basica): New tests for above, update others to match.
2004-05-19 Derek Price <derek@ximbiot.com>
* server.c (serve_unchanged, serve_is_modified): Overwrite existing
data in timefields. Fixes CAN-2004-0396.
2004-05-14 Derek Price <derek@ximbiot.com>
* subr.c (file_has_conflict), vers_ts.c (time_stamp_server): Don't
require '=' to be the only character here, as this is potentially
destabilizing.
2004-05-14 Mark D. Baushke <mdb@cvshome.org>
* sanity.sh (trailingslashes): During cleanup remove topfile,v to
avoid problems in later tests (editor-1).
2004-05-13 Derek Price <derek@ximbiot.com>
* sanity.sh (trailingslashes): Note TODO item #205 in the comment.
2004-05-13 Derek Price <derek@ximbiot.com>
* sanity.sh (trailingslashes): New tests to expose a bug in CVS when
paths are specified with trailing slashes. This relates to TODO #205.
2004-05-12 Derek Price <derek@ximbiot.com>
* subr.c (file_has_conflict), vers_ts.c (time_stamp_server): Only
special case "=" when it is the only character in a timestamp field.
Gratuitous reformatting.
* vers_ts.c (time_stamp_server): Check for NULL in a consistent manner.
Gratuitous reformatting.
2004-05-10 Derek Price <derek@ximbiot.com>
* sanity.sh (top-level): Rename to...
(rstar-toplevel): ...this for clarity.
2004-05-10 Derek Price <derek@ximbiot.com>
* sanity.sh (dirs2-10ar): Remove unnecessary empty argument.
2004-05-02 Larry Jones <lawrence.jones@ugsplm.com>
* log.c (log_expand_revlist): Suppress warnings if really_quiet.
2004-05-07 Derek Price <derek@ximbiot.com>
* sanity.sh (basica): Remove unnecessary empty arguments.
2004-05-07 Derek Price <derek@ximbiot.com>
* cvs.h (fopen_case): Remove obsolescent prototype.
2004-05-05 Derek Price <derek@ximbiot.com>
* sanity.sh: Wait a second and retry if cvs-serv* directories are
discovered to avoid race conditions on some systems.
(Patch from Pavel Roskin <proski@gnu.org>.)
2004-05-05 Derek Price <derek@ximbiot.com>
* commit.c: Some gratuitous reformatting.
2004-05-04 Derek Price <derek@ximbiot.com>
* update.c: Some gratuitous reformatting.
2004-05-04 Derek Price <derek@ximbiot.com>
* add.c (add): Remove obsolete FIXME comment.
(*): Some gratuitous reformatting.
2004-04-26 Derek Price <derek@ximbiot.com>
* client.c (start_rsh_server): Don't rely on GNU argument processing
capabilities in the RSH command.
(Report from Mark Andrews <Mark_Andrews@isc.org>.)
2004-04-19 Derek Price <derek@ximbiot.com>
* ignore.c: Gratuitous reformatting.
2004-04-11 Derek Price <derek@ximbiot.com>
* client.c (call_in_directory): Check paths the server sends us to make

View File

@ -187,16 +187,6 @@ add (argc, argv)
/* FIXME: Does this erroneously call Create_Admin in error
conditions which are only detected once the server gets its
hands on things? */
/* FIXME-also: if filenames are case-insensitive on the
client, and the directory in the repository already
exists and is named "foo", and the command is "cvs add
FOO", this call to Create_Admin puts the wrong thing in
CVS/Repository and so a subsequent "cvs update" will
give an error. The fix will be to have the server report
back what it actually did (e.g. use tagged text for the
"Directory %s added" message), and then Create_Admin,
which should also fix the error handling concerns. */
if (isdir (argv[j]))
{
char *tag;
@ -698,9 +688,11 @@ cannot resurrect %s; RCS file removed by second party", finfo.fullname);
if (options)
free (options);
return (err);
return err;
}
/*
* The specified user file is really a directory. So, let's make sure that
* it is created in the RCS source repository, and that the user's directory
@ -728,12 +720,12 @@ add_directory (finfo)
/* "Can't happen". */
error (0, 0,
"directory %s not added; must be a direct sub-directory", dir);
return (1);
return 1;
}
if (fncmp (dir, CVSADM) == 0)
{
error (0, 0, "cannot add a `%s' directory", CVSADM);
return (1);
return 1;
}
/* before we do anything else, see if we have any per-directory tags */
@ -875,7 +867,7 @@ add_directory (finfo)
free_cwd (&cwd);
if (rcsdir != NULL)
free (rcsdir);
return (0);
return 0;
}
@ -898,7 +890,7 @@ build_entry (repository, user, options, message, entries, tag)
FILE *fp;
if (noexec)
return (0);
return 0;
/*
* The requested log is read directly from the user and stored in the
@ -923,5 +915,5 @@ build_entry (repository, user, options, message, entries, tag)
(void) sprintf (line, "Initial %s", user);
Register (entries, user, "0", line, options, tag, (char *) 0, (char *) 0);
free (line);
return (0);
return 0;
}

View File

@ -4814,7 +4814,6 @@ start_rsh_server (root, to_server, from_server)
const char **p = argv;
*p++ = cvs_rsh;
*p++ = root->hostname;
/* If the login names differ between client and server
* pass it on to rsh.
@ -4825,6 +4824,7 @@ start_rsh_server (root, to_server, from_server)
*p++ = root->username;
}
*p++ = root->hostname;
*p++ = command;
*p++ = NULL;

View File

@ -155,7 +155,7 @@ find_dirent_proc (callerdat, dir, repository, update_dir, entries)
is that it (or some variant thereof) should go in all the
dirent procs. Unless someone has some better idea... */
if (!isdir (dir))
return (R_SKIP_ALL);
return R_SKIP_ALL;
/* initialize the ignore list for this directory */
find_data->ignlist = getlist ();
@ -225,6 +225,8 @@ find_filesdoneproc (callerdat, err, repository, update_dir, entries)
return err;
}
static int find_fileproc PROTO ((void *callerdat, struct file_info *finfo));
/* Machinery to find out what is modified, added, and removed. It is
@ -341,6 +343,8 @@ find_fileproc (callerdat, finfo)
return 0;
}
static int copy_ulist PROTO ((Node *, void *));
static int
@ -389,15 +393,16 @@ commit (argc, argv)
struct passwd *pw;
if ((pw = (struct passwd *) getpwnam (getcaller ())) == NULL)
error (1, 0, "your apparent username (%s) is unknown to this system",
getcaller ());
error (1, 0,
"your apparent username (%s) is unknown to this system",
getcaller ());
if (pw->pw_uid == (uid_t) 0)
error (1, 0, "'root' is not allowed to commit files");
}
#endif /* CVS_BADROOT */
optind = 0;
while( ( c = getopt( argc, argv, COMMIT_OPTIONS ) ) != -1 )
while ((c = getopt (argc, argv, COMMIT_OPTIONS)) != -1)
{
switch (c)
{
@ -518,7 +523,12 @@ commit (argc, argv)
operate on, and only work with those files in the future.
This saves time--we don't want to search the file system
of the working directory twice. */
find_args.argv = (char **) xmalloc (find_args.argc * sizeof (char **));
if (size_overflow_p (xtimes (find_args.argc, sizeof (char **))))
{
find_args.argc = 0;
return 0;
}
find_args.argv = xmalloc (xtimes (find_args.argc, sizeof (char **)));
find_args.argc = 0;
walklist (find_args.ulist, copy_ulist, &find_args);
@ -713,9 +723,11 @@ commit (argc, argv)
sleep_past (last_register_time);
}
return (err);
return err;
}
/* This routine determines the status of a given file and retrieves
the version information that is associated with that file. */
@ -803,6 +815,8 @@ classify_file_internal (finfo, vers)
return status;
}
/*
* Check to see if a file is ok to commit and make sure all files are
* up-to-date
@ -826,10 +840,11 @@ check_fileproc (callerdat, finfo)
if (!finfo->repository)
{
error (0, 0, "nothing known about `%s'", finfo->fullname);
return (1);
return 1;
}
if (strncmp (finfo->repository, current_parsed_root->directory, cvsroot_len) == 0
if (strncmp (finfo->repository, current_parsed_root->directory,
cvsroot_len) == 0
&& ISDIRSEP (finfo->repository[cvsroot_len])
&& strncmp (finfo->repository + cvsroot_len + 1,
CVSROOTADM,
@ -859,7 +874,7 @@ check_fileproc (callerdat, finfo)
case T_REMOVE_ENTRY:
error (0, 0, "Up-to-date check failed for `%s'", finfo->fullname);
freevers_ts (&vers);
return (1);
return 1;
case T_MODIFIED:
case T_ADDED:
case T_REMOVED:
@ -885,7 +900,7 @@ check_fileproc (callerdat, finfo)
"cannot commit with sticky date for file `%s'",
finfo->fullname);
freevers_ts (&vers);
return (1);
return 1;
}
if (status == T_MODIFIED && vers->tag &&
!RCS_isbranch (finfo->rcs, vers->tag))
@ -894,7 +909,7 @@ check_fileproc (callerdat, finfo)
"sticky tag `%s' for file `%s' is not a branch",
vers->tag, finfo->fullname);
freevers_ts (&vers);
return (1);
return 1;
}
}
if (status == T_MODIFIED && !force_ci && vers->ts_conflict)
@ -911,7 +926,7 @@ check_fileproc (callerdat, finfo)
"file `%s' had a conflict and has not been modified",
finfo->fullname);
freevers_ts (&vers);
return (1);
return 1;
}
if (file_has_markers (finfo))
@ -955,7 +970,7 @@ warning: file `%s' seems to still contain conflict indicators",
"cannot remove file `%s' which has a numeric sticky"
" tag of `%s'", finfo->fullname, vers->tag);
freevers_ts (&vers);
return (1);
return 1;
}
}
if (status == T_ADDED)
@ -969,7 +984,7 @@ warning: file `%s' seems to still contain conflict indicators",
"cannot add file `%s' when RCS file `%s' already exists",
finfo->fullname, finfo->rcs->path);
freevers_ts (&vers);
return (1);
return 1;
}
}
else if (isdigit ((unsigned char) *vers->tag) &&
@ -979,7 +994,7 @@ warning: file `%s' seems to still contain conflict indicators",
"cannot add file `%s' with revision `%s'; must be on trunk",
finfo->fullname, vers->tag);
freevers_ts (&vers);
return (1);
return 1;
}
}
@ -1082,7 +1097,7 @@ warning: file `%s' seems to still contain conflict indicators",
case T_UNKNOWN:
error (0, 0, "nothing known about `%s'", finfo->fullname);
freevers_ts (&vers);
return (1);
return 1;
case T_UPTODATE:
break;
default:
@ -1091,7 +1106,7 @@ warning: file `%s' seems to still contain conflict indicators",
}
freevers_ts (&vers);
return (0);
return 0;
}
@ -1110,14 +1125,16 @@ check_direntproc (callerdat, dir, repos, update_dir, entries)
List *entries;
{
if (!isdir (dir))
return (R_SKIP_ALL);
return R_SKIP_ALL;
if (!quiet)
error (0, 0, "Examining %s", update_dir);
return (R_PROCESS);
return R_PROCESS;
}
/*
* Walklist proc to run pre-commit checks
*/
@ -1133,9 +1150,11 @@ precommit_list_proc (p, closure)
{
run_arg (p->key);
}
return (0);
return 0;
}
/*
* Callback proc for pre-commit checking
*/
@ -1160,7 +1179,7 @@ precommit_proc (repository, filter)
{
error (0, errno, "cannot find pre-commit filter `%s'", s);
free (s);
return (1); /* so it fails! */
return 1; /* so it fails! */
}
free (s);
}
@ -1168,9 +1187,11 @@ precommit_proc (repository, filter)
run_setup (filter);
run_arg (repository);
(void) walklist (saved_ulist, precommit_list_proc, NULL);
return (run_exec (RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL|RUN_REALLY));
return run_exec (RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL|RUN_REALLY);
}
/*
* Run the pre-commit checks for the dir
*/
@ -1195,7 +1216,7 @@ check_filesdoneproc (callerdat, err, repos, update_dir, entries)
/* skip the checks if there's nothing to do */
if (saved_ulist == NULL || saved_ulist->list->next == saved_ulist->list)
return (err);
return err;
/* run any pre-commit checks */
if ((n = Parse_Info (CVSROOTADM_COMMITINFO, repos, precommit_proc, 1)) > 0)
@ -1204,9 +1225,11 @@ check_filesdoneproc (callerdat, err, repos, update_dir, entries)
err += n;
}
return (err);
return err;
}
/*
* Do the work of committing a file
*/
@ -1249,7 +1272,7 @@ commit_fileproc (callerdat, finfo)
* all up-to-date so nothing really needs to be done
*/
if (p == NULL)
return (0);
return 0;
ulist = ((struct master_lists *) p->data)->ulist;
cilist = ((struct master_lists *) p->data)->cilist;
@ -1273,7 +1296,7 @@ commit_fileproc (callerdat, finfo)
p = findnode (cilist, finfo->file);
if (p == NULL)
return (0);
return 0;
ci = p->data;
if (ci->status == T_MODIFIED)
@ -1431,9 +1454,11 @@ commit_fileproc (callerdat, finfo)
if (SIG_inCrSect ())
SIG_endCrSect ();
return (err);
return err;
}
/*
* Log the commit and clean up the update list
*/
@ -1451,7 +1476,7 @@ commit_filesdoneproc (callerdat, err, repository, update_dir, entries)
p = findnode (mulist, update_dir);
if (p == NULL)
return (err);
return err;
ulist = ((struct master_lists *) p->data)->ulist;
@ -1501,9 +1526,11 @@ commit_filesdoneproc (callerdat, err, repository, update_dir, entries)
}
}
return (err);
return err;
}
/*
* Get the log message for a dir
*/
@ -1521,7 +1548,7 @@ commit_direntproc (callerdat, dir, repos, update_dir, entries)
char *real_repos;
if (!isdir (dir))
return (R_SKIP_ALL);
return R_SKIP_ALL;
/* find the update list for this dir */
p = findnode (mulist, update_dir);
@ -1532,7 +1559,7 @@ commit_direntproc (callerdat, dir, repos, update_dir, entries)
/* skip the files as an optimization */
if (ulist == NULL || ulist->list->next == ulist->list)
return (R_SKIP_FILES);
return R_SKIP_FILES;
/* get commit message */
real_repos = Name_Repository (dir, update_dir);
@ -1545,9 +1572,11 @@ commit_direntproc (callerdat, dir, repos, update_dir, entries)
do_editor (update_dir, &saved_message, real_repos, ulist);
do_verify (&saved_message, real_repos);
free (real_repos);
return (R_PROCESS);
return R_PROCESS;
}
/*
* Process the post-commit proc if necessary
*/
@ -1572,9 +1601,11 @@ commit_dirleaveproc (callerdat, dir, err, update_dir, entries)
free (repos);
}
return (err);
return err;
}
/*
* find the maximum major rev number in an entries file
*/
@ -1661,7 +1692,7 @@ remove_file (finfo, tag, message)
if (rev == NULL)
{
error (0, 0, "cannot find branch \"%s\".", tag);
return (1);
return 1;
}
branchname = RCS_getbranch (finfo->rcs, rev, 1);
@ -1693,7 +1724,7 @@ remove_file (finfo, tag, message)
{
error (0, 0, "cannot change branch to default for %s",
finfo->fullname);
return (1);
return 1;
}
RCS_rewrite (finfo->rcs, NULL, NULL);
}
@ -1707,7 +1738,7 @@ remove_file (finfo, tag, message)
{
error (0, 0,
"failed to check out `%s'", finfo->fullname);
return (1);
return 1;
}
/* Except when we are creating a branch, lock the revision so that
@ -1728,7 +1759,7 @@ remove_file (finfo, tag, message)
if (!quiet)
error (0, retcode == -1 ? errno : 0,
"failed to commit dead revision for `%s'", finfo->fullname);
return (1);
return 1;
}
/* At this point, the file has been committed as removed. We should
probably tell the history file about it */
@ -1753,9 +1784,11 @@ remove_file (finfo, tag, message)
free (old_path);
Scratch_Entry (finfo->entries, finfo->file);
return (0);
return 0;
}
/*
* Do the actual checkin for added files
*/
@ -1784,9 +1817,11 @@ finaladd (finfo, rev, tag, options)
(void) time (&last_register_time);
return (ret);
return ret;
}
/*
* Unlock an rcs file
*/
@ -1852,6 +1887,8 @@ fixbranch (rcs, branch)
}
}
/*
* do the initial part of a file add for the named file. if adding
* with a tag, put the file in the Attic and point the symbolic tag
@ -2189,6 +2226,8 @@ checkaddfile (file, repository, tag, options, rcsnode)
return retval;
}
/*
* Attempt to place a lock on the RCS file; returns 0 if it could and 1 if it
* couldn't. If the RCS file currently has a branch as the head, we must
@ -2226,7 +2265,7 @@ lock_RCS (user, rcs, rev, repository)
rcs->path);
if (branch)
free (branch);
return (1);
return 1;
}
}
err = RCS_lock (rcs, NULL, 1);
@ -2260,7 +2299,7 @@ lock_RCS (user, rcs, rev, repository)
if (sbranch != NULL)
free (sbranch);
sbranch = branch;
return (0);
return 0;
}
/* try to restore the branch if we can on error */
@ -2269,9 +2308,11 @@ lock_RCS (user, rcs, rev, repository)
if (branch)
free (branch);
return (1);
return 1;
}
/*
* free an UPDATE node's data
*/

View File

@ -40,6 +40,10 @@
#include "popen.h"
#endif
/* Begin GNULIB headers. */
#include "xsize.h"
/* End GNULIB headers. */
#ifdef STDC_HEADERS
#include <stdlib.h>
#else
@ -608,7 +612,6 @@ extern void expand_wild PROTO ((int argc, char **argv,
#ifdef SERVER_SUPPORT
extern int cvs_casecmp PROTO ((const char *, const char *));
extern int fopen_case PROTO ((char *, char *, FILE **, char **));
#endif
void strip_trailing_slashes PROTO((char *path));

View File

@ -1029,8 +1029,14 @@ expand_wild (argc, argv, pargc, pargv)
char ***pargv;
{
int i;
if (size_overflow_p (xtimes (argc, sizeof (char *)))) {
*pargc = 0;
*pargv = NULL;
error (0, 0, "expand_wild: too many arguments");
return;
}
*pargc = argc;
*pargv = (char **) xmalloc (argc * sizeof (char *));
*pargv = xmalloc (xtimes (argc, sizeof (char *)));
for (i = 0; i < argc; ++i)
(*pargv)[i] = xstrdup (argv[i]);
}

View File

@ -416,8 +416,11 @@ history (argc, argv)
working = 1;
break;
case 'X': /* Undocumented debugging flag */
#ifdef DEBUG
histfile = optarg;
#endif
break;
case 'D': /* Since specified date */
if (*since_rev || *since_tag || *backto)
{
@ -906,9 +909,13 @@ save_user (name)
{
if (user_count == user_max)
{
user_max += USER_INCREMENT;
user_list = (char **) xrealloc ((char *) user_list,
(int) user_max * sizeof (char *));
user_max = xsum (user_max, USER_INCREMENT);
if (size_overflow_p (xtimes (user_max, sizeof (char *))))
{
error (0, 0, "save_user: too many users");
return;
}
user_list = xrealloc (user_list, xtimes (user_max, sizeof (char *)));
}
user_list[user_count++] = xstrdup (name);
}
@ -936,9 +943,13 @@ save_file (dir, name, module)
if (file_count == file_max)
{
file_max += FILE_INCREMENT;
file_list = (struct file_list_str *) xrealloc ((char *) file_list,
file_max * sizeof (*fl));
file_max = xsum (file_max, FILE_INCREMENT);
if (size_overflow_p (xtimes (file_max, sizeof (*fl))))
{
error (0, 0, "save_file: too many files");
return;
}
file_list = xrealloc (file_list, xtimes (file_max, sizeof (*fl)));
}
fl = &file_list[file_count++];
fl->l_file = cp = xmalloc (strlen (dir) + strlen (name) + 2);
@ -977,9 +988,13 @@ save_module (module)
{
if (mod_count == mod_max)
{
mod_max += MODULE_INCREMENT;
mod_list = (char **) xrealloc ((char *) mod_list,
mod_max * sizeof (char *));
mod_max = xsum (mod_max, MODULE_INCREMENT);
if (size_overflow_p (xtimes (mod_max, sizeof (char *))))
{
error (0, 0, "save_module: too many modules");
return;
}
mod_list = xrealloc (mod_list, xtimes (mod_max, sizeof (char *)));
}
mod_list[mod_count++] = xstrdup (module);
}

View File

@ -44,6 +44,8 @@ const char *ign_default = ". .. core RCSLOG tags TAGS RCS SCCS .make.state\
no longer ask the server about what is in CVSROOTADM_IGNORE. */
int ign_inhibit_server;
/*
* To the "ignore list", add the hard-coded default ignored wildcards above,
* the wildcards found in $CVSROOT/CVSROOT/cvsignore, the wildcards found in
@ -100,6 +102,8 @@ ign_setup ()
/* Later, add ignore entries found in -I arguments */
}
/*
* Open a file and read lines, feeding each line to a line parser. Arrange
* for keeping a temporary list of wildcards at the end, if the "hold"

View File

@ -1078,7 +1078,7 @@ log_expand_revlist (rcs, revlist, default_branch)
free (branch);
}
}
if (nr->first == NULL)
if (nr->first == NULL && !really_quiet)
{
error (0, 0, "warning: no branch `%s' in `%s'",
r->first, rcs->path);
@ -1101,7 +1101,7 @@ log_expand_revlist (rcs, revlist, default_branch)
nr->first = RCS_whatbranch (rcs, r->first);
else
nr->first = RCS_gettag (rcs, r->first, 1, (int *) NULL);
if (nr->first == NULL)
if (nr->first == NULL && !really_quiet)
{
error (0, 0, "warning: no revision `%s' in `%s'",
r->first, rcs->path);
@ -1119,7 +1119,7 @@ log_expand_revlist (rcs, revlist, default_branch)
nr->last = RCS_whatbranch (rcs, r->last);
else
nr->last = RCS_gettag (rcs, r->last, 1, (int *) NULL);
if (nr->last == NULL)
if (nr->last == NULL && !really_quiet)
{
error (0, 0, "warning: no revision `%s' in `%s'",
r->last, rcs->path);

View File

@ -792,7 +792,7 @@ if test x"$*" = x; then
tests="${tests} modules modules2 modules3 modules4 modules5 modules6"
tests="${tests} mkmodules co-d"
tests="${tests} cvsadm emptydir abspath abspath2 toplevel toplevel2"
tests="${tests} top-level checkout_repository"
tests="${tests} rstar-toplevel trailingslashes checkout_repository"
# Log messages, error messages.
tests="${tests} mflag editor errmsg1 errmsg2 adderrmsg opterrmsg"
# Watches, binary files, history browsing, &c.
@ -1919,13 +1919,46 @@ done"
"Checking in ssfile;
${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
new revision: 2\.0; previous revision: 1\.3
done"
dotest basica-8a1a "${testcvs} -q ci -m bump-it -r 2.9" \
"Checking in ssfile;
${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
new revision: 2\.9; previous revision: 2\.0
done"
# Test string-based revion number increment rollover
dotest basica-8a1b "${testcvs} -q ci -m bump-it -f -r 2" \
"Checking in ssfile;
${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
new revision: 2\.10; previous revision: 2\.9
done"
dotest basica-8a1c "${testcvs} -q ci -m bump-it -r 2.99" \
"Checking in ssfile;
${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
new revision: 2\.99; previous revision: 2\.10
done"
# Test string-based revion number increment rollover
dotest basica-8a1d "${testcvs} -q ci -m bump-it -f -r 2" \
"Checking in ssfile;
${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
new revision: 2\.100; previous revision: 2\.99
done"
dotest basica-8a1e "${testcvs} -q ci -m bump-it -r 2.1099" \
"Checking in ssfile;
${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
new revision: 2\.1099; previous revision: 2\.100
done"
# Test string-based revion number increment rollover
dotest basica-8a1f "${testcvs} -q ci -m bump-it -f -r 2" \
"Checking in ssfile;
${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
new revision: 2\.1100; previous revision: 2\.1099
done"
# -f should not be necessary, but it should be harmless.
# Also test the "-r 3" (rather than "-r 3.0") usage.
dotest basica-8a2 "${testcvs} -q ci -m bump-it -f -r 3" \
"Checking in ssfile;
${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v <-- ssfile
new revision: 3\.1; previous revision: 2\.0
new revision: 3\.1; previous revision: 2\.1100
done"
# Test using -r to create a branch
@ -1943,9 +1976,8 @@ done"
dotest basica-8a5 "${testcvs} -q up -A ./" "[UP] ssfile"
cd ../..
dotest basica-8b "${testcvs} -q diff -r1.2 -r1.3" ''
dotest basica-8b1 "${testcvs} -q diff -r1.2 -r1.3 -C 3isacrowd" \
''
dotest basica-8b "${testcvs} -q diff -r1.2 -r1.3"
dotest basica-8b1 "${testcvs} -q diff -r1.2 -r1.3 -C 3isacrowd"
# The .* here will normally be "No such file or directory",
# but if memory serves some systems (AIX?) have a different message.
@ -2013,11 +2045,23 @@ done"
done"
dotest basica-o5a "${testcvs} -n admin -o 1.2::3.1 ssfile" \
"RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
deleting revision 2\.1100
deleting revision 2\.1099
deleting revision 2\.100
deleting revision 2\.99
deleting revision 2\.10
deleting revision 2\.9
deleting revision 2\.0
deleting revision 1\.3
done"
dotest basica-o6 "${testcvs} admin -o 1.2::3.1 ssfile" \
"RCS file: ${CVSROOT_DIRNAME}/first-dir/sdir/ssdir/ssfile,v
deleting revision 2\.1100
deleting revision 2\.1099
deleting revision 2\.100
deleting revision 2\.99
deleting revision 2\.10
deleting revision 2\.9
deleting revision 2\.0
deleting revision 1\.3
done"
@ -6018,8 +6062,7 @@ ${QUESTION} sdir"
"${QUESTION} sdir
${PROG} \[update aborted\]: no such tag br"
dotest dirs2-10ar \
"${testcvs} -q rdiff -u -r 1.1 -r br first-dir/sdir/file1" \
""
"${testcvs} -q rdiff -u -r 1.1 -r br first-dir/sdir/file1"
dotest_fail dirs2-10-again "${testcvs} update -d -r br" \
"${QUESTION} sdir
${PROG} update: Updating \.
@ -13849,14 +13892,14 @@ ${PROG} commit: Rebuilding administrative file database"
top-level)
rstar-toplevel)
# FIXCVS:
# This test confirms a bug that exists in the r* commands currently
# when run against the top-level project.
#
# The assertion failure is something like:
# do_recursion: Assertion \`strstr (repository, \"/\./\") == ((void \*)0)' failed\..*"
dotest_fail top-level-1 "$testcvs rlog ." \
dotest_fail rstar-toplevel-1 "$testcvs rlog ." \
"${DOTSTAR}ssertion.*failed${DOTSTAR}" "${DOTSTAR}failed assertion${DOTSTAR}"
if $keep; then
@ -13867,6 +13910,52 @@ ${PROG} commit: Rebuilding administrative file database"
trailingslashes)
# Some tests of CVS's reactions to path specifications containing
# trailing slashes.
mkdir trailingslashes; cd trailingslashes
dotest trailingslashes-init-1 "$testcvs -Q co -ldt ."
dotest trailingslashes-init-2 "$testcvs -Q co -dt2 ."
cd t
echo "Ahh'll be baaack." >topfile
dotest trailingslashes-init-3 "$testcvs -Q add topfile"
dotest trailingslashes-init-4 "$testcvs -Q ci -mto-top" \
"RCS file: $CVSROOT_DIRNAME/topfile,v
done
Checking in topfile;
$CVSROOT_DIRNAME/topfile,v <-- topfile
initial revision: 1\.1
done"
# First, demonstrate the usual case.
cd ../t2
dotest trailingslashes-1 "$testcvs -q up CVSROOT"
dotest_fail trailingslashes-1a "test -f topfile"
# FIXCVS:
# Now the one that fails in remote mode.
# This highlights one of the failure cases mentioned in TODO item
# #205.
if $remote; then
dotest trailingslashes-2 "$testcvs -q up CVSROOT/" \
"U topfile"
dotest trailingslashes-2a "test -f topfile"
else
dotest trailingslashes-2 "$testcvs -q up CVSROOT/"
dotest_fail trailingslashes-2a "test -f topfile"
fi
if $keep; then
echo Keeping $TESTDIR and exiting due to --keep
exit 0
fi
cd ../..
rm -rf trailingslashes $CVSROOT_DIRNAME/topfile,v
;;
checkout_repository)
dotest_fail checkout_repository-1 \
"${testcvs} co -d ${CVSROOT_DIRNAME} CVSROOT" \
@ -26971,6 +27060,27 @@ EOF
ok" <<EOF
Global_option -l
noop
EOF
# There used to be some exploits based on malformed Entry requests
dotest server-17 "$testcvs server" \
"E protocol error: Malformed Entry
error " <<EOF
Root $TESTDIR/crerepos
Directory .
$TESTDIR/crerepos/dir1
Entry X/file1/1.1////
noop
EOF
dotest server-18 "$testcvs server" \
"E protocol error: Malformed Entry
error " <<EOF
Root $TESTDIR/crerepos
Directory .
$TESTDIR/crerepos/dir1
Entry /CC/CC/CC
noop
EOF
if $keep; then
@ -27494,7 +27604,11 @@ done"
# files. We would like to not leave any behind.
if $remote && ls $TMPDIR/cvs-serv* >/dev/null 2>&1; then
# A true value means ls found files/directories with these names.
fail "Found cvs-serv* directories in $TMPDIR."
# Give the server some time to finish, then retry.
sleep 1
if ls $TMPDIR/cvs-serv* >/dev/null 2>&1; then
fail "Found cvs-serv* directories in $TMPDIR."
fi
fi
if ls $TMPDIR/cvs?????? >/dev/null 2>&1; then
# A true value means ls found files/directories with these names.

View File

@ -917,7 +917,7 @@ serve_max_dotdot (arg)
int i;
char *p;
if (lim < 0)
if (lim < 0 || lim > 10000)
return;
p = xmalloc (strlen (server_temp_dir) + 2 * lim + 10);
if (p == NULL)
@ -1622,8 +1622,7 @@ serve_unchanged (arg)
char *cp;
char *timefield;
if (error_pending ())
return;
if (error_pending ()) return;
if (outside_dir (arg))
return;
@ -1637,7 +1636,16 @@ serve_unchanged (arg)
&& strlen (arg) == cp - name
&& strncmp (arg, name, cp - name) == 0)
{
timefield = strchr (cp + 1, '/') + 1;
if (!(timefield = strchr (cp + 1, '/')) || *++timefield == '\0')
{
/* We didn't find the record separator or it is followed by
* the end of the string, so just exit.
*/
if (alloc_pending (80))
sprintf (pending_error_text,
"E Malformed Entry encountered.");
return;
}
/* If the time field is not currently empty, then one of
* serve_modified, serve_is_modified, & serve_unchanged were
* already called for this file. We would like to ignore the
@ -1684,8 +1692,7 @@ serve_is_modified (arg)
/* Have we found this file in "entries" yet. */
int found;
if (error_pending ())
return;
if (error_pending ()) return;
if (outside_dir (arg))
return;
@ -1700,7 +1707,16 @@ serve_is_modified (arg)
&& strlen (arg) == cp - name
&& strncmp (arg, name, cp - name) == 0)
{
timefield = strchr (cp + 1, '/') + 1;
if (!(timefield = strchr (cp + 1, '/')) || *++timefield == '\0')
{
/* We didn't find the record separator or it is followed by
* the end of the string, so just exit.
*/
if (alloc_pending (80))
sprintf (pending_error_text,
"E Malformed Entry encountered.");
return;
}
/* If the time field is not currently empty, then one of
* serve_modified, serve_is_modified, & serve_unchanged were
* already called for this file. We would like to ignore the
@ -1785,8 +1801,29 @@ serve_entry (arg)
{
struct an_entry *p;
char *cp;
int i = 0;
if (error_pending()) return;
p = (struct an_entry *) xmalloc (sizeof (struct an_entry));
/* Verify that the entry is well-formed. This can avoid problems later.
* At the moment we only check that the Entry contains five slashes in
* approximately the correct locations since some of the code makes
* assumptions about this.
*/
cp = arg;
if (*cp == 'D') cp++;
while (i++ < 5)
{
if (!cp || *cp != '/')
{
if (alloc_pending (80))
sprintf (pending_error_text,
"E protocol error: Malformed Entry");
return;
}
cp = strchr (cp + 1, '/');
}
p = xmalloc (sizeof (struct an_entry));
if (p == NULL)
{
pending_error = ENOMEM;
@ -2018,6 +2055,9 @@ serve_notify (arg)
{
char *cp;
if (!data[0])
goto error;
if (strchr (data, '+'))
goto error;
@ -2149,6 +2189,14 @@ serve_argument (arg)
char *p;
if (error_pending()) return;
if (argument_count >= 10000)
{
if (alloc_pending (80))
sprintf (pending_error_text,
"E Protocol error: too many arguments");
return;
}
if (argument_vector_size <= argument_count)
{
@ -2179,6 +2227,14 @@ serve_argumentx (arg)
char *p;
if (error_pending()) return;
if (argument_count <= 1)
{
if (alloc_pending (80))
sprintf (pending_error_text,
"E Protocol error: called argumentx without prior call to argument");
return;
}
p = argument_vector[argument_count - 1];
p = xrealloc (p, strlen (p) + 1 + strlen (arg) + 1);
@ -2512,7 +2568,7 @@ check_command_legal_p (cmd_name)
save some code here... -kff */
/* Chop newline by hand, for strcmp()'s sake. */
if (linebuf[num_red - 1] == '\n')
if (num_red > 0 && linebuf[num_red - 1] == '\n')
linebuf[num_red - 1] = '\0';
if (strcmp (linebuf, CVS_Username) == 0)
@ -2567,7 +2623,7 @@ check_command_legal_p (cmd_name)
while ((num_red = getline (&linebuf, &linebuf_len, fp)) >= 0)
{
/* Chop newline by hand, for strcmp()'s sake. */
if (linebuf[num_red - 1] == '\n')
if (num_red > 0 && linebuf[num_red - 1] == '\n')
linebuf[num_red - 1] = '\0';
if (strcmp (linebuf, CVS_Username) == 0)

View File

@ -311,6 +311,9 @@ compare_revnums (rev1, rev2)
return result;
}
/* Increment a revision number. Working on the string is a bit awkward,
but it avoid problems with integer overflow should the revision numbers
get really big. */
char *
increment_revnum (rev)
const char *rev;
@ -319,17 +322,29 @@ increment_revnum (rev)
int lastfield;
size_t len = strlen (rev);
newrev = (char *) xmalloc (len + 2);
newrev = xmalloc (len + 2);
memcpy (newrev, rev, len + 1);
p = strrchr (newrev, '.');
if (p == NULL)
for (p = newrev + len; p != newrev; )
{
free (newrev);
return NULL;
--p;
if (!isdigit(*p))
{
++p;
break;
}
if (*p != '9')
{
++*p;
return newrev;
}
*p = '0';
}
lastfield = atoi (++p);
sprintf (p, "%d", lastfield + 1);
/* The number was all 9s, so change the first character to 1 and add
a 0 to the end. */
*p = '1';
p = newrev + len;
*p++ = '0';
*p = '\0';
return newrev;
}
@ -659,7 +674,7 @@ file_has_conflict (finfo, ts_conflict)
/* If ts_conflict is NULL, there was no merge since the last
* commit and there can be no conflict.
*/
assert ( ts_conflict );
assert (ts_conflict);
/*
* If the timestamp has changed and no
@ -668,14 +683,14 @@ file_has_conflict (finfo, ts_conflict)
*/
#ifdef SERVER_SUPPORT
if ( server_active )
if (server_active)
retcode = ts_conflict[0] == '=';
else
#endif /* SERVER_SUPPORT */
{
filestamp = time_stamp ( finfo->file );
retcode = !strcmp ( ts_conflict, filestamp );
free ( filestamp );
filestamp = time_stamp (finfo->file);
retcode = !strcmp (ts_conflict, filestamp);
free (filestamp);
}
return retcode;

View File

@ -420,9 +420,11 @@ update (argc, argv)
if (date != NULL)
free (date);
return (err);
return err;
}
/*
* Command line interface to update (used by checkout)
*/
@ -496,7 +498,7 @@ do_update (argc, argv, xoptions, xtag, xdate, xforce, local, xbuild, xaflag,
argc, argv, local, which, aflag, CVS_LOCK_READ,
preload_update_dir, 1, (char *) NULL);
if (err)
return (err);
return err;
/* FIXME-twp: at this point we should walk the hardlist
and update the `links' field of each hardlink_info struct
@ -523,7 +525,7 @@ do_update (argc, argv, xoptions, xtag, xdate, xforce, local, xbuild, xaflag,
sleep_past (last_register_time);
}
return (err);
return err;
}
#ifdef PRESERVE_PERMISSIONS_SUPPORT
@ -856,7 +858,7 @@ update_filesdone_proc (callerdat, err, repository, update_dir, entries)
Create_Root ((char *) NULL, current_parsed_root->original);
}
return (err);
return err;
}
@ -889,7 +891,7 @@ update_dirent_proc (callerdat, dir, repository, update_dir, entries)
{
/* if we aren't building dirs, blow it off */
if (!update_build_dirs)
return (R_SKIP_ALL);
return R_SKIP_ALL;
/* Various CVS administrators are in the habit of removing
the repository directory for things they don't want any
@ -917,7 +919,7 @@ update_dirent_proc (callerdat, dir, repository, update_dir, entries)
{
/* ignore the missing dir if -n is specified */
error (0, 0, "New directory `%s' -- ignored", update_dir);
return (R_SKIP_ALL);
return R_SKIP_ALL;
}
else
{
@ -1015,7 +1017,7 @@ update_dirent_proc (callerdat, dir, repository, update_dir, entries)
if (!quiet)
error (0, 0, "Updating %s", update_dir);
return (R_PROCESS);
return R_PROCESS;
}
@ -1075,9 +1077,11 @@ update_dirleave_proc (callerdat, dir, err, update_dir, entries)
}
}
return (err);
return err;
}
static int isremoved PROTO ((Node *, void *));
/* Returns 1 if the file indicated by node has been removed. */
@ -1093,6 +1097,8 @@ isremoved (node, closure)
return (entdata->version && entdata->version[0] == '-') ? 1 : 0;
}
/* Returns 1 if the argument directory is completely empty, other than the
existence of the CVS directory entry. Zero otherwise. If MIGHT_NOT_EXIST
and the directory doesn't exist, then just return 0. */
@ -1109,7 +1115,7 @@ isemptydir (dir, might_not_exist)
if (might_not_exist && existence_error (errno))
return 0;
error (0, errno, "cannot open directory %s for empty check", dir);
return (0);
return 0;
}
errno = 0;
while ((dp = CVS_READDIR (dirp)) != NULL)
@ -1122,7 +1128,7 @@ isemptydir (dir, might_not_exist)
/* An entry other than the CVS directory. The directory
is certainly not empty. */
(void) CVS_CLOSEDIR (dirp);
return (0);
return 0;
}
else
{
@ -1153,7 +1159,7 @@ isemptydir (dir, might_not_exist)
/* There are files that have been removed, but not
committed! Do not consider the directory empty. */
(void) CVS_CLOSEDIR (dirp);
return (0);
return 0;
}
}
}
@ -1163,12 +1169,14 @@ isemptydir (dir, might_not_exist)
{
error (0, errno, "cannot read directory %s", dir);
(void) CVS_CLOSEDIR (dirp);
return (0);
return 0;
}
(void) CVS_CLOSEDIR (dirp);
return (1);
return 1;
}
/*
* scratch the Entries file entry associated with a file
*/
@ -1213,9 +1221,11 @@ scratch_file (finfo, vers)
vers->ts_user = NULL;
}
}
return (0);
return 0;
}
/*
* Check out a file.
*/
@ -1503,9 +1513,11 @@ VERS: ", 0);
if (revbuf != NULL)
buf_free (revbuf);
return (retval);
return retval;
}
#ifdef SERVER_SUPPORT
/* This function is used to write data from a file being checked out
@ -1847,9 +1859,11 @@ patch_file (finfo, vers_ts, docheckout, file_info, checksum)
free (backup);
free (file1);
free (file2);
return (retval);
return retval;
}
/* Write data to a file. Record whether the last byte written was a
newline. Optionally compute a checksum. This is called by
patch_file via RCS_checkout. */
@ -2989,8 +3003,10 @@ special_file_mismatch (finfo, rev1, rev2)
#endif
}
int
joining ()
{
return (join_rev1 != NULL);
return join_rev1 != NULL;
}

View File

@ -287,7 +287,7 @@ time_stamp_server (file, vers_ts, entdata)
else if (entdata->timestamp
&& entdata->timestamp[0] == '=')
mark_unchanged (vers_ts);
else if (entdata->timestamp != NULL
else if (entdata->timestamp
&& (entdata->timestamp[0] == 'M'
|| entdata->timestamp[0] == 'D')
&& entdata->timestamp[1] == '\0')

View File

@ -236,6 +236,30 @@ wrap_unparse_rcs_options (line, first_call_p)
}
#endif /* SERVER_SUPPORT || CLIENT_SUPPORT */
/*
* Remove fmt str specifier other than %% or %s. And allow
* only max_s %s specifiers
*/
wrap_clean_fmt_str(char *fmt, int max_s)
{
while (*fmt) {
if (fmt[0] == '%' && fmt[1])
{
if (fmt[1] == '%')
fmt++;
else
if (fmt[1] == 's' && max_s > 0)
{
max_s--;
fmt++;
} else
*fmt = ' ';
}
fmt++;
}
return;
}
/*
* Open a file and read lines, feeding each line to a line parser. Arrange
* for keeping a temporary list of wrappers at the end, if the "temp"
@ -556,9 +580,8 @@ wrap_tocvs_process_file(fileName)
args = xmalloc (strlen (e->tocvsFilter)
+ strlen (fileName)
+ strlen (buf));
/* FIXME: sprintf will blow up if the format string contains items other
than %s, or contains too many %s's. We should instead be parsing
e->tocvsFilter ourselves and giving a real error. */
wrap_clean_fmt_str(e->tocvsFilter, 2);
sprintf (args, e->tocvsFilter, fileName, buf);
run_setup (args);
run_exec(RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL|RUN_REALLY );
@ -590,9 +613,8 @@ wrap_fromcvs_process_file(fileName)
args = xmalloc (strlen (e->fromcvsFilter)
+ strlen (fileName));
/* FIXME: sprintf will blow up if the format string contains items other
than %s, or contains too many %s's. We should instead be parsing
e->fromcvsFilter ourselves and giving a real error. */
wrap_clean_fmt_str(e->fromcvsFilter, 1);
sprintf (args, e->fromcvsFilter, fileName);
run_setup (args);
run_exec(RUN_TTY, RUN_TTY, RUN_TTY, RUN_NORMAL );