Import cvs-1.11.15

This commit is contained in:
Peter Wemm 2004-04-15 01:01:56 +00:00
parent c8ae5f0562
commit 10bfecb8b5
134 changed files with 21049 additions and 9518 deletions

View file

@ -1,4 +1,88 @@
Authors of GNU CVS
Um, yeah. There were lots of 'em. See the "Credits" section of the
README file and the individual ChangeLog files for more.
The conflict-resolution algorithms and much of the administrative file
definitions of CVS were based on the original package written by Dick Grune
at Vrije Universiteit in Amsterdam <dick@cs.vu.nl>, and posted to
comp.sources.unix in the volume 6 release sometime in 1986. This original
version was a collection of shell scripts. I am thankful that Dick made
his work available.
Brian Berliner from Prisma, Inc. (now at Sun Microsystems, Inc.)
<berliner@sun.com> converted the original CVS shell scripts into reasonably
fast C and added many, many features to support software release control
functions. See the manual page in the "man" directory. A copy of the
USENIX article presented at the Winter 1990 USENIX Conference, Washington
D.C., is included in the "doc" directory.
Jeff Polk from BSDI <polk@bsdi.com> converted the CVS 1.2
sources into much more readable and maintainable C code. He also added a
whole lot of functionality and modularity to the code in the process.
See the bottom of the NEWS file (from about 1992).
david d `zoo' zuhn <zoo@armadillo.com> contributed the working base code
for CVS 1.4 Alpha. His work carries on from work done by K. Richard Pixley
and others at Cygnus Support. The CVS 1.4 upgrade is due in large part to
Zoo's efforts.
David G. Grubbs <dgg@odi.com> contributed the CVS "history" and "release"
commands. As well as the ever-so-useful "-n" option of CVS which tells CVS
to show what it would do, without actually doing it. He also contributed
support for the .cvsignore file.
The Free Software Foundation (GNU) contributed most of the portability
framework that CVS now uses. This can be found in the "configure" script,
the Makefile's, and basically most of the "lib" directory.
K. Richard Pixley, Cygnus Support <rich@cygnus.com> contributed many bug
fixes/enhancement as well as completing early reviews of the CVS 1.3 manual
pages.
Roland Pesch, then of Cygnus Support <roland@wrs.com> contributed
brand new cvs(1) and cvs(5) manual pages. Thanks to him for saving us
from poor use of our language!
Paul Sander, HaL Computer Systems, Inc. <paul@hal.com> wrote and
contributed the code in lib/sighandle.c. I added support for POSIX, BSD,
and non-POSIX/non-BSD systems.
Jim Kingdon and others at Cygnus Support <info@cygnus.com> wrote the
remote repository access code.
Larry Jones and Derek Price <derek@ximbiot.com> have been maintaining and
enhancing CVS for some years. Mark D. Baushke <mdb@cvshome.org> came on in
2003.
There have been many, many contributions not listed here. Consult the
individual ChangeLog files in each directory for a more complete idea.
In addition to the above contributors, the following Beta testers
deserve special mention for their support. This is only a partial
list; if you have helped in this way and would like to be listed, let
bug-cvs know (as described in the Cederqvist manual).
Mark D. Baushke <mdb@cisco.com>
Per Cederqvist <ceder@signum.se>
J.T. Conklin <jtc@cygnus.com>
Vince DeMarco <vdemarco@fdcsrvr.cs.mci.com>
Paul Eggert <eggert@twinsun.com>
Lal George <george@research.att.com>
Dean E. Hardi <Dean.E.Hardi@ccmail.jpl.nasa.gov>
Mike Heath <mike@pencom.com>
Jim Kingdon <kingdon@cygnus.com>
Bernd Leibing <bernd.leibing@rz.uni-ulm.de>
Benedict Lofstedt <benedict@tusc.com.au>
Dave Love <d.love@dl.ac.uk>
Robert Lupton the Good <rhl@astro.princeton.edu>
Tom McAliney <tom@hilco.com>
Eberhard Mattes <mattes@azu.informatik.uni-stuttgart.de>
Jim Meyering <meyering@comco.com>
Thomas Mohr <mohr@lts.sel.alcatel.de>
Thomas Nilsson <thoni@softlab.se>
Raye Raskin <raye.raskin@lia.com>
Harlan Stenn <harlan@landmark.com>
Gunnar Tornblom <gunnar.tornblom@senet.abb.se>
Greg A. Woods <woods@planix.com>
Many contributors have added code to the "contrib" directory. See the
README file there for a list of what is available. There is also a
contributed GNU Emacs CVS-mode in tools/pcl-cvs.

View file

@ -15,16 +15,6 @@ similar file for the unix-like operating systems (not yet, at least).
This file also might contain some platform-specific bugs.
* Need more work on the procedure for fixing it if a binary file is
accidentally added in text mode (sanity.sh test cases, better
documentation, probably update and/or admin -kb should update
the -k setting in CVS/Entries).
* Wrappers (-t/-f) do not work client/server, and there are a variety of other
bugs and annoyances with wrappers.
* If your login name contains a space or various other characters
(particularly an issue on Windows), CVS will have trouble (it will
write invalid RCS files, probably). The fix would be to have CVS
@ -42,6 +32,21 @@ provide a "Option-read-write" request which sends -w, in addition to
"Global_option -r" which sends -r.
* Symbolic links to files will not work with or without LockDir. In the
repository, you should avoid using symbolic links to files since this issue
can cause data loss. Symlinks are only a problem when writing files. If your
repository does not allow any write access, symlinks are not a problem.
* Symbolic links to directories will not work with LockDir. In the
repository, you should avoid using symbolic links to directories if
you intend to use LockDir as the correct directory will NOT be locked
by CVS during write. Directory symlinks are not recommended, but should work
as long as LockDir is not being used. Symlinks are only a problem when
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
@ -59,49 +64,13 @@ file's description.
users who try to add the same directory at nearly the same time.
* 'cvs admin' dumped core when files were missing from working directory
(and from the repository)?
* The following bug was reported against CVS 1.9:
Create a module named test with a file named test in it.
cactus:sfavor> cvs get test
cvs checkout: Updating test
U test/test
cactus:sfavor> cd test
cactus:sfavor> cvs get test
cvs checkout: cannot chdir to test: Not a directory
cvs checkout: ignoring module test
Exit 1
cactus:sfavor> cvs update
cvs update: Updating .
rcs.c:2139: failed assertion `rev == NULL || isdigit (*rev)'
Abort (core dumped)
Exit 134
* pcl-cvs doesn't like it when you try to check in a file which isn't
up-to-date. The messages produced by the server perhaps don't match
what pcl-cvs is looking for.
* From: billr@mpd.tandem.com (Bill Robertson)
Subject: Problem with rtag and the -D option
Date: Fri, 17 Mar 1995 10:53:29 -0600 (CST)
I have been trying to use the -D option to specify a date for tagging, but
rtag does not recognize the -D option. It is documented to do so and I've
tested the use of -D with cvs update and cvs diff and it works fine there.
* From: "Charles M. Hannum" <mycroft@ai.mit.edu>
To: info-cvs@prep.ai.mit.edu
Subject: Still one more bug
Date: Sat, 25 Feb 1995 17:01:15 -0500
mycroft@duality [1]; cd /usr/src/lib/libc
mycroft@duality [1]; cvs diff -c2 '-D1 day ago' -Dnow
mycroft@duality [1]; cvs diff -C2 '-D1 day ago' -Dnow
cvs server: Diffing .
cvs server: Diffing DB
cvs [server aborted]: could not chdir to DB: No such file or directory
@ -229,3 +198,36 @@ file's description.
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
are modified, though the file must be modified within a short time after the
commit, probably milliseconds or seconds, for this symptom to be noticed. One
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.
* Status
/*-------.
| Stable |
`-------*/
/*-------------------------.
| Sane for full scale use. |
`-------------------------*/

View file

@ -1,3 +1,825 @@
2004-04-13 Derek Price <derek@ximbiot.com>
* NEWS: Note validation of paths passed to the client.
2004-04-07 Derek Price <derek@ximbiot.com>
* NEWS: Clarify relative-path up-reference article.
2004-04-07 Derek Price <derek@ximbiot.com>
* NEWS: Note ignoring of method options in CVSROOTs.
2004-04-06 Derek Price <derek@ximbiot.com>
* TODO (196, 217, 219, 220, 222, 226): Remove completed items.
(230): New item.
2004-04-06 Derek Price <derek@ximbiot.com>
* NEWS: Note this change.
* configure.in: Do not try and use TMP, TEMP, or TMPDIR as default
temporary directories.
* configure: Regenerated.
2004-04-04 Derek Price <derek@ximbiot.com>
* NEWS: Note Cygwin handles paths like X:\.
2004-04-02 Derek Price <derek@ximbiot.com>
* NEWS: Note Windows ISDIRSEP fix.
2004-04-02 Derek Price <derek@ximbiot.com>
* INSTALL: Instruct users to use the Workspace file and not the project
file for MSVC++.
(Patch from Conrad T. Pino <conrad@pino.com>.)
2004-04-02 Derek Price <derek@ximbiot.com>
* NEWS: Make some notes as to client/serverness of changes.
2004-04-02 Derek Price <derek@ximbiot.com>
* NEWS: Note relative path fix.
2004-04-01 Derek Price <derek@ximbiot.com>
* NEWS: Record run race removal.
2004-03-31 Mark D. Baushke <mdb@cvshome.org>
* cvs.spec.in (BuildRequires): Do not fail if info DIR file does
not exist. (Not everyone has an install-info that generates the
dir file that we want deleted.)
(Report from Geoff Beier <geoff@caradas.com>.)
2004-03-25 Derek Price <derek@ximbiot.com>
* NEWS: Note failure of Cygwin to convert back slashes to slashes.
2004-03-25 Derek Price <derek@ximbiot.com>
* cvs.spec.in (BuildRoot): Use a more unique directory name.
2004-03-22 Derek Price <derek@ximbiot.com>
* INSTALL: Note compilation & --without-gssapi requirement for HPPA
with HP-UX 11.11.
(Report from Nicolas Vervelle <nicolas.vervelle@steria.com>.)
2004-03-20 Derek Price <derek@ximbiot.com>
* NEWS: Note resurrection fixes.
2004-03-18 Derek Price <derek@ximbiot.com>
* NEWS: Back out previous NEWS change at Larry Jones' suggestion.
2004-03-17 Derek Price <derek@ximbiot.com>
* configure.in (--enable-password-authentication-client): Correct
error message text.
* NEWS: Note this change.
* configure: Regenerated.
2004-03-15 Derek Price <derek@ximbiot.com>
* NEWS: Note cvs release + Kerberos fix.
2004-03-15 Derek Price <derek@ximbiot.com>
* configure.in: Correct grammar in help text.
* configure: Regenerated.
2004-03-15 Derek Price <derek@ximbiot.com>
* macintosh/.cvsignore: Complete pruning of directory started in 1999.
2004-03-14 Derek Price <derek@ximbiot.com>
* NEWS: Note resurrection fix.
2004-03-14 Derek Price <derek@ximbiot.com>
* NEWS: Note error & status message corrections.
2004-03-14 Derek Price <derek@ximbiot.com>
* NEWS: Note diff of added files against arbitrary revisions fix.
2004-03-12 Derek Price <derek@ximbiot.com>
* NEWS: Note Larry's recent documentation fixes.
2004-03-03 Derek Price <derek@ximbiot.com>
* NEWS: Note that directories and files named `CVS' are now also
rejected by import.
2004-02-25 Derek Price <derek@ximbiot.com>
* NEWS: Update dying gasp note.
2004-02-25 Derek Price <derek@ximbiot.com>
* NEWS: Note `cvs release' Entries corruption fix.
2004-02-20 Derek Price <derek@ximbiot.com>
* NEWS: Note that the dying gasp check has now been completely removed.
2004-02-17 Derek Price <derek@ximbiot.com>
* NEWS: Note spec file fix.
* cvs.spec: Update to avoid the error checking algorithm's of more
recent version of RPM.
2004-02-17 Derek Price <derek@ximbiot.com>
* NEWS: Note recent commenting of src/checkout.c and Mark's leak fixes.
2004-02-12 Derek Price <derek@ximbiot.com>
* NEWS: Note Mark D. Baushke's recent memory leak plugs.
2004-02-12 Derek Price <derek@ximbiot.com>
* NEWS: Note Ville Skyttä's other recent man page patch.
2004-02-12 Derek Price <derek@ximbiot.com>
* NEWS: Note Ville Skyttä's recent man page patch.
2004-02-11 Derek Price <derek@ximbiot.com>
* NEWS: Note :fork: segfault avoidance.
2004-02-11 Derek Price <derek@ximbiot.com>
* NEWS: Note readability improvements.
2004-02-10 Derek Price <derek@ximbiot.com>
* NEWS: Note dying gasp check.
2004-02-10 Derek Price <derek@ximbiot.com>
* NEWS: Note flow control pipe race fix.
2004-02-10 Derek Price <derek@ximbiot.com>
* BUGS: Note problems building with MSVC++ under Windows and
workaround.
* INSTALL: Ditto.
2004-02-10 Derek Price <derek@ximbiot.com>
* cvsnt.mak: Add stack.c and stack.h in order to compile under Windows.
* NEWS: Note Windows fixes.
* README: Update copyright notice.
2004-02-09 Derek Price <derek@ximbiot.com>
* NEWS: Note new tests in sanity.sh.
2004-02-06 Derek Price <derek@ximbiot.com>
* README: Undo accidental overwrite.
2004-02-04 Derek Price <derek@ximbiot.com>
* NEWS: Note that alias module recursion is now more comprehensive.
2004-02-03 Derek Price <derek@ximbiot.com>
* NEWS: Note case insensitive client directory case preservation.
2004-02-02 Derek Price <derek@ximbiot.com>
* NEWS: Note new join-rm tests.
2004-02-02 Derek Price <derek@ximbiot.com>
* NEWS: Note removal from the server of support for case insensitive
clients.
2004-01-30 Derek Price <derek@ximbiot.com>
* NEWS: Note man page fix.
2004-01-30 Derek Price <derek@ximbiot.com>
* NEWS: Note contrib/log_accum tidy.
2004-01-25 Derek Price <derek@ximbiot.com>
* NEWS: Note Kerberos 4 fix.
2004-01-22 Derek Price <derek@ximbiot.com>
* NEWS: Note recent infinite alias loop fix.
2004-01-22 Derek Price <derek@ximbiot.com>
* INSTALL: Remove a note about an Automake bug that has been fixed for
quite awhile.
2004-01-22 Derek Price <derek@ximbiot.com>
* INSTALL: s/Automake 1.7.5/Automake 1.7.9/.
2004-01-14 Derek Price <derek@ximbiot.com>
* NEWS: Note Larrys recent mktemp.sh inclusion, documentation reorg,
and zlib code fix.
2003-12-23 Larry Jones <lawrence.jones@ugsplm.com>
* Makefile.am: Add mktemp.sh to EXTRA_DIST.
* Makefile.in: Regenerated.
* configure.in: Get mktemp.sh from $srcdir.
* configure: Regenerated.
(Reported by Matt Selsky <selsky@columbia.edu>.)
2003-12-18 Derek Price <derek@ximbiot.com>
* NEWS: Add since 1.11.11 section.
* configure.in: Update for dev 1.11.11.1.
* configure: Regenerated.
2003-12-18 Derek Price <derek@ximbiot.com>
* configure.in: Update for release 1.11.11.
* configure: Regenerated.
2003-12-18 Derek Price <derek@ximbiot.com>
* NEWS: Note syslog of root attempts.
2003-12-18 Derek Price <derek@ximbiot.com>
* NEWS: Note that pserver can no longer run as root.
2003-12-07 Mark D. Baushke <mdb@cvshome.org>
* configure.in (AC_SYS_LARGEFILE): Remove. More work is needed
before AC_SYS_LARGEFILE will work on all platforms.
* configure, config.h.in: Regenerated.
* NEWS: Remove last note.
* configure.in (AC_SYS_LARGEFILE): Add. The history file on
Solaris boxes can grow beyond 2GB.
* configure, config.h.in: Regenerated.
* NEWS: Note addition of --disable-largefiles option.
2003-12-05 Derek Price <derek@ximbiot.com>
* configure.in: Update to require Automake 1.7.9.
2003-12-04 Derek Price <derek@ximbiot.com>
* configure.in: Update for dev version 1.11.10.1.
* NEWS: Add Changes since 1.11.10 section.
* configure: Regenerated.
2003-12-04 Derek Price <derek@ximbiot.com>
* configure.in: Update for release 1.11.10.
* configure: Regenerated.
2003-12-03 Derek Price <derek@ximbiot.com>
* configure.in: Always AC_LIBOBJ(fncase) when filenames are found to be
case insensitive.
* configure: Regenerated.
2003-11-26 Derek Price <derek@ximbiot.com>
* NEWS: Note recase tests.
2003-11-26 Derek Price <derek@ximbiot.com>
* NEWS: Note new test suite functionality.
2003-11-25 Derek Price <derek@ximbiot.com>
* NEWS: Note latest case insensitivity fix.
2003-11-19 Derek Price <derek@ximbiot.com>
* NEWS: Rename "OTHER ISSUES" to "GENERAL USER ISSUES" and move the
note about the Autoconf upgrade to a new "DEVELOPER ISSUES" section.
Add a note about upgrading Automake.
* aclocal.m4, configure, **/Makefile.in: Regenerated with Automake
1.7.9.
2003-11-18 Derek Price <derek@ximbiot.com>
* NEWS: Subdivide Changes section into "SERVER SECURITY ISSUES" and
"OTHER ISSUES". Note module abspath issue in security section.
2003-11-10 Derek Price <derek@ximbiot.com>
* BUGS: Add some detail to the last two notes Mark added.
2003-11-10 Mark D. Baushke <mdb@cvshome.org>
* BUGS: Note that symlinks to files will not work with or without
LockDir. Note that symlinks to directories will not work with
LockDir.
* NEWS (Changes since 1.11.9): Note symlinked CVSROOT now works.
2003-11-10 Derek Price <derek@ximbiot.com>
* configure.in: Require Autoconf 2.58.
* INSTALL, NEWS: Note new Autoconf requirements.
* configure: Regenerated.
2003-11-04 Derek Price <derek@ximbiot.com>
* configure.in: Add some more help text for --enable-case-sensitivity.
* configure: Regenerated.
2003-11-03 Derek Price <derek@ximbiot.com>
* configure.in: Require Automake 1.7.5.
2003-11-03 Derek Price <derek@ximbiot.com>
* INSTALL: Add some notes on Autoconf requirements.
2003-10-31 Derek Price <derek@ximbiot.com>
* INSTALL: Note Cygwin as an option for building CVS under Windows.
2003-10-31 Derek Price <derek@ximbiot.com>
* INSTALL: s/cvsgui/wincvs/.
2003-10-27 Derek Price <derek@ximbiot.com>
* configure.in: Move case sensitivity test to the enable-* section and
allow override via command line switch.
* NEWS: Update last news item to reflect new command line switch.
* configure, config.h.in: Regenerated.
2003-10-27 Derek Price <derek@ximbiot.com>
* configure.in: Add new test for a case insensitive file system.
* configure, config.h.in: Regenerated.
* NEWS: Note the above change.
2003-10-24 Derek Price <derek@ximbiot.com>
* NEWS: Update recent text about joins to reflect new behavior.
2003-10-24 Derek Price <derek@ximbiot.com>
* BUGS: Note that release of a project subdir does not remove the entry
from `./CVS/Entries'.
2003-10-24 Derek Price <derek@ximbiot.com>
* BUGS: Remove obsolete bug report.
(Patch from Paul Edwards <somewhere in Australia>.)
2003-10-24 Derek Price <derek@ximbiot.com>
* BUGS: Remove obsolete bug report.
(Patch from Paul Edwards <somewhere in Australia>.)
2003-10-23 Mark D. Baushke <mdb@cvshome.org>
* NEWS: Note behavior change for cvs update -jrev1 -jrev2.
2003-10-21 Derek Price <derek@ximbiot.com>
* NEWS: Note Mark's recent admin -m fix.
2003-10-21 Derek Price <derek@ximbiot.com>
* NEWS: Note the @email{} and @url{} fixes as misc documentation fixes.
2003-10-14 Derek Price <derek@ximbiot.com>
* NEWS: Note POSIX 1003.1-2001 compatibility of docs and scripts.
2003-10-14 Derek Price <derek@ximbiot.com>
Port to pedantic POSIX 1003.1-2001 hosts, such as Debian GNU/Linux
testing with _POSIX2_VERSION=200112 in the environment.
* BUGS: Suggest 'diff -C2', not 'diff -c2'.
* FAQ: Suggest 'sort -k 1.2', not 'sort +0.1'.
* depcomp: Sync to the depcomp shipped with Automake 1.7.8, as
it has the bug fixed and that's better than maintaining our
own depcomp.
(Patch from Paul Eggert <eggert@twinsun.com>.)
2003-10-14 Derek Price <derek@ximbiot.com>
* INSTALL: Add HPPA 2.0 running HP-UX 10.20 for CVS 1.11.9.
(Report from Tom Kuiper <kuiper@DSNra.JPL.NASA.gov>.)
2003-10-10 Derek Price <derek@ximbiot.com>
* NEWS (Changes since 1.11.9): New section.
* configure.in: Update package version to 1.11.9.1.
* configure: Regenerated.
2003-10-10 Derek Price <derek@ximbiot.com>
* configure.in: Update package version to 1.11.9.
* configure: Regenerated.
2003-10-08 Derek Price <derek@ximbiot.com>
* NEWS: Note history reporting fix.
2003-10-08 Derek Price <derek@ximbiot.com>
* NEWS: Improve syntax and punctuation of my last entry.
2003-10-08 Derek Price <derek@ximbiot.com>
* NEWS: Note history fix for clients requesting `P' records.
2003-10-07 Derek Price <derek@ximbiot.com>
* NEWS: Note case insensitive file lookup fix.
2003-10-03 Derek Price <derek@ximbiot.com>
* NEWS: Note server ignoring `-l' with a warning.
2003-10-02 Derek Price <derek@ximbiot.com>
* NEWS (Changes since 1.11.8): Add empty section.
* configure.in: Update package version to 1.11.8.1.
* configure: Regenerated.
2003-10-02 Derek Price <derek@ximbiot.com>
* configure.in: Update package version to 1.11.8.
* configure: Regenerated.
2003-10-02 Derek Price <derek@ximbiot.com>
* NEWS: Note getpass fix.
2003-09-29 Derek Price <derek@ximbiot.com>
* NEWS (Changes since 1.11.7): Insert empty entry.
* configure.in: Update to 1.11.7.1.
* configure: Regenerated.
2003-09-29 Derek Price <derek@ximbiot.com>
* configure.in: Update package version to 1.11.7.
* configure: Regenerated.
2003-09-29 Derek Price <derek@ximbiot.com>
* NEWS: Note recent fix of the potential segfault during a diff.
2003-09-26 Derek Price <derek@ximbiot.com>
* BUGS: Note bug in options passed to diff via `cvs diff'.
2003-09-12 Derek Price <derek@ximbiot.com>
* NEWS: Note checkoutlist error message handling fix.
2003-08-27 Larry Jones <lawrence.jones@eds.com>
* NEWS: Note client/server messages have real command name, client/
server updates get logged in history file, history file has "P"
record type.
2003-07-29 Derek Price <derek@ximbiot.com>
* configure.in: Replace my recent misuse of AH_VERBATIM with a call to
AC_DEFINE.
* config.h.in, configure: Regenerated.
2003-07-29 Derek Price <derek@ximbiot.com>
* configure.in: Do not check for getpassphrase. Define `getpass' to
`cvs_getpass' in config.h to avoid conflicts with system decls.
* NEWS: Note use of GNULIB getpass.
* config.h.in, configure: Regenerated.
2003-07-25 Derek Price <derek@ximbiot.com>
* INSTALL: Note --without-gssapi required to configure on OS X.
2003-07-18 Derek Price <derek@ximbiot.com>
* BUGS: Remove mention of wrappers -t/-f since they are no longer
supported.
2003-07-18 Derek Price <derek@ximbiot.com>
* Makefile.am (EXTRA_DIST): Add cvs.spec so that RPMs can be built
directly from tarballs.
* Makefile.in: Regenerated.
2003-07-18 Derek Price <derek@ximbiot.com>
* TODO (72): Remove mention of the -i/-o in the modules file since they
have been removed.
2003-06-27 Larry Jones <lawrence.jones@eds.com>
* NEWS: Note LockDir fix.
2003-06-23 Derek Price <derek@ximbiot.com>
* configure.in: Debian Woody has -lkrb4, so check for that.
(Patch from Alexey Mahotkin <alexm@hsys.msk.ru>.)
* config.h.in: Regenerated.
* configure: Ditto.
2003-06-20 Derek Price <derek@ximbiot.com>
* INSTALL: Add some OS X platforms to the compile list. Correct link to
cvsgui.org -> wincvs.org.
2003-06-09 Derek Price <derek@ximbiot.com>
* cvsnt.mak: Rename win32.c to woe32.c in accordance with the GNU
convention to avoid implying that we consider the Microsoft Windows
Operating Environment any sort of "win".
2003-06-09 Derek Price <derek@ximbiot.com>
* NEWS: Note short patch fix.
2003-06-09 Derek Price <derek@ximbiot.com>
* TODO (45): Combine this with...
(30): ...this item (as #30). Remove reference to diff since the
modules file is only consulted for the r* commands.
2003-06-02 Derek Price <derek@ximbiot.com>
* NEWS: Note empty diff change text fix.
2003-05-29 Derek Price <derek@ximbiot.com>
* NEWS: Note removal of global -l option.
2003-05-27 Derek Price <derek@ximbiot.com>
* AUTHORS: Give Mark an email address.
2003-05-27 Derek Price <derek@ximbiot.com>
* cvs.spec.in: Add some files to doc. Remove redundant %defattr.
2003-05-27 Derek Price <derek@ximbiot.com>
* NEWS (Changes since 1.11.5): Add missing entry.
2003-05-27 Derek Price <derek@ximbiot.com>
* README (Credits): Move...
* AUTHORS: ...here and update.
2003-05-26 Derek Price <derek@ximbiot.com>
* configure.in: Update CVS version to 1.11.6.1.
* configure: Regenerated.
2003-05-25 Derek Price <derek@ximbiot.com>
* configure.in: Update CVS version to 1.11.6.
* configure: Regenerated.
2003-05-25 Derek Price <derek@ximbiot.com>
* BUGS: Note current intermittant BSDI failures.
2003-05-22 Larry Jones <lawrence.jones@eds.com>
* NEWS: Note recent administrative file changes.
2003-05-21 Derek Price <derek@ximbiot.com>
* INSTALL: Mention new Automake version.
* NEWS: Ditto.
* Makefile.in: Regenerated.
* aclocal.m4: Ditto.
* config.h.in: Ditto.
* configure: Ditto.
2003-05-20 Derek Price <derek@ximbiot.com>
* INSTALL: Using Autoconf version 2.57.
* NEWS: Ditto. Reorder NEWS items to put the stuff which it is likely
that only developers care about last.
* configure: Regenerated with Autoconf 2.57.
2003-05-09 Derek Price <derek@ximbiot.com>
* configure.in: Back out all the S_ISSOCK changes I just made and move
the equivalent to lib/system.h.
* configure.in: Regenerated.
* config.h.in: Ditto.
2003-05-09 Derek Price <derek@ximbiot.com>
* configure.in: Try again, with AC_TRY_LINK this time.
* configure: Regenerated.
2003-05-09 Derek Price <derek@ximbiot.com>
* configure.in: Correct a typo in my last patch.
* configure: Regenerated.
2003-05-09 Derek Price <derek@ximbiot.com>
* configure.in: Add some checks for S_ISSOCK to avoid a problem on
SCO OpenServer 5.0.6a.
(Reported by Boyd Lynn Gerber <gerberb@zenez.com>.)
* config.h.in: Regenerated.
* configure: Ditto.
2003-05-01 Derek Price <derek@ximbiot.com>
* TODO (149): Remove reference to defunct RELATIVE_REPOS macro.
2003-04-30 Derek Price <derek@ximbiot.com>
* acinclude.m4 (ACX_WITH_GSSAPI): Fix typo in broken conditional.
(Thanks to Alexey Mahotkin <alexm@hsys.msk.ru>.)
* configure: Regenerated.
* aclocal.m4: Ditto.
2003-04-28 Derek Price <derek@ximbiot.com>
* NEWS (Changes since 1.11.5): Note removal of Checkin.prog and
Update.prog functionality.
2003-04-10 Larry Jones <lawrence.jones@eds.com>
* aclocal.m4 (AM_MAINTAINER_MODE): New macro to support
--enable-maintainer-mode.
* configure.in: Use it.
* configure: Regenerated.
* Makefile.in: Regenerated.
* noautomake.sh: Removed; no longer needed.
* INSTALL: Remove reference to noautomake.sh, add reference to
--enable-maintainer-mode.
* Makefile.am: Remove noautomake.sh.
* NEWS: Add note about --enable-maintainer-mode and noautomake.sh.
* README: Remove noautomake.sh.
2003-04-01 Derek Price <derek@ximbiot.com>
* BUGS: Remove a pcl-cvs bug. pcl-cvs is no longer part of the CVS
source distribution.
2003-04-01 Derek Price <derek@ximbiot.com>
* BUGS: Remove reference to cvs admin SEGV bug Larry Jones fixed
on 2003-02-19.
2003-04-01 Derek Price <derek@ximbiot.com>
* BUGS: Remove obsolete bug.
* configure.in: Tail the BUGS file for status.
* configure: Regenerated.
2003-03-28 Derek Price <derek@ximbiot.com>
* configure.in (--with-editor): Quit with an error message when no
editor is found. Allow --with-editor to override $EDITOR from the
user's environment. Add vim to the list of defaults.
* configure: Regenerated.
2003-03-26 Derek Price <derek@ximbiot.com>
* configure.in (--with-editor): Quit with an error message when
--without-editor is specified.
(Report from Jim Salter <jsalterjim@earthlink.net>.)
* configure: Regenerated.
2003-03-24 Derek Price <derek@ximbiot.com>
* configure.in: Add copyright notice.
* Makefile.am: Update copyright notice.
* Makefile.in: Regenerated.
* configure: Ditto.
2003-03-07 Derek Price <derek@ximbiot.com>
* TESTS: Document some more global variables.
2003-03-05 Mark D Baushke <mdb@cvshome.org>
* NEWS (Changes since 1.11.5): Backout CVS_LOCAL_BRANCH_NUM feature.
* NEWS (Changes since 1.11.5): Mention CVS_LOCAL_BRANCH_NUM
environment varaible.
2003-02-25 Derek Price <derek@ximbiot.com>
* configure.in (WITH_KRB4): Import KRB4 patch from Redhat 8.0's CVS
1.11.2-5 SRPM. It's not the right fix, but it will work until I get
around to merging some of the code with WITH_GSSAPI and seperating the
bits into separate M4 files.
* configure: Regenerated.
* config.h.in: Ditto.
2003-02-28 Derek Price <derek@ximbiot.com>
* acinclude.m4 (ACX_WITH_GSSAPI): Move the checkin from 1/23 to
aclocal.m4 to the source, here.
* aclocal.m4: Regenerated.
* configure: Regenerated.
2003-02-28 Larry Jones <lawrence.jones@eds.com>
* TODO (206): Done in 1.11.3.
(226): Add comment about deadlock.
(228, 229): New items.
2003-02-26 Derek Price <derek@ximbiot.com>
* mktemp.sh: Actually add file this time.
* mktemp.sh: Add copyright notice, some comments, and attempt to return
success and error codes.
2003-02-25 Derek Price <derek@ximbiot.com>
* configure.in: Add checks for mktemp and sendmail.
* mktemp.sh: New file.
* Makefile.in: Regenerated.
* configure: Ditto.
2003-02-06 Derek Price <derek@ximbiot.com>
* NEWS (Changes since 1.11.5): Note error message corrections.
2003-01-30 Larry Jones <lawrence.jones@eds.com>
* FAQ: Update URL for tkCVS info.
* NEWS (Changes from 1.11.2 to 1.11.3): Add note about fixing watch
in server mode.
2003-01-28 Derek Price <derek@ximbiot.com>
* INSTALL: Remove a reference to options.h.
(Thanks to Jenn Vesperman <jenn@anthill.echidna.id.au> for the report.)
2003-01-28 Larry Jones <lawrence.jones@eds.com>
* NEWS: Update for 1.11.5, add notes about bug fixes in older
versions.
2003-01-23 Derek Price <derek@ximbiot.com>
* aclocal.m4 (WITH_GSSAPI): Check for libcrypt before libroken to
satisfy a FreeBSD 4.6 dependency.
(Thanks to Jan Ruzicka <jan.ruzicka@comtechmobile.com> for the bug
report and a partial fix.)
* configure: regenerated.
2003-01-20 Derek Price <derek@ximbiot.com>
* NEWS: Update the news for the last release to mention that client
builds are not affected by the security vulnerability.
2003-01-20 Derek Price <derek@ximbiot.com>
* configure.in: Update to dev version 1.11.5.1.
* configure: Regenerated.
2003-01-16 Derek Price <derek@ximbiot.com>
* NEWS: Add 1.11.4 entry in regards to
@ -8,6 +830,13 @@
* configure: Regenerated.
2002-01-16 Derek Price <derek@ximbiot.com>
* configure.in (--with-editor): Look for nano, the GNU GPL pico clone.
(Reported by Robin Cook <rcook@wyrms.net>.)
* configure: Regenerated.
2002-01-16 Derek Price <derek@ximbiot.com>
* configure.in: Update to dev version (1.11.4.1).

View file

@ -1897,7 +1897,9 @@ You can branch a branch.
Note that according to the official GIC page at
http://www.cpsc.ucalgary.ca/redirect/grouplab/projects/gic/
GIC is no longer being maintained and tkCVS is recommended
instead. For more on tkCVS, see http://www.cyclic.com/tkcvs/
instead.
For more on tkCVS, see http://www.cvshome.org/dev/addontkcvs.html.
kingdon@cyclic.com
@ -4330,7 +4332,7 @@ kingdon@cyclic.com
You should be able to run:
sort +0.1 ${dir1}/history ${dir2}/history > history
sort -k 1.2 ${dir1}/history ${dir2}/history > history
If you "diff" a standard history file before and after such a sort,
you might see other differences caused by garbage (split lines, nulls,

View file

@ -123,6 +123,8 @@ HPPA:
HPPA running HP-UX 9.05 (1.9)
HPPA running HP-UX 10.01 (1.7)
HPPA running HP-UX 10.20 (1.10.7)
HPPA running HP-UX 11.11 (1.11.13) (footnote 12)
HPPA 2.0 running HP-UX 10.20 (1.10.9) (footnote 13)
NextSTEP 3.3 (1.7)
i386 family:
Solaris 2.4 using gcc (about 1.4A2)
@ -181,6 +183,9 @@ PowerPC or RS/6000:
Lynx 2.3.1 120495 (1.6.86) (footnote 9)
Lynx 2.5 (1.9) (footnote 10)
MkLinux DR3 GENERIC #6 (1.10.5.1) (presumably LinuxPPC too)
Mac OS X Darwin 6.6 Darwin Kernel Version 6.6 (1.11.1p1)
Mac OS X Darwin 5.5 Darwin Kernel Version 5.5 (1.11.6) (footnote 12)
Mac OS X Darwin 5.5 Darwin Kernel Version 5.5 (1.12.1) (footnote 12)
SPARC:
Sun SPARC running SunOS 4.1.x (1.10)
Sun SPARCstation 10 running Solaris 2.3 using gcc and cc (about 1.4A2)
@ -238,21 +243,33 @@ VAX:
ci: RCS/loginfo,v: Invalid argument
cvs [init aborted]: failed to checkin n:/safe/CVSROOT/loginfo
(footnote 12)
Need to `configure --without-gssapi' unless you have installed Kerberos 5
libraries on the system yourself. For some reason Apple ships OS X with
the Kerberos 5 headers installed and not the libraries, which confuses the
current configure script. Some HP, BSD, & Sun boxes have similar problems.
(footnote 13)
A build under HP PA-RISC 2.0 will probably not run under PA-RISC 1.1
unless "+DAportable" is added to the HP ANSI cc compiler flags.
-------------------------------------------------------------------------------
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, so you may wish to run
noautomake.sh to set the timestamps and avoid attempting to run the
autotools on your system, especially if you are building from source
checked out from CVS:
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.
$ ./noautomake.sh --noautoconf
The CVS Makefiles and configure script were built using Automake 1.7.9 and
Autoconf 2.58, respectively.
The CVS Makefiles and configure script were built using Automake 1.6.3 and
Autoconf 2.53, respectively. Other combinations of autotool versions may
or may not work.
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":
@ -368,10 +385,7 @@ Building from source code under Unix:
END OF NOTE FOR NDBM GUNK.
3) Edit src/options.h. The defaults should be reasonable, and in fact
if you are lazy you can safely skip this step.
4) Try to build it:
3) Try to build it:
$ make
@ -382,7 +396,7 @@ Building from source code under Unix:
compiler information, make output, and anything else you think
will be helpful.
4a) Run the regression tests (optional).
3a) 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
@ -394,7 +408,7 @@ Building from source code under Unix:
If you want to run the tests, see the file TESTS for more information.
5) Install the binaries/documentation:
4) Install the binaries/documentation:
$ make install
@ -442,7 +456,11 @@ Building from source code under Windows NT/95/98/2000:
You may find interesting information in windows-NT/README.
1) Using Microsoft Visual C++ 5.x, open the project `cvsnt.dsp',
* Using Microsoft Visual C++ 5.x (this is currently broken - someone with
MVC++ 5.x needs to regenerate the project files, but the builds using `nmake'
below will work).
1) Using Microsoft Visual C++ 5.x, open the project `cvsnt.dsw',
in the top directory of the CVS distribution. If you have an older
version of Visual C++, take a look at windows-NT/README.
2) Choose "Build cvs.exe" from the "Project" menu.
@ -455,7 +473,12 @@ following also works:
C:\> vcvars32
C:\> nmake /f cvsnt.mak CFG="cvsnt - Win32 Debug"
* You might also try http://cvsgui.org & http://www.cvsnt.org
* Using the Cygwin development environment <http://cygwin.com>, Windows clients
and servers can be built using the instructions for building on UNIX. For
deploying the CVS server on Windows NT, see the `cygrunsrv' executable that
comes with Cygwin.
* You might also try <http://wincvs.org> & <http://www.cvsnt.org>.
-------------------------------------------------------------------------------
@ -467,24 +490,10 @@ For VMS, see README.VMS
Mac OS X: Builds fine, just like UNIX.
For older versions of Mac OS, you might try http://cvsgui.org .
For older versions of Mac OS, you might try <http://wincvs.org>.
For a Java client, see jCVS (which is a separate package from CVS
itself, but which might be preferable to the Macintosh port mentioned
above, for example).
**** ****
Builds are breaking on some systems (notably,
BSD/OS thor.sdrc.com 4.0.1 BSDI BSD/OS 4.0.1 Kernel #3: Thu Mar 9 11:29:16 EST 2000
) due to Automake's dependency tracking code. The work around for this is to
comile without it by passing the '--disable-dependency-tracking' option to
configure:
$ ./configure --disable-dependency-tracking
This will allow a compile but make will no longer be tracking header
dependencies. This means that if you make any changes to header files you may
have to run 'make clean' before running a 'make' to get everything to compile.
-------------------------------------------------------------------------------

View file

@ -1,6 +1,8 @@
## Process this file with automake to produce Makefile.in
# Master Makefile for the GNU Concurrent Versions System.
# Copyright (C) 1986, 1988-1992, 1994, 2000 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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
@ -36,8 +38,8 @@ EXTRA_DIST = \
cvsnt.dsp \
cvsnt.dsw \
cvsnt.mak \
noautomake.sh
cvs.spec \
mktemp.sh
## MAINTAINER Targets

View file

@ -1,7 +1,7 @@
# Makefile.in generated by automake 1.6.3 from Makefile.am.
# Makefile.in generated by automake 1.7.9 from Makefile.am.
# @configure_input@
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@ -15,7 +15,9 @@
@SET_MAKE@
# Master Makefile for the GNU Concurrent Versions System.
# Copyright (C) 1986, 1988-1992, 1994, 2000 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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
@ -26,79 +28,117 @@
# 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.
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = .
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
transform = @program_transform_name@
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
EXEEXT = @EXEEXT@
OBJEXT = @OBJEXT@
PATH_SEPARATOR = @PATH_SEPARATOR@
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSH = @CSH@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EDITOR = @EDITOR@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
KRB4 = @KRB4@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MAKE_TARGETS_IN_VPATH_FALSE = @MAKE_TARGETS_IN_VPATH_FALSE@
MAKE_TARGETS_IN_VPATH_TRUE = @MAKE_TARGETS_IN_VPATH_TRUE@
MKTEMP = @MKTEMP@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PR = @PR@
PS2PDF = @PS2PDF@
RANLIB = @RANLIB@
ROFF = @ROFF@
SENDMAIL = @SENDMAIL@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TEXI2DVI = @TEXI2DVI@
VERSION = @VERSION@
YACC = @YACC@
ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
ac_prefix_program = @ac_prefix_program@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
bindir = @bindir@
build_alias = @build_alias@
datadir = @datadir@
exec_prefix = @exec_prefix@
host_alias = @host_alias@
includedir = @includedir@
includeopt = @includeopt@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
# Unix source subdirs, where we'll want to run lint and etags:
# This is a legacy variable from b4 Automake
@ -124,7 +164,8 @@ EXTRA_DIST = \
cvsnt.dsp \
cvsnt.dsw \
cvsnt.mak \
noautomake.sh
cvs.spec \
mktemp.sh
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@ -133,14 +174,16 @@ CONFIG_HEADER = config.h
CONFIG_CLEAN_FILES = cvs.spec emx/Makefile os2/Makefile zlib/Makefile
DIST_SOURCES =
RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \
uninstall-info-recursive all-recursive install-data-recursive \
install-exec-recursive installdirs-recursive install-recursive \
uninstall-recursive check-recursive installcheck-recursive
DIST_COMMON = README AUTHORS COPYING COPYING.LIB ChangeLog INSTALL \
Makefile.am Makefile.in NEWS TODO acinclude.m4 aclocal.m4 \
compile config.h.in configure configure.in cvs.spec.in depcomp \
install-sh mdate-sh missing mkinstalldirs
RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \
ps-recursive install-info-recursive uninstall-info-recursive \
all-recursive install-data-recursive install-exec-recursive \
installdirs-recursive install-recursive uninstall-recursive \
check-recursive installcheck-recursive
DIST_COMMON = README $(srcdir)/Makefile.in $(srcdir)/configure AUTHORS \
COPYING COPYING.LIB ChangeLog INSTALL Makefile.am NEWS TODO \
acinclude.m4 aclocal.m4 compile config.h.in configure \
configure.in cvs.spec.in depcomp install-sh mdate-sh missing \
mkinstalldirs
DIST_SUBDIRS = $(SUBDIRS)
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
@ -149,18 +192,18 @@ all: config.h
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)
$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
$(srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
cd $(srcdir) && $(AUTOCONF)
$(ACLOCAL_M4): configure.in acinclude.m4
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in acinclude.m4
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
config.h: stamp-h1
@ -173,7 +216,7 @@ stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
@rm -f stamp-h1
cd $(top_builddir) && $(SHELL) ./config.status config.h
$(srcdir)/config.h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4)
$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && $(AUTOHEADER)
touch $(srcdir)/config.h.in
@ -243,10 +286,17 @@ tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ETAGS = etags
ETAGSFLAGS =
CTAGS = ctags
CTAGSFLAGS =
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@ -262,9 +312,15 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
if (etags --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
else \
include_option=--include; \
fi; \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
test -f $$subdir/TAGS && \
tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
@ -277,13 +333,28 @@ TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
|| $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique
ctags: CTAGS
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
top_distdir = .
@ -295,13 +366,20 @@ am__remove_distdir = \
&& rm -fr $(distdir); }; }
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
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
@list='$(DISTFILES)'; for file in $$list; do \
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
@ -359,12 +437,13 @@ distcheck: dist
$(am__remove_distdir)
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf -
chmod -R a-w $(distdir); chmod a+w $(distdir)
mkdir $(distdir)/=build
mkdir $(distdir)/=inst
mkdir $(distdir)/_build
mkdir $(distdir)/_inst
chmod a-w $(distdir)
dc_install_base=`$(am__cd) $(distdir)/=inst && pwd` \
&& cd $(distdir)/=build \
&& ../configure --srcdir=.. --prefix=$$dc_install_base \
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
&& cd $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
$(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
@ -372,23 +451,39 @@ distcheck: dist
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
&& (test `find $$dc_install_base -type f -print | wc -l` -le 1 \
|| { echo "ERROR: files left after uninstall:" ; \
find $$dc_install_base -type f -print ; \
exit 1; } >&2 ) \
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
distuninstallcheck \
&& chmod -R a-w "$$dc_install_base" \
&& ({ \
(cd ../.. && $(mkinstalldirs) "$$dc_destdir") \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
} || { rm -rf "$$dc_destdir"; exit 1; }) \
&& rm -rf "$$dc_destdir" \
&& $(MAKE) $(AM_MAKEFLAGS) dist-gzip \
&& rm -f $(distdir).tar.gz \
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
$(am__remove_distdir)
@echo "$(distdir).tar.gz is ready for distribution" | \
sed 'h;s/./=/g;p;x;p;x'
distuninstallcheck:
@cd $(distuninstallcheck_dir) \
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|| { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \
fi ; \
$(distuninstallcheck_listfiles) ; \
exit 1; } >&2
distcleancheck: distclean
if test '$(srcdir)' = . ; then \
@if test '$(srcdir)' = . ; then \
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
exit 1 ; \
fi
test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left after distclean:" ; \
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left in build directory after distclean:" ; \
$(distcleancheck_listfiles) ; \
exit 1; } >&2
check-am: all-am
@ -408,7 +503,7 @@ install-am: all-am
installcheck: installcheck-recursive
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
INSTALL_STRIP_FLAG=-s \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
@ -416,7 +511,7 @@ mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES)
-rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@ -427,6 +522,7 @@ clean-am: clean-generic mostlyclean-am
distclean: distclean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
dvi: dvi-recursive
@ -449,21 +545,31 @@ installcheck-am:
maintainer-clean: maintainer-clean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf autom4te.cache
-rm -rf $(top_srcdir)/autom4te.cache
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-recursive
mostlyclean-am: mostlyclean-generic
pdf: pdf-recursive
pdf-am:
ps: ps-recursive
ps-am:
uninstall-am: uninstall-info-am
uninstall-info: uninstall-info-recursive
.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \
clean-generic clean-recursive dist dist-all dist-bzip2 \
dist-gzip distcheck distclean distclean-generic distclean-hdr \
distclean-recursive distclean-tags distcleancheck distdir dvi \
.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
clean-generic clean-recursive ctags ctags-recursive dist \
dist-all dist-bzip2 dist-gzip distcheck distclean \
distclean-generic distclean-hdr distclean-recursive \
distclean-tags distcleancheck distdir distuninstallcheck dvi \
dvi-am dvi-recursive info info-am info-recursive install \
install-am install-data install-data-am install-data-recursive \
install-exec install-exec-am install-exec-recursive \
@ -472,9 +578,9 @@ uninstall-info: uninstall-info-recursive
installdirs installdirs-am installdirs-recursive \
maintainer-clean maintainer-clean-generic \
maintainer-clean-recursive mostlyclean mostlyclean-generic \
mostlyclean-recursive tags tags-recursive uninstall \
uninstall-am uninstall-info-am uninstall-info-recursive \
uninstall-recursive
mostlyclean-recursive pdf pdf-am pdf-recursive ps ps-am \
ps-recursive tags tags-recursive uninstall uninstall-am \
uninstall-info-am uninstall-info-recursive uninstall-recursive
.PHONY: localcheck remotecheck

View file

@ -1,17 +1,359 @@
Changes since 1.11.4:
Changes since 1.11.14:
**********************
* Fixed a security hole by which users with read only access could gain
write access. The Common Vulnerabilities and Exposures project (cve.mitre.org)
has assigned the name CAN-2003-0015 to this issue. See
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.
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.
GENERAL USER ISSUES
* Method options (used by WinCVS & CVS 1.12.7+) in CVSROOTs are ignored.
* Configure no longer checks the $TMPDIR, $TMP, & $TEMP variables to set the
default temporary directory.
* CVS on Cygwin correctly handles X:\ style paths.
* Import now uses backslash rather than slash on Windows when checking for
"CVS" directories to ignore in import commands.
* Relative paths containing up-references (`..') should now work in
client/server mode (client fix).
* A race condition between the ordering of messages from CVS and messages from
called scripts in client/server mode has been removed (server fix).
* Resurrected files now get their modes and timestamps set correctly and a
longstanding bug involving resurrection of an uncommitted removal has been
fixed (server fix).
* Some resurrection (cvs add) status messages have changed slightly.
* `cvs release' now works with Kerberos or GSSAPI encryption enabled (server
fix).
* File resurrection from a previously existing revision no longer just reports
that it works (server fix).
* Misc error & status message corrections.
* Diffing of locally added files against arbitrary revisions in an RCS archive
is now allowed when a file of the same name exists or used to exist on some
branch (server fix).
* Misc documentation fixes.
Changes from 1.11.13 to 1.11.14:
********************************
GENERAL USER ISSUES
* Imports will now always ignore directories and files named `CVS' to avoid
violating assumptions made by other parts of CVS.
* A problem with `cvs release' of subdirs that could corrupt CVS/Entries files
has been fixed (client/server).
* The CVS server's protocol check for unused data from the client is no longer
called automatically at program exit in order to avoid potential recursive
calls to error when the first close is due to memory allocation or similar
problems that cause calls to error() to fail. The check is still made when
the server program exits normally.
* The spec file has been updated to work with more recent versions of RPM.
* Several memory leaks have been plugged (client/server).
DEVELOPER ISSUES
* Misc cosmetic, readability, and commenting fixes.
Changes from 1.11.12 to 1.11.13:
********************************
GENERAL USER ISSUES
* Several memory leaks have been plugged.
* Thanks to Ville Skyttä the man page has a few less spelling errors and is
slightly more accurate.
* An unlikely potential segfault when using the :fork: connection method has
been fixed.
* The CVS server has had the protocol check for unused data from the client
partially restored.
* A fix has been included that should avoid a very rare race condition that
could cause a CVS server to exit with a "broken pipe" message.
* A minor problem with the nmake build file that was preventing the source from
compiling under Windows has been fixed.
* Tests have been added to the test suite.
DEVELOPER ISSUES
* Misc cosmetic, readability, and commenting fixes.
Changes from 1.11.11 to 1.11.12:
********************************
GENERAL USER ISSUES
* Infinite alias loops in the modules file are now checked for and avoided.
* Clients on case insensitive systems now preserve the case of directories in
CVS/Entries, in addition to files, for use in communications with the CVS
server.
* Some previously untested behavior is now being tested.
* Server support for case insensitive clients has been removed in favor of the
server relying on the client to preserve the case of checked out files, as
per the CVS client/server protocol spec. This is not as drastic as it may
sound, as all of the current tests still pass without modification when run
from a case insensitive client to a case sensitive server. This change
disables little previous functionality, enables access to more of the
possible namespace to users on systems with case insensitive file systems,
fixes a few bugs, and in the end this should provide a major stability
improvement.
* Thanks to Ville Skyttä the man page is a bit more accurate.
* Thanks to Ville Skyttä some unused variables were removed from the log_accum
Perl script in contrib.
* Thanks to Alexey Mahotkin, a bug that prevented CVS from being compiled with
Kerberos 4 authentication enabled has been fixed.
* A minor bug that caused CVS to fail to report an inifinte alias loop in the
modules file when portions of the alias definition contained trailing slashes
has been fixed.
* A bug in the gzip code that could cause heap corruption and segfaults in CVS
servers talking to clients less than 1.8 and some modern third-party CVS
clients has been fixed.
* mktemp.sh is now included with the source distribution so that the rcs2log
and cvsbug executables may be run on systems which do not contain an
implementation of mktemp.
* Misc documentation fixes.
Changes from 1.11.10 to 1.11.11:
********************************
SERVER SECURITY ISSUES
* pserver can no longer be configured to run as root via the
$CVSROOT/CVSROOT/passwd file, so if your passwd file is compromised, it no
longer leads directly to a root hack. Attempts to root will also be logged
via the syslog.
Changes from 1.11.9 to 1.11.10:
*******************************
SERVER SECURITY ISSUES
* Malformed module requests could cause the CVS server to attempt to create
directories and possibly files at the root of the filesystem holding the CVS
repository. Filesystem permissions usually prevent the creation of these
misplaced directories, but nevertheless, the CVS server now rejects the
malformed requests.
GENERAL USER ISSUES
* Case insensitive clients using a case sensitive server can now use a
`cvs rm -f file; cvs add FILE' command sequence to add a file with the same
name in a new case.
* CVSROOTs which contain a symlink to a real repository should work.
* The configure script now tests whether it is building CVS on a case
insensitive file system. If it is, CVS assumes that all file systems on this
platform will be case insensitive. This is useful for getting the case
insensitivity flag set correctly when compiling on Mac OS X and under Cygwin
on Windows. Autodetection can be overridden using the
--disable-case-sensitivity and --enable-case-sensitivity arguments to
configure.
* A behavior change in `cvs up -jrev1 -jrev2' for modified files with a base
revision of rev2 (ie, checked-out version matches rev2 and file has been
modified). The operation is no longer ignored and instead is passed to
diff3. This will potentially re-apply the diffs between the two revisions to
a modified local file. Status messages like from a standard merge have also
been added when the file would not or does not change due to this merge
request ("[file] already contains the changes between [revisions]...").
* A bug which could stop `cvs admin -mTAG:message' from recursing has been
fixed.
* Misc documentation cleanup and fixes.
* Some of the contrib scripts, some of the documentation, and sanity.sh were
modified to use and recommend more portable commands rather than using and
recommending commands which were not compatible with the POSIX 1003.1-2001
specification.
DEVELOPER ISSUES
* A new set of tests to test issues specific to case insensitive clients and
servers has also been added.
* Support has been added to the test suite to support testing over a :ext: link
to another machine, subject to some stringent requirements. This support can
be used, for instance, to test the operation of a case insensitive client
against a case sensitive server. Please see the comments in TEST and the
src/sanity.sh test script itself for more.
* We've standardized on Automake 1.7.9 to get a bug fix. See the note below
on the Autoconf upgrade for more details.
* We've standardized on Autoconf version 2.58 to avoid a bug and get at a few
new macros. Again, this should only really affect developers, though it is
possible that CVS will now compile on a few new platforms. Please see the
section of the INSTALL file about using the autotools if you are compiling
CVS yourself.
Changes from 1.11.8 to 1.11.9:
* CVS now knows how to report, as well as record, `P' record types.
* When running the `cvs history' command, clients will now send the
long-accepted `-e' option, for all records, rather than explicitly requesting
`P' record types, a request which servers prior to 1.11.7 will reject with a
fatal error message.
* A problem with locating files requested by case insensitive clients which was
accidentally introduced in 1.11.6 as part of a fix for a data loss problem
involving `cvs add's from case insensitive clients has been fixed. The
relevant error message was `cvs [<command> aborted]: filE,v is ambiguous;
could mean FILE,v or file,v'.
* Attempts to use the global `-l' option, removed from both client and server
as of version 1.11.6, will now elicit a warning rather than a fatal error
from the server.
Changes from 1.11.7 to 1.11.8:
* A problem in the CVS getpass library that could cause passwords to echo on
some systems has been fixed.
Changes from 1.11.6 to 1.11.7:
* A segfault that could occur in very rare cases where the stat of a file
failed during a diff has been fixed.
* Any user with write privleges to the CVSROOT/checkoutlist file could pass
arbitrary format strings directly through to a printf function. This was
probably bad and has been fixed. White space at the beginning of error strings
in checkoutlist is now ignored properly.
* In client/server mode, most messages from CVS now contain the actual
command name rather than the generic "server".
* A long-standing bug that prevented most client/server updates from being
logged in the history file has been fixed.
* Updates done via a patch ("P" status) are now logged in the history file
by default and the corresponding "P" history record type is now documented.
If you're setting the LogHistory option in your CVSROOT/config file, you may
want to add "P" to the list of record types.
* CVS now will always compile and its own getpass() function (originally from
GNULIB) in favor of any system one that may exist. This avoids some problems
with long passwords on some systems and updates us to POSIX.2 compliance, since
getpass() was removed from the POSIX.2 specification.
* A bug that allowed a write lock to be created in a directory despite
there being existing read locks when using LockDir in CVSROOT/config has
been fixed.
* A bug with short patches (`rdiff -s') which caused rdiff to sometimes report
differences that did not exist has been fixed.
* Some minor corrections were made to the diff code to keep diff & rdiff from
printing diff headers with empty change texts when two files have different
revision numbers but the same content.
* The global '-l' option, which suppressed history logging, has been removed
from both client and server.
Changes from 1.11.5 to 1.11.6:
* A warning message is now issued if an administrative file contains
more than one DEFAULT entry.
* An error running a verifymsg script (such as referencing an unset user
variable or the script not existing) now causes the verification to
fail.
* Errors in administrative files commands (like unset user variables)
are no longer reported unless the command is actually executed.
* When a file is initially checked out, its last access time is now set
to the current time rather than being set to the time the file was last
checked in like the modification time is.
* The Checkin.prog and Update.prog functionality has been removed. This
fuctionality previously allowed executables to be specified in the modules file
to be run at update and checkin time, but users could edit these files on a per
workspace basis, creating a security hole.
* contrib/rcs2log and src/cvsbug now use the BSD mktemp program to create
their temp files and directories on systems which provide it.
* Corrected the path in a failed write error message.
* Autoconf and Automake are no longer run automatically unless you run
configure with --enable-maintainer-mode. Accordingly, noautomake.sh is
no longer needed and has been removed.
* We've standardized on Automake version 1.7.5 and Autoconf version 2.57 to get
at a few new macros. Again, this should only really affect developers. See
the section of the INSTALL file about using the autotools if you are compiling
CVS yourself.
Changes from 1.11.4 to 1.11.5:
* Fixed a security hole in the CVS server by which users with read only access
could gain write access. This issue does not affect client builds. The
Common Vulnerabilities and Exposures project (cve.mitre.org) has assigned the
name CAN-2003-0015 to this issue. See
<http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2003-0015> for more
information.
* Fixed some bugs where revision numbers starting with 0 (like 0.3)
weren't correctly handled. (CVS doesn't normally use such revision
numbers, but users may be able to force it to do so and old RCS files
might.)
Changes from 1.11.3 to 1.11.4:
* Some minor changes to allow the code to compile on Windows platforms.
Changes from 1.11.2 to 1.11.3:
* The tag/rtag code has been fixed to once again lock just a single
directory at a time.
* There was a bug where certain error conditions could cause the server
to go into an infinite loop. There was also a bug that caused a
compressed connection from an older client to hang on shutdown. These
bugs have been fixed.
* Fixed a bug that caused the server to reject most watch commands.
* When waiting for another user's lock, the message timestamps are now
in UTC rather than the server's local time.
@ -24,6 +366,12 @@ sanity.sh to use Autotest and Autoshell. Again, this should only really affect
developers. See the section of the INSTALL file about using the autotools if
you are compiling CVS yourself.
* Fixed a bug in the log/rlog code when a revision range crosses a
branch point.
* Fixed a bug where filenames starting with - would be misinterpreted as
options when using client/server mode.
Changes from 1.11.1p1 to 1.11.2:
* There is a new feature, enabled by RereadLogAfterVerify in CVSROOT/config,
@ -62,6 +410,12 @@ Changes from 1.11.1 to 1.11.1p1:
Changes from 1.11 to 1.11.1:
* There was a locking bug in the tag/rtag code that could lose changes
made to a file while the tag operation was in progress. This has been
fixed, but all of the directories being tagged are now locked for the
entire duration of the tag operation rather than only one directory at a
time.
* The "cvs diff" command now accepts the -y/--side=by-side and -T/
--initial-tab options. (To use these options with a remote repository,
both the client and the server must support them.)

View file

@ -3,6 +3,9 @@
Copyright (c) 1993-1994 Brian Berliner
Copyright (c) 1992 Brian Berliner and Jeff Polk
Copyright (c) 1989-1992, Brian Berliner
Copyright (c) 1998-2004 Free Software Foundation,
Derek Price,
& Ximbiot <http://ximbiot.com>
All Rights Reserved
This program is free software; you can redistribute it and/or modify
@ -75,7 +78,6 @@ Installation:
Please read the INSTALL file for installation instructions. Brief summary:
$ ./noautomake.sh --noautoconf
$ ./configure
$ make
(run the regression tests if desired)
@ -112,87 +114,4 @@ then it will be possible to create one.
-------------------------------------------------------------------------------
Credits:
The conflict-resolution algorithms and much of the administrative file
definitions of CVS were based on the original package written by Dick Grune
at Vrije Universiteit in Amsterdam <dick@cs.vu.nl>, and posted to
comp.sources.unix in the volume 6 release sometime in 1986. This original
version was a collection of shell scripts. I am thankful that Dick made
his work available.
Brian Berliner from Prisma, Inc. (now at Sun Microsystems, Inc.)
<berliner@sun.com> converted the original CVS shell scripts into reasonably
fast C and added many, many features to support software release control
functions. See the manual page in the "man" directory. A copy of the
USENIX article presented at the Winter 1990 USENIX Conference, Washington
D.C., is included in the "doc" directory.
Jeff Polk from BSDI <polk@bsdi.com> converted the CVS 1.2
sources into much more readable and maintainable C code. He also added a
whole lot of functionality and modularity to the code in the process.
See the bottom of the NEWS file (from about 1992).
david d `zoo' zuhn <zoo@armadillo.com> contributed the working base code
for CVS 1.4 Alpha. His work carries on from work done by K. Richard Pixley
and others at Cygnus Support. The CVS 1.4 upgrade is due in large part to
Zoo's efforts.
David G. Grubbs <dgg@odi.com> contributed the CVS "history" and "release"
commands. As well as the ever-so-useful "-n" option of CVS which tells CVS
to show what it would do, without actually doing it. He also contributed
support for the .cvsignore file.
The Free Software Foundation (GNU) contributed most of the portability
framework that CVS now uses. This can be found in the "configure" script,
the Makefile's, and basically most of the "lib" directory.
K. Richard Pixley, Cygnus Support <rich@cygnus.com> contributed many bug
fixes/enhancement as well as completing early reviews of the CVS 1.3 manual
pages.
Roland Pesch, then of Cygnus Support <roland@wrs.com> contributed
brand new cvs(1) and cvs(5) manual pages. Thanks to him for saving us
from poor use of our language!
Paul Sander, HaL Computer Systems, Inc. <paul@hal.com> wrote and
contributed the code in lib/sighandle.c. I added support for POSIX, BSD,
and non-POSIX/non-BSD systems.
Jim Kingdon and others at Cygnus Support <info@cygnus.com> wrote the
remote repository access code.
There have been many, many contributions not listed here. Consult the
ChangeLog files in each directory for a more complete idea.
In addition to the above contributors, the following Beta testers
deserve special mention for their support. This is only a partial
list; if you have helped in this way and would like to be listed, let
bug-cvs know (as described in the Cederqvist manual).
Mark D. Baushke <mdb@cisco.com>
Per Cederqvist <ceder@signum.se>
J.T. Conklin <jtc@cygnus.com>
Vince DeMarco <vdemarco@fdcsrvr.cs.mci.com>
Paul Eggert <eggert@twinsun.com>
Lal George <george@research.att.com>
Dean E. Hardi <Dean.E.Hardi@ccmail.jpl.nasa.gov>
Mike Heath <mike@pencom.com>
Jim Kingdon <kingdon@cygnus.com>
Bernd Leibing <bernd.leibing@rz.uni-ulm.de>
Benedict Lofstedt <benedict@tusc.com.au>
Dave Love <d.love@dl.ac.uk>
Robert Lupton the Good <rhl@astro.princeton.edu>
Tom McAliney <tom@hilco.com>
Eberhard Mattes <mattes@azu.informatik.uni-stuttgart.de>
Jim Meyering <meyering@comco.com>
Thomas Mohr <mohr@lts.sel.alcatel.de>
Thomas Nilsson <thoni@softlab.se>
Raye Raskin <raye.raskin@lia.com>
Harlan Stenn <harlan@landmark.com>
Gunnar Tornblom <gunnar.tornblom@senet.abb.se>
Greg A. Woods <woods@planix.com>
Many contributors have added code to the "contrib" directory. See the
README file there for a list of what is available. There is also a
contributed GNU Emacs CVS-mode in tools/pcl-cvs.
Credits: See the AUTHORS file.

View file

@ -206,6 +206,10 @@ miss, but here are a few important ones. I'm leaving off long explanations
after the first few since it probably gives you the idea and the data is in
sanity.sh.
Note that the boolean variables contain shell commands which return true or
false when executed and are intended to be used like,
"if $remote; then ... ; else ... ; fi"
* $testdir = the directory this test is taking place in
(CVSROOT=$testdir/cvsroot or CVSROOT=:fork:$testdir/cvsroot)
@ -216,8 +220,11 @@ sanity.sh.
* $username = regexp to match a username
* $hostname = regexp to match a hostname
* $PROG = regexp to match progname in CVS error messages
* $remote = 'yes' or 'no', depending on whether the script is running with
a remote CVSROOT
* $remote = ':' (true) or 'false', depending on whether the script is
running with a remote CVSROOT
* $keep = ':' (true) or 'false'. When set, the first test run will
leave any files and directories it created in $testdir and
exit when complete.
And, of course, some characters like '.' in regexps need to be '\' escaped when
you mean them literally. Some characters may be interpreted by the shell,

View file

@ -6,9 +6,10 @@ The "TODO" file! -*-Indented-Text-*-
(If done, this should be configurable via commitinfo or some new
config file -kingdon, Jun 1995).
30. Add "rdiff" program option to the modules database (and "diff"
too?). (perhaps should think a little harder about what this is
trying to accomplish and what the best way is -kingdon, Jul 1997).
30. Add "rdiff" & "rtag" program options to the modules database. These
commands seem hard to use since these commands deal directly with the
RCS ,v files. (perhaps should think a little harder about what this is
trying to accomplish and what the best way is -kingdon, Jul 1997).
31. Think hard about ^C recovery.
One particular issue: RCS removes the ,foo.c, file on ^C and CVS
@ -26,10 +27,6 @@ trying to accomplish and what the best way is -kingdon, Jul 1997).
PRCS 1.0 was particularly bad the way it handled the "invisible
state", but 1.2 is significantly better.
45. Consider enhancing the "rdiff" and "tag" (rtag??) command support in
the module database -- they seem hard to use since these commands
deal directly with the RCS ,v files.
49. cvs xxx commands should be able to deal with files in other
directories. I want to do a cvs add foo/bar.c.
[[ most commands now use the generic recursion processor, but not all;
@ -56,8 +53,8 @@ trying to accomplish and what the best way is -kingdon, Jul 1997).
66. Length of the CVS temporary files must be limited to 14 characters for
System-V stupid support. As well as the length on the CVS.adm files.
72. Consider re-design of the module -o, -i, -t options to use the file
system more intuitively.
72. Consider re-design of the module -t options to use the file system more
intuitively.
73. Consider an option (in .cvsrc?) to automatically add files that are new
and specified to commit.
@ -261,10 +258,6 @@ trying to accomplish and what the best way is -kingdon, Jul 1997).
This behavior was not particularly popular and has been since
reverted.
Note also RELATIVE_REPOS in options.h; it needs to be set for
changing CVS/Root (not CVS/Repository) to be sufficient in the
case where the directory has changed.
This whole area is a rather bad pile of individual decisions which
accumulated over time, some of them probably bad decisions with
hindsight. But we didn't get into this mess overnight, and we're
@ -787,10 +780,6 @@ send differences instead of entire files. In the degenerate case
(e.g. "cvs diff" without arguments) the required network traffic is
reduced to zero, and the client need not even contact the server.
196. Using a CVSROOT with a trailing slash will confuse CVS. I think
we need to add a call to strip_trailing_slashes in root.c
(parse_cvsroot), but I haven't considered all of the ramifications.
197. Analyze the difference between CVS_UNLINK & unlink_file. As far as I
can tell, unlink_file aborts in noexec mode and CVS_UNLINK does not. I'm not
sure it would be possible to remove even the use of temp files in noexec mode,
@ -825,9 +814,6 @@ and other non-canonical paths confuse CVS. Most of the cases that do
work are handled on an ad-hoc basis. We need to come up with a coherent
strategy to address path canonicalization and apply it consistently.
206. Restore directory-at-a-time locking for tag operations instead of
locking the entire tree.
208. Merge enhancements to the diff package back into the original GNU source.
209. Go through this file and try to:
@ -862,24 +848,12 @@ glibc version.
216. Avoid command-line keyword expansion modes overriding binary mode
(or make binary mode completely separate from keyword expansion mode).
217. Fix assertion failures that occur when CVSROOT is a symlink to the
actual repository location.
218. Fix "checkout -d ." in client/server mode.
219. Fix "checkout -d multi/level/dir" in client/server mode.
220. Send correct Max-dotdot in client/server mode (broken by change to
support multiple repositories).
221. Handle spaces in file/directory names. (Most, if not all, of the
internal infrastructure already handles them correctly, but most of the
administrative file interfaces do not.)
222. Fix assertion failure (*rcsnode == NULL in commit.c, line 2056)
when adding a file from a case-insensitive client that matches an Attic
file with case differences.
223. Internationalization support. This probably means using some kind
of universal character set (ISO 10646?) internally and converting on
input and output, which opens the locale can of worms.
@ -899,13 +873,18 @@ local time string according to the localization settings before printing it.
225. Add support for --allow-root to server command.
226. Add support for upgrading read locks to write locks and use it to
avoid holding potentially long-term write locks (for example, in tag and
commit).
227. 'cvs release' should use the CVS/Root in the directory being released
when such is specified rather than $CVSROOT. In my work directory with no CVS
dir, a release of subdirectories causes the released projects to be tested
against my $CVSROOT environment variable, which often isn't correct but which
can complete without generating error messages if the project also exists in
the other CVSROOT. This happens a lot with my copies of the ccvs project.
228. Consider adding -d to commit ala ci.
229. Improve the locking code to use a random delay with exponential
backoff ala Ethernet and separate the notification interval from the
wait interval.
230. Support for options like compression as part of the CVSROOT might be
nice. This should be fairly easy to implement now using the method options.

View file

@ -85,7 +85,7 @@ AC_MSG_RESULT([$acx_gssapi_cv_gssapi])
# Set up GSSAPI includes for later use. We don't bother to check for
# $acx_gssapi_cv_gssapi=no here since that will be caught later.
#
if test x$acx_gssapi_cv_gssapi = yes; then
if test x$acx_gssapi_cv_gssapi = xyes; then
# no special includes necessary
GSSAPI_INCLUDES=""
else
@ -210,8 +210,14 @@ when using GSSAPI.])
#
AC_SEARCH_LIBS([__dn_expand], [resolv])
#
# crypt Needed by roken under FreeBSD 4.6.
#
AC_SEARCH_LIBS([crypt], [crypt])
#
# roken Heimdal K 0.3d -lresolv
# roken FreeBSD 4.6 -lcrypt
#
AC_SEARCH_LIBS([roken_gethostbyaddr], [roken])

264
contrib/cvs/aclocal.m4 vendored
View file

@ -1,6 +1,6 @@
# aclocal.m4 generated automatically by aclocal 1.6.3 -*- Autoconf -*-
# generated automatically by aclocal 1.7.9 -*- Autoconf -*-
# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@ -98,7 +98,7 @@ AC_MSG_RESULT([$acx_gssapi_cv_gssapi])
# Set up GSSAPI includes for later use. We don't bother to check for
# $acx_gssapi_cv_gssapi=no here since that will be caught later.
#
if test x$acx_gssapi_cv_gssapi = yes; then
if test x$acx_gssapi_cv_gssapi = xyes; then
# no special includes necessary
GSSAPI_INCLUDES=""
else
@ -223,8 +223,14 @@ when using GSSAPI.])
#
AC_SEARCH_LIBS([__dn_expand], [resolv])
#
# crypt Needed by roken under FreeBSD 4.6.
#
AC_SEARCH_LIBS([crypt], [crypt])
#
# roken Heimdal K 0.3d -lresolv
# roken FreeBSD 4.6 -lcrypt
#
AC_SEARCH_LIBS([roken_gethostbyaddr], [roken])
@ -280,7 +286,7 @@ fi
# This macro actually does too much some checks are only needed if
# your package does certain things. But this isn't really a big deal.
# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
@ -298,16 +304,9 @@ fi
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
# serial 8
# serial 10
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
# will think it sees a *use*, and therefore will trigger all it's
# C support machinery. Also note that it means that autoscan, seeing
# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
AC_PREREQ([2.52])
AC_PREREQ([2.54])
# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow
# the ones we care about.
@ -333,6 +332,16 @@ if test "`cd $srcdir && pwd`" != "`pwd`" &&
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
fi
# test whether we have cygpath
if test -z "$CYGPATH_W"; then
if (cygpath --version) >/dev/null 2>/dev/null; then
CYGPATH_W='cygpath -w'
else
CYGPATH_W=echo
fi
fi
AC_SUBST([CYGPATH_W])
# Define the identity of the package.
dnl Distinguish between old-style and new-style calls.
m4_ifval([$2],
@ -340,8 +349,8 @@ m4_ifval([$2],
AC_SUBST([PACKAGE], [$1])dnl
AC_SUBST([VERSION], [$2])],
[_AM_SET_OPTIONS([$1])dnl
AC_SUBST([PACKAGE], [AC_PACKAGE_TARNAME])dnl
AC_SUBST([VERSION], [AC_PACKAGE_VERSION])])dnl
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
_AM_IF_OPTION([no-define],,
[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
@ -362,19 +371,41 @@ AM_PROG_INSTALL_STRIP
# some platforms.
AC_REQUIRE([AC_PROG_AWK])dnl
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
_AM_IF_OPTION([no-dependencies],,
[AC_PROVIDE_IFELSE([AC_PROG_][CC],
[AC_PROVIDE_IFELSE([AC_PROG_CC],
[_AM_DEPENDENCIES(CC)],
[define([AC_PROG_][CC],
defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl
AC_PROVIDE_IFELSE([AC_PROG_][CXX],
[define([AC_PROG_CC],
defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
AC_PROVIDE_IFELSE([AC_PROG_CXX],
[_AM_DEPENDENCIES(CXX)],
[define([AC_PROG_][CXX],
defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl
[define([AC_PROG_CXX],
defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
])
])
# When config.status generates a header, we must update the stamp-h file.
# This file resides in the same directory as the config header
# that is generated. The stamp files are numbered to have different names.
# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
# loop where config.status creates the headers, so we can generate
# our stamp files there.
AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
[# Compute $1's index in $config_headers.
_am_stamp_count=1
for _am_header in $config_headers :; do
case $_am_header in
$1 | $1:* )
break ;;
* )
_am_stamp_count=`expr $_am_stamp_count + 1` ;;
esac
done
echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
# Copyright 2002 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
@ -395,14 +426,14 @@ AC_PROVIDE_IFELSE([AC_PROG_][CXX],
# ----------------------------
# Automake X.Y traces this macro to ensure aclocal.m4 has been
# generated from the m4 files accompanying Automake X.Y.
AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.6"])
AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"])
# AM_SET_CURRENT_AUTOMAKE_VERSION
# -------------------------------
# Call AM_AUTOMAKE_VERSION so it can be traced.
# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
[AM_AUTOMAKE_VERSION([1.6.3])])
[AM_AUTOMAKE_VERSION([1.7.9])])
# Helper functions for option handling. -*- Autoconf -*-
@ -688,9 +719,42 @@ fi
INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
# serial 4 -*- Autoconf -*-
# -*- Autoconf -*-
# Copyright (C) 2003 Free Software Foundation, Inc.
# Copyright 1999, 2000, 2001 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.
# serial 1
# Check whether the underlying file-system supports filenames
# with a leading dot. For instance MS-DOS doesn't.
AC_DEFUN([AM_SET_LEADING_DOT],
[rm -rf .tst 2>/dev/null
mkdir .tst 2>/dev/null
if test -d .tst; then
am__leading_dot=.
else
am__leading_dot=_
fi
rmdir .tst 2>/dev/null
AC_SUBST([am__leading_dot])])
# serial 5 -*- Autoconf -*-
# Copyright (C) 1999, 2000, 2001, 2002, 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
@ -751,18 +815,32 @@ AC_CACHE_CHECK([dependency style of $depcc],
# using a relative directory.
cp "$am_depcomp" conftest.dir
cd conftest.dir
# We will build objects and dependencies in a subdirectory because
# it helps to detect inapplicable dependency modes. For instance
# both Tru64's cc and ICC support -MD to output dependencies as a
# side effect of compilation, but ICC will put the dependencies in
# the current directory while Tru64 will put them in the object
# directory.
mkdir sub
am_cv_$1_dependencies_compiler_type=none
if test "$am_compiler_list" = ""; then
am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
fi
for depmode in $am_compiler_list; do
# Setup a source with many dependencies, because some compilers
# like to wrap large dependency lists on column 80 (with \), and
# we should not choose a depcomp mode which is confused by this.
#
# We need to recreate these files for each test, as the compiler may
# overwrite some of them when testing with obscure command lines.
# This happens at least with the AIX C compiler.
echo '#include "conftest.h"' > conftest.c
echo 'int i;' > conftest.h
echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf
: > sub/conftest.c
for i in 1 2 3 4 5 6; do
echo '#include "conftst'$i'.h"' >> sub/conftest.c
: > sub/conftst$i.h
done
echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
case $depmode in
nosideeffect)
@ -780,13 +858,20 @@ AC_CACHE_CHECK([dependency style of $depcc],
# mode. It turns out that the SunPro C++ compiler does not properly
# handle `-M -o', and we need to detect this.
if depmode=$depmode \
source=conftest.c object=conftest.o \
depfile=conftest.Po tmpdepfile=conftest.TPo \
$SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 &&
grep conftest.h conftest.Po > /dev/null 2>&1 &&
source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
$SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
>/dev/null 2>conftest.err &&
grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
${MAKE-make} -s -f confmf > /dev/null 2>&1; then
am_cv_$1_dependencies_compiler_type=$depmode
break
# icc doesn't choke on unknown options, it will just issue warnings
# (even with -Werror). So we grep stderr for any message
# that says an option was ignored.
if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else
am_cv_$1_dependencies_compiler_type=$depmode
break
fi
fi
done
@ -797,6 +882,9 @@ else
fi
])
AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
AM_CONDITIONAL([am__fastdep$1], [
test "x$enable_dependency_tracking" != xno \
&& test "$am_cv_$1_dependencies_compiler_type" = gcc3])
])
@ -805,16 +893,8 @@ AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
# Choose a directory name for dependency files.
# This macro is AC_REQUIREd in _AM_DEPENDENCIES
AC_DEFUN([AM_SET_DEPDIR],
[rm -f .deps 2>/dev/null
mkdir .deps 2>/dev/null
if test -d .deps; then
DEPDIR=.deps
else
# MS-DOS does not allow filenames that begin with a dot.
DEPDIR=_deps
fi
rmdir .deps 2>/dev/null
AC_SUBST([DEPDIR])
[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
])
@ -916,7 +996,9 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
[AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
])
# Copyright 2001 Free Software Foundation, Inc. -*- Autoconf -*-
# Check to see how 'make' treats includes. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 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
@ -941,8 +1023,9 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
AC_DEFUN([AM_MAKE_INCLUDE],
[am_make=${MAKE-make}
cat > confinc << 'END'
doit:
am__doit:
@echo done
.PHONY: am__doit
END
# If we don't find an include directive, just comment out the code.
AC_MSG_CHECKING([for style of include used by $am_make])
@ -956,7 +1039,7 @@ echo "include confinc" > confmf
# In particular we don't look at `^make:' because GNU make might
# be invoked under some other name (usually "gmake"), in which
# case it prints its new name instead of `make'.
if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then
if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
am__include=include
am__quote=
_am_result=GNU
@ -970,9 +1053,9 @@ if test "$am__include" = "#"; then
_am_result=BSD
fi
fi
AC_SUBST(am__include)
AC_SUBST(am__quote)
AC_MSG_RESULT($_am_result)
AC_SUBST([am__include])
AC_SUBST([am__quote])
AC_MSG_RESULT([$_am_result])
rm -f confinc confmf
])
@ -1016,7 +1099,7 @@ else
fi
AC_CONFIG_COMMANDS_PRE(
[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
AC_MSG_ERROR([conditional \"$1\" was never defined.
AC_MSG_ERROR([conditional "$1" was never defined.
Usually this means the macro was only invoked conditionally.])
fi])])
@ -1043,60 +1126,47 @@ AC_PREREQ([2.52])
# serial 6
# When config.status generates a header, we must update the stamp-h file.
# This file resides in the same directory as the config header
# that is generated. We must strip everything past the first ":",
# and everything past the last "/".
# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
# _AM_DIRNAME(PATH)
# -----------------
# Like AS_DIRNAME, only do it during macro expansion
AC_DEFUN([_AM_DIRNAME],
[m4_if(regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1,
m4_if(regexp([$1], [^//\([^/]\|$\)]), -1,
m4_if(regexp([$1], [^/.*]), -1,
[.],
patsubst([$1], [^\(/\).*], [\1])),
patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])),
patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl
])# _AM_DIRNAME
# Add --enable-maintainer-mode option to configure.
# From Jim Meyering
# Copyright 1996, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
# The stamp files are numbered to have different names.
# We could number them on a directory basis, but that's additional
# complications, let's have a unique counter.
m4_define([_AM_STAMP_Count], [0])
# 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.
# _AM_STAMP(HEADER)
# -----------------
# The name of the stamp file for HEADER.
AC_DEFUN([_AM_STAMP],
[m4_define([_AM_STAMP_Count], m4_incr(_AM_STAMP_Count))dnl
AS_ESCAPE(_AM_DIRNAME(patsubst([$1],
[:.*])))/stamp-h[]_AM_STAMP_Count])
# 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.
# serial 2
# _AM_CONFIG_HEADER(HEADER[:SOURCES], COMMANDS, INIT-COMMANDS)
# ------------------------------------------------------------
# We used to try to get a real timestamp in stamp-h. But the fear is that
# that will cause unnecessary cvs conflicts.
AC_DEFUN([_AM_CONFIG_HEADER],
[# Add the stamp file to the list of files AC keeps track of,
# along with our hook.
AC_CONFIG_HEADERS([$1],
[# update the timestamp
echo 'timestamp for $1' >"_AM_STAMP([$1])"
$2],
[$3])
])# _AM_CONFIG_HEADER
AC_DEFUN([AM_MAINTAINER_MODE],
[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
dnl maintainer-mode is disabled by default
AC_ARG_ENABLE(maintainer-mode,
[ --enable-maintainer-mode enable make rules and dependencies not useful
(and sometimes confusing) to the casual installer],
USE_MAINTAINER_MODE=$enableval,
USE_MAINTAINER_MODE=no)
AC_MSG_RESULT([$USE_MAINTAINER_MODE])
AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
MAINT=$MAINTAINER_MODE_TRUE
AC_SUBST(MAINT)dnl
]
)
# AM_CONFIG_HEADER(HEADER[:SOURCES]..., COMMANDS, INIT-COMMANDS)
# --------------------------------------------------------------
AC_DEFUN([AM_CONFIG_HEADER],
[AC_FOREACH([_AM_File], [$1], [_AM_CONFIG_HEADER(_AM_File, [$2], [$3])])
])# AM_CONFIG_HEADER
AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
# serial 2

View file

@ -41,10 +41,15 @@
/* Define to enable encryption support. */
#undef ENCRYPTION
/* Define if this executable will be running on case insensitive file systems.
In the client case, this means that it will request that the server pretend
to be case insensitive if it isn't already. */
#undef FILENAMES_CASE_INSENSITIVE
/* When committing or importing files, you must enter a log message. Normally,
you can do this either via the -m flag on the command line, the -F flag on
the command line, or an editor will be started for you. If you like to use
logging templates (the rcsinfo file within the /CVSROOT directory),
logging templates (the rcsinfo file within the $CVSROOT/CVSROOT directory),
you might want to force people to use the editor even if they specify a
message with -m or -F. Enabling FORCE_USE_EDITOR will cause the -m or -F
message to be appended to the temp file when the editor is started. */
@ -83,7 +88,7 @@
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
/* Define to 1 if your system has a working `fnmatch' function. */
/* Define to 1 if your system has a working POSIX `fnmatch' function. */
#undef HAVE_FNMATCH
/* Define to 1 if you have the <fnmatch.h> header file. */
@ -116,9 +121,6 @@
/* Define to 1 if you have the `getpagesize' function. */
#undef HAVE_GETPAGESIZE
/* Define to 1 if you have the `getpassphrase' function. */
#undef HAVE_GETPASSPHRASE
/* Define if you have the getspnam function. */
#undef HAVE_GETSPNAM
@ -155,6 +157,12 @@
/* Define to 1 if you have the `krb_get_err_text' function. */
#undef HAVE_KRB_GET_ERR_TEXT
/* Define to 1 if you have the `krb' library (-lkrb). */
#undef HAVE_LIBKRB
/* Define to 1 if you have the `krb4' library (-lkrb4). */
#undef HAVE_LIBKRB4
/* Define to 1 if you have the `nsl' library (-lnsl). */
#undef HAVE_LIBNSL
@ -470,6 +478,11 @@
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
/* We want to always use the GNULIB version of getpass which we have in lib,
so define getpass to something that won't conflict with any existing system
declarations. */
#undef getpass
/* Define to `int' if <sys/types.h> doesn't define. */
#undef gid_t

5576
contrib/cvs/configure vendored

File diff suppressed because it is too large Load diff

View file

@ -1,11 +1,12 @@
dnl configure.in for cvs
AC_INIT([Concurrent Versions System (CVS)],[1.11.5],[bug-cvs@gnu.org],[cvs])
AC_INIT([Concurrent Versions System (CVS)],[1.11.15],[bug-cvs@gnu.org],[cvs])
AC_CONFIG_SRCDIR(src/cvs.h)
AM_INIT_AUTOMAKE([gnu 1.5 dist-bzip2 no-define])
AC_PREREQ(2.53)
AM_INIT_AUTOMAKE([gnu 1.7.9 dist-bzip2 no-define])
AC_PREREQ(2.58)
AC_PREFIX_PROGRAM(cvs)
AM_CONFIG_HEADER(config.h)
AM_MAINTAINER_MODE
AC_PROG_CC
AM_PROG_CC_C_O
@ -71,8 +72,18 @@ AC_EXEEXT
AC_PATH_PROG(PERL, perl, no)
AC_PATH_PROG(CSH, csh, no)
AC_PATH_PROG(PR, pr, no)
# for contrib/rcs2log.sh & src/cvsbug.in.
AC_PATH_PROG(MKTEMP, mktemp, mktemp)
if test x"$MKTEMP" = xmktemp; then
MKTEMP_SH_FUNCTION=$srcdir/mktemp.sh
else
MKTEMP_SH_FUNCTION=/dev/null
fi
AC_SUBST_FILE(MKTEMP_SH_FUNCTION)
# for src/cvsbug.in
AC_PATH_PROG(SENDMAIL, sendmail, no, [$PATH:/usr/sbin:/usr/lib])
# For diff/util.c
AC_PATH_PROG(PR, pr, no)
if test x"$PR" != xno; then
AC_DEFINE_UNQUOTED([PR_PROGRAM], ["$PR"], [Path to the pr utility])
fi
@ -174,6 +185,26 @@ AC_REPLACE_FUNCS(\
valloc \
waitpid \
)
dnl
dnl Begin GNULIB stuff.
dnl
dnl We always want to use the GNULIB getpass, so define its name to something
dnl that won't conflict with system declarations.
AC_DEFINE([getpass], [cvs_getpass],
[We want to always use the GNULIB version of getpass which we have in lib,
so define getpass to something that won't conflict with any existing system
declarations.])
dnl
dnl End GNULIB stuff.
dnl
AC_CHECK_FUNCS(\
fchdir \
fchmod \
@ -183,7 +214,6 @@ AC_CHECK_FUNCS(\
getgroups \
getopt \
getpagesize \
getpassphrase \
gettimeofday \
initgroups \
login \
@ -349,18 +379,20 @@ if test -n "$krb_h"; then
LDFLAGS=$hold_ldflags
else
AC_CHECK_LIB(krb,printf,[krb_lib=yes krb_libdir=])
AC_CHECK_FUNC(krb_recvauth,[krb_lib=yes krb_libdir=])
fi
if test -n "$krb_lib"; then
AC_DEFINE([HAVE_KERBEROS], 1,
[Define if you have MIT Kerberos version 4 available.])
test -n "${krb_libdir}" && LIBS="${LIBS} -L${krb_libdir}"
LIBS="${LIBS} -lkrb"
# Put -L${krb_libdir} in LDFLAGS temporarily so that it appears before
# -ldes in the command line. Don't do it permanently so that we honor
# the user's setting for LDFLAGS
hold_ldflags=$LDFLAGS
test -n "${krb_libdir}" && LDFLAGS="$LDFLAGS -L${krb_libdir}"
AC_CHECK_LIB(des,printf,[LIBS="${LIBS} -ldes"])
AC_CHECK_LIB(krb,krb_recvauth)
AC_CHECK_LIB(krb4,krb_recvauth)
LDFLAGS=$hold_ldflags
if test -n "$krb_incdir"; then
includeopt="${includeopt} -I$krb_incdir"
@ -396,8 +428,21 @@ AC_ARG_WITH(
[--with-editor],
[The default text editor CVS should use for log messages
(default autoselects)]), ,
[with_editor="vi emacs pico edit"])
[with_editor=yes])
# If --with-editor was supplied with an argument, let it override $EDITOR from
# the user's environment. We need to unset EDITOR here because AC_CHECK_PROGS
# will let the value of EDITOR ride when it is set rather than searching. We
# ignore the --without-editor case since it will be caught below.
if test -n "$EDITOR" && test yes != $with_editor; then
AS_UNSET([EDITOR])
fi
# Set the default when --with-editor wasn't supplied or when it was supplied
# without an argument.
if test yes = $with_editor; then
with_editor="vim vi emacs nano pico edit"
fi
if echo $with_editor |grep ^/ >/dev/null; then
# If $with_editor is an absolute path, issue a warning if the executable
@ -409,31 +454,40 @@ if echo $with_editor |grep ^/ >/dev/null; then
if ! test -f $with_editor \
|| ! test -x $with_editor; then
# warn the user that they may encounter problems
AC_MSG_WARN([$with_editor is not a path to an executable file])
AC_MSG_WARN([\`$with_editor' is not a path to an executable file])
fi
elif test no != "${with_editor}"; then
# Search for an editor
AC_CHECK_PROGS([EDITOR], [$with_editor])
AC_CHECK_PROGS([EDITOR], [$with_editor], [no])
if test no = "${EDITOR}"; then
AC_MSG_ERROR([
Failed to find a text file editor. CVS cannot be compiled
without a default log message editor. Searched for
\`$with_editor'. Try \`configure --with-editor'.])
fi
else
AC_MSG_CHECKING([for an editor])
AC_MSG_RESULT([no])
AC_MSG_ERROR([
CVS cannot be compiled without a default log message editor.
Try \`configure --with-editor'.])
fi
if test -n "${EDITOR}"; then
dnl FIXME - Using --without-editor will probably break a compile at
dnl the moment, but maybe it is reasonable for someone to want to
dnl compile a CVS executable that refuses to run if no $EDITOR,
dnl $CVS_EDITOR, or -e option is specified? Making a preliminary
dnl design decision in this direction, subject to discussion.
AC_DEFINE_UNQUOTED(
[EDITOR_DFLT], ["$EDITOR"],
[The default editor to use, if one does not specify the "-e" option
to cvs, or does not have an EDITOR environment variable. If this
is not set to an absolute path to an executable, use the shell to
find where the editor actually is. This allows sites with
/usr/bin/vi or /usr/ucb/vi to work equally well (assuming that their
PATH is reasonable).])
fi
dnl FIXME - Using --without-editor will probably break a compile at
dnl the moment, but maybe it is reasonable for someone to want to
dnl compile a CVS executable that refuses to run if no $EDITOR,
dnl $CVS_EDITOR, or -e option is specified? Making a preliminary
dnl design decision in this direction, subject to discussion.
dnl
dnl Still don't know if the above would be useful, but we shouldn't
dnl be able to get here any longer without $EDITOR defined due to the
dnl error checking above.
AC_DEFINE_UNQUOTED(
[EDITOR_DFLT], ["$EDITOR"],
[The default editor to use, if one does not specify the "-e" option
to cvs, or does not have an EDITOR environment variable. If this
is not set to an absolute path to an executable, use the shell to
find where the editor actually is. This allows sites with
/usr/bin/vi or /usr/ucb/vi to work equally well (assuming that their
PATH is reasonable).])
dnl
dnl done finding an editor
@ -454,7 +508,7 @@ AC_ARG_WITH(
AC_MSG_CHECKING([for temporary directory])
if test -z "$with_tmpdir" || test yes = "$with_tmpdir"; then
for with_tmpdir in "$TMPDIR" "$TMP" "$TEMP" /tmp /var/tmp no; do
for with_tmpdir in /tmp /var/tmp no; do
if test -d "$with_tmpdir" && test -x "$with_tmpdir" \
&& test -w "$with_tmpdir" && test -r "$with_tmpdir"; then
break
@ -633,7 +687,7 @@ if test no != "$enable_password_authenticated_client"; then
method in the CVS client (default)])
else
AC_MSG_WARN(
[--enable-password-authenticated-server is meaningless with
[--enable-password-authenticated-client is meaningless with
the CVS client disabled (--disable-client)])
fi
fi
@ -740,6 +794,73 @@ if test no != "$enable_server"; then
fi # enable_server
dnl
dnl begin --enable-case-sensitivity
dnl
AC_ARG_ENABLE(
[case-sensitivity],
AC_HELP_STRING(
[--enable-case-sensitivity],
[Force CVS to expect a case sensitive file system. Enabling this on a case
insensitive system should have little effect on the server or client
operation, though client users may ocassionally be suprised that the CVS
server appears to be case sensitive. Disabling this for a case sensitive
server disables server support for case insensitive clients, which can
confuse all users of case insensitive clients contacting the server.
Disabling this for a case sensitive client will cause the client to ask
servers to behave case insensitively, which could cause confusion for
users, but also probably no real harm. (default autoselects based on the
case sensitivity of the file system containing the current working
directory)]),
[case "$enable_case_sensitivity" in
yes | no | auto) ;;
*)
AC_MSG_ERROR([Unrecognized argument to --enable-case-sensitivity: \`$enable_case_sensitivity'. Acceptable values are \`yes', \`no', and \`auto'.])
;;
esac],
[enable_case_sensitivity=auto])
acx_forced=' (forced)'
AC_MSG_CHECKING([for a case sensitive file system])
if test $enable_case_sensitivity = auto; then
dnl
dnl Check for a case insensitive filesystem, like Mac OS X and Windows have.
dnl
AC_CACHE_VAL([acx_cv_case_sensitive],
[ rm -f ac_TEST_filenames_CASE_sensitive
echo foo >ac_test_filenames_case_sensitive
if test -f ac_TEST_filenames_CASE_sensitive; then
acx_cv_case_sensitive=no
else
acx_cv_case_sensitive=yes
fi
rm ac_test_filenames_case_sensitive
])
enable_case_sensitivity=$acx_cv_case_sensitive
acx_forced=
fi
AC_MSG_RESULT([$enable_case_sensitivity$acx_forced])
if test $enable_case_sensitivity = no; then
AC_DEFINE([FILENAMES_CASE_INSENSITIVE], [1],
[Define if this executable will be running on case insensitive
file systems. In the client case, this means that it will request
that the server pretend to be case insensitive if it isn't
already.])
dnl Compile fncase.c (containing fncase() & fncmp()) to handle file name
dnl comparisons on case insensitive filesystems.
AC_LIBOBJ(fncase)
fi
dnl
dnl end --enable-case-sensitivity
dnl
dnl
dnl begin --enable-encryption
dnl
dnl
dnl Use --enable-encryption to turn on encryption support, but ignore this
dnl option unless either client or server is enabled.
@ -757,7 +878,7 @@ if test "$enable_encryption" = yes; then
[Define to enable encryption support.])
else
AC_MSG_WARN(
[--enable-encryption is meaningless with neither the CVS client
[--enable-encryption is meaningless when neither the CVS client
nor the CVS server is enabled (--disable-client and --disable-server).])
fi
fi
@ -849,6 +970,7 @@ dnl end --enable-*
dnl
dnl For the moment we will assume that all systems which have
dnl the unixyness to run configure are unixy enough to do the
dnl PreservePermissions stuff. I have this sinking feeling that
@ -856,11 +978,9 @@ dnl things won't be that simple, before long.
dnl AC_DEFINE(PRESERVE_PERMISSIONS_SUPPORT, 1,
dnl [Define if this system supports chown(), link(), and friends.])
dnl On cygwin32, we configure like a Unix system, but we use the
dnl Windows support code in lib/fncase.c to handle the case
dnl insensitive file system. We also need some support libraries. We
dnl do this at the end so that the new libraries are added at the end
dnl of LIBS.
dnl On cygwin32, we configure like a Unix system, but we need some support
dnl libraries. We do this at the end so that the new libraries are added at
dnl the end of LIBS.
dnl
dnl FIXME: We should be trying to meet the autoconf ideal of checking for
dnl the properties of the system rather than the name of the os here. In other
@ -870,7 +990,6 @@ AC_CACHE_CHECK(for cygwin32, ccvs_cv_sys_cygwin32,
[AC_TRY_COMPILE([], [return __CYGWIN32__;],
ccvs_cv_sys_cygwin32=yes, ccvs_cv_sys_cygwin32=no)])
if test $ccvs_cv_sys_cygwin32 = yes; then
AC_LIBOBJ(fncase)
LIBS="$LIBS -ladvapi32"
dnl On Windows you can only change file times if you can write to
@ -898,6 +1017,7 @@ AC_CONFIG_FILES(contrib/log, [chmod +x contrib/log])
AC_CONFIG_FILES(contrib/log_accum, [chmod +x contrib/log_accum])
AC_CONFIG_FILES(contrib/mfpipe, [chmod +x contrib/mfpipe])
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(src/cvsbug, [chmod +x src/cvsbug])
@ -921,3 +1041,19 @@ AC_CONFIG_FILES([Makefile \
dnl and we're done
AC_OUTPUT
# Report the state of this version of CVS if this is from dev.
m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[0-9]*\.[0-9]*\.[0-9]*\.[0-9]],
[ cat <<EOF
You are about to use an unreleased version of CVS. Be sure to
read the relevant mailing lists, most importantly <info-cvs@gnu.org>.
Below you will find information on the status of this version of CVS.
EOF
sed -n '/^\* Status/,$p' $srcdir/BUGS
])

View file

@ -1,3 +1,73 @@
2004-01-30 Derek Price <derek@ximbiot.com>
Close issue #155.
* log_accum.in: Remove unused variables.
(Patch from (Ville Skyttä <scop@cvshome.org>.)
2003-10-14 Derek Price <derek@ximbiot.com>
Port to pedantic POSIX 1003.1-2001 hosts, such as Debian GNU/Linux
testing with _POSIX2_VERSION=200112 in the environment.
* cvs2vendor.sh: Work with POSIX sort as well as with
traditional sort.
* rcs2sccs.sh, sccs2rcs.in: Likewise.
(Patch from Paul Eggert <eggert@twinsun.com>.)
2003-09-26 Mark D. Baushke <mdb@cvshome.org>
* sccs2rcs.in: Use @AWK@ to avoid ancient Solaris awk (no support
for the "?" operator). Add support for handling binary SCCS files.
(Suggestion from Allan Schrum <agschrum@mindspring.com>.)
2003-08-06 Derek Price <derek@ximbiot.com>
* commit_prep.in, log_accum.in: Port copious changes from Karl Fogel
and CollabNet. These changes add features, generalize, and organize.
2003-07-07 Larry Jones <lawrence.jones@eds.com>
* rcs2log.1: New file from Paul Eggert <eggert@twinsun.com>
via Eric Seidel <eseidel@apple.com>.
2003-06-20 Derek Price <derek@ximbiot.com>
* Don't call CVS with the -l option since CVS no longer accepts it.
(Suggestion from Matt Doar <matt@trpz.com>.)
2003-05-21 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerate with Automake version 1.7.5.
2003-04-10 Larry Jones <lawrence.jones@eds.com>
* Makefile.in: Regenerated.
2003-03-24 Derek Price <derek@ximbiot.com>
* Makefile.am: Update copyright notice.
* Makefile.in: Regenerated.
2003-02-25 Derek Price <derek@ximbiot.com>
* rcs2log.sh: Import RedHat 8.0's use of mktemp from the CVS 1.11.2
RPM. Use new MKTEMP variable from configure.
* Makefile.in: Regenerated.
2003-02-24 Larry Jones <lawrence.jones@eds.com>
and Donald Sharp <sharpd@cisco.com>
* check_cvs.in: Filenames with funky characters need to be quoted
correctly. Also needed to modify regex due to locked revisions of
files cause output to be different.
* check_cvs.in: Fixed multiple symlinks in your cvsroot,
improved CVSROOT/CVSROOT handling (Patch from Shlomo Reinstein
<shlomo.reinstein@intel.com). Fixed retrieving revisions of ,v
files. Added passwd, readers, and writers to list of files to
ignore and sorted list to match the one in src/mkmodules.c.
2002-12-16 Derek Price <derek@ximbiot.com>
* cvs_acls.in: Fix split loop error with Perl 5.8.0.

View file

@ -1,7 +1,9 @@
## Process this file with automake to produce Makefile.in
# Makefile for GNU CVS contributed sources.
# Do not use this makefile directly, but only from `../Makefile'.
# Copyright (C) 1986, 1988-1990 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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

View file

@ -1,7 +1,7 @@
# Makefile.in generated by automake 1.6.3 from Makefile.am.
# Makefile.in generated by automake 1.7.9 from Makefile.am.
# @configure_input@
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@ -16,7 +16,9 @@
# Makefile for GNU CVS contributed sources.
# Do not use this makefile directly, but only from `../Makefile'.
# Copyright (C) 1986, 1988-1990 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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
@ -27,79 +29,117 @@
# 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.
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
transform = @program_transform_name@
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
EXEEXT = @EXEEXT@
OBJEXT = @OBJEXT@
PATH_SEPARATOR = @PATH_SEPARATOR@
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSH = @CSH@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EDITOR = @EDITOR@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
KRB4 = @KRB4@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MAKE_TARGETS_IN_VPATH_FALSE = @MAKE_TARGETS_IN_VPATH_FALSE@
MAKE_TARGETS_IN_VPATH_TRUE = @MAKE_TARGETS_IN_VPATH_TRUE@
MKTEMP = @MKTEMP@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PR = @PR@
PS2PDF = @PS2PDF@
RANLIB = @RANLIB@
ROFF = @ROFF@
SENDMAIL = @SENDMAIL@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TEXI2DVI = @TEXI2DVI@
VERSION = @VERSION@
YACC = @YACC@
ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
ac_prefix_program = @ac_prefix_program@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
bindir = @bindir@
build_alias = @build_alias@
datadir = @datadir@
exec_prefix = @exec_prefix@
host_alias = @host_alias@
includedir = @includedir@
includeopt = @includeopt@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
contribdir = $(pkgdatadir)/contrib
@ -155,26 +195,28 @@ CLEANFILES = $(bin_SCRIPTS) $(contrib_SCRIPTS)
SUFFIXES = .sh
subdir = contrib
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES = check_cvs clmerge cln_hist commit_prep cvs_acls log \
log_accum mfpipe pvcs2rcs rcslock sccs2rcs
log_accum mfpipe pvcs2rcs rcs2log rcslock sccs2rcs
SCRIPTS = $(contrib_SCRIPTS)
DIST_SOURCES =
DATA = $(contrib_DATA)
DIST_COMMON = README ChangeLog Makefile.am Makefile.in check_cvs.in \
clmerge.in cln_hist.in commit_prep.in cvs_acls.in log.in \
log_accum.in mfpipe.in pvcs2rcs.in rcslock.in sccs2rcs.in
DIST_COMMON = README $(srcdir)/Makefile.in ChangeLog Makefile.am \
check_cvs.in clmerge.in cln_hist.in commit_prep.in cvs_acls.in \
log.in log_accum.in mfpipe.in pvcs2rcs.in rcs2log.sh rcslock.in \
sccs2rcs.in
all: all-am
.SUFFIXES:
.SUFFIXES: .sh
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu contrib/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
check_cvs: $(top_builddir)/config.status check_cvs.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
@ -194,6 +236,8 @@ mfpipe: $(top_builddir)/config.status mfpipe.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
pvcs2rcs: $(top_builddir)/config.status pvcs2rcs.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
rcs2log: $(top_builddir)/config.status rcs2log.sh
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
rcslock: $(top_builddir)/config.status rcslock.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
sccs2rcs: $(top_builddir)/config.status sccs2rcs.in
@ -240,13 +284,22 @@ uninstall-contribDATA:
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
top_distdir = ..
distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
distdir: $(DISTFILES)
@list='$(DISTFILES)'; for file in $$list; do \
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
@ -272,7 +325,6 @@ all-am: Makefile $(SCRIPTS) $(DATA)
installdirs:
$(mkinstalldirs) $(DESTDIR)$(contribdir) $(DESTDIR)$(contribdir)
install: install-am
install-exec: install-exec-am
install-data: install-data-am
@ -284,7 +336,7 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
INSTALL_STRIP_FLAG=-s \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
@ -293,7 +345,7 @@ clean-generic:
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES)
-rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@ -303,7 +355,7 @@ clean: clean-am
clean-am: clean-generic mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic
dvi: dvi-am
@ -326,13 +378,21 @@ install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-contribDATA uninstall-contribSCRIPTS \
uninstall-info-am uninstall-local
@ -343,7 +403,7 @@ uninstall-am: uninstall-contribDATA uninstall-contribSCRIPTS \
install-exec-am install-info install-info-am install-man \
install-strip installcheck installcheck-am installdirs \
maintainer-clean maintainer-clean-generic mostlyclean \
mostlyclean-generic uninstall uninstall-am \
mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
uninstall-contribDATA uninstall-contribSCRIPTS \
uninstall-info-am uninstall-local

View file

@ -67,6 +67,7 @@ my $verbose = 0;
my $total_revisions;
my $total_interesting_revisions;
my $total_files;
my @ignore_files;
######################################################################
# SUBROUTINES #
@ -121,12 +122,19 @@ if( exists( $ENV{ CVSDEBUGEDIT } ) )
}
$directory_to_look_at = $ENV{ CVSROOT };
if( -l $directory_to_look_at )
my $sym_count = 0;
while( -l $directory_to_look_at )
{
$directory_to_look_at = readlink( $directory_to_look_at );
$sym_count += 1;
if( $sym_count > 5 )
{
die( "Encountered too many symlinks for $ENV{ CVSROOT }\n" );
}
}
print( "Processing: $directory_to_look_at\n" ) if( $verbose );
@ignore_files = &get_ignore_files_from_cvsroot( $directory_to_look_at );
find( \&process_file, $directory_to_look_at );
my $num_files = @list_of_broken_files;
@ -184,34 +192,6 @@ sub process_file
elsif( ! -d $File::Find::name )
{
my $save = 0;
my @ignore_files = ( 'CVS\/fileattr$',
'^CVSROOT\/modules',
'^CVSROOT\/.#modules',
'^CVSROOT\/loginfo',
'^CVSROOT\/.#loginfo',
'^CVSROOT\/rcsinfo',
'^CVSROOT\/.#rcsinfo',
'^CVSROOT\/editinfo',
'^CVSROOT\/.#editinfo',
'^CVSROOT\/commitinfo',
'^CVSROOT\/.#commitinfo',
'^CVSROOT\/taginfo',
'^CVSROOT\/.#taginfo',
'^CVSROOT\/notify',
'^CVSROOT\/.#notify',
'^CVSROOT\/checkoutlist',
'^CVSROOT\/.#checkoutlist',
'^CVSROOT\/cvswrappers',
'^CVSROOT\/.#cvswrappers',
'^CVSROOT\/val-tags',
'^CVSROOT\/.#val-tags',
'^CVSROOT\/verifymsg',
'^CVSROOT\/.#verifymsg',
'^CVSROOT\/config',
'^CVSROOT\/.#config',
'^CVSROOT\/history',
'^CVSROOT\/cvsignore',
'^CVSROOT\/.#cvsignore' );
foreach my $ignore ( @ignore_files )
{
@ -322,18 +302,29 @@ sub look_at_cvs_file
sub get_history
{
my( $file ) = @_;
$file =~ s/(["\$`\\])/\\$1/g;
my @revisions;
my $revision;
my $ignore = 1;
my $save_ = $_;
open( FILE, "rlog -N '$file' 2>&1 |" ) or die( "unable to run rlog, help" );
open( FILE, "rlog -N \"$file\" 2>&1 |" ) or die( "unable to run rlog, help" );
while( <FILE> )
{
if( ( $revision ) = /^revision (.*)$/ )
{
push( @revisions, $revision );
#rlog outputs a "----" line before the actual revision
#without this we'll pick up peoples comments if they
#happen to start with revision
if( /^----------------------------$/ )
{
$ignore = 0;
next;
}
if( ( !$ignore ) && ( ( $revision ) = m/^revision (\S+)/ ) )
{
push( @revisions, $revision );
$ignore = 1;
}
}
@ -369,9 +360,6 @@ sub get_history
#
# COMMENTS :
# cvs command line options are as followed:
# -l - Do not log this command in the history file. I am
# doing this because we will literaly be looking at
# thousands of files with *lots* of revisions.
# -n - Do not run any checkout program as specified by the -o
# option in the modules file
# -p - Put all output to standard out.
@ -383,11 +371,12 @@ sub get_history
sub check_revision
{
my( $file, $revision ) = @_;
$file =~ s/(["\$`\\])/\\$1/g;
my $cwd = getcwd();
chdir( "/tmp" );
my $ret_code = 0xffff & system( "cvs -l co -n -p -r $revision '$file' > /dev/null 2>&1" );
my $ret_code = 0xffff & system( "cvs co -n -p -r $revision \"$file\" > /dev/null 2>&1" );
chdir( $cwd );
return( 1 ) if ( $ret_code == 0 );
@ -753,3 +742,81 @@ sub branch_split
return( $branch, pop( @split_rev ) );
}
######################################################################
#
# NAME :
# get_ignore_files_from_cvsroot
#
# PURPOSE :
# Retrieve the list of files from the CVSROOT/ directory
# that should be ignored.
# These are the regular files (e.g., commitinfo, loginfo)
# and those specified in the checkoutlist file.
#
# PARAMETERS :
# The CVSROOT
#
# GLOBALS :
# NONE
#
# RETURNS :
# @ignore - the list of files to ignore
#
# COMMENTS :
# NONE
#
######################################################################
sub get_ignore_files_from_cvsroot {
my( $cvsroot ) = @_;
my @ignore = ( 'CVS\/fileattr$',
'^CVSROOT\/loginfo',
'^CVSROOT\/.#loginfo',
'^CVSROOT\/rcsinfo',
'^CVSROOT\/.#rcsinfo',
'^CVSROOT\/editinfo',
'^CVSROOT\/.#editinfo',
'^CVSROOT\/verifymsg',
'^CVSROOT\/.#verifymsg',
'^CVSROOT\/commitinfo',
'^CVSROOT\/.#commitinfo',
'^CVSROOT\/taginfo',
'^CVSROOT\/.#taginfo',
'^CVSROOT\/cvsignore',
'^CVSROOT\/.#cvsignore',
'^CVSROOT\/checkoutlist',
'^CVSROOT\/.#checkoutlist',
'^CVSROOT\/cvswrappers',
'^CVSROOT\/.#cvswrappers',
'^CVSROOT\/notify',
'^CVSROOT\/.#notify',
'^CVSROOT\/modules',
'^CVSROOT\/.#modules',
'^CVSROOT\/readers',
'^CVSROOT\/.#readers',
'^CVSROOT\/writers',
'^CVSROOT\/.#writers',
'^CVSROOT\/passwd',
'^CVSROOT\/config',
'^CVSROOT\/.#config',
'^CVSROOT\/val-tags',
'^CVSROOT\/.#val-tags',
'^CVSROOT\/history' );
my $checkoutlist_file = "$cvsroot\/CVSROOT\/checkoutlist";
open( CHECKOUTLIST, "<$cvsroot\/CVSROOT\/checkoutlist" )
or die( "Unable to read checkoutlist file: $!\n" );
my @list = <CHECKOUTLIST>;
chomp( @list );
close( CHECKOUTLIST )
or die( "Unable to close checkoutlist file: $!\n" );
foreach my $line( @list )
{
next if( $line =~ /^#/ || $line =~ /^$/ );
if( $line =~ /^\s*(\S*)\s*/ ) { $line = $1 };
push( @ignore, "^CVSROOT\/$line", "^CVSROOT\/\.#$line" );
}
return @ignore;
}

View file

@ -1,215 +1,56 @@
#! @PERL@
# -*-Perl-*-
#
#
# Perl filter to handle pre-commit checking of files. This program
# records the last directory where commits will be taking place for
# use by the log_accum.pl script. For new files, it forces the
# existence of a RCS "Id" keyword in the first ten lines of the file.
# For existing files, it checks version number in the "Id" line to
# prevent losing changes because an old version of a file was copied
# into the direcory.
#
# Possible future enhancements:
#
# Check for cruft left by unresolved conflicts. Search for
# "^<<<<<<<$", "^-------$", and "^>>>>>>>$".
#
# Look for a copyright and automagically update it to the
# current year. [[ bad idea! -- woods ]]
# use by the log_accum.pl script.
#
# IMPORTANT: this script interacts with log_accum, they have to agree
# on the tmpfile name to use. See $LAST_FILE below.
#
# Contributed by David Hampton <hampton@cisco.com>
# Stripped to minimum by Roy Fielding
#
# Hacked on lots by Greg A. Woods <woods@web.net>
############################################################
$TMPDIR = $ENV{'TMPDIR'} || '/tmp';
$FILE_PREFIX = '#cvs.';
#
# Configurable options
#
# If see a "-u $USER" argument, then destructively remove it from the
# argument list, so $ARGV[0] will be the repository dir again, as it
# used to be before we added the -u flag.
if ($ARGV[0] eq '-u') {
shift @ARGV;
$CVS_USERNAME = shift (@ARGV);
}
# Constants (remember to protect strings from RCS keyword substitution)
#
$LAST_FILE = "/tmp/#cvs.lastdir"; # must match name in log_accum.pl
$ENTRIES = "CVS/Entries";
# Patterns to find $Log keywords in files
#
$LogString1 = "\\\$\\Log: .* \\\$";
$LogString2 = "\\\$\\Log\\\$";
$NoLog = "%s - contains an RCS \$Log keyword. It must not!\n";
# pattern to match an RCS Id keyword line with an existing ID
#
$IDstring = "\"@\\(#\\)[^:]*:.*\\\$\Id: .*\\\$\"";
$NoId = "
%s - Does not contain a properly formatted line with the keyword \"Id:\".
I.e. no lines match \"" . $IDstring . "\".
Please see the template files for an example.\n";
# pattern to match an RCS Id keyword line for a new file (i.e. un-expanded)
#
$NewId = "\"@(#)[^:]*:.*\\$\Id\\$\"";
$NoName = "
%s - The ID line should contain only \"@(#)module/path:\$Name\$:\$\Id\$\"
for a newly created file.\n";
$BadName = "
%s - The file name '%s' in the ID line does not match
the actual filename.\n";
$BadVersion = "
%s - How dare you!!! You replaced your copy of the file '%s',
which was based upon version %s, with an %s version based
upon %s. Please move your '%s' out of the way, perform an
update to get the current version, and them merge your changes
into that file, then try the commit again.\n";
#
# Subroutines
#
# This needs to match the corresponding var in log_accum.pl, including
# the appending of the pgrp and username suffixes (see uses of this
# var farther down).
$LAST_FILE = "$TMPDIR/${FILE_PREFIX}lastdir";
sub write_line {
local($filename, $line) = @_;
open(FILE, ">$filename") || die("Cannot open $filename, stopped");
my ($filename, $line) = @_;
# A check of some kind is needed here, but the rules aren't apparent
# at the moment:
# foreach($filename, $line){
# $_ =~ m#^([-\@\w.\#]+)$#;
# $_ = $1;
# }
open(FILE, ">$filename") || die("Cannot open $filename: $!\n");
print(FILE $line, "\n");
close(FILE);
}
sub check_version {
local($i, $id, $rname, $version);
local($filename, $cvsversion) = @_;
open(FILE, "<$filename") || return(0);
@all_lines = ();
$idpos = -1;
$newidpos = -1;
for ($i = 0; <FILE>; $i++) {
chop;
push(@all_lines, $_);
if ($_ =~ /$IDstring/) {
$idpos = $i;
}
if ($_ =~ /$NewId/) {
$newidpos = $i;
}
}
if (grep(/$LogString1/, @all_lines) || grep(/$LogString2/, @all_lines)) {
print STDERR sprintf($NoLog, $filename);
return(1);
}
if ($debug != 0) {
print STDERR sprintf("file = %s, version = %d.\n", $filename, $cvsversion{$filename});
}
if ($cvsversion{$filename} == 0) {
if ($newidpos != -1 && $all_lines[$newidpos] !~ /$NewId/) {
print STDERR sprintf($NoName, $filename);
return(1);
}
return(0);
}
if ($idpos == -1) {
print STDERR sprintf($NoId, $filename);
return(1);
}
$line = $all_lines[$idpos];
$pos = index($line, "Id: ");
if ($debug != 0) {
print STDERR sprintf("%d in '%s'.\n", $pos, $line);
}
($id, $rname, $version) = split(' ', substr($line, $pos));
if ($rname ne "$filename,v") {
print STDERR sprintf($BadName, $filename, substr($rname, 0, length($rname)-2));
return(1);
}
if ($cvsversion{$filename} < $version) {
print STDERR sprintf($BadVersion, $filename, $filename, $cvsversion{$filename},
"newer", $version, $filename);
return(1);
}
if ($cvsversion{$filename} > $version) {
print STDERR sprintf($BadVersion, $filename, $filename, $cvsversion{$filename},
"older", $version, $filename);
return(1);
}
return(0);
}
#
# Main Body
#
$id = getpgrp(); # You *must* use a shell that does setpgrp()!
# Check each file (except dot files) for an RCS "Id" keyword.
#
$check_id = 0;
# Record the directory for later use by the log_accumulate stript.
#
$record_directory = 0;
# parse command line arguments
#
while (@ARGV) {
$arg = shift @ARGV;
if ($arg eq '-d') {
$debug = 1;
print STDERR "Debug turned on...\n";
} elsif ($arg eq '-c') {
$check_id = 1;
} elsif ($arg eq '-r') {
$record_directory = 1;
} else {
push(@files, $arg);
}
}
$directory = shift @files;
if ($debug != 0) {
print STDERR "dir - ", $directory, "\n";
print STDERR "files - ", join(":", @files), "\n";
print STDERR "id - ", $id, "\n";
}
# Suck in the CVS/Entries file
#
open(ENTRIES, $ENTRIES) || die("Cannot open $ENTRIES.\n");
while (<ENTRIES>) {
local($filename, $version) = split('/', substr($_, 1));
$cvsversion{$filename} = $version;
}
# Now check each file name passed in, except for dot files. Dot files
# are considered to be administrative files by this script.
#
if ($check_id != 0) {
$failed = 0;
foreach $arg (@files) {
if (index($arg, ".") == 0) {
next;
}
$failed += &check_version($arg);
}
if ($failed) {
print STDERR "\n";
exit(1);
}
}
# Record this directory as the last one checked. This will be used
# by the log_accumulate script to determine when it is processing
# the final directory of a multi-directory commit.
#
if ($record_directory != 0) {
&write_line("$LAST_FILE.$id", $directory);
}
$id = getpgrp();
&write_line("$LAST_FILE.$id.$CVS_USERNAME", $ARGV[0]);
exit(0);

View file

@ -42,6 +42,11 @@ rm -f $revfile
commentfile=/tmp/cvs2vendor_$$_comment
rm -f $commentfile
if sort -k 1,1 /dev/null 2>/dev/null
then sort_each_field='-k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9'
else sort_each_field='+0 +1 +2 +3 +4 +5 +6 +7 +8'
fi
srcdirs=`cd $tsrcdir && find . -type d -print | sed 's~^\.[/]*~~'`
# the "" is a trick to get $tsrcdir itself without resorting to '.'
@ -68,7 +73,7 @@ for ldir in "" $srcdirs; do
fi
# work on each rev of that file in ascending order
rlog $file | grep "^revision [0-9][0-9]*\." | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u +0 +1 +2 +3 +4 +5 +6 +7 +8 | sed -e 's/ /./g' > $revfile
rlog $file | grep "^revision [0-9][0-9]*\." | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u $sort_each_field | sed -e 's/ /./g' > $revfile
for rev in `cat $revfile`; do

File diff suppressed because it is too large Load diff

View file

@ -31,7 +31,7 @@ Report bugs to <bug-gnu-emacs@gnu.org>.'
Id='$Id: rcs2log,v 1.48 2001/09/05 23:07:46 eggert Exp $'
# Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2001
# Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2001, 2003
# Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
@ -49,13 +49,16 @@ Id='$Id: rcs2log,v 1.48 2001/09/05 23:07:46 eggert Exp $'
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
Copyright='Copyright 2001 Free Software Foundation, Inc.
Copyright='Copyright 1992-2003 Free Software Foundation, Inc.
This program comes with NO WARRANTY, to the extent permitted by law.
You may redistribute copies of this program
under the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING.
Author: Paul Eggert <eggert@twinsun.com>'
# functions
@MKTEMP_SH_FUNCTION@
# Use the traditional C locale.
LANG=C
LANGUAGE=C
@ -79,8 +82,10 @@ nl='
# Parse options.
# defaults
: ${MKTEMP="@MKTEMP@"}
: ${AWK=awk}
: ${TMPDIR=/tmp}
changelog=ChangeLog # change log file name
datearg= # rlog date option
hostname= # name of local host (if empty, will deduce it later)
@ -182,11 +187,11 @@ month_data='
m[9]="Oct"; m[10]="Nov"; m[11]="Dec"
'
logdir=$TMPDIR/rcs2log$$
logdir=`$MKTEMP -d $TMPDIR/rcs2log.XXXXXX`
test -n "$logdir" || exit
llogout=$logdir/l
trap exit 1 2 13 15
trap "rm -fr $logdir 2>/dev/null" 0
(umask 077 && exec mkdir $logdir) || exit
# If no rlog-format log file is given, generate one into $rlogfile.
case $rlogfile in

View file

@ -42,13 +42,17 @@ cp $tmpfile $sedfile
############################################################
# Loop over every RCS file in RCS dir
#
if sort -k 1,1 /dev/null 2>/dev/null
then sort_each_field='-k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9'
else sort_each_field='+0 +1 +2 +3 +4 +5 +6 +7 +8'
fi
for vfile in *,v; do
# get rid of the ",v" at the end of the name
file=`echo $vfile | sed -e 's/,v$//'`
# work on each rev of that file in ascending order
firsttime=1
rlog $file | grep "^revision [0-9][0-9]*\." | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u +0 +1 +2 +3 +4 +5 +6 +7 +8 | sed -e 's/ /./g' > $revfile
rlog $file | grep "^revision [0-9][0-9]*\." | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u $sort_each_field | sed -e 's/ /./g' > $revfile
for rev in `cat $revfile`; do
if [ $? != 0 ]; then
echo ERROR - revision

View file

@ -42,6 +42,12 @@
# ...!harvard!cg-atla!viewlog!kenstir
#
# Various hacks made by Brian Berliner before inclusion in CVS contrib area.
#
# Modified to detect SCCS binary files. If binary, skip the keyword
# substitution and flag the RCS file as binary (using rcs -i -kb).
# -Allan G. Schrum schrum@ofsoptics.com agschrum@mindspring.com
# Fri Sep 26 10:40:40 EDT 2003
#
#we'll assume the user set up the path correctly
@ -163,6 +169,13 @@ end
onintr ERROR
sort -k 1,1 /dev/null >& /dev/null
if ($status == 0) then
set sort_each_field = '-k 1 -k 2 -k 3 -k 4 -k 5 -k 6 -k 7 -k 8 -k 9'
else
set sort_each_field = '+0 +1 +2 +3 +4 +5 +6 +7 +8'
endif
############################################################
# Loop over every s-file in SCCS dir
#
@ -172,7 +185,18 @@ foreach sfile (SCCS/s.*)
# work on each rev of that file in ascending order
set firsttime = 1
sccs prs $file | grep "^D " | awk '{print $2}' | sed -e 's/\./ /g' | sort -n -u +0 +1 +2 +3 +4 +5 +6 +7 +8 | sed -e 's/ /./g' > $revfile
# Only scan the file up to the "I" keyword, then see if
# the "f" keyword is set to binary. The SCCS file has
# <ctrl>-aI denoting the start of the file (or end of header).
set binary = (`sed -e '/^.I/,$d' < $sfile | grep '^.f e 1$'`)
#if ($#binary) then
# echo This is a binary file
#else
# echo This is not a binary file
#endif
sccs prs $file | grep "^D " | @AWK@ '{print $2}' | sed -e 's/\./ /g' | sort -n -u $sort_each_field | sed -e 's/ /./g' > $revfile
foreach rev (`cat $revfile`)
if ($status != 0) goto ERROR
@ -181,23 +205,34 @@ foreach sfile (SCCS/s.*)
# Is the substr stuff and the +0 in the following awk script really
# necessary? It seems to me that if we didn't find the date format
# we expected in the output we have other problems.
set date = `sccs prs -r$rev $file | awk '/^D / {print (substr($3,0,2)+0<70?20:19) $3, $4; exit}'`
set author = `sccs prs -r$rev $file | awk '/^D / {print $5; exit}'`
# Note: Solaris awk does not like the following line. Use gawk
# mawk, or nawk instead.
set date = `sccs prs -r$rev $file | @AWK@ '/^D / {print (substr($3,0,2)+0<70?20:19) $3, $4; exit}'`
set author = `sccs prs -r$rev $file | @AWK@ '/^D / {print $5; exit}'`
echo ""
echo "==> file $file, rev=$rev, date=$date, author=$author"
sccs edit -r$rev $file >>& $logfile
if ($status != 0) goto ERROR
echo checked out of SCCS
# add RCS keywords in place of SCCS keywords
sed -f $sedfile $file > $tmpfile
if ($status != 0) goto ERROR
echo performed keyword substitutions
cp $tmpfile $file
# add RCS keywords in place of SCCS keywords (only if not binary)
if ($#binary == 0) then
sed -f $sedfile $file > $tmpfile
if ($status != 0) goto ERROR
echo performed keyword substitutions
cp $tmpfile $file
endif
# check file into RCS
if ($firsttime) then
set firsttime = 0
if ($#binary) then
echo this is a binary file
# Mark initial, empty file as binary
rcs -i -kb -t$emptyfile $file
endif
if ($nodesc) then
echo about to do ci
echo ci -f -r$rev -d"$date" -w$author -t$emptyfile $file

View file

@ -1,7 +1,7 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
# Copyright 1999, 2000 Free Software Foundation, Inc.
# Copyright 1999, 2000, 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
@ -18,6 +18,11 @@
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
@ -26,7 +31,16 @@ if test -z "$depmode" || test -z "$source" || test -z "$object"; then
fi
# `libtool' can also be set to `yes' or `no'.
depfile=${depfile-`echo "$object" | sed 's,\([^/]*\)$,.deps/\1,;s/\.\([^.]*\)$/.P\1/'`}
if test -z "$depfile"; then
base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
dir=`echo "$object" | sed 's,/.*$,/,'`
if test "$dir" = "$object"; then
dir=
fi
# FIXME: should be _deps on DOS.
depfile="$dir.deps/$base"
fi
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
rm -f "$tmpdepfile"
@ -50,8 +64,9 @@ fi
case "$depmode" in
gcc3)
## gcc 3 implements dependency tracking that does exactly what
## we want. Yay!
"$@" -MT "$object" -MF "$tmpdepfile" -MD -MP
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
## it if -MD -MP comes after the -MF stuff. Hmm.
"$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
@ -157,19 +172,25 @@ sgi)
aix)
# The C for AIX Compiler uses -M and outputs the dependencies
# in a .u file. This file always lives in the current directory.
# Also, the AIX compiler puts `$object:' at the start of each line;
# $object doesn't have directory information.
stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
# in a .u file. In older versions, this file always lives in the
# current directory. Also, the AIX compiler puts `$object:' at the
# start of each line; $object doesn't have directory information.
# Version 6 uses the directory in both cases.
stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
tmpdepfile="$stripped.u"
outname="$stripped.o"
if test "$libtool" = yes; then
"$@" -Wc,-M
else
"$@" -M
fi
stat=$?
if test -f "$tmpdepfile"; then :
else
stripped=`echo "$stripped" | sed 's,^.*/,,'`
tmpdepfile="$stripped.u"
fi
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
@ -177,6 +198,7 @@ aix)
fi
if test -f "$tmpdepfile"; then
outname="$stripped.o"
# Each line is of the form `foo.o: dependent.h'.
# Do two passes, one to just change these to
# `$object: dependent.h' and one to simply `dependent.h:'.
@ -191,29 +213,80 @@ aix)
rm -f "$tmpdepfile"
;;
tru64)
# The Tru64 AIX compiler uses -MD to generate dependencies as a side
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
# Subdirectories are respected.
icc)
# Intel's C compiler understands `-MD -MF file'. However on
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
# ICC 7.0 will fill foo.d with something like
# foo.o: sub/foo.c
# foo.o: sub/foo.h
# which is wrong. We want:
# sub/foo.o: sub/foo.c
# sub/foo.o: sub/foo.h
# sub/foo.c:
# sub/foo.h:
# ICC 7.1 will output
# foo.o: sub/foo.c sub/foo.h
# and will wrap long lines using \ :
# foo.o: sub/foo.c ... \
# sub/foo.h ... \
# ...
"$@" -MD -MF "$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
# Each line is of the form `foo.o: dependent.h',
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
# Do two passes, one to just change these to
# `$object: dependent.h' and one to simply `dependent.h:'.
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
# Some versions of the HPUX 10.20 sed can't process this invocation
# correctly. Breaking it into two sed invocations is a workaround.
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
tru64)
# The Tru64 compiler uses -MD to generate dependencies as a side
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
# dependencies in `foo.d' instead, so we check for that too.
# Subdirectories are respected.
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
test "x$dir" = "x$object" && dir=
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
tmpdepfile="$object.d"
if test "$libtool" = yes; then
tmpdepfile1="$dir.libs/$base.lo.d"
tmpdepfile2="$dir.libs/$base.d"
"$@" -Wc,-MD
else
tmpdepfile1="$dir$base.o.d"
tmpdepfile2="$dir$base.d"
"$@" -MD
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
rm -f "$tmpdepfile1" "$tmpdepfile2"
exit $stat
fi
if test -f "$tmpdepfile1"; then
tmpdepfile="$tmpdepfile1"
else
tmpdepfile="$tmpdepfile2"
fi
if test -f "$tmpdepfile"; then
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
# That's a space and a tab in the [].
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
# That's a tab and a space in the [].
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
else
echo "#dummy" > "$depfile"
fi
@ -226,34 +299,42 @@ tru64)
dashmstdout)
# Important note: in order to support this mode, a compiler *must*
# always write the proprocessed file to stdout, regardless of -o,
# because we must use -o when running libtool.
test -z "$dashmflag" && dashmflag=-M
( IFS=" "
case " $* " in
*" --mode=compile "*) # this is libtool, let us make it quiet
for arg
do # cycle over the arguments
case "$arg" in
"--mode=compile")
# insert --quiet before "--mode=compile"
set fnord "$@" --quiet
shift # fnord
;;
esac
set fnord "$@" "$arg"
shift # fnord
shift # "$arg"
done
# always write the preprocessed file to stdout, regardless of -o.
"$@" || exit $?
# Remove the call to Libtool.
if test "$libtool" = yes; then
while test $1 != '--mode=compile'; do
shift
done
shift
fi
# Remove `-o $object'.
IFS=" "
for arg
do
case $arg in
-o)
shift
;;
$object)
shift
;;
*)
set fnord "$@" "$arg"
shift # fnord
shift # $arg
;;
esac
"$@" $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
) &
proc=$!
"$@"
stat=$?
wait "$proc"
if test "$stat" != 0; then exit $stat; fi
done
test -z "$dashmflag" && dashmflag=-M
# Require at least two characters before searching for `:'
# in the target name. This is to cope with DOS-style filenames:
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
"$@" $dashmflag |
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
tr ' ' '
@ -271,36 +352,40 @@ dashXmstdout)
;;
makedepend)
# X makedepend
(
shift
cleared=no
for arg in "$@"; do
case $cleared in no)
set ""; shift
cleared=yes
esac
case "$arg" in
-D*|-I*)
set fnord "$@" "$arg"; shift;;
-*)
;;
*)
set fnord "$@" "$arg"; shift;;
esac
"$@" || exit $?
# Remove any Libtool call
if test "$libtool" = yes; then
while test $1 != '--mode=compile'; do
shift
done
obj_suffix="`echo $object | sed 's/^.*\././'`"
touch "$tmpdepfile"
${MAKEDEPEND-makedepend} 2>/dev/null -o"$obj_suffix" -f"$tmpdepfile" "$@"
) &
proc=$!
"$@"
stat=$?
wait "$proc"
if test "$stat" != 0; then exit $stat; fi
shift
fi
# X makedepend
shift
cleared=no
for arg in "$@"; do
case $cleared in
no)
set ""; shift
cleared=yes ;;
esac
case "$arg" in
-D*|-I*)
set fnord "$@" "$arg"; shift ;;
# Strip any option that makedepend may not understand. Remove
# the object too, otherwise makedepend will parse it as a source file.
-*|$object)
;;
*)
set fnord "$@" "$arg"; shift ;;
esac
done
obj_suffix="`echo $object | sed 's/^.*\././'`"
touch "$tmpdepfile"
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
tail +3 "$tmpdepfile" | tr ' ' '
sed '1,2d' "$tmpdepfile" | tr ' ' '
' | \
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
@ -310,35 +395,39 @@ makedepend)
cpp)
# Important note: in order to support this mode, a compiler *must*
# always write the proprocessed file to stdout, regardless of -o,
# because we must use -o when running libtool.
( IFS=" "
case " $* " in
*" --mode=compile "*)
for arg
do # cycle over the arguments
case $arg in
"--mode=compile")
# insert --quiet before "--mode=compile"
set fnord "$@" --quiet
shift # fnord
;;
esac
set fnord "$@" "$arg"
shift # fnord
shift # "$arg"
done
# always write the preprocessed file to stdout.
"$@" || exit $?
# Remove the call to Libtool.
if test "$libtool" = yes; then
while test $1 != '--mode=compile'; do
shift
done
shift
fi
# Remove `-o $object'.
IFS=" "
for arg
do
case $arg in
-o)
shift
;;
$object)
shift
;;
*)
set fnord "$@" "$arg"
shift # fnord
shift # $arg
;;
esac
"$@" -E |
done
"$@" -E |
sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
sed '$ s: \\$::' > "$tmpdepfile"
) &
proc=$!
"$@"
stat=$?
wait "$proc"
if test "$stat" != 0; then exit $stat; fi
rm -f "$depfile"
echo "$object : \\" > "$depfile"
cat < "$tmpdepfile" >> "$depfile"
@ -348,34 +437,27 @@ cpp)
msvisualcpp)
# Important note: in order to support this mode, a compiler *must*
# always write the proprocessed file to stdout, regardless of -o,
# always write the preprocessed file to stdout, regardless of -o,
# because we must use -o when running libtool.
( IFS=" "
case " $* " in
*" --mode=compile "*)
for arg
do # cycle over the arguments
case $arg in
"--mode=compile")
# insert --quiet before "--mode=compile"
set fnord "$@" --quiet
shift # fnord
;;
esac
"$@" || exit $?
IFS=" "
for arg
do
case "$arg" in
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
set fnord "$@"
shift
shift
;;
*)
set fnord "$@" "$arg"
shift # fnord
shift # "$arg"
done
;;
shift
shift
;;
esac
"$@" -E |
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
) &
proc=$!
"$@"
stat=$?
wait "$proc"
if test "$stat" != 0; then exit $stat; fi
done
"$@" -E |
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"

View file

@ -1,3 +1,39 @@
2004-03-20 Derek Price <derek@ximbiot.com>
* diff.c (diff_run): Update string arg to const.
* diffrun.h: Update prototype to match.
2003-07-12 Larry Jones <lawrence.jones@eds.com>
* io.c (find_identical_ends): Update to match current diffutils
code and improve handling of files with no newline at end.
(Patch from Andrew Moise <chops@demiurgestudios.com>.)
2003-06-13 Derek Price <derek@ximbiot.com>
* diff3.c (read_diff): Fix memory leak.
(Patch from Kenneth Lorber <keni@his.com>.)
2003-05-21 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerate with Automake version 1.7.5.
2003-05-09 Derek Price <derek@ximbiot.com>
* system.h: Define S_ISSOCK on SCO OpenServer.
2003-04-10 Larry Jones <lawrence.jones@eds.com>
* Makefile.in: Regenerated.
2003-02-25 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerated.
2003-02-01 Larry Jones <lawrence.jones@eds.com>
* util.c (finish_output): Handle EINTR from waitpid.
2002-09-24 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerated using Automake 1.6.3.

View file

@ -1,7 +1,7 @@
# Makefile.in generated by automake 1.6.3 from Makefile.am.
# Makefile.in generated by automake 1.7.9 from Makefile.am.
# @configure_input@
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@ -13,79 +13,117 @@
# PARTICULAR PURPOSE.
@SET_MAKE@
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
transform = @program_transform_name@
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
EXEEXT = @EXEEXT@
OBJEXT = @OBJEXT@
PATH_SEPARATOR = @PATH_SEPARATOR@
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSH = @CSH@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EDITOR = @EDITOR@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
KRB4 = @KRB4@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MAKE_TARGETS_IN_VPATH_FALSE = @MAKE_TARGETS_IN_VPATH_FALSE@
MAKE_TARGETS_IN_VPATH_TRUE = @MAKE_TARGETS_IN_VPATH_TRUE@
MKTEMP = @MKTEMP@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PR = @PR@
PS2PDF = @PS2PDF@
RANLIB = @RANLIB@
ROFF = @ROFF@
SENDMAIL = @SENDMAIL@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TEXI2DVI = @TEXI2DVI@
VERSION = @VERSION@
YACC = @YACC@
ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
ac_prefix_program = @ac_prefix_program@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
bindir = @bindir@
build_alias = @build_alias@
datadir = @datadir@
exec_prefix = @exec_prefix@
host_alias = @host_alias@
includedir = @includedir@
includeopt = @includeopt@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
INCLUDES = -I$(top_srcdir)/lib
@ -98,6 +136,7 @@ libdiff_a_SOURCES = diff.c diff3.c analyze.c cmpbuf.c cmpbuf.h io.c \
EXTRA_DIST = ChangeLog build_diff.com diagmeet.note libdiff.dsp
subdir = diff
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
@ -111,11 +150,7 @@ am_libdiff_a_OBJECTS = diff.$(OBJEXT) diff3.$(OBJEXT) analyze.$(OBJEXT) \
version.$(OBJEXT) side.$(OBJEXT)
libdiff_a_OBJECTS = $(am_libdiff_a_OBJECTS)
DEFS = @DEFS@
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/analyze.Po ./$(DEPDIR)/cmpbuf.Po \
@ -129,19 +164,18 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
CFLAGS = @CFLAGS@
DIST_SOURCES = $(libdiff_a_SOURCES)
DIST_COMMON = ChangeLog Makefile.am Makefile.in
DIST_COMMON = $(srcdir)/Makefile.in ChangeLog Makefile.am
SOURCES = $(libdiff_a_SOURCES)
all: all-am
.SUFFIXES:
.SUFFIXES: .c .o .obj
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu diff/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
AR = ar
@ -173,26 +207,35 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@
distclean-depend:
-rm -rf ./$(DEPDIR)
.c.o:
@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
@am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
@am__fastdepCC_TRUE@ fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
.c.obj:
@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(COMPILE) -c `cygpath -w $<`
CCDEPMODE = @CCDEPMODE@
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
@am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
@am__fastdepCC_TRUE@ fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
uninstall-info-am:
ETAGS = etags
ETAGSFLAGS =
CTAGS = ctags
CTAGSFLAGS =
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@ -218,20 +261,41 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|| $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique
ctags: CTAGS
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
top_distdir = ..
distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
distdir: $(DISTFILES)
@list='$(DISTFILES)'; for file in $$list; do \
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
@ -256,7 +320,6 @@ check: check-am
all-am: Makefile $(LIBRARIES)
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
@ -268,7 +331,7 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
INSTALL_STRIP_FLAG=-s \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
@ -276,7 +339,7 @@ mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES)
-rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@ -286,9 +349,10 @@ clean: clean-am
clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
distclean: distclean-am
distclean-am: clean-am distclean-compile distclean-depend \
distclean-generic distclean-tags
-rm -rf ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-tags
dvi: dvi-am
@ -309,25 +373,33 @@ install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -rf ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am
.PHONY: GTAGS all all-am check check-am clean clean-generic \
clean-noinstLIBRARIES distclean distclean-compile \
distclean-depend distclean-generic distclean-tags 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-generic mostlyclean mostlyclean-compile \
mostlyclean-generic tags uninstall uninstall-am \
uninstall-info-am
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
clean-noinstLIBRARIES ctags distclean distclean-compile \
distclean-generic distclean-tags 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-generic \
mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
ps ps-am tags uninstall uninstall-am uninstall-info-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.

View file

@ -233,11 +233,13 @@ static struct option const longopts[] =
{0, 0, 0, 0}
};
int
diff_run (argc, argv, out, callbacks_arg)
int argc;
char *argv[];
char *out;
const char *out;
const struct diff_callbacks *callbacks_arg;
{
int val;

View file

@ -1360,6 +1360,7 @@ read_diff (filea, fileb, output_placement)
if (close (fd) != 0)
diff3_perror_with_exit ("pipe close");
unlink (diffout);
free( diffout );
return diff_result + total;
}

View file

@ -56,7 +56,7 @@ struct diff_callbacks
/* Run a diff. */
extern int diff_run DIFFPARAMS((int, char **, char *,
extern int diff_run DIFFPARAMS((int, char **, const char *,
const struct diff_callbacks *));
/* Run a diff3. */

View file

@ -508,11 +508,10 @@ find_identical_ends (filevec)
beg0 = filevec[0].prefix_end + (n0 < n1 ? 0 : n0 - n1);
/* Scan back until chars don't match or we reach that point. */
while (p0 != beg0)
if (*--p0 != *--p1)
for (; p0 != beg0; p0--, p1--)
if (*p0 != *p1)
{
/* Point at the first char of the matching suffix. */
++p0, ++p1;
beg0 = p0;
break;
}

View file

@ -61,9 +61,19 @@ GNU General Public License for more details.
#if !defined(S_ISFIFO) && defined(S_IFFIFO)
#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFFIFO)
#endif
#if !defined(S_ISSOCK) && defined(S_IFSOCK)
#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
#endif
#ifndef S_ISSOCK
# if defined( S_IFSOCK )
# ifdef S_IFMT
# define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
# else
# define S_ISSOCK(mode) ((mode) & S_IFSOCK)
# endif /* S_IFMT */
# elif defined( S_ISNAM )
/* SCO OpenServer 5.0.6a */
# define S_ISSOCK S_ISNAM
# endif /* !S_IFSOCK && S_ISNAM */
#endif /* !S_ISSOCK */
#if HAVE_UNISTD_H
#include <unistd.h>

View file

@ -300,7 +300,7 @@ finish_output ()
if (paginate_flag && outfile != 0 && outfile != stdout)
{
#ifdef PR_PROGRAM
int wstatus;
int wstatus, w;
if (ferror (outfile))
fatal ("write error");
# if ! HAVE_FORK
@ -308,7 +308,9 @@ finish_output ()
# else /* HAVE_FORK */
if (fclose (outfile) != 0)
pfatal_with_name ("write error");
if (waitpid (pr_pid, &wstatus, 0) < 0)
while ((w = waitpid (pr_pid, &wstatus, 0)) < 0 && errno == EINTR)
;
if (w < 0)
pfatal_with_name ("waitpid");
# endif /* HAVE_FORK */
if (wstatus != 0)

View file

@ -1,3 +1,399 @@
2004-04-06 Larry Jones <lawrence.jones@ugsplm.com>
* cvs.texinfo (Assigning revisions): Note that client/server mode
only considers files sent to the server to determine the major
revision for new files.
(Reported by Krzysztof GORBIEL <Krzysztof_GORBIEL@raiffeisen.pl>.)
* stamp-vti, version.texi: Regenerated.
2004-03-15 Derek Price <derek@ximbiot.com>
* stamp-vti, version.texi: Regenerated.
2004-03-11 Larry Jones <lawrence.jones@ugsplm.com>
* cvs.texinfo (loginfo, Error messages): Note that not reading all of
the log info can result in a broken pipe signal.
(Reported by Steven Nicoloso <spn@nwmail.wh.lucent.com>.)
* stamp-vti, version.texi: Regenerated.
2004-02-04 Derek Price <derek@ximbiot.com>
* cvs.texinfo (File Permissions): Clarify index entry.
* stamp-vti, version.texi: Regenerated.
2004-01-22 Derek Price <derek@ximbiot.com>
* stamp-vti, version.texi: Regenerated.
2004-01-08 Larry Jones <lawrence.jones@ugsplm.com>
* cvs.texinfo (user-defined logging): Move taginfo stuff from here...
(Administrative files): ...to its own node under here.
2003-12-18 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated
for 1.11.11.1.
2003-12-18 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated
for 1.11.11.
2003-12-05 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated.
2003-12-04 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated
for 1.11.10.1.
2003-12-04 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated
for 1.11.10.
2003-11-18 Derek Price <derek@ximbiot.com>
* stamp-vti, version.texi: Regenerated.
2003-11-13 Larry Jones <lawrence.jones@eds.com>
* cvs.texinfo (Reverting local changes): Use the same vendor tag
in the admin command as was used in the previous import commands.
2003-11-10 Derek Price <derek@ximbiot.com>
* stamp-vti, version.texi: Regenerated.
2003-11-07 Mark D. Baushke <mdb@cvshome.org>
* cvs.texinfo (CVS commands): Fix typo.
(FreeBSD PR docs/58669 reported by Ceri Davies <ceri@FreeBSD.org>.)
2003-10-30 Derek Price <derek@ximbiot.com>
* stamp-vti, version.texi: Regenerated.
2003-10-30 Derek Price <derek@ximbiot.com>
* cvs.texinfo (File permissions, Error messages): Add index entries for
CVSROOT/val-tags file.
2003-10-21 Derek Price <derek@ximbiot.com>
* cvs.texinfo: Note gnu.cvs.* usenet mirrors of the email lists.
(Suggestion from Paul Edwards, from somewhere in Australia.)
* cvs.texinfo: Put email addresses in @email{} tags and URLs in @url{}
tags rather than relying on markup like @code{}.
* stamp-vti, version.texi: Regenerated.
2003-10-14 Derek Price <derek@ximbiot.com>
* stamp-vti, version.texi: Regenerated.
2003-10-14 Derek Price <derek@ximbiot.com>
Port to pedantic POSIX 1003.1-2001 hosts, such as Debian GNU/Linux
testing with _POSIX2_VERSION=200112 in the environment.
* cvs.texinfo: Suggest 'sed 1q', not 'head -1'.
(Patch from Paul Eggert <eggert@twinsun.com>.)
2003-10-10 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated
for 1.11.9.1.
2003-10-10 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated
for 1.11.9.
2003-10-06 Derek Price <derek@ximbiot.com>
* cvsclient.texi (Requests): Add recommendation to client developers to
avoid the `Case' request.
* stamp-1, version-client.texi: Regenerated.
2003-10-02 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated
for 1.11.8.1.
2003-10-02 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated
for 1.11.8.
2003-09-29 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated
for 1.11.7.1.
2003-09-29 Derek Price <derek@ximbiot.com>
* stamp-1, stamp-vti, version-client.texi, version.texi: Regenerated
for 1.11.7.
2003-09-12 Derek Price <derek@ximbiot.com>
* cvs.texinfo (checkoutlist): Document the error messages which may be
specified in this file.
* stamp-vti, version.texi: Regenerated.
2003-08-27 Larry Jones <lawrence.jones@eds.com>
* cvs.texinfo (history options): Note the 'P' record type which
has been around for a long time but never actually appeared in
the history file due to bugs in the code.
(Invoking CVS): Ditto.
(config): Ditto.
* stamp-vti, version.texi: Regenerated.
2003-08-07 Derek Price <derek@ximbiot.com>
* .cvsignore: Ignore {cvs,cvsclient}.txt.
2003-08-07 Derek Price <derek@ximbiot.com>
* cvs.texinfo: Use the @dircategory and @direntry commands from texinfo
rather than rolling our own.
* stamp-vti, version.texi: Regenerated.
2003-08-07 Derek Price <derek@ximbiot.com>
* Makefile.am (POSTSCRIPTS): Rename to...
(PSS): ...to sync with and override Automakes default targets.
(PDFS): Reorder to match PSS.
(SUFFIXES): Remove .pdf and .aux.
(cvs.aux, cvs.pdf, cvsclient.aux, cvsclient.pdf): Remove these targets.
.aux weren't being generated anyhow and .pdf no longer need to be
supplied explicitly.
(cvs-paper.pdf: cvs-paper.ps): Provide ps2pdf rule explicitly.
(.{texinfo,texi,txy}.pdf): Remove these suffix rules - they are now
provided by Automake.
2003-08-06 Derek Price <derek@ximbiot.com>
* Makefile.am (CLEANFILES): Move...
(MOSTLYCLEANFILES): ...here and drop PDFs since this is where Automake
cleans PDFs & PSs by default.
(MAINTAINERCLEANFILES): Clean all PostScripts even though they will
have been removed in mostlyclean. That is a bug in Automake.
(doc): Depend on info & ps.
(pdf, ps): Removed in favor of Automake's default targets for these
types.
(cvsclient.* targets): Depened on version-client.texi.
(cvs-paper.pdf): Remove in favor of Automake's default target.
(.{texinfo,texi,txi}.{pdf,txt}): Update these targets based on
Automake's similar treatment of dvi, ps, and info targets.
* .cvsignore: Add cvs.tmp, a `make pdf' generated file.
* Makefile.in: Regenerated.
2003-07-18 Derek Price <derek@ximbiot.com>
* cvs.texinfo: Put a few errant references to bug-cvs inside @code{}
for consistancy.
2003-07-18 Derek Price <derek@ximbiot.com>
* cvs.texinfo: Update WARNINGs and Notes for a more consistent
appearance. Remove some obsolete comments.
* stamp-vti: Regenerated.
* version.texi: Regenerated.
2003-07-12 Larry Jones <lawrence.jones@eds.com>
* cvs.texinfo (Binary howto): Add note about how to determine whether
a file is marked as binary or not.
(Suggested by Erik Sigra <sigra@home.se>.)
* stamp-vti: Regenerated.
* version.texi: Regenerated.
2003-06-23 Derek Price <derek@ximbiot.com>
* stamp-vti: Regenerated.
* version.texi: Ditto.
2003-06-16 Derek Price <derek@ximbiot.com>
* cvs.texinfo (splitrcskeyword): New macro, now that @ifhtml will work
properly with texi2html (as of version 1.68), to cause output HTML to
contain <i></i> where we used to have @asis{} and prevent RCS keyword
substitution in generated HTML.
(Original patch from Patrice Dumas <dumas@centre-cired.fr>.)
2003-06-11 Derek Price <derek@ximbiot.com>
* cvs.texinfo (Invoking CVS): Remove `-P' from the list of `cvs export'
options.
(Patch from Alexander Taler <dissent@cvshome.org>.)
2003-06-11 Derek Price <derek@ximbiot.com>
* cvs.texinfo (Top): Remove out-of-date (by at least 5 years) comment.
(Patch from Alexander Taler <dissent@cvshome.org>.)
2003-05-27 Derek Price <derek@ximbiot.com>
* cvs.texinfo: Consolidate copyright notices into a single macro that
is called elsewhere to avoid needing three of them. Update copyright
notice.
(BUGS): Suggest Ximbiot rather than the defunct Signum Support as CVS
consultants.
* stamp-vti: Regenerated.
* version.texi: Ditto.
2003-05-26 Derek Price <derek@ximbiot.com>
* stamp-1: Regenerated for 1.11.6.1.
* stamp-vti: Ditto.
* version-client.texi: Ditto.
* version.texi: Ditto.
2003-05-25 Derek Price <derek@ximbiot.com>
* stamp-1: Regenerated for 1.11.6.
* stamp-vti: Ditto.
* version-client.texi: Ditto.
* version.texi: Ditto.
2003-05-21 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerate with Automake version 1.7.5.
2003-04-28 Derek Price <derek@ximbiot.com>
* cvs.texinfo (Working directory storage, Module options, Module
program options): Remove references to Checkin.prog and Update.prog.
(commit options): Remove reference to -n option.
* stamp-vti: Regenerated.
* version.texi: Ditto.
2003-04-10 Larry Jones <lawrence.jones@eds.com>
* Makefile.in: Regenerated.
2003-03-26 Derek Price <derek@ximbiot.com>
* stamp-vti: Regenerated.
* version.texi: Ditto.
2003-03-25 Larry Jones <larry.jones@sdrc.com>
* cvs.texinfo (Server temporary directory): Reorder list of places
to match code.
(Connection): Add additional example error message and note about
firewall software.
* stamp-vti: Regenerated.
* version.texi: Ditto.
2003-03-24 Derek Price <derek@ximbiot.com>
* Makefile.am: Update copyright notice.
* Makefile.in: Regenerated.
2003-03-06 Derek Price <derek@ximbiot.com>
* cvs.texinfo (What is CVS?): Correct date of first post of CVS by
Dick Grune from December to July based on the archive posted on
Google:
<http://groups.google.com/groups?q=Grune+cvs+group:mod.sources.*&hl=en&lr=&ie=UTF-8&selm=122%40mirror.UUCP&rnum=2>.
(Thanks to David A Wheeler <dwheeler@dwheeler.com>.)
* stamp-vti: Regenerated.
* version.texi: Ditto.
2003-03-05 Mark D. Baushke <mdb@cvshome.org>
* cvs.texinfo (CVS_LOCAL_BRANCH_NUM): Backout CVS_LOCAL_BRANCH_NUM
feature.
* cvs.texinfo (CVS_LOCAL_BRANCH_NUM): Document new environment
variable.
2003-02-27 Derek Price <derek@ximbiot.com>
* cvs.texinfo (Environment variables): Make the information on
CVS_CLIENT_PORT slightly clearer.
(Kerberos authenticated): XREF the Environment variables node.
* stamp-vti: Regenerated.
* version.texi: Ditto.
2003-02-25 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerated.
* stamp-1: Ditto.
* version-client.texi: Ditto.
2003-02-06 Derek Price <derek@ximbiot.com>
* cvs.texinfo (Working directory storage, Module options,
Module program options): Correct description of where Checkin.prog
and Update.prog are run. Provide more index entries and cross
references. Remove some FIXME comments. Add a FIXCVS THEN FIXME.
(Thanks to Art Manion at the CERT Coordination Center <cert@cert.org>.)
2003-02-04 Derek Price <derek@ximbiot.com>
* cvs.texinfo (File status): Mention the "Unresolved Conflict" status
which was apparently and erroneously removed from the doc at some
point in the past.
2003-02-03 Derek Price <derek@ximbiot.com>
* cvs.texinfo (Merging a branch): Mention the GCA as opposed to the
"branch point" as the implicit revision when merging a branch.
2003-02-03 Derek Price <derek@ximbiot.com>
* cvs.texinfo (Remote repositories): :METHOD: is optional.
2003-02-03 Derek Price <derek@ximbiot.com>
* cvs.texinfo (Committing your changes): Move index entries closer to
their corresponding references.
(Environment variables): Include $VISUAL in order of
preference. Add index entries. Reference Global options node.
(Variables): Change order of list to match the Env. Variables node
mentioned above.
* stamp-1: Regenerated.
* stamp-vti: Ditto.
* version-client.texi: Ditto.
* version.texi: Ditto.
2003-02-14 Derek Price <derek@ximbiot.com>
* cvs.texinfo (Watch Information, Editing files, Getting Notified,
Setting a watch): Edit usage specs for correctness and uniformity.
(Sticky tags): Use ref rather than xref to avoid a warning from
makeinfo.
* stamp-vti: Regenerated.
* version.texi: Ditto.
2003-01-23 Derek Price <derek@ximbiot.com>
* stamp-1: Regenerated.
* stamp-vti: Ditto.
* version-client.texi: Ditto.
* version.texi: Ditto.
2003-01-22 Larry Jones <larry.jones@sdrc.com>
* cvs.texinfo (config): Correct LogHistory default (U was omitted).
2003-01-16 Derek Price <derek@ximbiot.com>
* stamp-1: Regenerated for version (1.11.5).
@ -179,7 +575,7 @@
* Makefile.in: Regenerated.
* stamp-1: New file.
* version-client.texi: Ditto.
(Reportred by Alexey Mahotkin <alexm@hsys.msk.ru>.)
(Reported by Alexey Mahotkin <alexm@hsys.msk.ru>.)
2001-09-04 Derek Price <dprice@collab.net>

View file

@ -1,6 +1,8 @@
## Process this file with automake to produce Makefile.in
# Makefile for GNU CVS documentation (excluding man pages - see ../man).
# Copyright (C) 1986, 1988-1990, 2000 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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
@ -14,14 +16,14 @@
info_TEXINFOS = cvs.texinfo cvsclient.texi
POSTSCRIPTS = \
PSS = \
cvs.ps \
cvs-paper.ps \
cvsclient.ps
PDFS = \
cvs-paper.pdf \
cvs.pdf \
cvs-paper.pdf \
cvsclient.pdf
TXTS = \
@ -29,25 +31,23 @@ TXTS = \
cvsclient.txt
EXTRA_DIST = \
$(POSTSCRIPTS) \
$(PSS) \
.cvsignore \
ChangeLog.fsf \
RCSFILES \
mdate-sh \
cvs-paper.ms
CLEANFILES = \
$(PDFS) \
MOSTLYCLEANFILES = \
$(TXTS)
# These Automake generates MOSTLYCLEAN targets for PostScripts genersted from
# TEXINFOS, but it shouldn't when those files are in EXTRA_DIST
MAINTAINERCLEANFILES = \
cvs-paper.ps
$(PSS)
doc ps: $(POSTSCRIPTS)
.PHONY: doc ps
pdf: $(PDFS)
.PHONY: pdf
doc: info ps
.PHONY: doc
txt: $(TXTS)
.PHONY: txt
@ -58,8 +58,8 @@ dvi: cvs.dvi cvsclient.dvi
# FIXME-AUTOMAKE:
# For some reason if I remove version.texi, it doesn't get built automatically.
# This needs to be fixed in automake.
cvs.aux cvs.pdf cvs.txt: cvs.texinfo $(srcdir)/version.texi
cvsclient.aux cvsclient.pdf cvsclient.txt: cvsclient.texi
cvs.txt: cvs.texinfo $(srcdir)/version.texi
cvsclient.txt: cvsclient.texi $(srcdir)/version-client.texi
# These targets need to be very specific so that the other PDFs get generated
# correctly. If they are more generic and cvs.ps is made before cvs.pdf, then
@ -70,36 +70,25 @@ cvs-paper.ps: cvs-paper.ms
mv $@-t $@
cvs-paper.pdf: cvs-paper.ps
$(PS2PDF) $< $@
ps2pdf $< $@
SUFFIXES = .aux .txt .pdf
SUFFIXES = .txt
# texinfo based targets automake neglects to include
.texinfo.pdf:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) --pdf --batch $<
.txi.pdf:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) --pdf --batch $<
.texi.pdf:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) --pdf --batch $<
.texinfo.txt:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(MAKEINFO) $< --no-headers -o $@
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
--no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
.txi.txt:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(MAKEINFO) $< --no-headers -o $@
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
--no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
.texi.txt:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(MAKEINFO) $< --no-headers -o $@
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
--no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
##
## MAINTAINER Targets
##
## realclean ##
# for backwards compatibility with the old makefiles
realclean: maintainer-clean
.PHONY: realclean

View file

@ -1,7 +1,7 @@
# Makefile.in generated by automake 1.6.3 from Makefile.am.
# Makefile.in generated by automake 1.7.9 from Makefile.am.
# @configure_input@
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@ -15,7 +15,9 @@
@SET_MAKE@
# Makefile for GNU CVS documentation (excluding man pages - see ../man).
# Copyright (C) 1986, 1988-1990, 2000 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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
@ -26,91 +28,129 @@
# 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.
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
transform = @program_transform_name@
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
EXEEXT = @EXEEXT@
OBJEXT = @OBJEXT@
PATH_SEPARATOR = @PATH_SEPARATOR@
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSH = @CSH@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EDITOR = @EDITOR@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
KRB4 = @KRB4@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MAKE_TARGETS_IN_VPATH_FALSE = @MAKE_TARGETS_IN_VPATH_FALSE@
MAKE_TARGETS_IN_VPATH_TRUE = @MAKE_TARGETS_IN_VPATH_TRUE@
MKTEMP = @MKTEMP@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PR = @PR@
PS2PDF = @PS2PDF@
RANLIB = @RANLIB@
ROFF = @ROFF@
SENDMAIL = @SENDMAIL@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TEXI2DVI = @TEXI2DVI@
VERSION = @VERSION@
YACC = @YACC@
ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
ac_prefix_program = @ac_prefix_program@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
bindir = @bindir@
build_alias = @build_alias@
datadir = @datadir@
exec_prefix = @exec_prefix@
host_alias = @host_alias@
includedir = @includedir@
includeopt = @includeopt@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
info_TEXINFOS = cvs.texinfo cvsclient.texi
POSTSCRIPTS = \
PSS = \
cvs.ps \
cvs-paper.ps \
cvsclient.ps
PDFS = \
cvs-paper.pdf \
cvs.pdf \
cvs-paper.pdf \
cvsclient.pdf
@ -120,7 +160,7 @@ TXTS = \
EXTRA_DIST = \
$(POSTSCRIPTS) \
$(PSS) \
.cvsignore \
ChangeLog.fsf \
RCSFILES \
@ -128,149 +168,144 @@ EXTRA_DIST = \
cvs-paper.ms
CLEANFILES = \
$(PDFS) \
MOSTLYCLEANFILES = \
$(TXTS)
# These Automake generates MOSTLYCLEAN targets for PostScripts genersted from
# TEXINFOS, but it shouldn't when those files are in EXTRA_DIST
MAINTAINERCLEANFILES = \
cvs-paper.ps
$(PSS)
SUFFIXES = .aux .txt .pdf
SUFFIXES = .txt
subdir = doc
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
DIST_SOURCES =
am__TEXINFO_TEX_DIR = $(srcdir)
INFO_DEPS = cvs.info cvsclient.info
DVIS = cvs.dvi cvsclient.dvi
TEXINFOS = cvs.texinfo cvsclient.texi
DIST_COMMON = ChangeLog Makefile.am Makefile.in mdate-sh stamp-1 \
stamp-vti texinfo.tex version-client.texi version.texi
DIST_COMMON = $(srcdir)/Makefile.in ChangeLog Makefile.am mdate-sh \
stamp-1 stamp-vti texinfo.tex version-client.texi version.texi
all: all-am
.SUFFIXES:
.SUFFIXES: .aux .txt .pdf .dvi .info .ps .texi .texinfo .txi
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
.SUFFIXES: .txt .dvi .info .pdf .ps .texi .texinfo .txi
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu doc/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
$(srcdir)/version.texi: $(srcdir)/stamp-vti
@:
$(srcdir)/stamp-vti: cvs.texinfo $(top_srcdir)/configure.in
@(set `$(SHELL) $(srcdir)/mdate-sh $(srcdir)/cvs.texinfo`; \
.texinfo.info:
@rm -f $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
-o $@ `test -f '$<' || echo '$(srcdir)/'`$<
.texinfo.dvi:
TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
$(TEXI2DVI) `test -f '$<' || echo '$(srcdir)/'`$<
.texinfo.pdf:
TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
$(TEXI2PDF) `test -f '$<' || echo '$(srcdir)/'`$<
cvs.info: cvs.texinfo version.texi
cvs.dvi: cvs.texinfo version.texi
cvs.pdf: cvs.texinfo version.texi
version.texi: @MAINTAINER_MODE_TRUE@ stamp-vti
stamp-vti: cvs.texinfo $(top_srcdir)/configure
@(dir=.; test -f ./cvs.texinfo || dir=$(srcdir); \
set `$(SHELL) $(srcdir)/mdate-sh $$dir/cvs.texinfo`; \
echo "@set UPDATED $$1 $$2 $$3"; \
echo "@set UPDATED-MONTH $$2 $$3"; \
echo "@set EDITION $(VERSION)"; \
echo "@set VERSION $(VERSION)") > vti.tmp
@cmp -s vti.tmp $(srcdir)/version.texi \
|| (echo "Updating $(srcdir)/version.texi"; \
cp vti.tmp $(srcdir)/version.texi)
@cmp -s vti.tmp version.texi \
|| (echo "Updating version.texi"; \
cp vti.tmp version.texi)
-@rm -f vti.tmp
@cp $(srcdir)/version.texi $@
@cp version.texi $@
mostlyclean-vti:
-rm -f vti.tmp
maintainer-clean-vti:
-rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
@MAINTAINER_MODE_TRUE@ -rm -f stamp-vti version.texi
cvs.info: cvs.texinfo $(srcdir)/version.texi
cvs.dvi: cvs.texinfo $(srcdir)/version.texi
.texi.info:
@rm -f $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
-o $@ `test -f '$<' || echo '$(srcdir)/'`$<
$(srcdir)/version-client.texi: $(srcdir)/stamp-1
@:
$(srcdir)/stamp-1: cvsclient.texi $(top_srcdir)/configure.in
@(set `$(SHELL) $(srcdir)/mdate-sh $(srcdir)/cvsclient.texi`; \
.texi.dvi:
TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
$(TEXI2DVI) `test -f '$<' || echo '$(srcdir)/'`$<
.texi.pdf:
TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
$(TEXI2PDF) `test -f '$<' || echo '$(srcdir)/'`$<
cvsclient.info: cvsclient.texi version-client.texi
cvsclient.dvi: cvsclient.texi version-client.texi
cvsclient.pdf: cvsclient.texi version-client.texi
version-client.texi: @MAINTAINER_MODE_TRUE@ stamp-1
stamp-1: cvsclient.texi $(top_srcdir)/configure
@(dir=.; test -f ./cvsclient.texi || dir=$(srcdir); \
set `$(SHELL) $(srcdir)/mdate-sh $$dir/cvsclient.texi`; \
echo "@set UPDATED $$1 $$2 $$3"; \
echo "@set UPDATED-MONTH $$2 $$3"; \
echo "@set EDITION $(VERSION)"; \
echo "@set VERSION $(VERSION)") > 1.tmp
@cmp -s 1.tmp $(srcdir)/version-client.texi \
|| (echo "Updating $(srcdir)/version-client.texi"; \
cp 1.tmp $(srcdir)/version-client.texi)
@cmp -s 1.tmp version-client.texi \
|| (echo "Updating version-client.texi"; \
cp 1.tmp version-client.texi)
-@rm -f 1.tmp
@cp $(srcdir)/version-client.texi $@
@cp version-client.texi $@
mostlyclean-1:
-rm -f 1.tmp
maintainer-clean-1:
-rm -f $(srcdir)/stamp-1 $(srcdir)/version-client.texi
@MAINTAINER_MODE_TRUE@ -rm -f stamp-1 version-client.texi
cvsclient.info: cvsclient.texi $(srcdir)/version-client.texi
cvsclient.dvi: cvsclient.texi $(srcdir)/version-client.texi
.texi.info:
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
cd $(srcdir) \
&& $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) \
`echo $< | sed 's,.*/,,'`
.texi.dvi:
TEXINPUTS="$(srcdir)$(PATH_SEPARATOR)$$TEXINPUTS" \
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
$(TEXI2DVI) $<
.texi:
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
cd $(srcdir) \
&& $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) \
`echo $< | sed 's,.*/,,'`
.texinfo.info:
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
cd $(srcdir) \
&& $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) \
`echo $< | sed 's,.*/,,'`
.texinfo.dvi:
TEXINPUTS="$(srcdir)$(PATH_SEPARATOR)$$TEXINPUTS" \
MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
$(TEXI2DVI) $<
.texinfo:
@cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9]
cd $(srcdir) \
&& $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) \
`echo $< | sed 's,.*/,,'`
MAKEINFO = @MAKEINFO@
TEXI2PDF = $(TEXI2DVI) --pdf --batch
DVIPS = dvips
.dvi.ps:
$(DVIPS) $< -o $@
$(DVIPS) -o $@ $<
uninstall-info-am:
$(PRE_UNINSTALL)
@if (install-info --version && \
install-info --version | fgrep -i -v debian) >/dev/null 2>&1; then \
install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
list='$(INFO_DEPS)'; \
for file in $$list; do \
echo " install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$file"; \
install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$file; \
relfile=`echo "$$file" | sed 's|^.*/||'`; \
echo " install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$relfile"; \
install-info --info-dir=$(DESTDIR)$(infodir) --remove $(DESTDIR)$(infodir)/$$relfile; \
done; \
else :; fi
@$(NORMAL_UNINSTALL)
@list='$(INFO_DEPS)'; \
for file in $$list; do \
relfile=`echo "$$file" | sed 's|^.*/||'`; \
relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
(if cd $(DESTDIR)$(infodir); then \
echo " rm -f $$file $$file-[0-9] $$file-[0-9][0-9])"; \
rm -f $$file $$file-[0-9] $$file-[0-9][0-9]; \
echo " rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9])"; \
rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
else :; fi); \
done
dist-info: $(INFO_DEPS)
list='$(INFO_DEPS)'; \
for base in $$list; do \
d=$(srcdir); \
if test -f $$base; then d=.; else d=$(srcdir); fi; \
for file in $$d/$$base*; do \
relfile=`expr "$$file" : "$$d/\(.*\)"`; \
test -f $(distdir)/$$relfile || \
@ -279,30 +314,39 @@ dist-info: $(INFO_DEPS)
done
mostlyclean-aminfo:
-rm -f cvs.aux cvs.cp cvs.cps cvs.dvi cvs.fn cvs.fns cvs.ky cvs.log cvs.pg \
cvs.ps cvs.tmp cvs.toc cvs.tp cvs.vr cvsclient.aux \
cvsclient.cp cvsclient.dvi cvsclient.fn cvsclient.ky \
cvsclient.log cvsclient.pg cvsclient.ps cvsclient.tmp \
cvsclient.toc cvsclient.tp cvsclient.vr
-rm -f cvs.aux cvs.cp cvs.cps cvs.fn cvs.fns cvs.ky cvs.kys cvs.log cvs.pg \
cvs.pgs cvs.tmp cvs.toc cvs.tp cvs.tps cvs.vr cvs.vrs cvs.dvi \
cvs.pdf cvs.ps cvsclient.aux cvsclient.cp cvsclient.cps \
cvsclient.fn cvsclient.fns cvsclient.ky cvsclient.kys \
cvsclient.log cvsclient.pg cvsclient.pgs cvsclient.tmp \
cvsclient.toc cvsclient.tp cvsclient.tps cvsclient.vr \
cvsclient.vrs cvsclient.dvi cvsclient.pdf cvsclient.ps
maintainer-clean-aminfo:
cd $(srcdir) && \
list='$(INFO_DEPS)'; for i in $$list; do \
rm -f $$i; \
if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \
rm -f $$i-[0-9]*; \
fi; \
@list='$(INFO_DEPS)'; for i in $$list; do \
i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
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
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
top_distdir = ..
distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
distdir: $(DISTFILES)
@list='$(DISTFILES)'; for file in $$list; do \
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
@ -323,7 +367,7 @@ distdir: $(DISTFILES)
fi; \
done
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="${top_distdir}" distdir="$(distdir)" \
top_distdir="$(top_distdir)" distdir="$(distdir)" \
dist-info
check-am: all-am
check: check-am
@ -331,7 +375,6 @@ all-am: Makefile $(INFO_DEPS)
installdirs:
$(mkinstalldirs) $(DESTDIR)$(infodir)
install: install-am
install-exec: install-exec-am
install-data: install-data-am
@ -343,16 +386,16 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
INSTALL_STRIP_FLAG=-s \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
clean-generic:
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES)
-rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@ -363,7 +406,7 @@ clean: clean-am
clean-am: clean-generic mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic
dvi: dvi-am
@ -385,10 +428,12 @@ install-info-am: $(INFO_DEPS)
$(mkinstalldirs) $(DESTDIR)$(infodir)
@list='$(INFO_DEPS)'; \
for file in $$list; do \
d=$(srcdir); \
for ifile in echo $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9]; do \
if test -f $$file; then d=.; else d=$(srcdir); fi; \
file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
$$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
if test -f $$ifile; then \
relfile=`expr "$$ifile" : "$$d/\(.*\)"`; \
relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
echo " $(INSTALL_DATA) $$ifile $(DESTDIR)$(infodir)/$$relfile"; \
$(INSTALL_DATA) $$ifile $(DESTDIR)$(infodir)/$$relfile; \
else : ; fi; \
@ -396,11 +441,12 @@ install-info-am: $(INFO_DEPS)
done
@$(POST_INSTALL)
@if (install-info --version && \
install-info --version | fgrep -i -v debian) >/dev/null 2>&1; then \
install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
list='$(INFO_DEPS)'; \
for file in $$list; do \
echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\
install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\
relfile=`echo "$$file" | sed 's|^.*/||'`; \
echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$relfile";\
install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$relfile || :;\
done; \
else : ; fi
install-man:
@ -408,7 +454,7 @@ install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-1 \
maintainer-clean-aminfo maintainer-clean-generic \
maintainer-clean-vti
@ -418,6 +464,14 @@ mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \
mostlyclean-vti
pdf: pdf-am
pdf-am: $(PDFS)
ps: ps-am
ps-am: $(PSS)
uninstall-am: uninstall-info-am
.PHONY: all all-am check check-am clean clean-generic dist-info \
@ -428,14 +482,12 @@ uninstall-am: uninstall-info-am
maintainer-clean maintainer-clean-1 maintainer-clean-aminfo \
maintainer-clean-generic maintainer-clean-vti mostlyclean \
mostlyclean-1 mostlyclean-aminfo mostlyclean-generic \
mostlyclean-vti uninstall uninstall-am uninstall-info-am
mostlyclean-vti pdf pdf-am ps ps-am uninstall uninstall-am \
uninstall-info-am
doc ps: $(POSTSCRIPTS)
.PHONY: doc ps
pdf: $(PDFS)
.PHONY: pdf
doc: info ps
.PHONY: doc
txt: $(TXTS)
.PHONY: txt
@ -446,8 +498,8 @@ dvi: cvs.dvi cvsclient.dvi
# FIXME-AUTOMAKE:
# For some reason if I remove version.texi, it doesn't get built automatically.
# This needs to be fixed in automake.
cvs.aux cvs.pdf cvs.txt: cvs.texinfo $(srcdir)/version.texi
cvsclient.aux cvsclient.pdf cvsclient.txt: cvsclient.texi
cvs.txt: cvs.texinfo $(srcdir)/version.texi
cvsclient.txt: cvsclient.texi $(srcdir)/version-client.texi
# These targets need to be very specific so that the other PDFs get generated
# correctly. If they are more generic and cvs.ps is made before cvs.pdf, then
@ -458,28 +510,18 @@ cvs-paper.ps: cvs-paper.ms
mv $@-t $@
cvs-paper.pdf: cvs-paper.ps
$(PS2PDF) $< $@
ps2pdf $< $@
# texinfo based targets automake neglects to include
.texinfo.pdf:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) --pdf --batch $<
.txi.pdf:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) --pdf --batch $<
.texi.pdf:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) --pdf --batch $<
.texinfo.txt:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(MAKEINFO) $< --no-headers -o $@
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
--no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
.txi.txt:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(MAKEINFO) $< --no-headers -o $@
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
--no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
.texi.txt:
TEXINPUTS=$(srcdir):$$TEXINPUTS \
MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(MAKEINFO) $< --no-headers -o $@
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
--no-headers -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
# for backwards compatibility with the old makefiles
realclean: maintainer-clean

File diff suppressed because it is too large Load diff

View file

@ -943,6 +943,16 @@ there are some situations it cannot handle (ignore patterns, or
situations where the user specifies a filename and the client does not
know about that file).
Though this request will be supported into the forseeable future, it has been
the source of numerous bug reports in the past due to the complexity of testing
this functionality via the test suite and client developers are encouraged not
to use it. Instead, please consider munging conflicting names and maintaining
a map for communicating with the server. For example, suppose the server sends
files @file{case}, @file{CASE}, and @file{CaSe}. The client could write all
three files to names such as, @file{case}, @file{case_prefix_case}, and
@file{case_prefix_2_case} and maintain a mapping between the file names in, for
instance a new @file{CVS/Map} file.
@item Argument @var{text} \n
Response expected: no.
Save argument for use in a subsequent command. Arguments

View file

@ -1,4 +1,4 @@
@set UPDATED 5 September 2001
@set UPDATED-MONTH September 2001
@set EDITION 1.11.5
@set VERSION 1.11.5
@set UPDATED 3 February 2004
@set UPDATED-MONTH February 2004
@set EDITION 1.11.15
@set VERSION 1.11.15

View file

@ -1,4 +1,4 @@
@set UPDATED 18 November 2002
@set UPDATED-MONTH November 2002
@set EDITION 1.11.5
@set VERSION 1.11.5
@set UPDATED 6 April 2004
@set UPDATED-MONTH April 2004
@set EDITION 1.11.15
@set VERSION 1.11.15

View file

@ -1,4 +1,4 @@
@set UPDATED 5 September 2001
@set UPDATED-MONTH September 2001
@set EDITION 1.11.5
@set VERSION 1.11.5
@set UPDATED 3 February 2004
@set UPDATED-MONTH February 2004
@set EDITION 1.11.15
@set VERSION 1.11.15

View file

@ -1,4 +1,4 @@
@set UPDATED 18 November 2002
@set UPDATED-MONTH November 2002
@set EDITION 1.11.5
@set VERSION 1.11.5
@set UPDATED 6 April 2004
@set UPDATED-MONTH April 2004
@set EDITION 1.11.15
@set VERSION 1.11.15

View file

@ -1,3 +1,114 @@
2004-04-07 Derek Price <derek@ximbiot.com>
* regex.c: Revise "FREE_VAR" macro to eliminate C4090/C4022 warnings
in Windows build with Visual C++ 6.0 compiler.
(Original patch from Conrad T. Pino <Conrad@Pino.com>.)
2004-04-04 Derek Price <derek@ximbiot.com>
* system.h: Correct comment.
2004-04-04 Derek Price <derek@ximbiot.com>
* system.h: Restore complete path folding for Cygwin under Windows.
Add ISABSOLUTE macro for determining whether a path is absolute to
handle X:\ style paths under Windows (& Cygwin).
2004-03-25 Derek Price <derek@ximbiot.com>
* system.h: No longer fold back slashes in paths into slashes.
2004-03-20 Derek Price <derek@ximbiot.com>
* mkdir.c (mkdir): Declare string args const.
2004-03-19 Derek Price <derek@ximbiot.com>
* .cvsignore: Add fnmatch.h for Windows and other platforms which build
it.
2003-12-09 Derek Price <derek@ximbiot.com>
* system.h: Correct spelling in comment.
2003-12-03 Derek Price <derek@ximbiot.com>
* fncase.c (OSX_filename_classes): New array.
(fncmp): Use FOLD_FN_CASE rather relying on the fact that it will be
#defined to use WNT_filename_classes.
* system.h: Define FOLD_FN_CASE, fncmp, and fnfold for all case
insensitive filesystems. Share some code between the new generic case
insensitive section and the old WOE32 section.
2003-10-02 Derek Price <derek@ximbiot.com>
* getpass.c: Back out my last getpass.c update since the new GNULIB
version introduced some dependencies which I do not want to introduce
on stable.
2003-10-01 Derek Price <derek@ximbiot.com>
* getpass.c: Update to new version from GNULIB with Larry's fix
incorporated.
2003-09-30 Larry Jones <lawrence.jones@eds.com>
* getpass.c: Fix bug that caused password to be echoed on many
systems (input may not be followed by output on the same stream
without an intervening call to a file positioning function).
(Reported by David Everly <david.everly@mci.com>.)
2003-07-29 Derek Price <derek@ximbiot.com>
* getpass.c: New file, almost identical to GNULIB's currect version.
* Makefile.am (libcvs_a_SOURCES): Add getpass.c.
* Makefile.in: Regenerated.
2003-06-09 Derek Price <derek@ximbiot.com>
* system.h: Reference the WIN32 macro only in order to define WOE32,
in accordance with the GNU convention to avoid implying that we
consider the Microsoft Windows Operating Environment any sort of "win".
2003-05-21 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerate with Automake version 1.7.5.
2003-05-09 Derek Price <derek@ximbiot.com>
* system.h: Define S_ISSOCK on SCO OpenServer.
2003-04-10 Larry Jones <lawrence.jones@eds.com>
* Makefile.in: Regenerated.
2003-04-03 Derek Price <derek@ximbiot.com>
* Makefile.am (distclean-local): New target to remove fnmatch.h when
necessary. This should be handled by Automake, but until then...
(Resolves issue #100
<http://ccvs.cvshome.org/issues/show_bug.cgi?id=100> from
Serguei E. Leontiev <Serge3lse@cvshome.org>.)
* Makefile.in: Regenerated.
2003-03-24 Derek Price <derek@ximbiot.com>
* Makefile.am: Update copyright notice.
* Makefile.in: Regenerated.
2003-02-25 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerated.
2003-01-23 Larry Jones <lawrence.jones@eds.com>
* getdate.y: Add RCS/CVS timestamp format (Y.mm.dd.hh.mm.ss).
* getdate.c: Regenerated.
* wait.h (WCOREDUMP): New macro.
2002-12-27 Derek Price <derek@ximbiot.com>
* getdate.c: Regenerated with Bison 1.35.

View file

@ -1,6 +1,8 @@
## Process this file with automake to produce Makefile.in
# Makefile for library files used by GNU CVS.
# Copyright (C) 1986, 1988-1994, 2000 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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
@ -44,6 +46,7 @@ libcvs_a_SOURCES = \
getline.c \
getopt.c \
getopt1.c \
getpass.c \
md5.c \
regex.c \
savecwd.c \
@ -84,6 +87,10 @@ EXTRA_DIST = \
build_lib.com \
xgssapi.h
# Until Automake gets its act together
distclean-local:
rm -f fnmatch.h
# for backwards compatibility with the old makefiles
realclean: maintainer-clean
.PHONY: realclean

View file

@ -1,7 +1,7 @@
# Makefile.in generated by automake 1.6.3 from Makefile.am.
# Makefile.in generated by automake 1.7.9 from Makefile.am.
# @configure_input@
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@ -15,7 +15,9 @@
@SET_MAKE@
# Makefile for library files used by GNU CVS.
# Copyright (C) 1986, 1988-1994, 2000 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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
@ -26,79 +28,117 @@
# 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.
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
transform = @program_transform_name@
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
EXEEXT = @EXEEXT@
OBJEXT = @OBJEXT@
PATH_SEPARATOR = @PATH_SEPARATOR@
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSH = @CSH@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EDITOR = @EDITOR@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
KRB4 = @KRB4@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MAKE_TARGETS_IN_VPATH_FALSE = @MAKE_TARGETS_IN_VPATH_FALSE@
MAKE_TARGETS_IN_VPATH_TRUE = @MAKE_TARGETS_IN_VPATH_TRUE@
MKTEMP = @MKTEMP@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PR = @PR@
PS2PDF = @PS2PDF@
RANLIB = @RANLIB@
ROFF = @ROFF@
SENDMAIL = @SENDMAIL@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TEXI2DVI = @TEXI2DVI@
VERSION = @VERSION@
YACC = @YACC@
ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
ac_prefix_program = @ac_prefix_program@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
bindir = @bindir@
build_alias = @build_alias@
datadir = @datadir@
exec_prefix = @exec_prefix@
host_alias = @host_alias@
includedir = @includedir@
includeopt = @includeopt@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
# For now we need to include $(top_srcdir)/src because some systems
# (at least 'AIX rioscpu2 3 4 000030498200',
@ -132,6 +172,7 @@ libcvs_a_SOURCES = \
getline.c \
getopt.c \
getopt1.c \
getpass.c \
md5.c \
regex.c \
savecwd.c \
@ -159,6 +200,7 @@ EXTRA_DIST = \
xgssapi.h
subdir = lib
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
@ -168,16 +210,12 @@ libcvs_a_AR = $(AR) cru
libcvs_a_DEPENDENCIES = @LIBOBJS@
am_libcvs_a_OBJECTS = argmatch.$(OBJEXT) getdate.$(OBJEXT) \
getline.$(OBJEXT) getopt.$(OBJEXT) getopt1.$(OBJEXT) \
md5.$(OBJEXT) regex.$(OBJEXT) savecwd.$(OBJEXT) \
sighandle.$(OBJEXT) stripslash.$(OBJEXT) xgetwd.$(OBJEXT) \
yesno.$(OBJEXT)
getpass.$(OBJEXT) md5.$(OBJEXT) regex.$(OBJEXT) \
savecwd.$(OBJEXT) sighandle.$(OBJEXT) stripslash.$(OBJEXT) \
xgetwd.$(OBJEXT) yesno.$(OBJEXT)
libcvs_a_OBJECTS = $(am_libcvs_a_OBJECTS)
DEFS = @DEFS@
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/dup2.Po $(DEPDIR)/fncase.Po \
@ -189,31 +227,31 @@ am__depfiles_maybe = depfiles
@AMDEP_TRUE@ $(DEPDIR)/valloc.Po $(DEPDIR)/waitpid.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/argmatch.Po ./$(DEPDIR)/getdate.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/getline.Po ./$(DEPDIR)/getopt.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/getopt1.Po ./$(DEPDIR)/md5.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/regex.Po ./$(DEPDIR)/savecwd.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/sighandle.Po ./$(DEPDIR)/stripslash.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/xgetwd.Po ./$(DEPDIR)/yesno.Po
@AMDEP_TRUE@ ./$(DEPDIR)/getopt1.Po ./$(DEPDIR)/getpass.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/md5.Po ./$(DEPDIR)/regex.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/savecwd.Po ./$(DEPDIR)/sighandle.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/stripslash.Po ./$(DEPDIR)/xgetwd.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/yesno.Po
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
CFLAGS = @CFLAGS@
YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS)
DIST_SOURCES = $(libcvs_a_SOURCES)
DIST_COMMON = ChangeLog Makefile.am Makefile.in dup2.c fncase.c \
fnmatch.c fnmatch.h.in ftruncate.c getdate.c gethostname.c \
memmove.c mkdir.c rename.c strerror.c strstr.c strtoul.c \
valloc.c waitpid.c
DIST_COMMON = $(srcdir)/Makefile.in ChangeLog Makefile.am dup2.c \
fncase.c fnmatch.c fnmatch.h.in ftruncate.c getdate.c \
gethostname.c memmove.c mkdir.c rename.c strerror.c strstr.c \
strtoul.c valloc.c waitpid.c
SOURCES = $(libcvs_a_SOURCES)
all: all-am
.SUFFIXES:
.SUFFIXES: .c .o .obj .y
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu lib/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
AR = ar
@ -250,6 +288,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getline.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getpass.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/savecwd.Po@am__quote@
@ -258,26 +297,30 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xgetwd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yesno.Po@am__quote@
distclean-depend:
-rm -rf $(DEPDIR) ./$(DEPDIR)
.c.o:
@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
@am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
@am__fastdepCC_TRUE@ fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
.c.obj:
@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(COMPILE) -c `cygpath -w $<`
CCDEPMODE = @CCDEPMODE@
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
@am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
@am__fastdepCC_TRUE@ fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
.y.c:
$(YACCCOMPILE) `test -f '$<' || echo '$(srcdir)/'`$<
sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@
rm -f y.tab.c
if test -f y.tab.h; then \
to=`echo "$*_H" | sed \
-e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \
@ -293,11 +336,16 @@ CCDEPMODE = @CCDEPMODE@
if test -f y.output; then \
mv y.output $*.output; \
fi
sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@
rm -f y.tab.c
uninstall-info-am:
ETAGS = etags
ETAGSFLAGS =
CTAGS = ctags
CTAGSFLAGS =
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@ -323,20 +371,41 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|| $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique
ctags: CTAGS
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
top_distdir = ..
distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
distdir: $(DISTFILES)
@list='$(DISTFILES)'; for file in $$list; do \
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
@ -361,7 +430,6 @@ check: check-am
all-am: Makefile $(LIBRARIES)
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
@ -373,7 +441,7 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
INSTALL_STRIP_FLAG=-s \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
@ -381,20 +449,21 @@ mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES)
-rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
-test -z "getdate.c" || rm -f getdate.c
-rm -f getdate.c
clean: clean-am
clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
distclean: distclean-am
distclean-am: clean-am distclean-compile distclean-depend \
distclean-generic distclean-tags
-rm -rf $(DEPDIR) ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-local distclean-tags
dvi: dvi-am
@ -415,27 +484,40 @@ install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -rf $(DEPDIR) ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am
.PHONY: GTAGS all all-am check check-am clean clean-generic \
clean-noinstLIBRARIES distclean distclean-compile \
distclean-depend distclean-generic distclean-tags distdir dvi \
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
clean-noinstLIBRARIES ctags distclean distclean-compile \
distclean-generic distclean-local distclean-tags 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-generic mostlyclean mostlyclean-compile \
mostlyclean-generic tags uninstall uninstall-am \
uninstall-info-am
mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
uninstall-am uninstall-info-am
# Until Automake gets its act together
distclean-local:
rm -f fnmatch.h
# for backwards compatibility with the old makefiles
realclean: maintainer-clean
.PHONY: realclean

View file

@ -50,6 +50,8 @@ main ()
}
#endif
/* Under Windows NT, filenames are case-insensitive but case-preserving,
and both \ and / are path element separators. */
unsigned char
WNT_filename_classes[] =
{
@ -87,18 +89,56 @@ WNT_filename_classes[] =
0xf8,0xf9,0xfa,0xfb, 0xfc,0xfd,0xfe,0xff,
};
/* Same as WNT_filename_classes, but do not fold `\' into `/'. */
unsigned char
OSX_filename_classes[] =
{
0x00,0x01,0x02,0x03, 0x04,0x05,0x06,0x07,
0x08,0x09,0x0a,0x0b, 0x0c,0x0d,0x0e,0x0f,
0x10,0x11,0x12,0x13, 0x14,0x15,0x16,0x17,
0x18,0x19,0x1a,0x1b, 0x1c,0x1d,0x1e,0x1f,
0x20,0x21,0x22,0x23, 0x24,0x25,0x26,0x27,
0x28,0x29,0x2a,0x2b, 0x2c,0x2d,0x2e,0x2f,
0x30,0x31,0x32,0x33, 0x34,0x35,0x36,0x37,
0x38,0x39,0x3a,0x3b, 0x3c,0x3d,0x3e,0x3f,
0x40,0x61,0x62,0x63, 0x64,0x65,0x66,0x67,
0x68,0x69,0x6a,0x6b, 0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73, 0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x5b, 0x2f,0x5d,0x5e,0x5f,
0x60,0x61,0x62,0x63, 0x64,0x65,0x66,0x67,
0x68,0x69,0x6a,0x6b, 0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73, 0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x7b, 0x7c,0x7d,0x7e,0x7f,
0x80,0x81,0x82,0x83, 0x84,0x85,0x86,0x87,
0x88,0x89,0x8a,0x8b, 0x8c,0x8d,0x8e,0x8f,
0x90,0x91,0x92,0x93, 0x94,0x95,0x96,0x97,
0x98,0x99,0x9a,0x9b, 0x9c,0x9d,0x9e,0x9f,
0xa0,0xa1,0xa2,0xa3, 0xa4,0xa5,0xa6,0xa7,
0xa8,0xa9,0xaa,0xab, 0xac,0xad,0xae,0xaf,
0xb0,0xb1,0xb2,0xb3, 0xb4,0xb5,0xb6,0xb7,
0xb8,0xb9,0xba,0xbb, 0xbc,0xbd,0xbe,0xbf,
0xc0,0xc1,0xc2,0xc3, 0xc4,0xc5,0xc6,0xc7,
0xc8,0xc9,0xca,0xcb, 0xcc,0xcd,0xce,0xcf,
0xd0,0xd1,0xd2,0xd3, 0xd4,0xd5,0xd6,0xd7,
0xd8,0xd9,0xda,0xdb, 0xdc,0xdd,0xde,0xdf,
0xe0,0xe1,0xe2,0xe3, 0xe4,0xe5,0xe6,0xe7,
0xe8,0xe9,0xea,0xeb, 0xec,0xed,0xee,0xef,
0xf0,0xf1,0xf2,0xf3, 0xf4,0xf5,0xf6,0xf7,
0xf8,0xf9,0xfa,0xfb, 0xfc,0xfd,0xfe,0xff,
};
/* Like strcmp, but with the appropriate tweaks for file names.
Under Windows NT, filenames are case-insensitive but case-preserving,
and both \ and / are path element separators. */
and both \ and / are path element separators. Under Mac OS X, filenames
are case-insensitive but case-preserving. */
int
fncmp (const char *n1, const char *n2)
{
while (*n1 && *n2
&& (WNT_filename_classes[(unsigned char) *n1]
== WNT_filename_classes[(unsigned char) *n2]))
&& (FOLD_FN_CHAR(*n1)
== FOLD_FN_CHAR(*n2)))
n1++, n2++;
return (WNT_filename_classes[(unsigned char) *n1]
- WNT_filename_classes[(unsigned char) *n2]);
return (FOLD_FN_CHAR(*n1) - FOLD_FN_CHAR(*n2));
}
/* Fold characters in FILENAME to their canonical forms.

View file

@ -175,9 +175,27 @@ item : time {
| rel {
yyHaveRel++;
}
| cvsstamp {
yyHaveTime++;
yyHaveDate++;
yyHaveZone++;
}
| number
;
cvsstamp: tUNUMBER '.' tUNUMBER '.' tUNUMBER '.' tUNUMBER '.' tUNUMBER '.' tUNUMBER {
yyYear = $1;
if (yyYear < 100) yyYear += 1900;
yyMonth = $3;
yyDay = $5;
yyHour = $7;
yyMinutes = $9;
yySeconds = $11;
yyDSTmode = DSToff;
yyTimezone = 0;
}
;
time : tUNUMBER tMERIDIAN {
yyHour = $1;
yyMinutes = 0;

106
contrib/cvs/lib/getpass.c Normal file
View file

@ -0,0 +1,106 @@
/* Copyright (C) 1992,93,94,95,96,97,98,99,2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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. */
#if HAVE_CONFIG_H
# include <config.h>
#endif
#include <stdio.h>
#ifndef SEEK_CUR
#define SEEK_CUR 1
#endif
#include <termios.h>
#include <unistd.h>
#include "getline.h"
/* It is desirable to use this bit on systems that have it.
The only bit of terminal state we want to twiddle is echoing, which is
done in software; there is no need to change the state of the terminal
hardware. */
#ifndef TCSASOFT
# define TCSASOFT 0
#endif
char *
getpass (const char *prompt)
{
FILE *in, *out;
struct termios s, t;
int tty_changed;
static char *buf;
static size_t bufsize;
ssize_t nread;
/* Try to write to and read from the terminal if we can.
If we can't open the terminal, use stderr and stdin. */
in = fopen ("/dev/tty", "w+");
if (in == NULL)
{
in = stdin;
out = stderr;
}
else
out = in;
/* Turn echoing off if it is on now. */
if (tcgetattr (fileno (in), &t) == 0)
{
/* Save the old one. */
s = t;
/* Tricky, tricky. */
t.c_lflag &= ~(ECHO|ISIG);
tty_changed = (tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &t) == 0);
}
else
tty_changed = 0;
/* Write the prompt. */
fputs (prompt, out);
fflush (out);
/* Read the password. */
nread = getline (&buf, &bufsize, in);
if (buf != NULL)
{
if (nread < 0)
buf[0] = '\0';
else if (buf[nread - 1] == '\n')
{
/* Remove the newline. */
buf[nread - 1] = '\0';
if (tty_changed)
{
/* Write the newline that was not echoed. */
if (out == in) fseek (out, 0, SEEK_CUR);
putc ('\n', out);
}
}
}
/* Restore the original setting. */
if (tty_changed)
(void) tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &s);
if (in != stdin)
/* We opened the terminal; now close it. */
fclose (in);
return buf;
}

View file

@ -37,7 +37,7 @@ extern int errno;
int
mkdir (dpath, dmode)
char *dpath;
const char *dpath;
int dmode;
{
int cpid, status;

View file

@ -4001,7 +4001,7 @@ static boolean alt_match_null_string_p (),
/* Free everything we malloc. */
#ifdef MATCH_MAY_ALLOCATE
#define FREE_VAR(var) if (var) { REGEX_FREE (var); var = NULL; } else
#define FREE_VAR(var) if (var) { (void)REGEX_FREE ((void *)var); var = NULL; } else
#define FREE_VARIABLES() \
do { \
REGEX_FREE_STACK (fail_stack.stack); \

View file

@ -84,13 +84,18 @@
# endif
#endif
#if !defined(S_ISSOCK) && defined(S_IFSOCK)
# if defined(S_IFMT)
# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
# else
# define S_ISSOCK(m) ((m) & S_IFSOCK)
# endif
#endif
#ifndef S_ISSOCK
# if defined( S_IFSOCK )
# ifdef S_IFMT
# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
# else
# define S_ISSOCK(m) ((m) & S_IFSOCK)
# endif /* S_IFMT */
# elif defined( S_ISNAM )
/* SCO OpenServer 5.0.6a */
# define S_ISSOCK S_ISNAM
# endif /* !S_IFSOCK && S_ISNAM */
#endif /* !S_ISSOCK */
#if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
# if defined(S_IFMT)
@ -452,30 +457,65 @@ extern int errno;
#define CVS_FNMATCH fnmatch
#endif
#if defined (__CYGWIN32__) || defined (WIN32)
#ifdef WIN32
/*
* According to GNU conventions, we should avoid referencing any macro
* containing "WIN" as a reference to Microsoft Windows, as we would like to
* avoid any implication that we consider Microsoft Windows any sort of "win".
*
* FIXME: As of 2003-06-09, folks on the GNULIB project were discussing
* defining a configure macro to define WOE32 appropriately. If they ever do
* write such a beast, we should use it, though in most cases it would be
* preferable to avoid referencing any OS or compiler anyhow, per Autoconf
* convention, and reference only tested features of the system.
*/
# define WOE32 1
#endif /* WIN32 */
/* Under Windows NT, filenames are case-insensitive, and both / and \
are path component separators. */
#define FOLD_FN_CHAR(c) (WNT_filename_classes[(unsigned char) (c)])
#ifdef WOE32
/* Under Windows NT, filenames are case-insensitive. */
# define FILENAMES_CASE_INSENSITIVE 1
#endif /* WOE32 */
#ifdef FILENAMES_CASE_INSENSITIVE
# if defined (__CYGWIN32__) || defined (WOE32)
/* Under Windows NT, 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[];
#define FILENAMES_CASE_INSENSITIVE 1
/* Is the character C a path name separator? Under
Windows NT, you can use either / or \. */
# 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,
* 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.
*
* Under Mac OS X & Cygwin, filenames are case-insensitive.
*/
# define FOLD_FN_CHAR(c) (OSX_filename_classes[(unsigned char) (c)])
extern unsigned char OSX_filename_classes[];
# endif /* __CYGWIN32__ || WOE32 */
/* Is the character C a path name separator? Under
Windows NT, you can use either / or \. */
#define ISDIRSEP(c) (FOLD_FN_CHAR(c) == '/')
/* The following need to be declared for all case insensitive filesystems.
* When not FOLD_FN_CHAR is not #defined, a default definition for these
* functions is provided later in this header file. */
/* Like strcmp, but with the appropriate tweaks for file names.
Under Windows NT, filenames are case-insensitive but case-preserving,
and both \ and / are path element separators. */
/* Like strcmp, but with the appropriate tweaks for file names. */
extern int fncmp (const char *n1, const char *n2);
/* Fold characters in FILENAME to their canonical forms.
If FOLD_FN_CHAR is not #defined, the system provides a default
definition for this. */
/* Fold characters in FILENAME to their canonical forms. */
extern void fnfold (char *FILENAME);
#endif /* defined (__CYGWIN32__) || defined (WIN32) */
#endif /* FILENAMES_CASE_INSENSITIVE */
/* Some file systems are case-insensitive. If FOLD_FN_CHAR is
#defined, it maps the character C onto its "canonical" form. In a
@ -483,15 +523,22 @@ extern void fnfold (char *FILENAME);
to lower case. Under Windows NT, / and \ are both path component
separators, so FOLD_FN_CHAR would map them both to /. */
#ifndef FOLD_FN_CHAR
#define FOLD_FN_CHAR(c) (c)
#define fnfold(filename) (filename)
#define fncmp strcmp
# define FOLD_FN_CHAR(c) (c)
# define fnfold(filename) (filename)
# define fncmp strcmp
#endif
/* Different file systems have different path component separators.
For the VMS port we might need to abstract further back than this. */
#ifndef ISDIRSEP
#define ISDIRSEP(c) ((c) == '/')
# define ISDIRSEP(c) ((c) == '/')
#endif
/* Different file systems can have different naming patterns which designate
* a path as absolute
*/
#ifndef ISABSOLUTE
# define ISABSOLUTE(s) ISDIRSEP(s[0])
#endif

View file

@ -27,6 +27,9 @@
#ifndef WIFEXITED
#define WIFEXITED(w) (((w) & 0xff) == 0)
#endif
#ifndef WCOREDUMP /* not POSIX, but common and useful */
#define WCOREDUMP(w) (((w) & 0x80) != 0)
#endif
#ifndef WSTOPSIG
#define WSTOPSIG(w) (((w) >> 8) & 0xff)

View file

@ -1,3 +1,51 @@
2004-02-12 Derek Price <derek@ximbiot.com>
Close issue #162.
* cvs.1: Remove references to the removed global -l option.
(Original patch from Ville Skyttä <scop@cvshome.org>.)
2004-02-12 Derek Price <derek@ximbiot.com>
Close issue #161.
* cvs.1, cvs.5: A couple of spelling fixes.
(Patch from Ville Skyttä <scop@cvshome.org>.)
2004-01-30 Derek Price <derek@ximbiot.com>
Close issue #146.
* cvs.1: Reference `cvs --help diff' rather than the rcsdiff man page.
Use consistent spelling of `initialization'.
(Patch from Ville Skyttä <scop@cvshome.org>.)
2003-05-21 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerate with Automake version 1.7.5.
2003-04-10 Larry Jones <lawrence.jones@eds.com>
* Makefile.in: Regenerated.
2003-03-24 Derek Price <derek@ximbiot.com>
* Makefile.am: Update copyright notice.
* Makefile.in: Regenerated.
2003-03-05 Mark D. Baushke <mdb@cvshome.org>
* cvs.1 (CVS_LOCAL_BRANCH_NUM): Backout CVS_LOCAL_BRANCH_NUM feature.
* cvs.1 (CVS_LOCAL_BRANCH_NUM): Document new environment variable.
2003-02-26 Larry Jones <lawrence.jones@eds.com>
* cvs.1: Note using "cvs" in .cvsrc for global options.
(Patch from "Mark D. Baushke" <mdb@cvshome.org>).
2003-02-25 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerated.
2002-09-24 Derek Price <derek@ximbiot.com>
* Makefile.in: Regenerated using Automake 1.6.3.

View file

@ -1,6 +1,8 @@
## Process this file with automake to produce Makefile.in
# Makefile.am for GNU CVS man pages.
# Copyright (C) 1986-1992, 2000 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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

View file

@ -1,7 +1,7 @@
# Makefile.in generated by automake 1.6.3 from Makefile.am.
# Makefile.in generated by automake 1.7.9 from Makefile.am.
# @configure_input@
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@ -15,7 +15,9 @@
@SET_MAKE@
# Makefile.am for GNU CVS man pages.
# Copyright (C) 1986-1992, 2000 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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
@ -26,79 +28,117 @@
# 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.
SHELL = @SHELL@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
transform = @program_transform_name@
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
EXEEXT = @EXEEXT@
OBJEXT = @OBJEXT@
PATH_SEPARATOR = @PATH_SEPARATOR@
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSH = @CSH@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EDITOR = @EDITOR@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
KRB4 = @KRB4@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MAKE_TARGETS_IN_VPATH_FALSE = @MAKE_TARGETS_IN_VPATH_FALSE@
MAKE_TARGETS_IN_VPATH_TRUE = @MAKE_TARGETS_IN_VPATH_TRUE@
MKTEMP = @MKTEMP@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PR = @PR@
PS2PDF = @PS2PDF@
RANLIB = @RANLIB@
ROFF = @ROFF@
SENDMAIL = @SENDMAIL@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TEXI2DVI = @TEXI2DVI@
VERSION = @VERSION@
YACC = @YACC@
ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
ac_prefix_program = @ac_prefix_program@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
bindir = @bindir@
build_alias = @build_alias@
datadir = @datadir@
exec_prefix = @exec_prefix@
host_alias = @host_alias@
includedir = @includedir@
includeopt = @includeopt@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
man_MANS = cvs.1 cvs.5 cvsbug.8
EXTRA_DIST = \
@ -106,6 +146,7 @@ EXTRA_DIST = \
$(man_MANS)
subdir = man
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
@ -113,14 +154,14 @@ DIST_SOURCES =
NROFF = nroff
MANS = $(man_MANS)
DIST_COMMON = ChangeLog Makefile.am Makefile.in
DIST_COMMON = $(srcdir)/Makefile.in ChangeLog Makefile.am
all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu man/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
uninstall-info-am:
@ -160,6 +201,10 @@ uninstall-man1:
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; \
@ -203,6 +248,10 @@ uninstall-man5:
done; \
for i in $$list; do \
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
case "$$ext" in \
5*) ;; \
*) ext='5' ;; \
esac; \
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
inst=`echo $$inst | sed -e 's/^.*\///'`; \
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
@ -246,6 +295,10 @@ uninstall-man8:
done; \
for i in $$list; do \
ext=`echo $$i | sed -e 's/^.*\\.//'`; \
case "$$ext" in \
8*) ;; \
*) ext='8' ;; \
esac; \
inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
inst=`echo $$inst | sed -e 's/^.*\///'`; \
inst=`echo $$inst | sed '$(transform)'`.$$ext; \
@ -255,13 +308,22 @@ uninstall-man8:
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
top_distdir = ..
distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
distdir: $(DISTFILES)
@list='$(DISTFILES)'; for file in $$list; do \
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
@ -287,7 +349,6 @@ all-am: Makefile $(MANS)
installdirs:
$(mkinstalldirs) $(DESTDIR)$(man1dir) $(DESTDIR)$(man5dir) $(DESTDIR)$(man8dir)
install: install-am
install-exec: install-exec-am
install-data: install-data-am
@ -299,7 +360,7 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
INSTALL_STRIP_FLAG=-s \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
@ -307,7 +368,7 @@ mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES)
-rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@ -317,7 +378,7 @@ clean: clean-am
clean-am: clean-generic mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic
dvi: dvi-am
@ -339,13 +400,21 @@ install-man: install-man1 install-man5 install-man8
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am uninstall-man
uninstall-man: uninstall-man1 uninstall-man5 uninstall-man8
@ -356,9 +425,9 @@ uninstall-man: uninstall-man1 uninstall-man5 uninstall-man8
install-exec-am install-info install-info-am install-man \
install-man1 install-man5 install-man8 install-strip \
installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic \
uninstall uninstall-am uninstall-info-am uninstall-man \
uninstall-man1 uninstall-man5 uninstall-man8
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
# for backwards compatibility with the old makefiles

View file

@ -208,14 +208,6 @@ Do not read the
.B cvs
startup file (\fI~/.cvsrc\fP).
.TP
.B \-l
Do not log the
.I cvs_command
in the command history (but execute it anyway). See the description
of the
.B history
command for information on command history.
.TP
.B \-n
Do not change any files. Attempt to execute the
.IR cvs_command ,
@ -297,6 +289,15 @@ it will have the effect of producing context sensitive diffs for
all executions of
.` "cvs diff"
).
.SP
Global options are specified using the \fBcvs\fP keyword. For example,
the following:
.SP
cvs \-q
.SP
will mean that all
.` "cvs"
commands will behave as thought he \-q global option had been supplied.
.SH "CVS COMMAND SUMMARY"
Here are brief descriptions of all the
.B cvs
@ -510,15 +511,6 @@ subdirectories. Available with the following commands:
.BR checkout ", " commit ", " diff ", "
.BR export ", " remove ", " rdiff ", " rtag ", "
.BR status ", " tag ", and " update .
.I Warning:
this is not the same
as the overall
.` "cvs \-l"
option, which you can specify to the
.I left
of a
.B cvs
command!
.TP
.B \-n
Do
@ -1046,7 +1038,7 @@ Others would simply do
.` "cvs checkout -rEXPR1 whatever_module"
to work with you on the experimental change.
.TP
\fBdiff\fP [\fB\-kl\fP] [\fIrcsdiff_options\fP] [[\fB\-r\fP \fIrev1\fP | \fB\-D\fP \fIdate1\fP] [\fB\-r\fP \fIrev2\fP | \fB\-D\fP \fIdate2\fP]] [\fIfiles.\|.\|.\fP]
\fBdiff\fP [\fB\-kl\fP] [\fIformat_options\fP] [[\fB\-r\fP \fIrev1\fP | \fB\-D\fP \fIdate1\fP] [\fB\-r\fP \fIrev2\fP | \fB\-D\fP \fIdate2\fP]] [\fIfiles.\|.\|.\fP]
.I Requires:
working directory, repository.
.br
@ -1077,8 +1069,9 @@ and
options can be mixed together with at most two options ever specified.
.SP
See
.BR rcsdiff ( 1 )
for a list of other accepted options.
.` "cvs --help diff"
for a list of supported
.IR format_options .
.SP
If you don't specify any files,
.B diff
@ -1409,7 +1402,7 @@ is able to find the files that are located in other directories.
.SP
The standard option \fIflags\fP \fB\-f\fP, and \fB\-l\fP
are available with this command. There are also several
special options flags:
special option flags:
.SP
If you use the
.B \-s
@ -1878,7 +1871,7 @@ Files in home directories:
\&.cvsrc
The
.B cvs
initialisation file. Lines in this file can be used to specify default
initialization file. Lines in this file can be used to specify default
options for each
.B cvs
command. For example the line

View file

@ -284,7 +284,7 @@ containing the logging forms) rather than command templates.
The `\|editinfo\|' file allows you to execute a script \fIbefore the
commit starts\fP, but after the log information is recorded. These
"edit" scripts can verify information recorded in the log file. If
the edit script exits wth a non-zero exit status, the commit is aborted.
the edit script exits with a non-zero exit status, the commit is aborted.
.SP
The `\|loginfo\|' file contains commands to execute \fIat the end\fP
of a commit. The text specified as a commit log message is piped

39
contrib/cvs/mktemp.sh Normal file
View file

@ -0,0 +1,39 @@
# mktemp
# Copyright (c) Derek Price, Ximbiot <http://ximbiot.com>, and the
# Free Software Foundation, Inc. <http://gnu.org>
# 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.
# This Bourne Shell scriptlet is intended as a simple replacement for
# the BSD mktemp function for systems that do not support mktemp. It
# currently does not check that the files it is creating did not exist
# previously and it does not verify that it successfully creates the
# files it returns the names of.
mktemp() {
if test x"$1" = x-d; then
tmp=`echo $2 |sed "s/XXXXXX/$$/"`
(umask 077 && exec mkdir $tmp) || return 1
else
tmp=`echo $1 |sed "s/XXXXXX/$$/"`
(umask 077 && touch $tmp) || return 1
fi
echo $tmp
return 0
}

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,8 @@
## Process this file with automake to produce Makefile.in
# Makefile for GNU CVS program.
# Copyright (C) 1986, 1988-1990, 2000 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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
@ -71,6 +73,7 @@ cvs_SOURCES = \
run.c \
scramble.c \
server.c \
stack.c \
status.c \
subr.c \
tag.c \
@ -88,10 +91,12 @@ cvs_SOURCES = \
fileattr.h \
hardlink.h \
hash.h \
history.h \
myndbm.h \
rcs.h \
root.h \
server.h \
stack.h \
update.h \
watch.h
@ -118,11 +123,11 @@ check-local: localcheck remotecheck
.PHONY: localcheck
localcheck:
$(SHELL) $(srcdir)/sanity.sh `pwd`/cvs
$(SHELL) $(srcdir)/sanity.sh `pwd`/cvs$(EXEEXT)
.PHONY: remotecheck
remotecheck: all
$(SHELL) $(srcdir)/sanity.sh -r `pwd`/cvs
$(SHELL) $(srcdir)/sanity.sh -r `pwd`/cvs$(EXEEXT)
## MAINTAINER Targets

View file

@ -1,7 +1,7 @@
# Makefile.in generated by automake 1.6.3 from Makefile.am.
# Makefile.in generated by automake 1.7.9 from Makefile.am.
# @configure_input@
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
# Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@ -15,7 +15,9 @@
@SET_MAKE@
# Makefile for GNU CVS program.
# Copyright (C) 1986, 1988-1990, 2000 Free Software Foundation, Inc.
# Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
# 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 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
@ -30,76 +32,114 @@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
sbindir = @sbindir@
libexecdir = @libexecdir@
datadir = @datadir@
sysconfdir = @sysconfdir@
sharedstatedir = @sharedstatedir@
localstatedir = @localstatedir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@
includedir = @includedir@
oldincludedir = /usr/include
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
ACLOCAL = @ACLOCAL@
AUTOCONF = @AUTOCONF@
AUTOMAKE = @AUTOMAKE@
AUTOHEADER = @AUTOHEADER@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_HEADER = $(INSTALL_DATA)
transform = @program_transform_name@
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
EXEEXT = @EXEEXT@
OBJEXT = @OBJEXT@
PATH_SEPARATOR = @PATH_SEPARATOR@
SHELL = /bin/sh
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CSH = @CSH@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EDITOR = @EDITOR@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
KRB4 = @KRB4@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
MAKEINFO = @MAKEINFO@
MAKE_TARGETS_IN_VPATH_FALSE = @MAKE_TARGETS_IN_VPATH_FALSE@
MAKE_TARGETS_IN_VPATH_TRUE = @MAKE_TARGETS_IN_VPATH_TRUE@
MKTEMP = @MKTEMP@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PR = @PR@
PS2PDF = @PS2PDF@
RANLIB = @RANLIB@
ROFF = @ROFF@
SENDMAIL = @SENDMAIL@
SET_MAKE = @SET_MAKE@
SHELL = /bin/sh
STRIP = @STRIP@
TEXI2DVI = @TEXI2DVI@
VERSION = @VERSION@
YACC = @YACC@
ac_ct_CC = @ac_ct_CC@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
ac_prefix_program = @ac_prefix_program@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
bindir = @bindir@
build_alias = @build_alias@
datadir = @datadir@
exec_prefix = @exec_prefix@
host_alias = @host_alias@
includedir = @includedir@
includeopt = @includeopt@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
# $(includeopt) is CVS specific and set by configure
# FIXME - This includes line is dependant on its order. This means there is
@ -157,6 +197,7 @@ cvs_SOURCES = \
run.c \
scramble.c \
server.c \
stack.c \
status.c \
subr.c \
tag.c \
@ -174,10 +215,12 @@ cvs_SOURCES = \
fileattr.h \
hardlink.h \
hash.h \
history.h \
myndbm.h \
rcs.h \
root.h \
server.h \
stack.h \
update.h \
watch.h
@ -203,6 +246,7 @@ EXTRA_DIST = \
sanity.sh
subdir = src
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES = cvsbug
@ -223,20 +267,17 @@ am_cvs_OBJECTS = add.$(OBJEXT) admin.$(OBJEXT) annotate.$(OBJEXT) \
patch.$(OBJEXT) rcs.$(OBJEXT) rcscmds.$(OBJEXT) \
recurse.$(OBJEXT) release.$(OBJEXT) remove.$(OBJEXT) \
repos.$(OBJEXT) root.$(OBJEXT) run.$(OBJEXT) scramble.$(OBJEXT) \
server.$(OBJEXT) status.$(OBJEXT) subr.$(OBJEXT) tag.$(OBJEXT) \
update.$(OBJEXT) version.$(OBJEXT) vers_ts.$(OBJEXT) \
watch.$(OBJEXT) wrapper.$(OBJEXT) zlib.$(OBJEXT)
server.$(OBJEXT) stack.$(OBJEXT) status.$(OBJEXT) \
subr.$(OBJEXT) tag.$(OBJEXT) update.$(OBJEXT) version.$(OBJEXT) \
vers_ts.$(OBJEXT) watch.$(OBJEXT) wrapper.$(OBJEXT) \
zlib.$(OBJEXT)
cvs_OBJECTS = $(am_cvs_OBJECTS)
cvs_DEPENDENCIES = ../diff/libdiff.a ../lib/libcvs.a ../zlib/libz.a
cvs_LDFLAGS =
SCRIPTS = $(bin_SCRIPTS)
DEFS = @DEFS@
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/add.Po ./$(DEPDIR)/admin.Po \
@ -261,28 +302,28 @@ am__depfiles_maybe = depfiles
@AMDEP_TRUE@ ./$(DEPDIR)/release.Po ./$(DEPDIR)/remove.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/repos.Po ./$(DEPDIR)/root.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/run.Po ./$(DEPDIR)/scramble.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/server.Po ./$(DEPDIR)/status.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/subr.Po ./$(DEPDIR)/tag.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/update.Po ./$(DEPDIR)/vers_ts.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/version.Po ./$(DEPDIR)/watch.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/wrapper.Po ./$(DEPDIR)/zlib.Po
@AMDEP_TRUE@ ./$(DEPDIR)/server.Po ./$(DEPDIR)/stack.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/status.Po ./$(DEPDIR)/subr.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/tag.Po ./$(DEPDIR)/update.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/vers_ts.Po ./$(DEPDIR)/version.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/watch.Po ./$(DEPDIR)/wrapper.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/zlib.Po
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
CFLAGS = @CFLAGS@
DIST_SOURCES = $(cvs_SOURCES)
DIST_COMMON = ChangeLog Makefile.am Makefile.in cvsbug.in
DIST_COMMON = $(srcdir)/Makefile.in ChangeLog Makefile.am cvsbug.in
SOURCES = $(cvs_SOURCES)
all: all-am
.SUFFIXES:
.SUFFIXES: .c .o .obj
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu src/Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
cvsbug: $(top_builddir)/config.status cvsbug.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
@ -296,7 +337,7 @@ install-binPROGRAMS: $(bin_PROGRAMS)
; then \
f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \
$(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f; \
$(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f || exit 1; \
else :; fi; \
done
@ -385,6 +426,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scramble.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/status.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subr.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag.Po@am__quote@
@ -395,26 +437,35 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wrapper.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlib.Po@am__quote@
distclean-depend:
-rm -rf ./$(DEPDIR)
.c.o:
@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
@am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
@am__fastdepCC_TRUE@ fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
.c.obj:
@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
$(COMPILE) -c `cygpath -w $<`
CCDEPMODE = @CCDEPMODE@
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
@am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
@am__fastdepCC_TRUE@ fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
uninstall-info-am:
ETAGS = etags
ETAGSFLAGS =
CTAGS = ctags
CTAGSFLAGS =
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
@ -440,20 +491,41 @@ TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|| $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique
ctags: CTAGS
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
top_distdir = ..
distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
distdir: $(DISTFILES)
@list='$(DISTFILES)'; for file in $$list; do \
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
@ -480,7 +552,6 @@ all-am: Makefile $(PROGRAMS) $(SCRIPTS)
installdirs:
$(mkinstalldirs) $(DESTDIR)$(bindir) $(DESTDIR)$(bindir)
install: install-am
install-exec: install-exec-am
install-data: install-data-am
@ -492,7 +563,7 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
INSTALL_STRIP_FLAG=-s \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
@ -500,7 +571,7 @@ mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f Makefile $(CONFIG_CLEAN_FILES)
-rm -f $(CONFIG_CLEAN_FILES)
-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
maintainer-clean-generic:
@ -511,9 +582,10 @@ clean: clean-am
clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
distclean: distclean-am
distclean-am: clean-am distclean-compile distclean-depend \
distclean-generic distclean-tags
-rm -rf ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-tags
dvi: dvi-am
@ -534,38 +606,47 @@ install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -rf ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
uninstall-info-am
.PHONY: GTAGS all all-am check check-am check-local clean \
clean-binPROGRAMS clean-generic distclean distclean-compile \
distclean-depend distclean-generic distclean-tags distdir dvi \
.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
clean-binPROGRAMS clean-generic ctags distclean \
distclean-compile distclean-generic distclean-tags distdir dvi \
dvi-am info info-am install install-am install-binPROGRAMS \
install-binSCRIPTS 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-generic mostlyclean \
mostlyclean-compile mostlyclean-generic tags uninstall \
uninstall-am uninstall-binPROGRAMS uninstall-binSCRIPTS \
uninstall-info-am
mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
tags uninstall uninstall-am uninstall-binPROGRAMS \
uninstall-binSCRIPTS uninstall-info-am
check-local: localcheck remotecheck
.PHONY: localcheck
localcheck:
$(SHELL) $(srcdir)/sanity.sh `pwd`/cvs
$(SHELL) $(srcdir)/sanity.sh `pwd`/cvs$(EXEEXT)
.PHONY: remotecheck
remotecheck: all
$(SHELL) $(srcdir)/sanity.sh -r `pwd`/cvs
$(SHELL) $(srcdir)/sanity.sh -r `pwd`/cvs$(EXEEXT)
# for backwards compatibility with the old makefiles
.PHONY: realclean

View file

@ -24,13 +24,15 @@
* file to be resurrected.
*/
#include <assert.h>
#include "cvs.h"
#include "savecwd.h"
#include "fileattr.h"
static int add_directory PROTO ((struct file_info *finfo));
static int build_entry PROTO((char *repository, char *user, char *options,
char *message, List * entries, char *tag));
static int build_entry PROTO((const char *repository, const char *user,
const char *options, const char *message,
List * entries, const char *tag));
static const char *const add_usage[] =
{
@ -150,7 +152,7 @@ add (argc, argv)
#ifdef CLIENT_SUPPORT
if (current_parsed_root->isremote)
{
int i;
int j;
if (argc == 0)
/* We snipped out all the arguments in the above sanity
@ -180,7 +182,7 @@ add (argc, argv)
free (repository);
}
for (i = 0; i < argc; ++i)
for (j = 0; j < argc; ++j)
{
/* FIXME: Does this erroneously call Create_Admin in error
conditions which are only detected once the server gets its
@ -195,7 +197,7 @@ add (argc, argv)
"Directory %s added" message), and then Create_Admin,
which should also fix the error handling concerns. */
if (isdir (argv[i]))
if (isdir (argv[j]))
{
char *tag;
char *date;
@ -210,8 +212,11 @@ add (argc, argv)
if (save_cwd (&cwd))
error_exit ();
filedir = xstrdup (argv[i]);
p = last_component (filedir);
filedir = xstrdup (argv[j]);
/* Deliberately discard the const below since we know we just
* allocated filedir and can do what we like with it.
*/
p = (char *)last_component (filedir);
if (p == filedir)
{
update_dir = "";
@ -246,7 +251,7 @@ add (argc, argv)
rcsdir = xmalloc (strlen (repository) + strlen (p) + 5);
sprintf (rcsdir, "%s/%s", repository, p);
Create_Admin (p, argv[i], rcsdir, tag, date,
Create_Admin (p, argv[j], rcsdir, tag, date,
nonbranch, 0, 1);
if (found_slash)
@ -263,7 +268,7 @@ add (argc, argv)
free (rcsdir);
if (p == filedir)
Subdir_Register ((List *) NULL, (char *) NULL, argv[i]);
Subdir_Register ((List *) NULL, (char *) NULL, argv[j]);
else
{
Subdir_Register ((List *) NULL, update_dir, p);
@ -289,10 +294,7 @@ add (argc, argv)
int begin_added_files = added_files;
#endif
struct file_info finfo;
char *p;
#if defined (SERVER_SUPPORT) && !defined (FILENAMES_CASE_INSENSITIVE)
char *found_name;
#endif
char *filename, *p;
memset (&finfo, 0, sizeof finfo);
@ -300,8 +302,12 @@ add (argc, argv)
error_exit ();
finfo.fullname = xstrdup (argv[i]);
p = last_component (argv[i]);
if (p == argv[i])
filename = xstrdup (argv[i]);
/* We know we can discard the const below since we just allocated
* filename and can do as we like with it.
*/
p = (char *)last_component (filename);
if (p == filename)
{
finfo.update_dir = "";
finfo.file = p;
@ -309,7 +315,7 @@ add (argc, argv)
else
{
p[-1] = '\0';
finfo.update_dir = argv[i];
finfo.update_dir = filename;
finfo.file = p;
if (CVS_CHDIR (finfo.update_dir) < 0)
error (1, errno, "could not chdir to %s", finfo.update_dir);
@ -325,7 +331,8 @@ add (argc, argv)
repository = Name_Repository (NULL, finfo.update_dir);
/* don't add stuff to Emptydir */
if (strncmp (repository, current_parsed_root->directory, cvsroot_len) == 0
if (strncmp (repository, current_parsed_root->directory,
cvsroot_len) == 0
&& ISDIRSEP (repository[cvsroot_len])
&& strncmp (repository + cvsroot_len + 1,
CVSROOTADM,
@ -340,65 +347,12 @@ add (argc, argv)
finfo.repository = repository;
finfo.entries = entries;
#if defined (SERVER_SUPPORT) && !defined (FILENAMES_CASE_INSENSITIVE)
if (ign_case)
{
/* Need to check whether there is a directory with the
same name but different case. We'll check for files
with the same name later (when Version_TS calls
RCS_parse which calls fopen_case). If CVS some day
records directories in the RCS files, then we should be
able to skip the separate check here, which would be
cleaner. */
DIR *dirp;
struct dirent *dp;
dirp = CVS_OPENDIR (finfo.repository);
if (dirp == NULL)
error (1, errno, "cannot read directory %s", finfo.repository);
found_name = NULL;
errno = 0;
while ((dp = CVS_READDIR (dirp)) != NULL)
{
if (cvs_casecmp (dp->d_name, finfo.file) == 0)
{
if (found_name != NULL)
error (1, 0, "%s is ambiguous; could mean %s or %s",
finfo.file, dp->d_name, found_name);
found_name = xstrdup (dp->d_name);
}
}
if (errno != 0)
error (1, errno, "cannot read directory %s", finfo.repository);
CVS_CLOSEDIR (dirp);
if (found_name != NULL)
{
/* OK, we are about to patch up the name, so patch up
the temporary directory too to match. The isdir
should "always" be true (since files have ,v), but
I guess we might as well make some attempt to not
get confused by stray files in the repository. */
if (isdir (finfo.file))
{
if (CVS_MKDIR (found_name, 0777) < 0
&& errno != EEXIST)
error (0, errno, "cannot create %s", finfo.file);
}
/* OK, we found a directory with the same name, maybe in
a different case. Treat it as if the name were the
same. */
finfo.file = found_name;
}
}
#endif
/* We pass force_tag_match as 1. If the directory has a
sticky branch tag, and there is already an RCS file which
does not have that tag, then the head revision is
meaningless to us. */
vers = Version_TS (&finfo, options, NULL, NULL, 1, 0);
if (vers->vn_user == NULL)
{
/* No entry available, ts_rcs is invalid */
@ -507,24 +461,90 @@ same name already exists in the repository.");
}
else
{
char *timestamp = NULL;
if (vers->ts_user == NULL)
{
/* If this file does not exist locally, assume that
* the last version on the branch is being
* resurrected.
*
* Compute previous revision. We assume that it
* exists and that it is not a revision on the
* trunk of the form X.1 (1.1, 2.1, 3.1, ...). We
* also assume that it is not dead, which seems
* fair since we know vers->vn_rcs is dead
* and we shouldn't see two dead revisions in a
* row.
*/
char *prev = previous_rev (vers->srcfile,
vers->vn_rcs);
int status;
assert (prev != NULL);
if (!quiet)
error (0, 0,
"Resurrecting file `%s' from revision %s.",
finfo.fullname, prev);
status = RCS_checkout (vers->srcfile, finfo.file,
prev, vers->tag,
vers->options, RUN_TTY,
NULL, NULL);
xchmod (finfo.file, 1);
if (status != 0)
{
error (0, 0, "Failed to resurrect revision %s",
prev);
err++;
}
else
{
/* I don't actually set vers->ts_user here
* because it would confuse server_update().
*/
timestamp = time_stamp (finfo.file);
if (!really_quiet)
write_letter (&finfo, 'U');
}
free (prev);
}
if (!quiet)
{
if (vers->tag)
error (0, 0, "\
file `%s' will be added on branch `%s' from version %s",
finfo.fullname, vers->tag, vers->vn_rcs);
error (0, 0,
"file `%s' will be added on branch `%s' from version %s",
finfo.fullname, vers->tag,
vers->vn_rcs);
else
/* I'm not sure that mentioning
vers->vn_rcs makes any sense here; I
can't think of a way to word the
message which is not confusing. */
error (0, 0, "\
re-adding file %s (in place of dead revision %s)",
finfo.fullname, vers->vn_rcs);
error (0, 0,
"Re-adding file `%s' (in place of dead revision %s).",
finfo.fullname, vers->vn_rcs);
}
Register (entries, finfo.file, "0", vers->ts_user,
vers->options,
vers->tag, NULL, NULL);
Register (entries, finfo.file, "0",
timestamp ? timestamp : vers->ts_user,
vers->options, vers->tag, vers->date, NULL);
if (timestamp) free (timestamp);
#ifdef SERVER_SUPPORT
if (server_active && vers->ts_user == NULL)
{
/* If we resurrected the file from the archive, we
* need to tell the client about it.
*/
server_updated (&finfo, vers,
SERVER_UPDATED,
(mode_t) -1, NULL, NULL);
/* This is kinda hacky or, at least, it renders the
* name "begin_added_files" obsolete, but we want
* the added_files to be counted without triggering
* the check that causes server_checked_in() to be
* called below since we have already called
* server_updated() to complete the resurrection.
*/
++begin_added_files;
}
#endif
++added_files;
}
}
@ -570,36 +590,56 @@ cannot resurrect %s; RCS file removed by second party", finfo.fullname);
}
else
{
int status;
/*
* There is an RCS file, so remove the "-" from the
* version number and restore the file
*/
char *tmp = xmalloc (strlen (finfo.file) + 50);
char *tmp = xmalloc (strlen (vers->vn_user));
(void) strcpy (tmp, vers->vn_user + 1);
(void) strcpy (vers->vn_user, tmp);
(void) sprintf (tmp, "Resurrected %s", finfo.file);
Register (entries, finfo.file, vers->vn_user, tmp,
vers->options,
vers->tag, vers->date, vers->ts_conflict);
free (tmp);
/* XXX - bugs here; this really resurrect the head */
/* Note that this depends on the Register above actually
having written Entries, or else it won't really
check the file out. */
if (update (2, argv + i - 1) == 0)
free(tmp);
status = RCS_checkout (vers->srcfile, finfo.file,
vers->vn_user, vers->tag,
vers->options, RUN_TTY,
NULL, NULL);
xchmod (finfo.file, 1);
if (status != 0)
{
error (0, 0, "%s, version %s, resurrected",
finfo.fullname,
error (0, 0, "Failed to resurrect revision %s",
vers->vn_user);
err++;
tmp = NULL;
}
else
{
error (0, 0, "could not resurrect %s", finfo.fullname);
err++;
/* I don't actually set vers->ts_user here because it
* would confuse server_update().
*/
tmp = time_stamp (finfo.file);
write_letter (&finfo, 'U');
if (!quiet)
error (0, 0, "%s, version %s, resurrected",
finfo.fullname, vers->vn_user);
}
Register (entries, finfo.file, vers->vn_user,
tmp, vers->options,
vers->tag, vers->date, NULL);
if (tmp) free (tmp);
#ifdef SERVER_SUPPORT
if (server_active)
{
/* If we resurrected the file from the archive, we
* need to tell the client about it.
*/
server_updated (&finfo, vers,
SERVER_UPDATED,
(mode_t) -1, NULL, NULL);
}
/* We don't increment added_files here because this isn't
* a change that needs to be committed.
*/
#endif
}
}
else
@ -642,11 +682,11 @@ cannot resurrect %s; RCS file removed by second party", finfo.fullname);
error_exit ();
free_cwd (&cwd);
free (finfo.fullname);
#if defined (SERVER_SUPPORT) && !defined (FILENAMES_CASE_INSENSITIVE)
if (ign_case && found_name != NULL)
free (found_name);
#endif
/* It's okay to discard the const to free this - we allocated this
* above. The const is for everybody else.
*/
free ((char *) finfo.fullname);
free ((char *) filename);
}
if (added_files && !really_quiet)
error (0, 0, "use '%s commit' to add %s permanently",
@ -672,9 +712,9 @@ static int
add_directory (finfo)
struct file_info *finfo;
{
char *repository = finfo->repository;
const char *repository = finfo->repository;
List *entries = finfo->entries;
char *dir = finfo->file;
const char *dir = finfo->file;
char *rcsdir = NULL;
struct saved_cwd cwd;
@ -707,11 +747,11 @@ add_directory (finfo)
/* now, remember where we were, so we can get back */
if (save_cwd (&cwd))
return (1);
if ( CVS_CHDIR (dir) < 0)
return 1;
if (CVS_CHDIR (dir) < 0)
{
error (0, errno, "cannot chdir to %s", finfo->fullname);
return (1);
return 1;
}
#ifdef SERVER_SUPPORT
if (!server_active && isfile (CVSADM))
@ -737,7 +777,8 @@ add_directory (finfo)
+ 80
+ (tag == NULL ? 0 : strlen (tag) + 80)
+ (date == NULL ? 0 : strlen (date) + 80));
(void) sprintf (message, "Directory %s added to the repository\n", rcsdir);
(void) sprintf (message, "Directory %s added to the repository\n",
rcsdir);
if (tag)
{
(void) strcat (message, "--> Using per-directory sticky tag `");
@ -799,7 +840,7 @@ add_directory (finfo)
li->type = T_TITLE;
li->tag = xstrdup (tag);
li->rev_old = li->rev_new = NULL;
p->data = (char *) li;
p->data = li;
(void) addnode (ulist, p);
Update_Logfile (rcsdir, message, (FILE *) NULL, ulist);
dellist (&ulist);
@ -820,12 +861,13 @@ add_directory (finfo)
Subdir_Register (entries, (char *) NULL, dir);
cvs_output (message, 0);
if (!really_quiet)
cvs_output (message, 0);
free (rcsdir);
free (message);
return (0);
return 0;
out:
if (restore_cwd (&cwd, NULL))
@ -836,18 +878,20 @@ out:
return (0);
}
/*
* Builds an entry for a new file and sets up "CVS/file",[pt] by
* interrogating the user. Returns non-zero on error.
*/
static int
build_entry (repository, user, options, message, entries, tag)
char *repository;
char *user;
char *options;
char *message;
const char *repository;
const char *user;
const char *options;
const char *message;
List *entries;
char *tag;
const char *tag;
{
char *fname;
char *line;

View file

@ -15,9 +15,9 @@
#endif
#include <assert.h>
static Dtype admin_dirproc PROTO ((void *callerdat, char *dir,
char *repos, char *update_dir,
List *entries));
static Dtype admin_dirproc PROTO ((void *callerdat, const char *dir,
const char *repos, const char *update_dir,
List *entries));
static int admin_fileproc PROTO ((void *callerdat, struct file_info *finfo));
static const char *const admin_usage[] =
@ -367,7 +367,7 @@ admin (argc, argv)
/* getopt will have printed an error message. */
usage_error:
/* Don't use command_name; it might be "server". */
/* Don't use cvs_cmd_name; it might be "server". */
error (1, 0, "specify %s -H admin for usage information",
program_name);
}
@ -520,7 +520,8 @@ admin (argc, argv)
err = start_recursion (admin_fileproc, (FILESDONEPROC) NULL, admin_dirproc,
(DIRLEAVEPROC) NULL, (void *)&admin_data,
argc, argv, 0,
W_LOCAL, 0, CVS_LOCK_NONE, (char *) NULL, 1);
W_LOCAL, 0, CVS_LOCK_NONE, (char *) NULL, 1,
(char *) NULL);
Lock_Cleanup ();
return_it:
@ -564,15 +565,22 @@ admin_fileproc (callerdat, finfo)
if (version != NULL && strcmp (version, "0") == 0)
{
error (0, 0, "cannot admin newly added file `%s'", finfo->file);
status = 1;
goto exitfunc;
}
rcs = vers->srcfile;
if (rcs == NULL)
{
if (!really_quiet)
error (0, 0, "nothing known about %s", finfo->file);
status = 1;
goto exitfunc;
}
if (rcs->flags & PARTIAL)
RCS_reparsercsfile (rcs, (FILE **) NULL, (struct rcsbuffer *) NULL);
status = 0;
if (!really_quiet)
{
cvs_output ("RCS file: ", 0);
@ -776,7 +784,7 @@ admin_fileproc (callerdat, finfo)
error (0, 0,
"%s: symbolic name %s already bound to %s",
rcs->path,
tag, n->data);
tag, (char *)n->data);
status = 1;
free (tag);
continue;
@ -835,7 +843,7 @@ admin_fileproc (callerdat, finfo)
continue;
}
free (rev);
delta = (RCSVers *) n->data;
delta = n->data;
free (delta->state);
delta->state = tag;
break;
@ -849,20 +857,32 @@ admin_fileproc (callerdat, finfo)
status = 1;
continue;
}
*p = '\0';
rev = RCS_gettag (rcs, arg + 2, 0, NULL);
*p = '\0'; /* temporarily make arg+2 its own string */
rev = RCS_gettag (rcs, arg + 2, 1, NULL); /* Force tag match */
if (rev == NULL)
{
error (0, 0, "%s: no such revision %s", rcs->path, rev);
error (0, 0, "%s: no such revision %s", rcs->path, arg+2);
status = 1;
*p = ':'; /* restore the full text of the -m argument */
continue;
}
*p++ = ':';
msg = p;
msg = p+1;
n = findnode (rcs->versions, rev);
/* tags may exist against non-existing versions */
if (n == NULL)
{
error (0, 0, "%s: no such revision %s: %s",
rcs->path, arg+2, rev);
status = 1;
*p = ':'; /* restore the full text of the -m argument */
free (rev);
continue;
}
*p = ':'; /* restore the full text of the -m argument */
free (rev);
delta = (RCSVers *) n->data;
delta = n->data;
if (delta->text == NULL)
{
delta->text = (Deltatext *) xmalloc (sizeof (Deltatext));
@ -911,9 +931,9 @@ admin_fileproc (callerdat, finfo)
static Dtype
admin_dirproc (callerdat, dir, repos, update_dir, entries)
void *callerdat;
char *dir;
char *repos;
char *update_dir;
const char *dir;
const char *repos;
const char *update_dir;
List *entries;
{
if (!quiet)

View file

@ -54,7 +54,7 @@ annotate (argc, argv)
int err = 0;
int c;
is_rannotate = (strcmp(command_name, "rannotate") == 0);
is_rannotate = (strcmp(cvs_cmd_name, "rannotate") == 0);
if (argc == -1)
usage (annotate_usage);
@ -224,14 +224,12 @@ rannotate_proc (argc, argv, xwhere, mwhere, mfile, shorten, local, mname, msg)
free (repository);
return (1);
}
free (repository);
/* End section which is identical to patch_proc. */
if (force_tag_match && tag != NULL)
which = W_REPOS | W_ATTIC;
else
which = W_REPOS;
repository = NULL;
}
else
{
@ -249,7 +247,11 @@ rannotate_proc (argc, argv, xwhere, mwhere, mfile, shorten, local, mname, msg)
err = start_recursion (annotate_fileproc, (FILESDONEPROC) NULL,
(DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL,
argc - 1, argv + 1, local, which, 0, CVS_LOCK_READ,
where, 1);
where, 1, repository);
if ( which & W_REPOS )
free ( repository );
if ( where != NULL )
free (where);
return err;
}

View file

@ -60,6 +60,11 @@ void
buf_free (buf)
struct buffer *buf;
{
if (buf->closure != NULL)
{
free (buf->closure);
buf->closure = NULL;
}
if (buf->data != NULL)
{
buf->last->next = free_buffer_data;
@ -137,8 +142,23 @@ get_buffer_data ()
return ret;
}
/* See whether a buffer is empty. */
/* See whether a buffer and its file descriptor is empty. */
int
buf_empty (buf)
struct buffer *buf;
{
/* Try and read any data on the file descriptor first.
* We already know the descriptor is non-blocking.
*/
buf_input_data (buf, NULL);
return buf_empty_p (buf);
}
/* See whether a buffer is empty. */
int
buf_empty_p (buf)
struct buffer *buf;
@ -151,6 +171,8 @@ buf_empty_p (buf)
return 1;
}
#ifdef SERVER_FLOWCONTROL
/*
* Count how much data is stored in the buffer..
@ -1208,6 +1230,8 @@ buf_shutdown (buf)
return 0;
}
/* The simplest type of buffer is one built on top of a stdio FILE.
For simplicity, and because it is all that is required, we do not
implement setting this type of buffer into nonblocking mode. The
@ -1218,14 +1242,17 @@ static int stdio_buffer_output PROTO((void *, const char *, int, int *));
static int stdio_buffer_flush PROTO((void *));
static int stdio_buffer_shutdown PROTO((struct buffer *buf));
/* Initialize a buffer built on a stdio FILE. */
/* Initialize a buffer built on a stdio FILE. */
struct stdio_buffer_closure
{
FILE *fp;
int child_pid;
};
struct buffer *
stdio_buffer_initialize (fp, child_pid, input, memory)
FILE *fp;
@ -1351,8 +1378,9 @@ stdio_buffer_output (closure, data, have, wrote)
return 0;
}
/* The buffer flush function for a buffer built on a stdio FILE. */
/* The buffer flush function for a buffer built on a stdio FILE. */
static int
stdio_buffer_flush (closure)
void *closure;
@ -1376,12 +1404,12 @@ static int
stdio_buffer_shutdown (buf)
struct buffer *buf;
{
struct stdio_buffer_closure *bc = (struct stdio_buffer_closure *) buf->closure;
struct stdio_buffer_closure *bc = buf->closure;
struct stat s;
int closefp = 1;
/* Must be a pipe or a socket. What could go wrong? */
assert (fstat ( fileno (bc->fp), &s ) != -1);
assert (fstat (fileno (bc->fp), &s) != -1);
/* Flush the buffer if we can */
if (buf->flush)
@ -1392,30 +1420,11 @@ stdio_buffer_shutdown (buf)
if (buf->input)
{
if ( !buf_empty_p (buf) )
{
# ifdef SERVER_SUPPORT
if (server_active)
/* FIXME: This should probably be sysloged since it doesn't
* have anywhere else to go at this point.
*/
error (0, 0, "dying gasps from client unexpected");
else
#endif
error (0, 0, "dying gasps from %s unexpected", current_parsed_root->hostname);
}
else if (ferror (bc->fp))
{
# ifdef SERVER_SUPPORT
if (server_active)
/* FIXME: This should probably be sysloged since it doesn't
* have anywhere else to go at this point.
*/
error (0, errno, "reading from client");
else
#endif
error (0, errno, "reading from %s", current_parsed_root->hostname);
}
/* There used to be a check here for unread data in the buffer of on
* the pipe, but it was deemed unnecessary and possibly dangerous. In
* some sense it could be second-guessing the caller who requested it
* closed, as well.
*/
# ifdef SHUTDOWN_SERVER
if (current_parsed_root->method != server_method)
@ -1423,8 +1432,8 @@ stdio_buffer_shutdown (buf)
# ifndef NO_SOCKET_TO_FD
{
/* shutdown() sockets */
if (S_ISSOCK(s.st_mode))
shutdown ( fileno (bc->fp), 0);
if (S_ISSOCK (s.st_mode))
shutdown (fileno (bc->fp), 0);
}
# endif /* NO_SOCKET_TO_FD */
# ifdef START_RSH_WITH_POPEN_RW
@ -1446,13 +1455,13 @@ stdio_buffer_shutdown (buf)
* SHUTDOWN_SERVER_OUTPUT
*/
if (current_parsed_root->method == server_method)
SHUTDOWN_SERVER ( fileno (bc->fp) );
SHUTDOWN_SERVER (fileno (bc->fp));
else
# endif
# ifndef NO_SOCKET_TO_FD
/* shutdown() sockets */
if (S_ISSOCK(s.st_mode))
shutdown ( fileno (bc->fp), 1);
if (S_ISSOCK (s.st_mode))
shutdown (fileno (bc->fp), 1);
# else
{
/* I'm not sure I like this empty block, but the alternative
@ -1465,15 +1474,34 @@ stdio_buffer_shutdown (buf)
}
if (closefp && fclose (bc->fp) == EOF)
error (1, errno,
"closing down connection to %s",
current_parsed_root->hostname);
{
if (0
# ifdef SERVER_SUPPORT
|| server_active
# endif /* SERVER_SUPPORT */
)
{
/* Syslog this? */
}
# ifdef CLIENT_SUPPORT
else
error (1, errno,
"closing down connection to %s",
current_parsed_root->hostname);
# endif /* CLIENT_SUPPORT */
}
/* If we were talking to a process, make sure it exited */
if (bc->child_pid
&& waitpid (bc->child_pid, (int *) 0, 0) == -1)
error (1, errno, "waiting for process %d", bc->child_pid);
if (bc->child_pid)
{
int w;
do
w = waitpid (bc->child_pid, (int *) 0, 0);
while (w == -1 && errno == EINTR);
if (w == -1)
error (1, errno, "waiting for process %d", bc->child_pid);
}
return 0;
}
@ -1872,8 +1900,9 @@ packetizing_buffer_output (closure, data, have, wrote)
return buf_send_output (pb->buf);
}
/* Flush data to a packetizing buffer. */
/* Flush data to a packetizing buffer. */
static int
packetizing_buffer_flush (closure)
void *closure;
@ -1887,8 +1916,9 @@ packetizing_buffer_flush (closure)
return buf_flush (pb->buf, 0);
}
/* The block routine for a packetizing buffer. */
/* The block routine for a packetizing buffer. */
static int
packetizing_buffer_block (closure, block)
void *closure;

View file

@ -119,6 +119,7 @@ extern struct buffer *packetizing_buffer_initialize
PROTO((struct buffer *, int (*) (void *, const char *, char *, int),
int (*) (void *, const char *, char *, int, int *), void *,
void (*) (struct buffer *)));
extern int buf_empty PROTO((struct buffer *));
extern int buf_empty_p PROTO((struct buffer *));
extern void buf_output PROTO((struct buffer *, const char *, int));
extern void buf_output0 PROTO((struct buffer *, const char *));

View file

@ -15,15 +15,15 @@
* Returns non-zero on error.
*/
#include <assert.h>
#include "cvs.h"
#include "fileattr.h"
#include "edit.h"
int
Checkin (type, finfo, rcs, rev, tag, options, message)
Checkin (type, finfo, rev, tag, options, message)
int type;
struct file_info *finfo;
char *rcs;
char *rev;
char *tag;
char *options;
@ -53,10 +53,15 @@ Checkin (type, finfo, rcs, rev, tag, options, message)
}
}
if (finfo->rcs == NULL)
finfo->rcs = RCS_parse (finfo->file, finfo->repository);
/* There use to be a check for finfo->rcs == NULL here and then a
* call to RCS_parse when necessary, but Checkin() isn't called
* if the RCS file hasn't already been parsed in one of the
* check functions.
*/
assert (finfo->rcs != NULL);
switch (RCS_checkin (finfo->rcs, NULL, message, rev, RCS_FLAGS_KEEPFILE))
switch (RCS_checkin (finfo->rcs, finfo->file, message, rev,
RCS_FLAGS_KEEPFILE))
{
case 0: /* everything normal */
@ -78,11 +83,12 @@ Checkin (type, finfo, rcs, rev, tag, options, message)
call RCS_checkout here, compare the resulting files
using xcmp, and rename if necessary. I think this
should be fixed in RCS_cmp_file. */
if ((! preserve_perms
&& options != NULL
&& (strcmp (options, "-ko") == 0
|| strcmp (options, "-kb") == 0))
|| RCS_cmp_file (finfo->rcs, rev, options, finfo->file) == 0)
if( ( ! preserve_perms
&& options != NULL
&& ( strcmp( options, "-ko" ) == 0
|| strcmp( options, "-kb" ) == 0 ) )
|| RCS_cmp_file( finfo->rcs, rev, (char **)NULL, (char *)NULL,
options, finfo->file ) == 0 )
{
/* The existing file is correct. We don't have to do
anything. */
@ -176,5 +182,5 @@ Checkin (type, finfo, rcs, rev, tag, options, message)
mark_up_to_date (finfo->file);
freevers_ts (&vers);
return (0);
return 0;
}

View file

@ -130,7 +130,7 @@ checkout (argc, argv)
* options to be default (like -kv) and takes care to remove the CVS
* directory when it has done its duty
*/
if (strcmp (command_name, "export") == 0)
if (strcmp (cvs_cmd_name, "export") == 0)
{
m_type = EXPORT;
valid_options = "+Nnk:d:flRQqr:D:";
@ -177,7 +177,7 @@ checkout (argc, argv)
#endif
error (1, 0,
"-q or -Q must be specified before \"%s\"",
command_name);
cvs_cmd_name);
break;
case 'l':
local = 1;
@ -273,14 +273,6 @@ checkout (argc, argv)
ign_setup ();
/* We have to expand names here because the "expand-modules"
directive to the server has the side-effect of having the
server send the check-in and update programs for the
various modules/dirs requested. If we turn this off and
simply request the names of the modules and directories (as
below in !expand_modules), those files (CVS/Checkin.prog
or CVS/Update.prog) don't get created. Grrr. */
expand_modules = (!cat && !pipeout
&& supported_request ("expand-modules"));
@ -323,6 +315,7 @@ checkout (argc, argv)
option_with_arg ("-j", join_rev1);
if (join_rev2 != NULL)
option_with_arg ("-j", join_rev2);
send_arg ("--");
if (expand_modules)
{
@ -398,39 +391,55 @@ checkout (argc, argv)
/* FIXME: This is and emptydir_name are in checkout.c for historical
reasons, probably want to move them. */
/* int
* safe_location ( char *where )
*
* Return true if where is a safe destination for a checkout.
*
* INPUTS
* where The requested destination directory.
*
* GLOBALS
* current_parsed_root->directory
* current_parsed_root->isremote
* Used to locate our CVSROOT.
*
* RETURNS
* true If we are running in client mode or if where is not located
* within the CVSROOT.
* false Otherwise.
*
* ERRORS
* Exits with a fatal error message when various events occur, such as not
* being able to resolve a path or failing ot chdir to a path.
*/
int
safe_location (where)
char *where;
{
char *current;
char *where_location;
char hardpath[PATH_MAX+5];
char *hardpath;
size_t hardpath_len;
int x;
int retval;
#ifdef HAVE_READLINK
/* FIXME-arbitrary limit: should be retrying this like xgetwd.
But how does readlink let us know that the buffer was too small?
(by returning sizeof hardpath - 1?). */
x = readlink(current_parsed_root->directory, hardpath, sizeof hardpath - 1);
#else
x = -1;
#endif
if (x == -1)
{
strcpy(hardpath, current_parsed_root->directory);
}
else
{
hardpath[x] = '\0';
}
if (trace)
(void) fprintf (stderr, "%s-> safe_location( where=%s )\n",
CLIENT_SERVER_STR,
where ? where : "(null)");
#ifdef CLIENT_SUPPORT
/* Don't compare remote CVSROOTs to our destination directory. */
if ( current_parsed_root->isremote ) return 1;
#endif /* CLIENT_SUPPORT */
/* set current - even if where is set we'll need to cd back... */
current = xgetwd ();
if (current == NULL)
error (1, errno, "could not get working directory");
hardpath = xresolvepath ( current_parsed_root->directory );
/* if where is set, set current to where, where - last_component( where ),
* or fail, depending on whether the directories exist or not.
*/
@ -457,12 +466,16 @@ safe_location (where)
char *parent;
/* strip the last_component */
where_location = xstrdup( where );
parent = last_component( where_location );
where_location = xstrdup (where);
/* It's okay to cast out the const below since we know we just
* allocated where_location and can do what we like with it.
*/
parent = (char *)last_component (where_location);
parent[-1] = '\0';
if( chdir( where_location ) != -1 )
{
free( where_location );
where_location = xgetwd();
if( where_location == NULL )
error( 1, errno, "could not get working directory (nominally `%s')", where_location );
@ -505,6 +518,7 @@ safe_location (where)
else
retval = 1;
free (current);
free (hardpath);
return retval;
}
@ -918,52 +932,48 @@ internal error: %s doesn't start with %s in checkout_proc",
/* clean up */
free (reposcopy);
{
int where_is_absolute = isabsolute (where);
/* The top-level CVSADM directory should always be
current_parsed_root->directory. Create it, but only if WHERE is
relative. If WHERE is absolute, our current directory
may not have a thing to do with where the sources are
being checked out. If it does, build_dirs_and_chdir
will take care of creating adm files here. */
/* FIXME: checking where_is_absolute is a horrid kludge;
I suspect we probably can just skip the call to
build_one_dir whenever the -d command option was specified
to checkout. */
/* The top-level CVSADM directory should always be
current_parsed_root->directory. Create it, but only if WHERE is
relative. If WHERE is absolute, our current directory
may not have a thing to do with where the sources are
being checked out. If it does, build_dirs_and_chdir
will take care of creating adm files here. */
/* FIXME: checking is_absolute (where) is a horrid kludge;
I suspect we probably can just skip the call to
build_one_dir whenever the -d command option was specified
to checkout. */
if (! where_is_absolute && top_level_admin && m_type == CHECKOUT)
{
/* It may be argued that we shouldn't set any sticky
bits for the top-level repository. FIXME? */
build_one_dir (current_parsed_root->directory, ".", argc <= 1);
if (!isabsolute (where) && top_level_admin && m_type == CHECKOUT)
{
/* It may be argued that we shouldn't set any sticky
bits for the top-level repository. FIXME? */
build_one_dir (current_parsed_root->directory, ".", argc <= 1);
#ifdef SERVER_SUPPORT
/* We _always_ want to have a top-level admin
directory. If we're running in client/server mode,
send a "Clear-static-directory" command to make
sure it is created on the client side. (See 5.10
in cvsclient.dvi to convince yourself that this is
OK.) If this is a duplicate command being sent, it
will be ignored on the client side. */
/* We _always_ want to have a top-level admin
directory. If we're running in client/server mode,
send a "Clear-static-directory" command to make
sure it is created on the client side. (See 5.10
in cvsclient.dvi to convince yourself that this is
OK.) If this is a duplicate command being sent, it
will be ignored on the client side. */
if (server_active)
server_clear_entstat (".", current_parsed_root->directory);
if (server_active)
server_clear_entstat (".", current_parsed_root->directory);
#endif
}
}
/* Build dirs on the path if necessary and leave us in the
bottom directory (where if where was specified) doesn't
contain a CVS subdir yet, but all the others contain
CVS and Entries.Static files */
/* Build dirs on the path if necessary and leave us in the
bottom directory (where if where was specified) doesn't
contain a CVS subdir yet, but all the others contain
CVS and Entries.Static files */
if (build_dirs_and_chdir (head, argc <= 1) != 0)
{
error (0, 0, "ignoring module %s", omodule);
err = 1;
goto out;
}
if (build_dirs_and_chdir (head, argc <= 1) != 0)
{
error (0, 0, "ignoring module %s", omodule);
err = 1;
goto out;
}
/* set up the repository (or make sure the old one matches) */
@ -1086,7 +1096,8 @@ internal error: %s doesn't start with %s in checkout_proc",
force_tag_match, 0 /* !local */ ,
1 /* update -d */ , aflag, checkout_prune_dirs,
pipeout, which, join_rev1, join_rev2,
preload_update_dir, m_type == CHECKOUT);
preload_update_dir, m_type == CHECKOUT,
repository);
goto out;
}
@ -1142,7 +1153,8 @@ internal error: %s doesn't start with %s in checkout_proc",
err += do_update (argc - 1, argv + 1, options, tag, date,
force_tag_match, local_specified, 1 /* update -d */,
aflag, checkout_prune_dirs, pipeout, which, join_rev1,
join_rev2, preload_update_dir, m_type == CHECKOUT);
join_rev2, preload_update_dir, m_type == CHECKOUT,
repository);
out:
free (preload_update_dir);
preload_update_dir = oldupdate;
@ -1192,8 +1204,28 @@ emptydir_name ()
}
/* Build all the dirs along the path to DIRS with CVS subdirs with appropriate
repositories. If ->repository is NULL, do not create a CVSADM directory
for that subdirectory; just CVS_CHDIR into it. */
* repositories. If DIRS->repository is NULL or the directory already exists,
* do not create a CVSADM directory for that subdirectory; just CVS_CHDIR into
* it. Frees all storage used by DIRS.
*
* ASSUMPTIONS
* 1. Parent directories will be listed in DIRS before their children.
* 2. At most a single directory will need to be changed at one time. In
* other words, if we are in /a/b/c, and our final destination is
* /a/b/c/d/e/f, then we will build d, then d/e, then d/e/f.
*
* INPUTS
* dirs Simple list composed of dir_to_build structures, listing
* information about directories to build.
* sticky Passed to build_one_dir to tell it whether there are any sticky
* tags or dates to be concerned with.
*
* RETURNS
* 1 on error, 0 otherwise.
*
* ERRORS
* The only nonfatal error this function may return is if the CHDIR fails.
*/
static int
build_dirs_and_chdir (dirs, sticky)
struct dir_to_build *dirs;
@ -1204,7 +1236,7 @@ build_dirs_and_chdir (dirs, sticky)
while (dirs != NULL)
{
char *dir = last_component (dirs->dirpath);
const char *dir = last_component (dirs->dirpath);
if (!dirs->just_chdir)
{

View file

@ -266,7 +266,7 @@ Classify_File (finfo, tag, date, options, force_tag_match, aflag, versp,
* There is no user file, so note that it was lost and
* extract a new version
*/
/* Comparing the command_name against "update", in
/* Comparing the cvs_cmd_name against "update", in
addition to being an ugly way to operate, means
that this message does not get printed by the
server. That might be considered just a straight
@ -274,7 +274,7 @@ Classify_File (finfo, tag, date, options, force_tag_match, aflag, versp,
gets hit when a patch fails and the client fetches
a file. I'm not sure there is currently any way
for the server to distinguish those two cases. */
if (strcmp (command_name, "update") == 0)
if (strcmp (cvs_cmd_name, "update") == 0)
if (!really_quiet)
error (0, 0, "warning: %s was lost", finfo->fullname);
ret = T_CHECKOUT;
@ -344,7 +344,7 @@ Classify_File (finfo, tag, date, options, force_tag_match, aflag, versp,
/* See comment at other "update" compare, for more
thoughts on this comparison. */
if (strcmp (command_name, "update") == 0)
if (strcmp (cvs_cmd_name, "update") == 0)
if (!really_quiet)
error (0, 0, "warning: %s was lost", finfo->fullname);
ret = T_CHECKOUT;

File diff suppressed because it is too large Load diff

View file

@ -60,6 +60,8 @@ extern int client_prune_dirs;
# ifdef AUTH_CLIENT_SUPPORT
extern int use_authenticating_server;
# endif /* AUTH_CLIENT_SUPPORT */
# if defined (AUTH_CLIENT_SUPPORT) || defined (HAVE_GSSAPI)
void connect_to_pserver PROTO ((cvsroot_t *,
struct buffer **,
struct buffer **,
@ -67,7 +69,7 @@ void connect_to_pserver PROTO ((cvsroot_t *,
# ifndef CVS_AUTH_PORT
# define CVS_AUTH_PORT 2401
# endif /* CVS_AUTH_PORT */
# endif /* AUTH_CLIENT_SUPPORT */
# endif /* (AUTH_CLIENT_SUPPORT) || defined (HAVE_GSSAPI) */
# if HAVE_KERBEROS
# ifndef CVS_PORT
@ -75,16 +77,8 @@ void connect_to_pserver PROTO ((cvsroot_t *,
# endif
# endif /* HAVE_KERBEROS */
# if defined (AUTH_SERVER_SUPPORT) || (defined (SERVER_SUPPORT) && defined (HAVE_GSSAPI))
extern void pserver_authenticate_connection PROTO ((void));
# endif
# if defined (SERVER_SUPPORT) && defined (HAVE_KERBEROS)
extern void kserver_authenticate_connection PROTO ((void));
# endif
/* Talking to the server. */
void send_to_server PROTO((char *str, size_t len));
void send_to_server PROTO((const char *str, size_t len));
void read_from_server PROTO((char *buf, size_t len));
/* Internal functions that handle client communication to server, etc. */
@ -131,7 +125,8 @@ send_arg PROTO((char *string));
void
send_option_string PROTO((char *string));
extern void send_a_repository PROTO ((char *, char *, char *));
extern void send_a_repository PROTO ((const char *, const char *,
const char *));
#endif /* CLIENT_SUPPORT */
@ -209,5 +204,6 @@ extern int client_process_import_file
int targc, char *targv[], char *repository, int all_files_binary,
int modtime));
extern void client_import_done PROTO((void));
extern void client_notify PROTO((char *, char *, char *, int, char *));
extern void client_notify PROTO((const char *, const char *, const char *, int,
const char *));
#endif /* CLIENT_SUPPORT */

File diff suppressed because it is too large Load diff

View file

@ -24,11 +24,11 @@
int
Create_Admin (dir, update_dir, repository, tag, date, nonbranch, warn,
dotemplate)
char *dir;
char *update_dir;
char *repository;
char *tag;
char *date;
const char *dir;
const char *update_dir;
const char *repository;
const char *tag;
const char *date;
int nonbranch;
int warn;
int dotemplate;

View file

@ -84,6 +84,7 @@ extern int errno;
#include "system.h"
#include "hash.h"
#include "stack.h"
#include "root.h"
@ -127,8 +128,6 @@ extern int errno;
#define CVSADM_ENTSTAT "CVS/Entries.Static"
#define CVSADM_REP "CVS/Repository."
#define CVSADM_ROOT "CVS/Root."
#define CVSADM_CIPROG "CVS/Checkin.prog"
#define CVSADM_UPROG "CVS/Update.prog"
#define CVSADM_TAG "CVS/Tag."
#define CVSADM_NOTIFY "CVS/Notify."
#define CVSADM_NOTIFYTMP "CVS/Notify.tmp"
@ -144,8 +143,6 @@ extern int errno;
#define CVSADM_ENTSTAT "CVS/Entries.Static"
#define CVSADM_REP "CVS/Repository"
#define CVSADM_ROOT "CVS/Root"
#define CVSADM_CIPROG "CVS/Checkin.prog"
#define CVSADM_UPROG "CVS/Update.prog"
#define CVSADM_TAG "CVS/Tag"
#define CVSADM_NOTIFY "CVS/Notify"
#define CVSADM_NOTIFYTMP "CVS/Notify.tmp"
@ -363,7 +360,7 @@ typedef enum direnter_type Dtype;
#define CVS_LOCK_READ 1
#define CVS_LOCK_WRITE 2
extern char *program_name, *program_path, *command_name;
extern const char *program_name, *program_path, *cvs_cmd_name;
extern char *Tmpdir, *Editor;
extern int cvsadmin_root;
extern char *CurDir;
@ -409,7 +406,8 @@ extern char hostname[];
/* Externs that are included directly in the CVS sources */
int RCS_merge PROTO((RCSNode *, char *, char *, char *, char *, char *));
int RCS_merge PROTO((RCSNode *, const char *, const char *, const char *,
const char *, const char *));
/* Flags used by RCS_* functions. See the description of the individual
functions for which flags mean what for each function. */
#define RCS_FLAGS_FORCE 1
@ -419,14 +417,14 @@ int RCS_merge PROTO((RCSNode *, char *, char *, char *, char *, char *));
#define RCS_FLAGS_KEEPFILE 16
extern int RCS_exec_rcsdiff PROTO ((RCSNode *rcsfile,
char *opts, char *options,
char *rev1, char *rev2,
char *label1, char *label2,
char *workfile));
extern int diff_exec PROTO ((char *file1, char *file2,
char *label1, char *label2,
char *options, char *out));
const char *opts, const char *options,
const char *rev1, const char *rev1_cache,
const char *rev2, const char *label1,
const char *label2, const char *workfile));
extern int diff_exec PROTO ((const char *file1, const char *file2,
const char *label1, const char *label2,
const char *options, const char *out));
#include "error.h"
@ -445,34 +443,36 @@ void date_to_internet PROTO ((char *, const char *));
void date_to_tm PROTO ((struct tm *, const char *));
void tm_to_internet PROTO ((char *, const struct tm *));
char *Name_Repository PROTO((char *dir, char *update_dir));
char *Short_Repository PROTO((char *repository));
char *Name_Repository PROTO((const char *dir, const char *update_dir));
const char *Short_Repository PROTO((const char *repository));
void Sanitize_Repository_Name PROTO((char *repository));
char *Name_Root PROTO((char *dir, char *update_dir));
void free_cvsroot_t PROTO((cvsroot_t *root_in));
cvsroot_t *parse_cvsroot PROTO((char *root));
cvsroot_t *local_cvsroot PROTO((char *dir));
void Create_Root PROTO((char *dir, char *rootdir));
cvsroot_t *parse_cvsroot PROTO((const char *root));
cvsroot_t *local_cvsroot PROTO((const char *dir));
void Create_Root PROTO((const char *dir, const char *rootdir));
void root_allow_add PROTO ((char *));
void root_allow_free PROTO ((void));
int root_allow_ok PROTO ((char *));
char *gca PROTO((const char *rev1, const char *rev2));
char *previous_rev PROTO ((RCSNode *rcs, const char *rev));
char *gca PROTO ((const char *rev1, const char *rev2));
extern void check_numeric PROTO ((const char *, int, char **));
char *getcaller PROTO((void));
char *time_stamp PROTO((char *file));
char *getcaller PROTO ((void));
char *time_stamp PROTO ((const char *file));
void *xmalloc PROTO((size_t bytes));
void *xrealloc PROTO((void *ptr, size_t bytes));
void expand_string PROTO ((char **, size_t *, size_t));
void xrealloc_and_strcat PROTO ((char **, size_t *, const char *));
char *xstrdup PROTO((const char *str));
void strip_trailing_newlines PROTO((char *str));
int pathname_levels PROTO ((char *path));
int strip_trailing_newlines PROTO((char *str));
int pathname_levels PROTO ((const char *path));
typedef int (*CALLPROC) PROTO((char *repository, char *value));
int Parse_Info PROTO((char *infofile, char *repository, CALLPROC callproc, int all));
typedef int (*CALLPROC) PROTO((const char *repository, const char *value));
int Parse_Info PROTO((const char *infofile, const char *repository,
CALLPROC callproc, int all));
extern int parse_config PROTO ((char *));
typedef RETSIGTYPE (*SIGCLEANUPPROC) PROTO(());
@ -485,8 +485,11 @@ int isreadable PROTO((const char *file));
int iswritable PROTO((const char *file));
int isaccessible PROTO((const char *file, const int mode));
int isabsolute PROTO((const char *filename));
#ifdef HAVE_READLINK
char *xreadlink PROTO((const char *link));
char *last_component PROTO((char *path));
#endif
char *xresolvepath PROTO((const char *path));
const char *last_component PROTO((const char *path));
char *get_homedir PROTO ((void));
char *strcat_filename_onto_homedir PROTO ((const char *, const char *));
char *cvs_temp_name PROTO ((void));
@ -497,16 +500,57 @@ char *increment_revnum PROTO ((const char *));
int compare_revnums PROTO ((const char *, const char *));
int unlink_file PROTO((const char *f));
int unlink_file_dir PROTO((const char *f));
/* This is the structure that the recursion processor passes to the
fileproc to tell it about a particular file. */
struct file_info
{
/* Name of the file, without any directory component. */
const char *file;
/* Name of the directory we are in, relative to the directory in
which this command was issued. We have cd'd to this directory
(either in the working directory or in the repository, depending
on which sort of recursion we are doing). If we are in the directory
in which the command was issued, this is "". */
const char *update_dir;
/* update_dir and file put together, with a slash between them as
necessary. This is the proper way to refer to the file in user
messages. */
const char *fullname;
/* Name of the directory corresponding to the repository which contains
this file. */
const char *repository;
/* The pre-parsed entries for this directory. */
List *entries;
RCSNode *rcs;
};
int update PROTO((int argc, char *argv[]));
/* The only place this is currently used outside of update.c is add.c.
* Restricting its use to update.c seems to be in the best interest of
* modularity, but I can't think of a good way to get an update of a
* resurrected file done and print the fact otherwise.
*/
void write_letter PROTO ((struct file_info *finfo, int letter));
int xcmp PROTO((const char *file1, const char *file2));
int yesno PROTO((void));
void *valloc PROTO((size_t bytes));
time_t get_date PROTO((char *date, struct timeb *now));
extern int Create_Admin PROTO ((char *dir, char *update_dir,
char *repository, char *tag, char *date,
int nonbranch, int warn, int dotemplate));
extern int expand_at_signs PROTO ((char *, off_t, FILE *));
extern int Create_Admin PROTO ((const char *dir, const char *update_dir,
const char *repository, const char *tag,
const char *date,
int nonbranch, int warn, int dotemplate));
extern int expand_at_signs PROTO ((const char *, off_t, FILE *));
/* Locking subsystem (implemented in lock.c). */
int Reader_Lock PROTO((char *xrepository));
@ -522,11 +566,12 @@ extern void lock_dir_for_write PROTO ((char *));
/* LockDir setting from CVSROOT/config. */
extern char *lock_dir;
void Scratch_Entry PROTO((List * list, char *fname));
void Scratch_Entry PROTO((List * list, const char *fname));
void ParseTag PROTO((char **tagp, char **datep, int *nonbranchp));
void WriteTag PROTO ((char *dir, char *tag, char *date, int nonbranch,
char *update_dir, char *repository));
void WriteTag PROTO ((const char *dir, const char *tag, const char *date,
int nonbranch, const char *update_dir,
const char *repository));
void cat_module PROTO((int status));
void check_entries PROTO((char *dir));
void close_module PROTO((DBM * db));
@ -539,18 +584,17 @@ void ign_add PROTO((char *ign, int hold));
void ign_add_file PROTO((char *file, int hold));
void ign_setup PROTO((void));
void ign_dir_add PROTO((char *name));
int ignore_directory PROTO((char *name));
typedef void (*Ignore_proc) PROTO ((char *, char *));
extern void ignore_files PROTO ((List *, List *, char *, Ignore_proc));
int ignore_directory PROTO((const char *name));
typedef void (*Ignore_proc) PROTO ((const char *, const char *));
extern void ignore_files PROTO ((List *, List *, const char *, Ignore_proc));
extern int ign_inhibit_server;
extern int ign_case;
#include "update.h"
void line2argv PROTO ((int *pargc, char ***argv, char *line, char *sepchars));
void make_directories PROTO((const char *name));
void make_directory PROTO((const char *name));
extern int mkdir_if_needed PROTO ((char *name));
extern int mkdir_if_needed PROTO ((const char *name));
void rename_file PROTO((const char *from, const char *to));
/* Expand wildcards in each element of (ARGC,ARGV). This is according to the
files which exist in the current directory, and accordingly to OS-specific
@ -563,68 +607,41 @@ extern void expand_wild PROTO ((int argc, char **argv,
int *pargc, char ***pargv));
#ifdef SERVER_SUPPORT
extern int cvs_casecmp PROTO ((char *, char *));
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));
void update_delproc PROTO((Node * p));
void usage PROTO((const char *const *cpp));
void xchmod PROTO((char *fname, int writable));
void xchmod PROTO((const char *fname, int writable));
char *xgetwd PROTO((void));
List *Find_Names PROTO((char *repository, int which, int aflag,
List ** optentries));
void Register PROTO((List * list, char *fname, char *vn, char *ts,
char *options, char *tag, char *date, char *ts_conflict));
void Update_Logfile PROTO((char *repository, char *xmessage, FILE * xlogfp,
List * xchanges));
void do_editor PROTO((char *dir, char **messagep,
char *repository, List * changes));
List **optentries));
void Register PROTO((List * list, const char *fname, const char *vn,
const char *ts, const char *options, const char *tag,
const char *date, const char *ts_conflict));
void Update_Logfile PROTO((const char *repository, const char *xmessage,
FILE * xlogfp, List * xchanges));
void do_editor PROTO((const char *dir, char **messagep,
const char *repository, List * changes));
void do_verify PROTO((char **messagep, char *repository));
void do_verify PROTO((char **messagep, const char *repository));
typedef int (*CALLBACKPROC) PROTO((int argc, char *argv[], char *where,
char *mwhere, char *mfile, int shorten, int local_specified,
char *omodule, char *msg));
/* This is the structure that the recursion processor passes to the
fileproc to tell it about a particular file. */
struct file_info
{
/* Name of the file, without any directory component. */
char *file;
/* Name of the directory we are in, relative to the directory in
which this command was issued. We have cd'd to this directory
(either in the working directory or in the repository, depending
on which sort of recursion we are doing). If we are in the directory
in which the command was issued, this is "". */
char *update_dir;
/* update_dir and file put together, with a slash between them as
necessary. This is the proper way to refer to the file in user
messages. */
char *fullname;
/* Name of the directory corresponding to the repository which contains
this file. */
char *repository;
/* The pre-parsed entries for this directory. */
List *entries;
RCSNode *rcs;
};
typedef int (*FILEPROC) PROTO ((void *callerdat, struct file_info *finfo));
typedef int (*FILESDONEPROC) PROTO ((void *callerdat, int err,
char *repository, char *update_dir,
List *entries));
typedef Dtype (*DIRENTPROC) PROTO ((void *callerdat, char *dir,
char *repos, char *update_dir,
const char *repository,
const char *update_dir,
List *entries));
typedef Dtype (*DIRENTPROC) PROTO ((void *callerdat, const char *dir,
const char *repos, const char *update_dir,
List *entries));
typedef int (*DIRLEAVEPROC) PROTO ((void *callerdat, char *dir, int err,
char *update_dir, List *entries));
typedef int (*DIRLEAVEPROC) PROTO ((void *callerdat, const char *dir, int err,
const char *update_dir, List *entries));
extern int mkmodules PROTO ((char *dir));
extern int init PROTO ((int argc, char **argv));
@ -633,20 +650,22 @@ int do_module PROTO((DBM * db, char *mname, enum mtype m_type, char *msg,
CALLBACKPROC callback_proc, char *where, int shorten,
int local_specified, int run_module_prog, int build_dirs,
char *extra_arg));
void history_write PROTO((int type, char *update_dir, char *revs, char *name,
char *repository));
void history_write PROTO((int type, const char *update_dir, const char *revs,
const char *name, const char *repository));
int start_recursion PROTO((FILEPROC fileproc, FILESDONEPROC filesdoneproc,
DIRENTPROC direntproc, DIRLEAVEPROC dirleaveproc,
void *callerdat,
int argc, char *argv[], int local, int which,
int aflag, int locktype, char *update_preload,
int dosrcs));
int dosrcs, char *repository));
void SIG_beginCrSect PROTO((void));
void SIG_endCrSect PROTO((void));
int SIG_inCrSect PROTO((void));
void read_cvsrc PROTO((int *argc, char ***argv, char *cmdname));
void read_cvsrc PROTO((int *argc, char ***argv, const char *cmdname));
char *make_message_rcslegal PROTO((char *message));
char *make_message_rcslegal PROTO((const char *message));
extern int file_has_conflict PROTO ((const struct file_info *,
const char *ts_conflict));
extern int file_has_markers PROTO ((const struct file_info *));
extern void get_file PROTO ((const char *, const char *, const char *,
char **, size_t *, size_t *));
@ -656,13 +675,13 @@ extern void resolve_symlink PROTO ((char **filename));
void sleep_past PROTO ((time_t desttime));
/* flags for run_exec(), the fast system() for CVS */
#define RUN_NORMAL 0x0000 /* no special behaviour */
#define RUN_COMBINED 0x0001 /* stdout is duped to stderr */
#define RUN_REALLY 0x0002 /* do the exec, even if noexec is on */
#define RUN_STDOUT_APPEND 0x0004 /* append to stdout, don't truncate */
#define RUN_STDERR_APPEND 0x0008 /* append to stderr, don't truncate */
#define RUN_SIGIGNORE 0x0010 /* ignore interrupts for command */
#define RUN_TTY (char *)0 /* for the benefit of lint */
#define RUN_NORMAL 0x0000 /* no special behaviour */
#define RUN_COMBINED 0x0001 /* stdout is duped to stderr */
#define RUN_REALLY 0x0002 /* do the exec, even if noexec is on */
#define RUN_STDOUT_APPEND 0x0004 /* append to stdout, don't truncate */
#define RUN_STDERR_APPEND 0x0008 /* append to stderr, don't truncate */
#define RUN_SIGIGNORE 0x0010 /* ignore interrupts for command */
#define RUN_TTY (char *)0 /* for the benefit of lint */
void run_arg PROTO((const char *s));
void run_print PROTO((FILE * fp));
@ -672,7 +691,7 @@ int run_exec PROTO((const char *stin, const char *stout, const char *sterr,
/* other similar-minded stuff from run.c. */
FILE *run_popen PROTO((const char *, const char *));
int piped_child PROTO((char **, int *, int *));
int piped_child PROTO((const char **, int *, int *));
void close_on_exec PROTO((int));
pid_t waitpid PROTO((pid_t, int *, int));
@ -755,7 +774,7 @@ void freevers_ts PROTO ((Vers_TS ** versp));
/* Miscellaneous CVS infrastructure which layers on top of the recursion
processor (for example, needs struct file_info). */
int Checkin PROTO ((int type, struct file_info *finfo, char *rcs, char *rev,
int Checkin PROTO ((int type, struct file_info *finfo, char *rev,
char *tag, char *options, char *message));
int No_Difference PROTO ((struct file_info *finfo, Vers_TS *vers));
/* TODO: can the finfo argument to special_file_mismatch be changed? -twp */
@ -829,15 +848,15 @@ void wrap_send PROTO ((void));
#if defined(SERVER_SUPPORT) || defined(CLIENT_SUPPORT)
void wrap_unparse_rcs_options PROTO ((char **, int));
#endif /* SERVER_SUPPORT || CLIENT_SUPPORT */
/* Pathname expansion */
char *expand_path PROTO((char *name, char *file, int line));
char *expand_path PROTO((const char *name, const char *file, int line));
/* User variables. */
extern List *variable_list;
extern void variable_set PROTO ((char *nameval));
int watch PROTO ((int argc, char **argv));
int edit PROTO ((int argc, char **argv));
int unedit PROTO ((int argc, char **argv));
@ -898,4 +917,4 @@ extern void cvs_output_binary PROTO ((char *, size_t));
extern void cvs_outerr PROTO ((const char *, size_t));
extern void cvs_flusherr PROTO ((void));
extern void cvs_flushout PROTO ((void));
extern void cvs_output_tagged PROTO ((char *, char *));
extern void cvs_output_tagged PROTO ((const char *, const char *));

View file

@ -48,16 +48,17 @@ DEFAULT_ORGANIZATION="net"
## # Newer config information?
## [ -f ${GNATS_ROOT}/gnats-adm/config ] && . ${GNATS_ROOT}/gnats-adm/config
# Hack mktemp on systems that don't have it.
@MKTEMP_SH_FUNCTION@
MKTEMP="@MKTEMP@"
# What mailer to use. This must come after the config file, since it is
# host-dependent.
if [ -f /usr/sbin/sendmail ]; then
MAIL_AGENT="/usr/sbin/sendmail -oi -t"
else
MAIL_AGENT="/usr/lib/sendmail -oi -t"
fi
SENDMAIL="@SENDMAIL@"
MAIL_AGENT="$SENDMAIL -oi -t"
MAILER=`echo $MAIL_AGENT | sed -e 's, .*,,'`
if [ ! -f "$MAILER" ] ; then
echo "$COMMAND: Cannot file mail program \"$MAILER\"."
echo "$COMMAND: Cannot find mail program \"$MAILER\"."
echo "$COMMAND: Please fix the MAIL_AGENT entry in the $COMMAND file."
exit 1
fi
@ -85,9 +86,9 @@ fi
[ -z "$TMPDIR" ] && TMPDIR=/tmp
TEMP=$TMPDIR/p$$
BAD=$TMPDIR/pbad$$
REF=$TMPDIR/pf$$
TEMP="`$MKTEMP $TMPDIR/p.XXXXXX`"
BAD="`$MKTEMP $TMPDIR/pbad.XXXXXX`"
REF="`$MKTEMP $TMPDIR/pf.XXXXXX`"
if [ -z "$LOGNAME" -a -n "$USER" ]; then
LOGNAME=$USER

View file

@ -30,7 +30,7 @@ void
read_cvsrc (argc, argv, cmdname)
int *argc;
char ***argv;
char *cmdname;
const char *cmdname;
{
char *homedir;
char *homeinit;

View file

@ -14,6 +14,7 @@
* files.
*/
#include <assert.h>
#include "cvs.h"
enum diff_file
@ -25,18 +26,21 @@ enum diff_file
DIFF_SAME
};
static Dtype diff_dirproc PROTO ((void *callerdat, char *dir,
char *pos_repos, char *update_dir,
List *entries));
static Dtype diff_dirproc PROTO ((void *callerdat, const char *dir,
const char *pos_repos,
const char *update_dir,
List *entries));
static int diff_filesdoneproc PROTO ((void *callerdat, int err,
char *repos, char *update_dir,
List *entries));
static int diff_dirleaveproc PROTO ((void *callerdat, char *dir,
int err, char *update_dir,
List *entries));
static enum diff_file diff_file_nodiff PROTO ((struct file_info *finfo,
const char *repos,
const char *update_dir,
List *entries));
static int diff_dirleaveproc PROTO ((void *callerdat, const char *dir,
int err, const char *update_dir,
List *entries));
static enum diff_file diff_file_nodiff PROTO(( struct file_info *finfo,
Vers_TS *vers,
enum diff_file));
enum diff_file,
char **rev1_cache ));
static int diff_fileproc PROTO ((void *callerdat, struct file_info *finfo));
static void diff_mark_errors PROTO((int err));
@ -270,6 +274,13 @@ diff (argc, argv)
diff_date2 = NULL;
optind = 0;
/* FIXME: This should really be allocating an argv to be passed to diff
* later rather than strcatting onto the opts variable. We have some
* handling routines that can already handle most of the argc/argv
* maintenance for us and currently, if anyone were to attempt to pass a
* quoted string in here, it would be split on spaces and tabs on its way
* to diff.
*/
while ((c = getopt_long (argc, argv,
"+abcdefhilnpstuwy0123456789BHNRTC:D:F:I:L:U:W:k:r:",
longopts, &option_index)) != -1)
@ -422,7 +433,8 @@ diff (argc, argv)
/* start the recursion processor */
err = start_recursion (diff_fileproc, diff_filesdoneproc, diff_dirproc,
diff_dirleaveproc, NULL, argc, argv, local,
which, 0, CVS_LOCK_READ, (char *) NULL, 1);
which, 0, CVS_LOCK_READ, (char *) NULL, 1,
(char *) NULL);
/* clean up */
free (options);
@ -448,16 +460,12 @@ diff_fileproc (callerdat, finfo)
int status, err = 2; /* 2 == trouble, like rcsdiff */
Vers_TS *vers;
enum diff_file empty_file = DIFF_DIFFERENT;
char *tmp;
char *tocvsPath;
char *fname;
char *tmp = NULL;
char *tocvsPath = NULL;
char *fname = NULL;
char *label1;
char *label2;
/* Initialize these solely to avoid warnings from gcc -Wall about
variables that might be used uninitialized. */
tmp = NULL;
fname = NULL;
char *rev1_cache = NULL;
user_file_rev = 0;
vers = Version_TS (finfo, NULL, NULL, NULL, 1, 0);
@ -505,30 +513,69 @@ diff_fileproc (callerdat, finfo)
error (0, 0,
"%s no longer exists, no comparison available",
finfo->fullname);
freevers_ts (&vers);
diff_mark_errors (err);
return (err);
goto out;
}
}
else
{
error (0, 0, "I know nothing about %s", finfo->fullname);
freevers_ts (&vers);
diff_mark_errors (err);
return (err);
goto out;
}
}
else if (vers->vn_user[0] == '0' && vers->vn_user[1] == '\0')
{
if (empty_files)
empty_file = DIFF_ADDED;
else
/* The file was added locally. */
int exists = 0;
if (vers->srcfile != NULL)
{
error (0, 0, "%s is a new entry, no comparison available",
finfo->fullname);
freevers_ts (&vers);
diff_mark_errors (err);
return (err);
/* The file does exist in the repository. */
if ((diff_rev1 != NULL || diff_date1 != NULL))
{
/* special handling for TAG_HEAD */
if (diff_rev1 && strcmp (diff_rev1, TAG_HEAD) == 0)
{
char *head =
(vers->vn_rcs == NULL
? NULL
: RCS_branch_head (vers->srcfile, vers->vn_rcs));
exists = head != NULL && !RCS_isdead(vers->srcfile, head);
if (head != NULL)
free (head);
}
else
{
Vers_TS *xvers;
xvers = Version_TS (finfo, NULL, diff_rev1, diff_date1,
1, 0);
exists = xvers->vn_rcs != NULL
&& !RCS_isdead (xvers->srcfile, xvers->vn_rcs);
freevers_ts (&xvers);
}
}
else
{
/* The file was added locally, but an RCS archive exists. Our
* base revision must be dead.
*/
/* No need to set, exists = 0, here. That's the default. */
}
}
if (!exists)
{
/* If we got here, then either the RCS archive does not exist or
* the relevant revision is dead.
*/
if (empty_files)
empty_file = DIFF_ADDED;
else
{
error (0, 0, "%s is a new entry, no comparison available",
finfo->fullname);
goto out;
}
}
}
else if (vers->vn_user[0] == '-')
@ -539,9 +586,7 @@ diff_fileproc (callerdat, finfo)
{
error (0, 0, "%s was removed, no comparison available",
finfo->fullname);
freevers_ts (&vers);
diff_mark_errors (err);
return (err);
goto out;
}
}
else
@ -550,18 +595,14 @@ diff_fileproc (callerdat, finfo)
{
error (0, 0, "cannot find revision control file for %s",
finfo->fullname);
freevers_ts (&vers);
diff_mark_errors (err);
return (err);
goto out;
}
else
{
if (vers->ts_user == NULL)
{
error (0, 0, "cannot find %s", finfo->fullname);
freevers_ts (&vers);
diff_mark_errors (err);
return (err);
goto out;
}
else if (!strcmp (vers->ts_user, vers->ts_rcs))
{
@ -573,73 +614,21 @@ diff_fileproc (callerdat, finfo)
}
}
empty_file = diff_file_nodiff (finfo, vers, empty_file);
if (empty_file == DIFF_SAME || empty_file == DIFF_ERROR)
empty_file = diff_file_nodiff( finfo, vers, empty_file, &rev1_cache );
if( empty_file == DIFF_SAME )
{
freevers_ts (&vers);
if (empty_file == DIFF_SAME)
{
/* In the server case, would be nice to send a "Checked-in"
response, so that the client can rewrite its timestamp.
server_checked_in by itself isn't the right thing (it
needs a server_register), but I'm not sure what is.
It isn't clear to me how "cvs status" handles this (that
is, for a client which sends Modified not Is-modified to
"cvs status"), but it does. */
return (0);
}
else
{
diff_mark_errors (err);
return (err);
}
}
if (empty_file == DIFF_DIFFERENT)
{
int dead1, dead2;
if (use_rev1 == NULL)
dead1 = 0;
else
dead1 = RCS_isdead (vers->srcfile, use_rev1);
if (use_rev2 == NULL)
dead2 = 0;
else
dead2 = RCS_isdead (vers->srcfile, use_rev2);
if (dead1 && dead2)
{
freevers_ts (&vers);
return (0);
}
else if (dead1)
{
if (empty_files)
empty_file = DIFF_ADDED;
else
{
error (0, 0, "%s is a new entry, no comparison available",
finfo->fullname);
freevers_ts (&vers);
diff_mark_errors (err);
return (err);
}
}
else if (dead2)
{
if (empty_files)
empty_file = DIFF_REMOVED;
else
{
error (0, 0, "%s was removed, no comparison available",
finfo->fullname);
freevers_ts (&vers);
diff_mark_errors (err);
return (err);
}
}
/* In the server case, would be nice to send a "Checked-in"
response, so that the client can rewrite its timestamp.
server_checked_in by itself isn't the right thing (it
needs a server_register), but I'm not sure what is.
It isn't clear to me how "cvs status" handles this (that
is, for a client which sends Modified not Is-modified to
"cvs status"), but it does. */
err = 0;
goto out;
}
else if( empty_file == DIFF_ERROR )
goto out;
/* Output an "Index:" line for patch to use */
cvs_output ("Index: ", 0);
@ -647,7 +636,7 @@ diff_fileproc (callerdat, finfo)
cvs_output ("\n", 1);
tocvsPath = wrap_tocvs_process_file(finfo->file);
if (tocvsPath)
if( tocvsPath != NULL )
{
/* Backup the current version of the file to CVS/,,filename */
fname = xmalloc (strlen (finfo->file)
@ -676,7 +665,8 @@ diff_fileproc (callerdat, finfo)
make_file_label (DEVNULL, NULL, NULL);
else
label1 =
make_file_label (finfo->fullname, use_rev1, vers ? vers->srcfile : NULL);
make_file_label (finfo->fullname, use_rev1,
vers ? vers->srcfile : NULL);
}
if (!have_rev2_label)
@ -686,7 +676,8 @@ diff_fileproc (callerdat, finfo)
make_file_label (DEVNULL, NULL, NULL);
else
label2 =
make_file_label (finfo->fullname, use_rev2, vers ? vers->srcfile : NULL);
make_file_label (finfo->fullname, use_rev2,
vers ? vers->srcfile : NULL);
}
if (empty_file == DIFF_ADDED || empty_file == DIFF_REMOVED)
@ -709,7 +700,8 @@ RCS file: ", 0);
if (empty_file == DIFF_ADDED)
{
if (use_rev2 == NULL)
status = diff_exec (DEVNULL, finfo->file, label1, label2, opts, RUN_TTY);
status = diff_exec (DEVNULL, finfo->file, label1, label2, opts,
RUN_TTY);
else
{
int retcode;
@ -722,11 +714,8 @@ RCS file: ", 0);
: vers->options),
tmp, (RCSCHECKOUTPROC) NULL,
(void *) NULL);
if (retcode != 0)
{
diff_mark_errors (err);
return err;
}
if( retcode != 0 )
goto out;
status = diff_exec (DEVNULL, tmp, label1, label2, opts, RUN_TTY);
}
@ -742,26 +731,24 @@ RCS file: ", 0);
tmp, (RCSCHECKOUTPROC) NULL,
(void *) NULL);
if (retcode != 0)
{
diff_mark_errors (err);
return err;
}
goto out;
status = diff_exec (tmp, DEVNULL, label1, label2, opts, RUN_TTY);
}
}
else
{
status = RCS_exec_rcsdiff (vers->srcfile, opts,
*options ? options : vers->options,
use_rev1, use_rev2,
label1, label2,
finfo->file);
status = RCS_exec_rcsdiff(vers->srcfile, opts,
*options ? options : vers->options,
use_rev1, rev1_cache, use_rev2,
label1, label2,
finfo->file);
if (label1) free (label1);
if (label2) free (label2);
}
if (label1) free (label1);
if (label2) free (label2);
switch (status)
{
case -1: /* fork failed */
@ -775,7 +762,8 @@ RCS file: ", 0);
break;
}
if (tocvsPath)
out:
if( tocvsPath != NULL )
{
if (unlink_file_dir (finfo->file) < 0)
if (! existence_error (errno))
@ -787,17 +775,25 @@ RCS file: ", 0);
free (fname);
}
if (empty_file == DIFF_REMOVED
|| (empty_file == DIFF_ADDED && use_rev2 != NULL))
/* Call CVS_UNLINK() rather than unlink_file() below to avoid the check
* for noexec.
*/
if( tmp != NULL )
{
if (CVS_UNLINK (tmp) < 0)
if (CVS_UNLINK(tmp) < 0)
error (0, errno, "cannot remove %s", tmp);
free (tmp);
}
if( rev1_cache != NULL )
{
if( CVS_UNLINK( rev1_cache ) < 0 )
error( 0, errno, "cannot remove %s", rev1_cache );
free( rev1_cache );
}
freevers_ts (&vers);
diff_mark_errors (err);
return (err);
return err;
}
/*
@ -820,9 +816,9 @@ diff_mark_errors (err)
static Dtype
diff_dirproc (callerdat, dir, pos_repos, update_dir, entries)
void *callerdat;
char *dir;
char *pos_repos;
char *update_dir;
const char *dir;
const char *pos_repos;
const char *update_dir;
List *entries;
{
/* XXX - check for dirs we don't want to process??? */
@ -844,8 +840,8 @@ static int
diff_filesdoneproc (callerdat, err, repos, update_dir, entries)
void *callerdat;
int err;
char *repos;
char *update_dir;
const char *repos;
const char *update_dir;
List *entries;
{
return (diff_errors);
@ -858,9 +854,9 @@ diff_filesdoneproc (callerdat, err, repos, update_dir, entries)
static int
diff_dirleaveproc (callerdat, dir, err, update_dir, entries)
void *callerdat;
char *dir;
const char *dir;
int err;
char *update_dir;
const char *update_dir;
List *entries;
{
return (diff_errors);
@ -870,10 +866,13 @@ diff_dirleaveproc (callerdat, dir, err, update_dir, entries)
* verify that a file is different
*/
static enum diff_file
diff_file_nodiff (finfo, vers, empty_file)
diff_file_nodiff( finfo, vers, empty_file, rev1_cache )
struct file_info *finfo;
Vers_TS *vers;
enum diff_file empty_file;
char **rev1_cache; /* Cache the content of rev1 if we have to look
* it up.
*/
{
Vers_TS *xvers;
int retcode;
@ -889,9 +888,10 @@ diff_file_nodiff (finfo, vers, empty_file)
{
/* special handling for TAG_HEAD */
if (diff_rev1 && strcmp (diff_rev1, TAG_HEAD) == 0)
use_rev1 = ((vers->vn_rcs == NULL || vers->srcfile == NULL)
? NULL
: RCS_branch_head (vers->srcfile, vers->vn_rcs));
{
if (vers->vn_rcs != NULL && vers->srcfile != NULL)
use_rev1 = RCS_branch_head (vers->srcfile, vers->vn_rcs);
}
else
{
xvers = Version_TS (finfo, NULL, diff_rev1, diff_date1, 1, 0);
@ -904,9 +904,10 @@ diff_file_nodiff (finfo, vers, empty_file)
{
/* special handling for TAG_HEAD */
if (diff_rev2 && strcmp (diff_rev2, TAG_HEAD) == 0)
use_rev2 = ((vers->vn_rcs == NULL || vers->srcfile == NULL)
? NULL
: RCS_branch_head (vers->srcfile, vers->vn_rcs));
{
if (vers->vn_rcs != NULL && vers->srcfile != NULL)
use_rev2 = RCS_branch_head (vers->srcfile, vers->vn_rcs);
}
else
{
xvers = Version_TS (finfo, NULL, diff_rev2, diff_date2, 1, 0);
@ -915,19 +916,39 @@ diff_file_nodiff (finfo, vers, empty_file)
freevers_ts (&xvers);
}
if (use_rev1 == NULL)
if( use_rev1 == NULL || RCS_isdead( vers->srcfile, use_rev1 ) )
{
/* The first revision does not exist. If EMPTY_FILES is
true, treat this as an added file. Otherwise, warn
about the missing tag. */
if (use_rev2 == NULL)
if( use_rev2 == NULL || RCS_isdead( vers->srcfile, use_rev2 ) )
/* At least in the case where DIFF_REV1 and DIFF_REV2
are both numeric, we should be returning some kind
of error (see basicb-8a0 in testsuite). The symbolic
case may be more complicated. */
* are both numeric (and non-existant (NULL), as opposed to
* dead?), we should be returning some kind of error (see
* basicb-8a0 in testsuite). The symbolic case may be more
* complicated.
*/
return DIFF_SAME;
else if (empty_files)
if( empty_files )
return DIFF_ADDED;
if( use_rev1 != NULL )
{
if (diff_rev1)
{
error( 0, 0,
"Tag %s refers to a dead (removed) revision in file `%s'.",
diff_rev1, finfo->fullname );
}
else
{
error( 0, 0,
"Date %s refers to a dead (removed) revision in file `%s'.",
diff_date1, finfo->fullname );
}
error( 0, 0,
"No comparison available. Pass `-N' to `%s diff'?",
program_name );
}
else if (diff_rev1)
error (0, 0, "tag %s is not in file %s", diff_rev1,
finfo->fullname);
@ -937,13 +958,32 @@ diff_file_nodiff (finfo, vers, empty_file)
return DIFF_ERROR;
}
if (use_rev2 == NULL)
assert( use_rev1 != NULL );
if( use_rev2 == NULL || RCS_isdead( vers->srcfile, use_rev2 ) )
{
/* The second revision does not exist. If EMPTY_FILES is
true, treat this as a removed file. Otherwise warn
about the missing tag. */
if (empty_files)
return DIFF_REMOVED;
if( use_rev2 != NULL )
{
if (diff_rev2)
{
error( 0, 0,
"Tag %s refers to a dead (removed) revision in file `%s'.",
diff_rev2, finfo->fullname );
}
else
{
error( 0, 0,
"Date %s refers to a dead (removed) revision in file `%s'.",
diff_date2, finfo->fullname );
}
error( 0, 0,
"No comparison available. Pass `-N' to `%s diff'?",
program_name );
}
else if (diff_rev2)
error (0, 0, "tag %s is not in file %s", diff_rev2,
finfo->fullname);
@ -952,15 +992,23 @@ diff_file_nodiff (finfo, vers, empty_file)
diff_date2, finfo->fullname);
return DIFF_ERROR;
}
/* now, see if we really need to do the diff */
if (strcmp (use_rev1, use_rev2) == 0)
/* Now, see if we really need to do the diff. We can't assume that the
* files are different when the revs are.
*/
assert( use_rev2 != NULL );
if( strcmp (use_rev1, use_rev2) == 0 )
return DIFF_SAME;
else
return DIFF_DIFFERENT;
/* else fall through and do the diff */
}
if ((diff_rev1 || diff_date1) && use_rev1 == NULL)
/* If we had a r1/d1 & r2/d2, then at this point we must have a C3P0...
* err... ok, then both rev1 & rev2 must have resolved to an existing,
* live version due to if statement we just closed.
*/
assert (!(diff_rev2 || diff_date2) || (use_rev1 && use_rev2));
if ((diff_rev1 || diff_date1) &&
(use_rev1 == NULL || RCS_isdead (vers->srcfile, use_rev1)))
{
/* The first revision does not exist, and no second revision
was given. */
@ -968,25 +1016,39 @@ diff_file_nodiff (finfo, vers, empty_file)
{
if (empty_file == DIFF_REMOVED)
return DIFF_SAME;
else
{
if (user_file_rev && use_rev2 == NULL)
use_rev2 = xstrdup (user_file_rev);
return DIFF_ADDED;
}
if( user_file_rev && use_rev2 == NULL )
use_rev2 = xstrdup( user_file_rev );
return DIFF_ADDED;
}
else
if( use_rev1 != NULL )
{
if (diff_rev1)
error (0, 0, "tag %s is not in file %s", diff_rev1,
finfo->fullname);
{
error( 0, 0,
"Tag %s refers to a dead (removed) revision in file `%s'.",
diff_rev1, finfo->fullname );
}
else
error (0, 0, "no revision for date %s in file %s",
diff_date1, finfo->fullname);
return DIFF_ERROR;
{
error( 0, 0,
"Date %s refers to a dead (removed) revision in file `%s'.",
diff_date1, finfo->fullname );
}
error( 0, 0,
"No comparison available. Pass `-N' to `%s diff'?",
program_name );
}
else if ( diff_rev1 )
error( 0, 0, "tag %s is not in file %s", diff_rev1,
finfo->fullname );
else
error( 0, 0, "no revision for date %s in file %s",
diff_date1, finfo->fullname );
return DIFF_ERROR;
}
assert( !diff_rev1 || use_rev1 );
if (user_file_rev)
{
/* drop user_file_rev into first unused use_rev */
@ -995,20 +1057,25 @@ diff_file_nodiff (finfo, vers, empty_file)
else if (!use_rev2)
use_rev2 = xstrdup (user_file_rev);
/* and if not, it wasn't needed anyhow */
user_file_rev = 0;
user_file_rev = NULL;
}
/* now, see if we really need to do the diff */
if (use_rev1 && use_rev2)
/* Now, see if we really need to do the diff. We can't assume that the
* files are different when the revs are.
*/
if( use_rev1 && use_rev2)
{
if (strcmp (use_rev1, use_rev2) == 0)
return DIFF_SAME;
else
return DIFF_DIFFERENT;
/* Fall through and do the diff. */
}
if (use_rev1 == NULL
|| (vers->vn_user != NULL && strcmp (use_rev1, vers->vn_user) == 0))
/* Don't want to do the timestamp check with both use_rev1 & use_rev2 set.
* The timestamp check is just for the default case of diffing the
* workspace file against its base revision.
*/
else if( use_rev1 == NULL
|| ( vers->vn_user != NULL
&& strcmp( use_rev1, vers->vn_user ) == 0 ) )
{
if (empty_file == DIFF_DIFFERENT
&& vers->ts_user != NULL
@ -1033,13 +1100,12 @@ diff_file_nodiff (finfo, vers, empty_file)
return empty_file;
/*
* with 0 or 1 -r option specified, run a quick diff to see if we
* should bother with it at all.
* Run a quick cmp to see if we should bother with a full diff.
*/
retcode = RCS_cmp_file (vers->srcfile, use_rev1,
*options ? options : vers->options,
finfo->file);
retcode = RCS_cmp_file( vers->srcfile, use_rev1, rev1_cache,
use_rev2, *options ? options : vers->options,
finfo->file );
return retcode == 0 ? DIFF_SAME : DIFF_DIFFERENT;
}

View file

@ -36,14 +36,17 @@ onoff_fileproc (callerdat, finfo)
return 0;
}
static int onoff_filesdoneproc PROTO ((void *, int, char *, char *, List *));
static int onoff_filesdoneproc PROTO ((void *, int, const char *, const char *,
List *));
static int
onoff_filesdoneproc (callerdat, err, repository, update_dir, entries)
void *callerdat;
int err;
char *repository;
char *update_dir;
const char *repository;
const char *update_dir;
List *entries;
{
if (setting_default)
@ -104,7 +107,7 @@ watch_onoff (argc, argv)
err = start_recursion (onoff_fileproc, onoff_filesdoneproc,
(DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL,
argc, argv, local, W_LOCAL, 0, CVS_LOCK_NONE,
(char *)NULL, 0);
(char *) NULL, 0, (char *) NULL);
Lock_Cleanup ();
return err;
@ -238,7 +241,7 @@ send_notifications (argc, argv, local)
notifications stay in CVSADM_NOTIFY to be sent next time. */
if (current_parsed_root->isremote)
{
if (strcmp (command_name, "release") != 0)
if (strcmp (cvs_cmd_name, "release") != 0)
{
start_server ();
ign_setup ();
@ -247,10 +250,10 @@ send_notifications (argc, argv, local)
err += start_recursion (dummy_fileproc, (FILESDONEPROC) NULL,
(DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL,
argc, argv, local, W_LOCAL, 0, 0, (char *)NULL,
0);
0, (char *) NULL);
send_to_server ("noop\012", 0);
if (strcmp (command_name, "release") == 0)
if (strcmp (cvs_cmd_name, "release") == 0)
err += get_server_responses ();
else
err += get_responses_and_close ();
@ -264,7 +267,7 @@ send_notifications (argc, argv, local)
err += start_recursion (ncheck_fileproc, (FILESDONEPROC) NULL,
(DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL,
argc, argv, local, W_LOCAL, 0, 0, (char *)NULL,
0);
0, (char *) NULL);
Lock_Cleanup ();
}
return err;
@ -443,8 +446,8 @@ edit (argc, argv)
repository. */
err = start_recursion (edit_fileproc, (FILESDONEPROC) NULL,
(DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL,
argc, argv, local, W_LOCAL, 0, 0, (char *)NULL,
0);
argc, argv, local, W_LOCAL, 0, 0, (char *) NULL,
0, (char *) NULL);
err += send_notifications (argc, argv, local);
@ -534,7 +537,7 @@ unedit_fileproc (callerdat, finfo)
now. */
if (node != NULL)
{
entdata = (Entnode *) node->data;
entdata = node->data;
if (baserev == NULL)
{
/* This can only happen if the CVS/Baserev file got
@ -613,7 +616,7 @@ unedit (argc, argv)
err = start_recursion (unedit_fileproc, (FILESDONEPROC) NULL,
(DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL,
argc, argv, local, W_LOCAL, 0, 0, (char *)NULL,
0);
0, (char *) NULL);
err += send_notifications (argc, argv, local);
@ -622,7 +625,7 @@ unedit (argc, argv)
void
mark_up_to_date (file)
char *file;
const char *file;
{
char *base;
@ -637,12 +640,13 @@ mark_up_to_date (file)
free (base);
}
void
editor_set (filename, editor, val)
char *filename;
char *editor;
char *val;
const char *filename;
const char *editor;
const char *val;
{
char *edlist;
char *newlist;
@ -663,32 +667,36 @@ editor_set (filename, editor, val)
struct notify_proc_args {
/* What kind of notification, "edit", "tedit", etc. */
char *type;
const char *type;
/* User who is running the command which causes notification. */
char *who;
const char *who;
/* User to be notified. */
char *notifyee;
const char *notifyee;
/* File. */
char *file;
const char *file;
};
/* Pass as a static until we get around to fixing Parse_Info to pass along
a void * where we can stash it. */
static struct notify_proc_args *notify_args;
static int notify_proc PROTO ((char *repository, char *filter));
static int notify_proc PROTO ((const char *repository, const char *filter));
static int
notify_proc (repository, filter)
char *repository;
char *filter;
const char *repository;
const char *filter;
{
FILE *pipefp;
char *prog;
char *expanded_prog;
char *p;
const char *p;
char *q;
char *srepos;
const char *srepos;
struct notify_proc_args *args = notify_args;
srepos = Short_Repository (repository);
@ -751,11 +759,11 @@ notify_proc (repository, filter)
void
notify_do (type, filename, who, val, watches, repository)
int type;
char *filename;
char *who;
char *val;
char *watches;
char *repository;
const char *filename;
const char *who;
const char *val;
const char *watches;
const char *repository;
{
static struct addremove_args blank;
struct addremove_args args;
@ -919,9 +927,11 @@ notify_do (type, filename, who, val, watches, repository)
if (args.notifyee == NULL)
{
args.notifyee = xmalloc (endp - p + 1);
strncpy (args.notifyee, p, endp - p);
args.notifyee[endp - p] = '\0';
char *tmp;
tmp = xmalloc (endp - p + 1);
strncpy (tmp, p, endp - p);
tmp[endp - p] = '\0';
args.notifyee = tmp;
}
notify_args = &args;
@ -930,7 +940,12 @@ notify_do (type, filename, who, val, watches, repository)
args.file = filename;
(void) Parse_Info (CVSROOTADM_NOTIFY, repository, notify_proc, 1);
free (args.notifyee);
/* It's okay to cast out the const for the free() below since we
* just allocated this a few lines above. The const was for
* everybody else.
*/
free ((char *)args.notifyee);
}
p = nextp;
@ -969,8 +984,8 @@ notify_do (type, filename, who, val, watches, repository)
/* Check and send notifications. This is only for the client. */
void
notify_check (repository, update_dir)
char *repository;
char *update_dir;
const char *repository;
const char *update_dir;
{
FILE *fp;
char *line = NULL;
@ -1136,6 +1151,6 @@ editors (argc, argv)
return start_recursion (editors_fileproc, (FILESDONEPROC) NULL,
(DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL,
argc, argv, local, W_LOCAL, 0, 1, (char *)NULL,
0);
argc, argv, local, W_LOCAL, 0, 1, (char *) NULL,
0, (char *) NULL);
}

View file

@ -17,7 +17,8 @@ extern int watch_off PROTO ((int argc, char **argv));
/* Check to see if any notifications are sitting around in need of being
sent. These are the notifications stored in CVSADM_NOTIFY (edit,unedit);
commit calls notify_do directly. */
extern void notify_check PROTO ((char *repository, char *update_dir));
extern void notify_check PROTO ((const char *repository,
const char *update_dir));
#endif /* CLIENT_SUPPORT */
/* Issue a notification for file FILENAME. TYPE is 'E' for edit, 'U'
@ -25,14 +26,16 @@ extern void notify_check PROTO ((char *repository, char *update_dir));
For TYPE 'E', VAL is the time+host+directory data which goes in
_editors, and WATCHES is zero or more of E,U,C, in that order, to specify
what kinds of temporary watches to set. */
extern void notify_do PROTO ((int type, char *filename, char *who,
char *val, char *watches, char *repository));
extern void notify_do PROTO ((int type, const char *filename, const char *who,
const char *val, const char *watches,
const char *repository));
/* Set attributes to reflect the fact that EDITOR is editing FILENAME.
VAL is time+host+directory, or NULL if we are to say that EDITOR is
*not* editing FILENAME. */
extern void editor_set PROTO ((char *filename, char *editor, char *val));
extern void editor_set PROTO ((const char *filename, const char *editor,
const char *val));
/* Take note of the fact that FILE is up to date (this munges CVS/Base;
processing of CVS/Entries is done separately). */
extern void mark_up_to_date PROTO ((char *file));
extern void mark_up_to_date PROTO ((const char *file));

View file

@ -24,6 +24,8 @@ static Entnode *subdir_record PROTO((int, const char *, const char *));
static FILE *entfile;
static char *entfilename; /* for error messages */
/*
* Construct an Entnode
*/
@ -90,9 +92,7 @@ write_ent_proc (node, closure)
Node *node;
void *closure;
{
Entnode *entnode;
entnode = (Entnode *) node->data;
Entnode *entnode = node->data;
if (closure != NULL && entnode->type != ENT_FILE)
*(int *) closure = 1;
@ -145,7 +145,7 @@ write_entries (list)
/* We didn't write out any directories. Check the list
private data to see whether subdirectory information is
known. If it is, we need to write out an empty D line. */
sdtp = (struct stickydirtag *) list->list->data;
sdtp = list->list->data;
if (sdtp == NULL || sdtp->subdirs)
if (fprintf (entfile, "D\n") < 0)
error (1, errno, "cannot write %s", entfilename);
@ -162,13 +162,15 @@ write_entries (list)
error (0, errno, "cannot remove %s", CVSADM_ENTLOG);
}
/*
* Removes the argument file from the Entries file if necessary.
*/
void
Scratch_Entry (list, fname)
List *list;
char *fname;
const char *fname;
{
Node *node;
@ -202,6 +204,8 @@ Scratch_Entry (list, fname)
}
}
/*
* Enters the given file name/version/time-stamp into the Entries file,
* removing the old entry first, if necessary.
@ -209,13 +213,13 @@ Scratch_Entry (list, fname)
void
Register (list, fname, vn, ts, options, tag, date, ts_conflict)
List *list;
char *fname;
char *vn;
char *ts;
char *options;
char *tag;
char *date;
char *ts_conflict;
const char *fname;
const char *vn;
const char *ts;
const char *options;
const char *tag;
const char *date;
const char *ts_conflict;
{
Entnode *entnode;
Node *node;
@ -270,9 +274,8 @@ static void
freesdt (p)
Node *p;
{
struct stickydirtag *sdtp;
struct stickydirtag *sdtp = p->data;
sdtp = (struct stickydirtag *) p->data;
if (sdtp->tag)
free (sdtp->tag);
if (sdtp->date)
@ -488,7 +491,7 @@ Entries_Open (aflag, update_dir)
sdtp->nonbranch = dirnonbranch;
/* feed it into the list-private area */
entries->list->data = (char *) sdtp;
entries->list->data = sdtp;
entries->list->delproc = freesdt;
}
@ -553,7 +556,7 @@ Entries_Open (aflag, update_dir)
sdtp = (struct stickydirtag *) xmalloc (sizeof (*sdtp));
memset ((char *) sdtp, 0, sizeof (*sdtp));
sdtp->subdirs = 0;
entries->list->data = (char *) sdtp;
entries->list->data = sdtp;
entries->list->delproc = freesdt;
}
@ -592,9 +595,8 @@ static void
Entries_delproc (node)
Node *node;
{
Entnode *p;
Entnode *p = node->data;
p = (Entnode *) node->data;
Entnode_Destroy(p);
}
@ -626,7 +628,7 @@ AddEntryNode (list, entdata)
assume that the key is dynamically allocated. The user's free proc
should be responsible for freeing the key. */
p->key = xstrdup (entdata->user);
p->data = (char *) entdata;
p->data = entdata;
/* put the node into the list */
addnode (list, p);
@ -638,12 +640,12 @@ AddEntryNode (list, entdata)
*/
void
WriteTag (dir, tag, date, nonbranch, update_dir, repository)
char *dir;
char *tag;
char *date;
const char *dir;
const char *tag;
const char *date;
int nonbranch;
char *update_dir;
char *repository;
const char *update_dir;
const char *repository;
{
FILE *fout;
char *tmp;
@ -796,11 +798,10 @@ void
Subdirs_Known (entries)
List *entries;
{
struct stickydirtag *sdtp;
struct stickydirtag *sdtp = entries->list->data;
/* If there is no list private data, that means that the
subdirectory information is known. */
sdtp = (struct stickydirtag *) entries->list->data;
if (sdtp != NULL && ! sdtp->subdirs)
{
FILE *fp;

View file

@ -128,12 +128,12 @@ error (status, errnum, message, va_alist)
char buf[100];
cvs_outerr (program_name, 0);
if (command_name && *command_name)
if (cvs_cmd_name && *cvs_cmd_name)
{
cvs_outerr (" ", 1);
if (status != 0)
cvs_outerr ("[", 1);
cvs_outerr (command_name, 0);
cvs_outerr (cvs_cmd_name, 0);
if (status != 0)
cvs_outerr (" aborted]", 0);
}

View file

@ -15,9 +15,11 @@
#include "cvs.h"
#include <sys/types.h>
static char *expand_variable PROTO((char *env, char *file, int line));
static char *expand_variable PROTO((const char *env, const char *file,
int line));
/* User variables. */
List *variable_list = NULL;
@ -79,7 +81,9 @@ variable_set (nameval)
free (name);
}
}
/* This routine will expand the pathname to account for ~ and $
characters as described above. Returns a pointer to a newly
malloc'd string. If an error occurs, an error message is printed
@ -89,11 +93,11 @@ variable_set (nameval)
known. */
char *
expand_path (name, file, line)
char *name;
char *file;
const char *name;
const char *file;
int line;
{
char *s;
const char *s;
char *d;
char *mybuf = NULL;
@ -179,8 +183,9 @@ expand_path (name, file, line)
if (*s++ == '~')
{
char *t;
char *p=s;
if (*s=='/' || *s==0)
char *p, *pstart;
pstart = p = xstrdup (s);
if (*pstart=='/' || *pstart==0)
t = get_homedir ();
else
{
@ -201,14 +206,14 @@ expand_path (name, file, line)
for (; *p!='/' && *p; p++)
;
*p = 0;
ps = getpwnam (s);
ps = getpwnam (pstart);
if (ps == 0)
{
if (line != 0)
error (0, 0, "%s:%d: no such user %s",
file, line, s);
file, line, pstart);
else
error (0, 0, "%s: no such user %s", file, s);
error (0, 0, "%s: no such user %s", file, pstart);
return NULL;
}
t = ps->pw_dir;
@ -227,9 +232,8 @@ expand_path (name, file, line)
d = buf + doff;
}
--d;
if (*p == 0)
*p = '/'; /* always add / */
s=p;
s+=p-pstart;
free (pstart);
}
else
--s;
@ -267,12 +271,12 @@ expand_path (name, file, line)
static char *
expand_variable (name, file, line)
char *name;
char *file;
const char *name;
const char *file;
int line;
{
if (strcmp (name, CVSROOT_ENV) == 0)
return current_parsed_root->original;
return current_parsed_root->directory;
else if (strcmp (name, "RCSBIN") == 0)
{
error (0, 0, "RCSBIN internal variable is no longer supported");

View file

@ -43,7 +43,7 @@ static struct unrecog *unrecog_head;
no open(), no nothing. */
void
fileattr_startdir (repos)
char *repos;
const char *repos;
{
assert (fileattr_stored_repos == NULL);
fileattr_stored_repos = xstrdup (repos);

View file

@ -56,7 +56,7 @@
/* Prepare for a new directory with repository REPOS. If REPOS is NULL,
then prepare for a "non-directory"; the caller can call fileattr_write
and fileattr_free, but must not call fileattr_get or fileattr_set. */
extern void fileattr_startdir PROTO ((char *repos));
extern void fileattr_startdir PROTO ((const char *repos));
/* Get the attribute ATTRNAME for file FILENAME. The return value
points into memory managed by the fileattr_* routines, should not

View file

@ -327,12 +327,13 @@ make_directories (name)
existed. */
int
mkdir_if_needed (name)
char *name;
const char *name;
{
if (mkdir (name, 0777) < 0)
{
if (errno != EEXIST && !isdir (name))
error (1, errno, "cannot make directory %s", name);
int save_errno = errno;
if (save_errno != EEXIST && !isdir (name))
error (1, save_errno, "cannot make directory %s", name);
return 1;
}
return 0;
@ -347,7 +348,7 @@ mkdir_if_needed (name)
*/
void
xchmod (fname, writable)
char *fname;
const char *fname;
int writable;
{
struct stat sb;
@ -609,6 +610,7 @@ xcmp (file1, file2)
/* If FILE1 and FILE2 are symlinks, they are equal if they point to
the same thing. */
#ifdef S_ISLNK
if (S_ISLNK (sb1.st_mode) && S_ISLNK (sb2.st_mode))
{
int result;
@ -619,6 +621,7 @@ xcmp (file1, file2)
free (buf2);
return result;
}
#endif
/* If FILE1 and FILE2 are devices, they are equal if their device
numbers match. */
@ -766,8 +769,8 @@ FILE *cvs_temp_file (filename)
if (fd == -1) fp = NULL;
else if ((fp = CVS_FDOPEN (fd, "w+")) == NULL)
{
/* attempt to close and unlink the file since mkstemp returned sucessfully and
* we believe it's been created and opened
/* Attempt to close and unlink the file since mkstemp returned
* sucessfully and we believe it's been created and opened.
*/
int save_errno = errno;
if (close (fd))
@ -845,31 +848,33 @@ FILE *cvs_temp_file (filename)
return fp;
}
/* Return non-zero iff FILENAME is absolute.
Trivial under Unix, but more complicated under other systems. */
int
isabsolute (filename)
const char *filename;
{
return filename[0] == '/';
}
/*
* Return a string (dynamically allocated) with the name of the file to which
* LINK is symlinked.
#ifdef HAVE_READLINK
/* char *
* xreadlink ( const char *link )
*
* Like the X/OPEN and 4.4BSD readlink() function, but allocates and returns
* its own buf.
*
* INPUTS
* link The original path.
*
* RETURNS
* The resolution of the final symbolic link in the path.
*
* ERRORS
* This function exits with a fatal error if it fails to read the link for
* any reason.
*/
char *
xreadlink (link)
const char *link;
{
char *file = NULL;
char *tfile;
int buflen = 128;
int link_name_len;
if (!islink (link))
return NULL;
/* Get the name of the file to which `from' is linked.
FIXME: what portability issues arise here? Are readlink &
ENAMETOOLONG defined on all systems? -twp */
@ -886,19 +891,59 @@ xreadlink (link)
file[link_name_len] = '\0';
tfile = xstrdup (file);
free (file);
return file;
}
#endif /* HAVE_READLINK */
return tfile;
/* char *
* xresolvepath ( const char *path )
*
* Like xreadlink(), but resolve all links in a path.
*
* INPUTS
* path The original path.
*
* RETURNS
* The path with any symbolic links expanded.
*
* ERRORS
* This function exits with a fatal error if it fails to read the link for
* any reason.
*/
char *
xresolvepath ( path )
const char *path;
{
char *hardpath;
char *owd;
assert ( isdir ( path ) );
/* FIXME - If HAVE_READLINK is defined, we should probably walk the path
* bit by bit calling xreadlink().
*/
owd = xgetwd();
if ( CVS_CHDIR ( path ) < 0)
error ( 1, errno, "cannot chdir to %s", path );
if ( ( hardpath = xgetwd() ) == NULL )
error (1, errno, "cannot getwd in %s", path);
if ( CVS_CHDIR ( owd ) < 0)
error ( 1, errno, "cannot chdir to %s", owd );
free (owd);
return hardpath;
}
/* Return a pointer into PATH's last component. */
char *
const char *
last_component (path)
char *path;
const char *path;
{
char *last = strrchr (path, '/');
const char *last = strrchr (path, '/');
if (last && (last != path))
return last + 1;
@ -990,6 +1035,8 @@ expand_wild (argc, argv, pargc, pargv)
(*pargv)[i] = xstrdup (argv[i]);
}
#ifdef SERVER_SUPPORT
/* Case-insensitive string compare. I know that some systems
have such a routine, but I'm not sure I see any reasons for
@ -998,11 +1045,11 @@ expand_wild (argc, argv, pargc, pargv)
not). */
int
cvs_casecmp (str1, str2)
char *str1;
char *str2;
const char *str1;
const char *str2;
{
char *p;
char *q;
const char *p;
const char *q;
int pqdiff;
p = str1;
@ -1016,107 +1063,4 @@ cvs_casecmp (str1, str2)
}
return pqdiff;
}
/* Case-insensitive file open. As you can see, this is an expensive
call. We don't regard it as our main strategy for dealing with
case-insensitivity. Returns errno code or 0 for success. Puts the
new file in *FP. NAME and MODE are as for fopen. If PATHP is not
NULL, then put a malloc'd string containing the pathname as found
into *PATHP. *PATHP is only set if the return value is 0.
Might be cleaner to separate the file finding (which just gives
*PATHP) from the file opening (which the caller can do). For one
thing, might make it easier to know whether to put NAME or *PATHP
into error messages. */
int
fopen_case (name, mode, fp, pathp)
char *name;
char *mode;
FILE **fp;
char **pathp;
{
struct dirent *dp;
DIR *dirp;
char *dir;
char *fname;
char *found_name;
int retval;
/* Separate NAME into directory DIR and filename within the directory
FNAME. */
dir = xstrdup (name);
fname = strrchr (dir, '/');
if (fname == NULL)
error (1, 0, "internal error: relative pathname in fopen_case");
*fname++ = '\0';
found_name = NULL;
dirp = CVS_OPENDIR (dir);
if (dirp == NULL)
{
if (existence_error (errno))
{
/* This can happen if we are looking in the Attic and the Attic
directory does not exist. Return the error to the caller;
they know what to do with it. */
retval = errno;
goto out;
}
else
{
/* Give a fatal error; that way the error message can be
more specific than if we returned the error to the caller. */
error (1, errno, "cannot read directory %s", dir);
}
}
errno = 0;
while ((dp = CVS_READDIR (dirp)) != NULL)
{
if (cvs_casecmp (dp->d_name, fname) == 0)
{
if (found_name != NULL)
error (1, 0, "%s is ambiguous; could mean %s or %s",
fname, dp->d_name, found_name);
found_name = xstrdup (dp->d_name);
}
}
if (errno != 0)
error (1, errno, "cannot read directory %s", dir);
CVS_CLOSEDIR (dirp);
if (found_name == NULL)
{
*fp = NULL;
retval = ENOENT;
}
else
{
char *p;
/* Copy the found name back into DIR. We are assuming that
found_name is the same length as fname, which is true as
long as the above code is just ignoring case and not other
aspects of filename syntax. */
p = dir + strlen (dir);
*p++ = '/';
strcpy (p, found_name);
*fp = fopen (dir, mode);
if (*fp == NULL)
retval = errno;
else
retval = 0;
}
if (pathp == NULL)
free (dir);
else if (retval != 0)
free (dir);
else
*pathp = dir;
free (found_name);
out:
return retval;
}
#endif /* SERVER_SUPPORT */
/* vim:tabstop=8:shiftwidth=4
*/

View file

@ -33,11 +33,10 @@ add_entries_proc (node, closure)
Node *node;
void *closure;
{
Entnode *entnode;
Node *fnode;
List *filelist = (List *) closure;
List *filelist = closure;
Entnode *entnode = node->data;
entnode = (Entnode *) node->data;
if (entnode->type != ENT_FILE)
return (0);
@ -127,11 +126,10 @@ add_subdir_proc (p, closure)
Node *p;
void *closure;
{
List *dirlist = (List *) closure;
Entnode *entnode;
List *dirlist = closure;
Entnode *entnode = p->data;
Node *dnode;
entnode = (Entnode *) p->data;
if (entnode->type != ENT_SUBDIR)
return 0;
@ -189,7 +187,7 @@ Find_Directories (repository, which, entries)
tmpentries = NULL;
if (tmpentries != NULL)
sdtp = (struct stickydirtag *) tmpentries->list->data;
sdtp = tmpentries->list->data;
/* If we do have an entries list, then if sdtp is NULL, or if
sdtp->subdirs is nonzero, all subdirectory information is

View file

@ -87,7 +87,7 @@ lookup_file_by_inode (filepath)
hp = getnode ();
hp->type = NT_UNKNOWN;
hp->key = inodestr;
hp->data = (char *) getlist();
hp->data = getlist();
hp->delproc = dellist;
(void) addnode (hardlist, hp);
}
@ -96,14 +96,14 @@ lookup_file_by_inode (filepath)
free (inodestr);
}
p = findnode ((List *) hp->data, filepath);
p = findnode (hp->data, filepath);
if (p == NULL)
{
p = getnode();
p->type = NT_UNKNOWN;
p->key = xstrdup (filepath);
p->data = NULL;
(void) addnode ((List *) hp->data, p);
(void) addnode (hp->data, p);
}
return p;
@ -143,8 +143,8 @@ update_hardlink_info (file)
}
if (n->data == NULL)
n->data = (char *) xmalloc (sizeof (struct hardlink_info));
hlinfo = (struct hardlink_info *) n->data;
n->data = xmalloc (sizeof (struct hardlink_info));
hlinfo = n->data;
hlinfo->status = T_UPTODATE;
hlinfo->checked_out = 1;
}
@ -197,10 +197,10 @@ list_linked_files_on_disk (file)
/* Make sure the files linked to this inode are sorted. */
n = findnode (hardlist, inodestr);
sortlist ((List *) n->data, fsortcmp);
sortlist (n->data, fsortcmp);
free (inodestr);
return (List *) n->data;
return n->data;
}
/* Compare the files in the `key' fields of two lists, returning 1 if
@ -292,7 +292,7 @@ find_checkedout_proc (node, data)
return 0;
}
hlinfo = (struct hardlink_info *) link->data;
hlinfo = link->data;
if (hlinfo->checked_out)
{
/* This file has been checked out recently, so it's safe to

View file

@ -195,7 +195,7 @@ freenode_mem (p)
free (p->key);
/* to be safe, re-initialize these */
p->key = p->data = (char *) NULL;
p->key = p->data = NULL;
p->delproc = (void (*) ()) NULL;
}
@ -402,6 +402,9 @@ sortlist (list, comp)
Node *head, *remain, *p, **array;
int i, n;
if (list == NULL)
return;
/* save the old first element of the list */
head = list->list;
remain = head->next;
@ -488,8 +491,10 @@ printnode (node, closure)
return(0);
}
(void) printf("Node at 0x%p: type = %s, key = 0x%p = \"%s\", data = 0x%p, next = 0x%p, prev = 0x%p\n",
node, nodetypestring(node->type), node->key, node->key, node->data, node->next, node->prev);
(void) printf("Node at %p: type = %s, key = %p = \"%s\", data = %p, next = %p, prev = %p\n",
(void *)node, nodetypestring(node->type),
(void *)node->key, node->key, node->data,
(void *)node->next, (void *)node->prev);
return(0);
}
@ -509,8 +514,8 @@ printlist (list)
return;
}
(void) printf("List at 0x%p: list = 0x%p, HASHSIZE = %d, next = 0x%p\n",
list, list->list, HASHSIZE, list->next);
(void) printf("List at %p: list = %p, HASHSIZE = %d, next = %p\n",
(void *)list, (void *)list->list, HASHSIZE, (void *)list->next);
(void) walklist(list, printnode, NULL);

View file

@ -30,7 +30,7 @@ struct node
struct node *hashnext;
struct node *hashprev;
char *key;
char *data;
void *data;
void (*delproc) ();
};
typedef struct node Node;

View file

@ -21,6 +21,7 @@
* F "Release" cmd.
* W "Update" cmd - No User file, Remove from Entries file.
* U "Update" cmd - File was checked out over User file.
* P "Update" cmd - User file was patched.
* G "Update" cmd - File was merged successfully.
* C "Update" cmd - File was merged and shows overlaps.
* M "Commit" cmd - "Modified" file.
@ -34,9 +35,9 @@
*
* CurDir The directory where the action occurred. This should be the
* absolute path of the directory which is at the same level as
* the "Repository" field (for W,U,G,C & M,A,R).
* the "Repository" field (for W,U,P,G,C & M,A,R).
*
* Repository For record types [W,U,G,C,M,A,R] this field holds the
* Repository For record types [W,U,P,G,C,M,A,R] this field holds the
* repository read from the administrative data where the
* command was typed.
* T "A" --> New Tag, "D" --> Delete Tag
@ -48,11 +49,11 @@
* O,E The Tag or Date, if specified, else "" (null field).
* F "" (null field)
* W The Tag or Date, if specified, else "" (null field).
* U The Revision checked out over the User file.
* U,P The Revision checked out over the User file.
* G,C The Revision(s) involved in merge.
* M,A,R RCS Revision affected.
*
* argument The module (for [TOEUF]) or file (for [WUGCMAR]) affected.
* argument The module (for [TOEF]) or file (for [WUPGCMAR]) affected.
*
*
*** Report categories: "User" and "Since" modifiers apply to all reports.
@ -60,7 +61,7 @@
*
* Extract list of record types
*
* -e, -x [TOEFWUGCMAR]
* -e, -x [TOEFWUPGCMAR]
*
* Extracted records are simply printed, No analysis is performed.
* All "field" modifiers apply. -e chooses all types.
@ -93,7 +94,7 @@
* modules are remembered. Only records matching exactly those
* files and repositories are shown. Sorting by "module", then
* filename, is implied. If -l ("last modified") is specified,
* then "update" records (types WUCG), tag and release records
* then "update" records (types WUPCG), tag and release records
* are ignored and the last (by date) "modified" record.
*
* TAG history
@ -170,7 +171,7 @@
* cvs hi -e -u user
*
*** Dump (eXtract) specified record types
* cvs hi -x [TOFWUGCMAR]
* cvs hi -x [TOEFWUPGCMAR]
*
*
* FUTURE: J[Join], I[Import] (Not currently implemented.)
@ -178,6 +179,7 @@
*/
#include "cvs.h"
#include "history.h"
#include "savecwd.h"
static struct hrec
@ -208,7 +210,6 @@ static void save_file PROTO((char *dir, char *name, char *module));
static void save_module PROTO((char *module));
static void save_user PROTO((char *name));
#define ALL_REC_TYPES "TOEFWUCGMAR"
#define USER_INCREMENT 2
#define FILE_INCREMENT 128
#define MODULE_INCREMENT 5
@ -217,6 +218,7 @@ static void save_user PROTO((char *name));
static short report_count;
static short extract;
static short extract_all;
static short v_checkout;
static short modified;
static short tag_report;
@ -234,7 +236,7 @@ static short tz_local;
static time_t tz_seconds_east_of_GMT;
static char *tz_name = "+0000";
char *logHistory = ALL_REC_TYPES;
char *logHistory = ALL_HISTORY_REC_TYPES;
/* -r, -t, or -b options, malloc'd. These are "" if the option in
question is not specified or is overridden by another option. The
@ -290,7 +292,7 @@ static const char *const history_usg[] =
" -c Committed (Modified) files\n",
" -o Checked out modules\n",
" -m <module> Look for specified module (repeatable)\n",
" -x [TOEFWUCGMAR] Extract by record type\n",
" -x [" ALL_HISTORY_REC_TYPES "] Extract by record type\n",
" -e Everything (same as -x, but all record types)\n",
" Flags:\n",
" -a All users (Default is self)\n",
@ -399,9 +401,9 @@ history (argc, argv)
break;
case 'e':
report_count++;
extract++;
extract_all++;
free (rec_types);
rec_types = xstrdup (ALL_REC_TYPES);
rec_types = xstrdup (ALL_HISTORY_REC_TYPES);
break;
case 'l': /* Find Last file record */
last_entry = 1;
@ -482,7 +484,7 @@ history (argc, argv)
char *cp;
for (cp = optarg; *cp; cp++)
if (!strchr (ALL_REC_TYPES, *cp))
if (!strchr (ALL_HISTORY_REC_TYPES, *cp))
error (1, 0, "%c is not a valid report type", *cp);
}
free (rec_types);
@ -584,6 +586,8 @@ history (argc, argv)
option_with_arg ("-t", since_tag);
for (mod = user_list; mod < &user_list[user_count]; ++mod)
option_with_arg ("-u", *mod);
if (extract_all)
send_arg("-e");
if (extract)
option_with_arg ("-x", rec_types);
option_with_arg ("-z", tz_name);
@ -607,7 +611,7 @@ history (argc, argv)
(void) strcat (rec_types, "T");
}
}
else if (extract)
else if (extract || extract_all)
{
if (user_list)
user_sort++;
@ -636,7 +640,7 @@ history (argc, argv)
else if (module_report)
{
free (rec_types);
rec_types = xstrdup (last_entry ? "OMAR" : ALL_REC_TYPES);
rec_types = xstrdup (last_entry ? "OMAR" : ALL_HISTORY_REC_TYPES);
module_sort++;
repos_sort++;
file_sort++;
@ -697,22 +701,25 @@ history (argc, argv)
void
history_write (type, update_dir, revs, name, repository)
int type;
char *update_dir;
char *revs;
char *name;
char *repository;
const char *update_dir;
const char *revs;
const char *name;
const char *repository;
{
char *fname;
char *workdir;
char *username = getcaller ();
int fd;
char *line;
char *slash = "", *cp, *cp2, *repos;
char *slash = "", *cp;
const char *cp2, *repos;
int i;
static char *tilde = "";
static char *PrCurDir = NULL;
if (logoff) /* History is turned off by cmd line switch */
if (logoff) /* History is turned off by noexec or
* readonlyfs.
*/
return;
if ( strchr(logHistory, type) == NULL )
return;
@ -722,6 +729,15 @@ history_write (type, update_dir, revs, name, repository)
CVSROOTADM, CVSROOTADM_HISTORY);
/* turn off history logging if the history file does not exist */
/* FIXME: This should check for write permissions instead. This way,
* O_CREATE could be added back into the call to open() below and
* there would be no race condition involved in log rotation.
*
* Note that the new method of turning off logging would be either via
* the CVSROOT/config file (probably the quicker method, but would need
* to be added, or at least checked for, too) or by creating a dummy
* history file with 0444 permissions.
*/
if (!isfile (fname))
{
logoff = 1;
@ -733,7 +749,7 @@ history_write (type, update_dir, revs, name, repository)
CLIENT_SERVER_STR, fname);
if (noexec)
goto out;
fd = CVS_OPEN (fname, O_WRONLY | O_APPEND | O_CREAT | OPEN_BINARY, 0666);
fd = CVS_OPEN (fname, O_WRONLY | O_APPEND | OPEN_BINARY, 0666);
if (fd < 0)
{
if (! really_quiet)
@ -1524,6 +1540,7 @@ report_hrecs ()
break;
case 'W':
case 'U':
case 'P':
case 'C':
case 'G':
case 'M':

13
contrib/cvs/src/history.h Normal file
View file

@ -0,0 +1,13 @@
/*
* Copyright (c) 2003, Derek Price, Ximbiot <http://ximbiot.com>,
* and the Free Software Foundation
*
* You may distribute under the terms of the GNU General Public License
* as specified in the README file that comes with the CVS source
* distribution.
*
* This is the header file for definitions and functions shared by history.c
* with other portions of CVS.
*/
#define ALL_HISTORY_REC_TYPES "TOEFWUPCGMAR"

View file

@ -165,6 +165,8 @@ ign_add_file (file, hold)
free (line);
}
/* Parse a line of space-separated wildcards and add them to the list. */
void
ign_add (ign, hold)
@ -183,6 +185,16 @@ ign_add (ign, hold)
if (isspace ((unsigned char) *ign))
continue;
/* If we have used up all the space, add some more. Do this before
processing `!', since an "empty" list still contains the `CVS'
entry. */
if (ign_count >= ign_size)
{
ign_size += IGN_GROW;
ign_list = (char **) xrealloc ((char *) ign_list,
(ign_size + 1) * sizeof (char *));
}
/*
* if we find a single character !, we must re-set the ignore list
* (saving it if necessary). We also catch * as a special case in a
@ -198,8 +210,10 @@ ign_add (ign, hold)
for (i = 0; i < ign_count; i++)
free (ign_list[i]);
ign_count = 0;
ign_list[0] = NULL;
ign_count = 1;
/* Always ignore the "CVS" directory. */
ign_list[0] = xstrdup("CVS");
ign_list[1] = NULL;
/* if we are doing a '!', continue; otherwise add the '*' */
if (*ign == '!')
@ -223,20 +237,14 @@ ign_add (ign, hold)
for (i = 0; i < ign_count; i++)
s_ign_list[i] = ign_list[i];
s_ign_count = ign_count;
ign_count = 0;
ign_list[0] = NULL;
ign_count = 1;
/* Always ignore the "CVS" directory. */
ign_list[0] = xstrdup ("CVS");
ign_list[1] = NULL;
continue;
}
}
/* If we have used up all the space, add some more */
if (ign_count >= ign_size)
{
ign_size += IGN_GROW;
ign_list = (char **) xrealloc ((char *) ign_list,
(ign_size + 1) * sizeof (char *));
}
/* find the end of this token */
for (mark = ign; *mark && !isspace ((unsigned char) *mark); mark++)
/* do nothing */ ;
@ -255,12 +263,11 @@ ign_add (ign, hold)
}
}
/* Set to 1 if filenames should be matched in a case-insensitive
fashion. Note that, contrary to the name and placement in ignore.c,
this is no longer just for ignore patterns. */
int ign_case;
/* Return 1 if the given filename should be ignored by update or import. */
/* Return true if the given filename should be ignored by update or import,
* else return false.
*/
int
ign_name (name)
char *name;
@ -268,47 +275,17 @@ ign_name (name)
char **cpp = ign_list;
if (cpp == NULL)
return (0);
if (ign_case)
{
/* We do a case-insensitive match by calling fnmatch on copies of
the pattern and the name which have been converted to
lowercase. FIXME: would be much cleaner to just unify this
with the other case-insensitive fnmatch stuff (FOLD_FN_CHAR
in lib/fnmatch.c; os2_fnmatch in emx/system.c). */
char *name_lower;
char *pat_lower;
char *p;
name_lower = xstrdup (name);
for (p = name_lower; *p != '\0'; ++p)
*p = tolower (*p);
while (*cpp)
{
pat_lower = xstrdup (*cpp++);
for (p = pat_lower; *p != '\0'; ++p)
*p = tolower (*p);
if (CVS_FNMATCH (pat_lower, name_lower, 0) == 0)
goto matched;
free (pat_lower);
}
free (name_lower);
return 0;
matched:
free (name_lower);
free (pat_lower);
return 1;
}
else
{
while (*cpp)
if (CVS_FNMATCH (*cpp++, name, 0) == 0)
return 1;
return 0;
}
while (*cpp)
if (CVS_FNMATCH (*cpp++, name, 0) == 0)
return 1;
return 0;
}
/* FIXME: This list of dirs to ignore stuff seems not to be used.
Really? send_dirent_proc and update_dirent_proc both call
ignore_directory and do_module calls ign_dir_add. No doubt could
@ -340,7 +317,7 @@ ign_dir_add (name)
int
ignore_directory (name)
char *name;
const char *name;
{
int i;
@ -356,7 +333,9 @@ ignore_directory (name)
return 0;
}
/*
* Process the current directory, looking for files not in ILIST and
* not on the global ignore list for this directory. If we find one,
@ -369,7 +348,7 @@ void
ignore_files (ilist, entries, update_dir, proc)
List *ilist;
List *entries;
char *update_dir;
const char *update_dir;
Ignore_proc proc;
{
int subdirs;
@ -377,7 +356,7 @@ ignore_files (ilist, entries, update_dir, proc)
struct dirent *dp;
struct stat sb;
char *file;
char *xdir;
const char *xdir;
List *files;
Node *p;
@ -386,9 +365,8 @@ ignore_files (ilist, entries, update_dir, proc)
subdirs = 0;
else
{
struct stickydirtag *sdtp;
struct stickydirtag *sdtp = entries->list->data;
sdtp = (struct stickydirtag *) entries->list->data;
subdirs = sdtp == NULL || sdtp->subdirs;
}
@ -451,7 +429,7 @@ ignore_files (ilist, entries, update_dir, proc)
#ifdef DT_DIR
dp->d_type != DT_UNKNOWN ||
#endif
lstat(file, &sb) != -1)
CVS_LSTAT (file, &sb) != -1)
{
if (

View file

@ -20,7 +20,7 @@
#include "savecwd.h"
#include <assert.h>
static char *get_comment PROTO((char *user));
static char *get_comment PROTO((const char *user));
static int add_rev PROTO((char *message, RCSNode *rcs, char *vfile,
char *vers));
static int add_tags PROTO((RCSNode *rcs, char *vfile, char *vtag, int targc,
@ -91,7 +91,7 @@ import (argc, argv)
#endif
error (1, 0,
"-q or -Q must be specified before \"%s\"",
command_name);
cvs_cmd_name);
break;
case 'd':
#ifdef SERVER_SUPPORT
@ -157,6 +157,21 @@ import (argc, argv)
use_file_modtime = 1;
#endif
/* Don't allow "CVS" as any directory in module path.
*
* Could abstract this to valid_module_path, but I don't think we'll need
* to call it from anywhere else.
*/
if ((cp = strstr(argv[0], "CVS")) && /* path contains "CVS" AND ... */
((cp == argv[0]) || ISDIRSEP(*(cp-1))) && /* /^CVS/ OR m#/CVS# AND ... */
((*(cp+3) == '\0') || ISDIRSEP(*(cp+3))) /* /CVS$/ OR m#CVS/# */
)
{
error (0, 0,
"The word `CVS' is reserved by CVS and may not be used");
error (1, 0, "as a directory in a path or as a file name.");
}
for (i = 1; i < argc; i++) /* check the tags for validity */
{
int j;
@ -168,8 +183,7 @@ import (argc, argv)
}
/* XXX - this should be a module, not just a pathname */
if (! isabsolute (argv[0])
&& pathname_levels (argv[0]) == 0)
if (!isabsolute (argv[0]) && pathname_levels (argv[0]) == 0)
{
if (current_parsed_root == NULL)
{
@ -379,7 +393,7 @@ import (argc, argv)
li->type = T_TITLE;
li->tag = xstrdup (vbranch);
li->rev_old = li->rev_new = NULL;
p->data = (char *) li;
p->data = li;
(void) addnode (ulist, p);
Update_Logfile (repository, message, logfp, ulist);
dellist (&ulist);
@ -573,7 +587,8 @@ process_import_file (message, vfile, vtag, targc, targv)
node = findnode_fn (entries, vfile);
if (node != NULL)
{
Entnode *entdata = (Entnode *) node->data;
Entnode *entdata = node->data;
if (entdata->type == ENT_FILE)
{
assert (entdata->options[0] == '-'
@ -653,7 +668,8 @@ update_rcs_file (message, vfile, vtag, targc, targv, inattic)
not NULL? */
expand = vers->srcfile->expand != NULL &&
vers->srcfile->expand[0] == 'b' ? "-kb" : "-ko";
different = RCS_cmp_file (vers->srcfile, vers->vn_rcs, expand, vfile);
different = RCS_cmp_file( vers->srcfile, vers->vn_rcs, (char **)NULL,
(char *)NULL, expand, vfile );
if (tocvsPath)
if (unlink_file_dir (tocvsPath) < 0)
error (0, errno, "cannot remove %s", tocvsPath);
@ -932,7 +948,7 @@ static const struct compair comtable[] =
static char *
get_comment (user)
char *user;
const char *user;
{
char *cp, *suffix;
char *suffix_path;
@ -988,34 +1004,34 @@ add_rcs_file (message, rcs, user, add_vhead, key_opt,
add_vbranch, vtag, targc, targv,
desctext, desclen, add_logfp)
/* Log message for the addition. Not used if add_vhead == NULL. */
char *message;
const char *message;
/* Filename of the RCS file to create. */
char *rcs;
const char *rcs;
/* Filename of the file to serve as the contents of the initial
revision. Even if add_vhead is NULL, we use this to determine
the modes to give the new RCS file. */
char *user;
const char *user;
/* Revision number of head that we are adding. Normally 1.1 but
could be another revision as long as ADD_VBRANCH is a branch
from it. If NULL, then just add an empty file without any
revisions (similar to the one created by "rcs -i"). */
char *add_vhead;
const char *add_vhead;
/* Keyword expansion mode, e.g., "b" for binary. NULL means the
default behavior. */
char *key_opt;
const char *key_opt;
/* Vendor branch to import to, or NULL if none. If non-NULL, then
vtag should also be non-NULL. */
char *add_vbranch;
char *vtag;
const char *add_vbranch;
const char *vtag;
int targc;
char *targv[];
/* If non-NULL, description for the file. If NULL, the description
will be empty. */
char *desctext;
const char *desctext;
size_t desclen;
/* Write errors to here as well as via error (), or NULL if we should
@ -1031,8 +1047,7 @@ add_rcs_file (message, rcs, user, add_vhead, key_opt,
int i, ierrno, err = 0;
mode_t mode;
char *tocvsPath;
char *userfile;
char *local_opt = key_opt;
const char *userfile;
char *free_opt = NULL;
mode_t file_type;
@ -1046,11 +1061,11 @@ add_rcs_file (message, rcs, user, add_vhead, key_opt,
or the other. Before making a change of this sort, should think
about what is best, document it (in cvs.texinfo and NEWS), &c. */
if (local_opt == NULL)
if (key_opt == NULL)
{
if (wrap_name_has (user, WRAP_RCSOPTION))
{
local_opt = free_opt = wrap_rcsoption (user, 0);
key_opt = free_opt = wrap_rcsoption (user, 0);
}
}
@ -1087,7 +1102,7 @@ add_rcs_file (message, rcs, user, add_vhead, key_opt,
if (!preserve_perms || file_type == S_IFREG)
{
fpuser = CVS_FOPEN (userfile,
((local_opt != NULL && strcmp (local_opt, "b") == 0)
((key_opt != NULL && strcmp (key_opt, "b") == 0)
? "rb"
: "r")
);
@ -1157,9 +1172,9 @@ add_rcs_file (message, rcs, user, add_vhead, key_opt,
goto write_error;
}
if (local_opt != NULL && strcmp (local_opt, "kv") != 0)
if (key_opt != NULL && strcmp (key_opt, "kv") != 0)
{
if (fprintf (fprcs, "expand @%s@;\012", local_opt) < 0)
if (fprintf (fprcs, "expand @%s@;\012", key_opt) < 0)
{
goto write_error;
}
@ -1463,19 +1478,16 @@ read_error:
*/
int
expand_at_signs (buf, size, fp)
char *buf;
const char *buf;
off_t size;
FILE *fp;
{
register char *cp, *next;
register const char *cp, *next;
cp = buf;
while ((next = memchr (cp, '@', size)) != NULL)
{
int len;
++next;
len = next - cp;
size_t len = ++next - cp;
if (fwrite (cp, 1, len, fp) != len)
return EOF;
if (putc ('@', fp) == EOF)

View file

@ -55,26 +55,28 @@
1. Check for EROFS. Maybe useful, although in the presence of NFS
EROFS does *not* mean that the file system is unchanging.
2. Provide a means to put the cvs locks in some directory apart from
the repository (CVSROOT/locks; a -l option in modules; etc.).
3. Provide an option to disable locks for operations which only
2. Provide an option to disable locks for operations which only
read (see above for some of the consequences).
4. Have a server internally do the locking. Probably a good
3. Have a server internally do the locking. Probably a good
long-term solution, and many people have been working hard on code
changes which would eventually make it possible to have a server
which can handle various connections in one process, but there is
much, much work still to be done before this is feasible.
5. Like #4 but use shared memory or something so that the servers
merely need to all be on the same machine. This is a much smaller
change to CVS (it functions much like #2; shared memory might be an
unneeded complication although it presumably would be faster). */
much, much work still to be done before this is feasible. */
#include "cvs.h"
#include <assert.h>
#ifdef HAVE_NANOSLEEP
# include "xtime.h"
#else /* HAVE_NANOSLEEP */
# if !defined HAVE_USLEEP && defined HAVE_SELECT
/* use select as a workaround */
# include "xselect.h"
# endif /* !defined HAVE_USLEEP && defined HAVE_SELECT */
#endif /* !HAVE_NANOSLEEP */
struct lock {
/* This is the directory in which we may have a lock named by the
readlock variable, a lock named by the writelock variable, and/or
@ -341,7 +343,7 @@ unlock_proc (p, closure)
Node *p;
void *closure;
{
lock_simple_remove ((struct lock *)p->data);
lock_simple_remove (p->data);
return (0);
}
@ -388,6 +390,8 @@ lock_simple_remove (lock)
}
}
/*
* Create a lock file for readers
*/
@ -404,13 +408,13 @@ Reader_Lock (xrepository)
xrepository);
if (noexec)
return (0);
return 0;
/* we only do one directory at a time for read locks! */
if (global_readlock.repository != NULL)
{
error (0, 0, "Reader_Lock called while read locks set - Help!");
return (1);
return 1;
}
if (readlock == NULL)
@ -439,7 +443,7 @@ Reader_Lock (xrepository)
/* We don't set global_readlock.repository to NULL. I think this
only works because recurse.c will give a fatal error if we return
a nonzero value. */
return (1);
return 1;
}
/* write a read-lock */
@ -458,9 +462,11 @@ Reader_Lock (xrepository)
/* free the lock dir */
clear_lock (&global_readlock);
return (err);
return err;
}
/*
* Lock a list of directories for writing
*/
@ -476,13 +482,13 @@ Writer_Lock (list)
char *wait_repos;
if (noexec)
return (0);
return 0;
/* We only know how to do one list at a time */
if (locklist != (List *) NULL)
{
error (0, 0, "Writer_Lock called while write locks set - Help!");
return (1);
return 1;
}
wait_repos = NULL;
@ -505,7 +511,7 @@ Writer_Lock (list)
free (wait_repos);
Lock_Cleanup (); /* clean up any locks we set */
error (0, 0, "lock failed - giving up");
return (1);
return 1;
case L_LOCKED: /* Someone already had a lock */
remove_locks (); /* clean up any locks we set */
@ -519,18 +525,20 @@ Writer_Lock (list)
lock_obtained (wait_repos);
free (wait_repos);
}
return (0);
return 0;
default:
if (wait_repos != NULL)
free (wait_repos);
error (0, 0, "unknown lock status %d in Writer_Lock",
lock_error);
return (1);
return 1;
}
}
}
/*
* walklist proc for setting write locks
*/
@ -541,14 +549,16 @@ set_writelock_proc (p, closure)
{
/* if some lock was not OK, just skip this one */
if (lock_error != L_OK)
return (0);
return 0;
/* apply the write lock */
lock_error_repos = p->key;
lock_error = write_lock ((struct lock *)p->data);
return (0);
lock_error = write_lock (p->data);
return 0;
}
/*
* Create a lock file for writers returns L_OK if lock set ok, L_LOCKED if
* lock held by someone else or L_ERROR if an error occurred
@ -591,7 +601,7 @@ write_lock (lock)
}
/* indicate we failed due to read locks instead of error */
return (L_LOCKED);
return L_LOCKED;
}
/* write the write-lock file */
@ -613,15 +623,17 @@ write_lock (lock)
error (0, xerrno, "cannot create write lock in repository `%s'",
lock->repository);
free (tmp);
return (L_ERROR);
return L_ERROR;
}
free (tmp);
return (L_OK);
return L_OK;
}
else
return (status);
return status;
}
/*
* readers_exist() returns 0 if there are no reader lock files remaining in
* the repository; else 1 is returned, to indicate that the caller should
@ -631,6 +643,7 @@ static int
readers_exist (repository)
char *repository;
{
char *lockdir;
char *line;
DIR *dirp;
struct dirent *dp;
@ -638,12 +651,15 @@ readers_exist (repository)
int ret;
#ifdef CVS_FUDGELOCKS
time_t now;
(void) time (&now);
(void)time (&now);
#endif
lockdir = lock_name (repository, "");
lockdir[strlen (lockdir) - 1] = '\0'; /* remove trailing slash */
do {
if ((dirp = CVS_OPENDIR (repository)) == NULL)
error (1, 0, "cannot open directory %s", repository);
if ((dirp = CVS_OPENDIR (lockdir)) == NULL)
error (1, 0, "cannot open directory %s", lockdir);
ret = 0;
errno = 0;
@ -651,13 +667,9 @@ readers_exist (repository)
{
if (CVS_FNMATCH (CVSRFLPAT, dp->d_name, 0) == 0)
{
/* ignore our own readlock, if any */
if (readlock && strcmp (readlock, dp->d_name) == 0)
continue;
line = xmalloc (strlen (repository) + strlen (dp->d_name) + 5);
(void) sprintf (line, "%s/%s", repository, dp->d_name);
if ( CVS_STAT (line, &sb) != -1)
line = xmalloc (strlen (lockdir) + 1 + strlen (dp->d_name) + 1);
(void)sprintf (line, "%s/%s", lockdir, dp->d_name);
if (CVS_STAT (line, &sb) != -1)
{
#ifdef CVS_FUDGELOCKS
/*
@ -677,9 +689,10 @@ readers_exist (repository)
}
else
{
/* If the file doesn't exist, it just means that it disappeared
between the time we did the readdir and the time we did
the stat. */
/* If the file doesn't exist, it just means that it
* disappeared between the time we did the readdir and the
* time we did the stat.
*/
if (!existence_error (errno))
error (0, errno, "cannot stat %s", line);
}
@ -695,9 +708,14 @@ readers_exist (repository)
CVS_CLOSEDIR (dirp);
} while (ret < 0);
return (ret);
if (lockdir != NULL)
free (lockdir);
return ret;
}
/*
* Set the static variable lockers_name appropriately, based on the stat
* structure passed in.
@ -710,22 +728,29 @@ set_lockers_name (statp)
if (lockers_name != NULL)
free (lockers_name);
if ((pw = (struct passwd *) getpwuid (statp->st_uid)) !=
(struct passwd *) NULL)
if ((pw = (struct passwd *)getpwuid (statp->st_uid)) !=
(struct passwd *)NULL)
{
lockers_name = xstrdup (pw->pw_name);
}
else
{
lockers_name = xmalloc (20);
(void) sprintf (lockers_name, "uid%lu", (unsigned long) statp->st_uid);
(void)sprintf (lockers_name, "uid%lu", (unsigned long) statp->st_uid);
}
}
/*
* Persistently tries to make the directory "lckdir",, which serves as a
* lock. If the create time on the directory is greater than CVSLCKAGE
* Persistently tries to make the directory "lckdir", which serves as a
* lock.
*
* #ifdef CVS_FUDGELOCKS
* If the create time on the directory is greater than CVSLCKAGE
* seconds old, just try to remove the directory.
* #endif
*
*/
static int
set_lock (lock, will_wait)
@ -733,6 +758,7 @@ set_lock (lock, will_wait)
int will_wait;
{
int waited;
long us;
struct stat sb;
mode_t omask;
#ifdef CVS_FUDGELOCKS
@ -749,6 +775,7 @@ set_lock (lock, will_wait)
* directory before they exit.
*/
waited = 0;
us = 1;
lock->have_lckdir = 0;
for (;;)
{
@ -810,6 +837,33 @@ set_lock (lock, will_wait)
/* if he wasn't willing to wait, return an error */
if (!will_wait)
return (L_LOCKED);
/* if possible, try a very short sleep without a message */
if (!waited && us < 1000)
{
us += us;
#if defined HAVE_NANOSLEEP
{
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = us * 1000;
(void)nanosleep (&ts, NULL);
continue;
}
#elif defined HAVE_USLEEP
(void)usleep (us);
continue;
#elif defined HAVE_SELECT
{
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = us;
(void)select (0, (fd_set *)NULL, (fd_set *)NULL, (fd_set *)NULL, &tv);
continue;
}
#endif
}
lock_wait (lock->repository);
waited = 1;
}
@ -877,10 +931,13 @@ lock_obtained (repos)
cvs_flusherr ();
free (msg);
}
static int lock_filesdoneproc PROTO ((void *callerdat, int err,
char *repository, char *update_dir,
List *entries));
const char *repository,
const char *update_dir,
List *entries));
/*
* Create a list of repositories to lock
@ -890,8 +947,8 @@ static int
lock_filesdoneproc (callerdat, err, repository, update_dir, entries)
void *callerdat;
int err;
char *repository;
char *update_dir;
const char *repository;
const char *update_dir;
List *entries;
{
Node *p;
@ -917,16 +974,15 @@ lock_tree_for_write (argc, argv, local, which, aflag)
int which;
int aflag;
{
int err;
/*
* Run the recursion processor to find all the dirs to lock and lock all
* the dirs
*/
lock_tree_list = getlist ();
err = start_recursion ((FILEPROC) NULL, lock_filesdoneproc,
(DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL, argc,
argv, local, which, aflag, CVS_LOCK_NONE,
(char *) NULL, 0);
start_recursion ((FILEPROC) NULL, lock_filesdoneproc,
(DIRENTPROC) NULL, (DIRLEAVEPROC) NULL, NULL, argc,
argv, local, which, aflag, CVS_LOCK_NONE,
(char *) NULL, 0, (char *) NULL);
sortlist (lock_tree_list, fsortcmp);
if (Writer_Lock (lock_tree_list) != 0)
error (1, 0, "lock failed - giving up");

View file

@ -115,9 +115,10 @@ struct log_data_and_rcs
static int rlog_proc PROTO((int argc, char **argv, char *xwhere,
char *mwhere, char *mfile, int shorten,
int local_specified, char *mname, char *msg));
static Dtype log_dirproc PROTO ((void *callerdat, char *dir,
char *repository, char *update_dir,
List *entries));
static Dtype log_dirproc PROTO ((void *callerdat, const char *dir,
const char *repository,
const char *update_dir,
List *entries));
static int log_fileproc PROTO ((void *callerdat, struct file_info *finfo));
static struct option_revlist *log_parse_revlist PROTO ((const char *));
static void log_parse_date PROTO ((struct log_data *, const char *));
@ -224,7 +225,7 @@ cvslog (argc, argv)
int local = 0;
struct option_revlist **prl;
is_rlog = (strcmp (command_name, "rlog") == 0);
is_rlog = (strcmp (cvs_cmd_name, "rlog") == 0);
if (argc == -1)
usage (log_usage);
@ -486,39 +487,46 @@ rlog_proc (argc, argv, xwhere, mwhere, mfile, shorten, local, mname, msg)
if (is_rlog)
{
repository = xmalloc (strlen (current_parsed_root->directory) + strlen (argv[0])
repository = xmalloc (strlen (current_parsed_root->directory)
+ strlen (argv[0])
+ (mfile == NULL ? 0 : strlen (mfile) + 1) + 2);
(void) sprintf (repository, "%s/%s", current_parsed_root->directory, argv[0]);
where = xmalloc (strlen (argv[0]) + (mfile == NULL ? 0 : strlen (mfile) + 1)
(void)sprintf (repository, "%s/%s",
current_parsed_root->directory, argv[0]);
where = xmalloc (strlen (argv[0])
+ (mfile == NULL ? 0 : strlen (mfile) + 1)
+ 1);
(void) strcpy (where, argv[0]);
/* if mfile isn't null, we need to set up to do only part of the module */
/* If mfile isn't null, we need to set up to do only part of theu
* module.
*/
if (mfile != NULL)
{
char *cp;
char *path;
/* if the portion of the module is a path, put the dir part on repos */
/* If the portion of the module is a path, put the dir part on
* repos.
*/
if ((cp = strrchr (mfile, '/')) != NULL)
{
*cp = '\0';
(void) strcat (repository, "/");
(void) strcat (repository, mfile);
(void) strcat (where, "/");
(void) strcat (where, mfile);
(void)strcat (repository, "/");
(void)strcat (repository, mfile);
(void)strcat (where, "/");
(void)strcat (where, mfile);
mfile = cp + 1;
}
/* take care of the rest */
path = xmalloc (strlen (repository) + strlen (mfile) + 5);
(void) sprintf (path, "%s/%s", repository, mfile);
(void)sprintf (path, "%s/%s", repository, mfile);
if (isdir (path))
{
/* directory means repository gets the dir tacked on */
(void) strcpy (repository, path);
(void) strcat (where, "/");
(void) strcat (where, mfile);
(void)strcpy (repository, path);
(void)strcat (where, "/");
(void)strcat (where, mfile);
}
else
{
@ -531,19 +539,20 @@ rlog_proc (argc, argv, xwhere, mwhere, mfile, shorten, local, mname, msg)
}
/* cd to the starting repository */
if ( CVS_CHDIR (repository) < 0)
if (CVS_CHDIR (repository) < 0)
{
error (0, errno, "cannot chdir to %s", repository);
free (repository);
return (1);
free (where);
return 1;
}
free (repository);
/* End section which is identical to patch_proc. */
which = W_REPOS | W_ATTIC;
}
else
{
repository = NULL;
where = NULL;
which = W_LOCAL | W_REPOS | W_ATTIC;
}
@ -551,15 +560,19 @@ rlog_proc (argc, argv, xwhere, mwhere, mfile, shorten, local, mname, msg)
err = start_recursion (log_fileproc, (FILESDONEPROC) NULL, log_dirproc,
(DIRLEAVEPROC) NULL, (void *) &log_data,
argc - 1, argv + 1, local, which, 0, CVS_LOCK_READ,
where, 1);
where, 1, repository);
if (!(which & W_LOCAL)) free (repository);
if (where) free (where);
return err;
}
/*
* Parse a revision list specification.
*/
static struct option_revlist *
log_parse_revlist (argstring)
const char *argstring;
@ -783,6 +796,8 @@ printlock_proc (lock, foo)
return 0;
}
/*
* Do an rlog on a file
*/
@ -796,7 +811,7 @@ log_fileproc (callerdat, finfo)
int selrev = -1;
RCSNode *rcsfile;
char buf[50];
struct revlist *revlist;
struct revlist *revlist = NULL;
struct log_data_and_rcs log_data_and_rcs;
if ((rcsfile = finfo->rcs) == NULL)
@ -805,22 +820,21 @@ log_fileproc (callerdat, finfo)
p = findnode (finfo->entries, finfo->file);
if (p != NULL)
{
Entnode *e;
e = (Entnode *) p->data;
Entnode *e = p->data;
if (e->version[0] == '0' && e->version[1] == '\0')
{
if (!really_quiet)
error (0, 0, "%s has been added, but not committed",
finfo->file);
return(0);
return 0;
}
}
if (!really_quiet)
error (0, 0, "nothing known about %s", finfo->file);
return (1);
return 1;
}
if (log_data->sup_header || !log_data->nameonly)
@ -833,7 +847,8 @@ log_fileproc (callerdat, finfo)
revisions. */
revlist = log_expand_revlist (rcsfile, log_data->revlist,
log_data->default_branch);
if (log_data->sup_header || (!log_data->header && !log_data->long_header))
if (log_data->sup_header
|| (!log_data->header && !log_data->long_header))
{
log_data_and_rcs.log_data = log_data;
log_data_and_rcs.revlist = revlist;
@ -846,11 +861,15 @@ log_fileproc (callerdat, finfo)
start date for each specific revision. */
if (log_data->singledatelist != NULL)
walklist (rcsfile->versions, log_fix_singledate,
(void *) &log_data_and_rcs);
(void *)&log_data_and_rcs);
selrev = walklist (rcsfile->versions, log_count_print,
(void *) &log_data_and_rcs);
if (log_data->sup_header && selrev == 0) return 0;
(void *)&log_data_and_rcs);
if (log_data->sup_header && selrev == 0)
{
log_free_revlist (revlist);
return 0;
}
}
}
@ -859,6 +878,7 @@ log_fileproc (callerdat, finfo)
{
cvs_output (rcsfile->path, 0);
cvs_output ("\n", 1);
log_free_revlist (revlist);
return 0;
}
@ -915,7 +935,7 @@ log_fileproc (callerdat, finfo)
cvs_output ("\n\t", 2);
cp2 = cp;
while (! isspace ((unsigned char) *cp2) && *cp2 != '\0')
while (!isspace ((unsigned char) *cp2) && *cp2 != '\0')
++cp2;
cvs_output (cp, cp2 - cp);
cp = cp2;
@ -924,7 +944,7 @@ log_fileproc (callerdat, finfo)
}
}
if (! log_data->notags)
if (!log_data->notags)
{
List *syms;
@ -952,14 +972,14 @@ log_fileproc (callerdat, finfo)
cvs_output ("\n", 1);
if (! log_data->header || log_data->long_header)
if (!log_data->header || log_data->long_header)
{
cvs_output ("description:\n", 0);
if (rcsfile->desc != NULL)
cvs_output (rcsfile->desc, 0);
}
if (! log_data->header && ! log_data->long_header && rcsfile->head != NULL)
if (!log_data->header && ! log_data->long_header && rcsfile->head != NULL)
{
p = findnode (rcsfile->versions, rcsfile->head);
if (p == NULL)
@ -967,9 +987,8 @@ log_fileproc (callerdat, finfo)
finfo->fullname);
while (p != NULL)
{
RCSVers *vers;
RCSVers *vers = p->data;
vers = (RCSVers *) p->data;
log_version (log_data, revlist, rcsfile, vers, 1);
if (vers->next == NULL)
p = NULL;
@ -1009,6 +1028,8 @@ log_fileproc (callerdat, finfo)
return 0;
}
/*
* Fix up a revision list in order to compare it against versions.
* Expand any symbolic revisions.
@ -1109,26 +1130,21 @@ log_expand_revlist (rcs, revlist, default_branch)
does. This code is a bit cryptic for my tastes, but
keeping the same implementation as rlog ensures a
certain degree of compatibility. */
if (r->first == NULL)
if (r->first == NULL && nr->last != NULL)
{
if (nr->last == NULL)
nr->fields = 0;
nr->fields = numdots (nr->last) + 1;
if (nr->fields < 2)
nr->first = xstrdup (".0");
else
{
nr->fields = numdots (nr->last) + 1;
if (nr->fields < 2)
nr->first = xstrdup (".0");
else
{
char *cp;
char *cp;
nr->first = xstrdup (nr->last);
cp = strrchr (nr->first, '.');
strcpy (cp + 1, "0");
}
nr->first = xstrdup (nr->last);
cp = strrchr (nr->first, '.');
strcpy (cp + 1, "0");
}
}
else if (r->last == NULL)
else if (r->last == NULL && nr->first != NULL)
{
nr->fields = numdots (nr->first) + 1;
nr->last = xstrdup (nr->first);
@ -1377,6 +1393,8 @@ log_version_requested (log_data, revlist, rcs, vnode)
return 1;
}
/*
* Output a single symbol. This is called via walklist.
*/
@ -1393,6 +1411,8 @@ log_symbol (p, closure)
return 0;
}
/*
* Count the number of entries on a list. This is called via walklist.
*/
@ -1405,6 +1425,8 @@ log_count (p, closure)
return 1;
}
/*
* Sort out a single date specification by narrowing down the date
* until we find the specific selected revision.
@ -1424,7 +1446,7 @@ log_fix_singledate (p, closure)
if (pv == NULL)
error (1, 0, "missing version `%s' in RCS file `%s'",
p->key, data->rcs->path);
vnode = (RCSVers *) pv->data;
vnode = pv->data;
/* We are only interested if this revision passes any other tests.
Temporarily clear log_data->singledatelist to avoid confusing
@ -1464,6 +1486,8 @@ log_fix_singledate (p, closure)
return 0;
}
/*
* Count the number of revisions we are going to print.
*/
@ -1480,7 +1504,7 @@ log_count_print (p, closure)
error (1, 0, "missing version `%s' in RCS file `%s'",
p->key, data->rcs->path);
if (log_version_requested (data->log_data, data->revlist, data->rcs,
(RCSVers *) pv->data))
pv->data))
return 1;
else
return 0;
@ -1504,7 +1528,7 @@ log_tree (log_data, revlist, rcs, ver)
if (p == NULL)
error (1, 0, "missing version `%s' in RCS file `%s'",
ver, rcs->path);
vnode = (RCSVers *) p->data;
vnode = p->data;
if (vnode->next != NULL)
log_tree (log_data, revlist, rcs, vnode->next);
if (vnode->branches != NULL)
@ -1540,7 +1564,7 @@ log_abranch (log_data, revlist, rcs, ver)
if (p == NULL)
error (1, 0, "missing version `%s' in RCS file `%s'",
ver, rcs->path);
vnode = (RCSVers *) p->data;
vnode = p->data;
if (vnode->next != NULL)
log_abranch (log_data, revlist, rcs, vnode->next);
log_version (log_data, revlist, rcs, vnode, 0);
@ -1611,7 +1635,7 @@ log_version (log_data, revlist, rcs, ver, trunk)
if (nextp == NULL)
error (1, 0, "missing version `%s' in `%s'", ver->next,
rcs->path);
nextver = (RCSVers *) nextp->data;
nextver = nextp->data;
pdel = findnode (nextver->other, ";add");
padd = findnode (nextver->other, ";delete");
}
@ -1640,14 +1664,14 @@ log_version (log_data, revlist, rcs, ver, trunk)
would be the p == NULL case would mean an RCS file which was
missing the "log" keyword (which is illegal according to
rcsfile.5). */
if (p == NULL || p->data == NULL || p->data[0] == '\0')
if (p == NULL || p->data == NULL || *(char *)p->data == '\0')
cvs_output ("*** empty log message ***\n", 0);
else
{
/* FIXME: Technically, the log message could contain a null
byte. */
cvs_output (p->data, 0);
if (p->data[strlen (p->data) - 1] != '\n')
if (((char *)p->data)[strlen (p->data) - 1] != '\n')
cvs_output ("\n", 1);
}
}
@ -1685,9 +1709,9 @@ log_branch (p, closure)
static Dtype
log_dirproc (callerdat, dir, repository, update_dir, entries)
void *callerdat;
char *dir;
char *repository;
char *update_dir;
const char *dir;
const char *repository;
const char *update_dir;
List *entries;
{
if (!isdir (dir))

View file

@ -12,12 +12,6 @@
#ifdef AUTH_CLIENT_SUPPORT /* This covers the rest of the file. */
#ifdef HAVE_GETPASSPHRASE
#define GETPASS getpassphrase
#else
#define GETPASS getpass
#endif
/* There seems to be very little agreement on which system header
getpass is declared in. With a lot of fancy autoconfiscation,
we could perhaps detect this, but for now we'll just rely on
@ -25,9 +19,6 @@
declaration won't work (some Crays declare the 2#$@% thing as
varadic, believe it or not). On Cray, getpass will be declared
in either stdlib.h or unistd.h. */
#ifndef _CRAY
extern char *GETPASS ();
#endif
#ifndef CVS_PASSWORD_FILE
#define CVS_PASSWORD_FILE ".cvspass"
@ -229,8 +220,10 @@ password_entry_parseline (cvsroot_canonical, warn, linenumber, linebuf)
*
* Mode Action
* password_entry_lookup Return the password
* password_entry_delete Delete the entry from the file, if it exists
* password_entry_add Replace the line with the new one, else append it
* password_entry_delete Delete the entry from the file, if it
* exists.
* password_entry_add Replace the line with the new one, else
* append it.
*
* Because the user might be accessing multiple repositories, with
* different passwords for each one, the format of ~/.cvspass is:
@ -291,7 +284,7 @@ password_entry_operation (operation, root, newpassword)
char *cvsroot_canonical = NULL;
char *password = NULL;
int line_length;
long line;
long line = -1;
char *linebuf = NULL;
size_t linebuf_len;
char *p;
@ -299,7 +292,8 @@ password_entry_operation (operation, root, newpassword)
if (root->method != pserver_method)
{
error (0, 0, "internal error: can only call password_entry_operation with pserver method");
error (0, 0, "\
internal error: can only call password_entry_operation with pserver method");
error (1, 0, "CVSROOT: %s", root->original);
}
@ -323,7 +317,8 @@ password_entry_operation (operation, root, newpassword)
while ((line_length = getline (&linebuf, &linebuf_len, fp)) >= 0)
{
line++;
password = password_entry_parseline(cvsroot_canonical, 1, line, linebuf);
password = password_entry_parseline (cvsroot_canonical, 1, line,
linebuf);
if (password != NULL)
/* this is it! break out and deal with linebuf */
break;
@ -373,7 +368,8 @@ process:
* add
*/
if (!noexec && password != NULL && (operation == password_entry_delete
|| (operation == password_entry_add && strcmp (password, newpassword))))
|| (operation == password_entry_add
&& strcmp (password, newpassword))))
{
long found_at = line;
char *tmp_name;
@ -394,7 +390,8 @@ process:
line++;
if (line < found_at
|| (line != found_at
&& !password_entry_parseline(cvsroot_canonical, 0, line, linebuf)))
&& !password_entry_parseline (cvsroot_canonical, 0, line,
linebuf)))
{
if (fprintf (tmp_fp, "%s", linebuf) == EOF)
{
@ -541,7 +538,7 @@ login (argc, argv)
else
{
char *tmp;
tmp = GETPASS ("CVS password: ");
tmp = getpass ("CVS password: ");
/* Must deal with a NULL return value here. I haven't managed to
* disconnect the CVS process from the tty and force a NULL return
* in sanity.sh, but the Linux version of getpass is documented
@ -560,7 +557,8 @@ login (argc, argv)
connect_to_pserver (current_parsed_root, NULL, NULL, 1, 0);
password_entry_operation (password_entry_add, current_parsed_root, typed_password);
password_entry_operation (password_entry_add, current_parsed_root,
typed_password);
memset (typed_password, 0, strlen (typed_password));
free (typed_password);
@ -572,6 +570,8 @@ login (argc, argv)
return 0;
}
/* Returns the _scrambled_ password. The server must descramble
before hashing and comparing. If password file not found, or
password not found in the file, just return NULL. */
@ -579,7 +579,7 @@ char *
get_cvs_password ()
{
if (current_parsed_root->password)
return (scramble(current_parsed_root->password));
return scramble (current_parsed_root->password);
/* If someone (i.e., login()) is calling connect_to_pserver() out of
context, then assume they have supplied the correct, scrambled
@ -607,9 +607,12 @@ get_cvs_password ()
error (1, 0, "CVSROOT: %s", current_parsed_root->original);
}
return password_entry_operation (password_entry_lookup, current_parsed_root, NULL);
return password_entry_operation (password_entry_lookup,
current_parsed_root, NULL);
}
static const char *const logout_usage[] =
{
"Usage: %s %s\n",

View file

@ -13,14 +13,16 @@
static int find_type PROTO((Node * p, void *closure));
static int fmt_proc PROTO((Node * p, void *closure));
static int logfile_write PROTO((char *repository, char *filter,
char *message, FILE * logfp, List * changes));
static int rcsinfo_proc PROTO((char *repository, char *template));
static int logfile_write PROTO((const char *repository, const char *filter,
const char *message, FILE * logfp,
List * changes));
static int rcsinfo_proc PROTO((const char *repository, const char *template));
static int title_proc PROTO((Node * p, void *closure));
static int update_logfile_proc PROTO((char *repository, char *filter));
static int update_logfile_proc PROTO((const char *repository,
const char *filter));
static void setup_tmpfile PROTO((FILE * xfp, char *xprefix, List * changes));
static int editinfo_proc PROTO((char *repository, char *template));
static int verifymsg_proc PROTO((char *repository, char *script));
static int editinfo_proc PROTO((const char *repository, const char *template));
static int verifymsg_proc PROTO((const char *repository, const char *script));
static FILE *fp;
static char *str_list;
@ -104,9 +106,8 @@ find_type (p, closure)
Node *p;
void *closure;
{
struct logfile_info *li;
struct logfile_info *li = p->data;
li = (struct logfile_info *) p->data;
if (li->type == type)
return (1);
else
@ -125,7 +126,7 @@ fmt_proc (p, closure)
{
struct logfile_info *li;
li = (struct logfile_info *) p->data;
li = p->data;
if (li->type == type)
{
if (li->tag == NULL
@ -182,9 +183,9 @@ fmt_proc (p, closure)
*/
void
do_editor (dir, messagep, repository, changes)
char *dir;
const char *dir;
char **messagep;
char *repository;
const char *repository;
List *changes;
{
static int reuse_log_message = 0;
@ -413,7 +414,7 @@ do_editor (dir, messagep, repository, changes)
void
do_verify (messagep, repository)
char **messagep;
char *repository;
const char *repository;
{
FILE *fp;
char *fname;
@ -429,14 +430,14 @@ do_verify (messagep, repository)
/* FIXME? Do we really want to skip this on noexec? What do we do
for the other administrative files? */
if (noexec)
if (noexec || repository == NULL)
return;
/* Get the name of the verification script to run */
if (repository != NULL)
(void) Parse_Info (CVSROOTADM_VERIFYMSG, repository,
verifymsg_proc, 0);
if (Parse_Info (CVSROOTADM_VERIFYMSG, repository, verifymsg_proc, 0) > 0)
error (1, 0, "Message verification failed");
if (!verifymsg_script)
return;
@ -550,6 +551,8 @@ do_verify (messagep, repository)
if (unlink_file (fname) < 0)
error (0, errno, "cannot remove %s", fname);
free (fname);
free( verifymsg_script );
verifymsg_script = NULL;
}
/*
@ -560,8 +563,8 @@ do_verify (messagep, repository)
/* ARGSUSED */
static int
rcsinfo_proc (repository, template)
char *repository;
char *template;
const char *repository;
const char *template;
{
static char *last_template;
FILE *tfp;
@ -602,13 +605,13 @@ rcsinfo_proc (repository, template)
* specified program as standard input.
*/
static FILE *logfp;
static char *message;
static const char *message;
static List *changes;
void
Update_Logfile (repository, xmessage, xlogfp, xchanges)
char *repository;
char *xmessage;
const char *repository;
const char *xmessage;
FILE *xlogfp;
List *xchanges;
{
@ -625,17 +628,21 @@ Update_Logfile (repository, xmessage, xlogfp, xchanges)
(void) Parse_Info (CVSROOTADM_LOGINFO, repository, update_logfile_proc, 1);
}
/*
* callback proc to actually do the logfile write from Update_Logfile
*/
static int
update_logfile_proc (repository, filter)
char *repository;
char *filter;
const char *repository;
const char *filter;
{
return (logfile_write (repository, filter, message, logfp, changes));
return logfile_write (repository, filter, message, logfp, changes);
}
/*
* concatenate each filename/version onto str_list
*/
@ -644,10 +651,9 @@ title_proc (p, closure)
Node *p;
void *closure;
{
struct logfile_info *li;
char *c;
struct logfile_info *li = p->data;
li = (struct logfile_info *) p->data;
if (li->type == type)
{
/* Until we decide on the correct logging solution when we add
@ -727,9 +733,9 @@ title_proc (p, closure)
*/
static int
logfile_write (repository, filter, message, logfp, changes)
char *repository;
char *filter;
char *message;
const char *repository;
const char *filter;
const char *message;
FILE *logfp;
List *changes;
{
@ -796,7 +802,7 @@ logfile_write (repository, filter, message, logfp, changes)
if (fmt_percent)
{
int len;
char *srepos;
const char *srepos;
char *fmt_begin, *fmt_end; /* beginning and end of the
format string specified in
filter. */
@ -927,7 +933,7 @@ logfile_write (repository, filter, message, logfp, changes)
}
setup_tmpfile (pipefp, "", changes);
(void) fprintf (pipefp, "Log Message:\n%s\n", message);
(void) fprintf (pipefp, "Log Message:\n%s\n", (message) ? message : "");
if (logfp != (FILE *) 0)
{
(void) fprintf (pipefp, "Status:\n");
@ -951,8 +957,8 @@ logfile_write (repository, filter, message, logfp, changes)
/* ARGSUSED */
static int
editinfo_proc(repository, editor)
char *repository;
char *editor;
const char *repository;
const char *editor;
{
/* nothing to do if the last match is the same as this one */
if (editinfo_editor && strcmp (editinfo_editor, editor) == 0)
@ -969,8 +975,8 @@ editinfo_proc(repository, editor)
*/
static int
verifymsg_proc (repository, script)
char *repository;
char *script;
const char *repository;
const char *script;
{
if (verifymsg_script && strcmp (verifymsg_script, script) == 0)
return (0);

View file

@ -21,9 +21,9 @@
extern int gethostname ();
#endif
char *program_name;
char *program_path;
char *command_name;
const char *program_name;
const char *program_path;
const char *cvs_cmd_name;
/* I'd dynamically allocate this, but it seems like gethostname
requires a fixed size array. If I'm remembering the RFCs right,
@ -247,7 +247,6 @@ static const char *const opt_usage[] =
" -q Cause CVS to be somewhat quiet.\n",
" -r Make checked-out files read-only.\n",
" -w Make checked-out files read-write (default).\n",
" -l Turn history logging off.\n",
" -n Do not execute anything that will change the disk.\n",
" -t Show trace of program execution -- try with -n.\n",
" -v CVS version and copyright.\n",
@ -407,7 +406,7 @@ main (argc, argv)
int help = 0; /* Has the user asked for help? This
lets us support the `cvs -H cmd'
convention to give help for cmd. */
static const char short_options[] = "+Qqrwtnlvb:T:e:d:Hfz:s:xa";
static const char short_options[] = "+Qqrwtnvb:T:e:d:Hfz:s:xa";
static struct option long_options[] =
{
{"help", 0, NULL, 'H'},
@ -537,7 +536,6 @@ main (argc, argv)
break;
case 'n':
noexec = 1;
case 'l': /* Fall through */
logoff = 1;
break;
case 'v':
@ -545,7 +543,7 @@ main (argc, argv)
version (0, (char **) NULL);
(void) fputs ("\n", stdout);
(void) fputs ("\
Copyright (c) 1989-2002 Brian Berliner, david d `zoo' zuhn, \n\
Copyright (c) 1989-2004 Brian Berliner, david d `zoo' zuhn, \n\
Jeff Polk, and other authors\n", stdout);
(void) fputs ("\n", stdout);
(void) fputs ("CVS may be copied only under the terms of the GNU General Public License,\n", stdout);
@ -590,14 +588,19 @@ Copyright (c) 1989-2002 Brian Berliner, david d `zoo' zuhn, \n\
break;
case 'z':
#ifdef CLIENT_SUPPORT
gzip_level = atoi (optarg);
if (gzip_level < 0 || gzip_level > 9)
gzip_level = strtol (optarg, &end, 10);
if (*end != '\0' || gzip_level < 0 || gzip_level > 9)
error (1, 0,
"gzip compression level must be between 0 and 9");
#endif
#endif /* CLIENT_SUPPORT */
/* If no CLIENT_SUPPORT, we just silently ignore the gzip
level, so that users can have it in their .cvsrc and not
cause any trouble. */
* level, so that users can have it in their .cvsrc and not
* cause any trouble.
*
* We still parse the argument to -z for correctness since
* one user complained of being bitten by a run of
* `cvs -z -n up' which read -n as the argument to -z without
* complaining. */
break;
case 's':
variable_set (optarg);
@ -634,24 +637,24 @@ Copyright (c) 1989-2002 Brian Berliner, david d `zoo' zuhn, \n\
/* Look up the command name. */
command_name = argv[0];
cvs_cmd_name = argv[0];
for (cm = cmds; cm->fullname; cm++)
{
if (cm->nick1 && !strcmp (command_name, cm->nick1))
if (cm->nick1 && !strcmp (cvs_cmd_name, cm->nick1))
break;
if (cm->nick2 && !strcmp (command_name, cm->nick2))
if (cm->nick2 && !strcmp (cvs_cmd_name, cm->nick2))
break;
if (!strcmp (command_name, cm->fullname))
if (!strcmp (cvs_cmd_name, cm->fullname))
break;
}
if (!cm->fullname)
{
fprintf (stderr, "Unknown command: `%s'\n\n", command_name);
fprintf (stderr, "Unknown command: `%s'\n\n", cvs_cmd_name);
usage (cmd_usage);
}
else
command_name = cm->fullname; /* Global pointer for later use */
cvs_cmd_name = cm->fullname; /* Global pointer for later use */
if (help)
{
@ -685,18 +688,18 @@ Copyright (c) 1989-2002 Brian Berliner, david d `zoo' zuhn, \n\
running as Kerberos server as root. Do the authentication as
the very first thing, to minimize the amount of time we are
running as root. */
if (strcmp (command_name, "kserver") == 0)
if (strcmp (cvs_cmd_name, "kserver") == 0)
{
kserver_authenticate_connection ();
/* Pretend we were invoked as a plain server. */
command_name = "server";
cvs_cmd_name = "server";
}
# endif /* HAVE_KERBEROS */
# if defined (AUTH_SERVER_SUPPORT) || defined (HAVE_GSSAPI)
if (strcmp (command_name, "pserver") == 0)
if (strcmp (cvs_cmd_name, "pserver") == 0)
{
/* The reason that --allow-root is not a command option
is mainly the comment in server() about how argc,argv
@ -710,11 +713,11 @@ Copyright (c) 1989-2002 Brian Berliner, david d `zoo' zuhn, \n\
pserver_authenticate_connection ();
/* Pretend we were invoked as a plain server. */
command_name = "server";
cvs_cmd_name = "server";
}
# endif /* AUTH_SERVER_SUPPORT || HAVE_GSSAPI */
server_active = strcmp (command_name, "server") == 0;
server_active = strcmp (cvs_cmd_name, "server") == 0;
#endif /* SERVER_SUPPORT */
@ -781,7 +784,7 @@ Copyright (c) 1989-2002 Brian Berliner, david d `zoo' zuhn, \n\
#endif /* KLUDGE_FOR_WNT_TESTSUITE */
if (use_cvsrc)
read_cvsrc (&argc, &argv, command_name);
read_cvsrc (&argc, &argv, cvs_cmd_name);
#ifdef SERVER_SUPPORT
/* Fiddling with CVSROOT doesn't make sense if we're running
@ -922,7 +925,7 @@ Copyright (c) 1989-2002 Brian Berliner, david d `zoo' zuhn, \n\
{
save_errno = errno;
/* If this is "cvs init", the root need not exist yet. */
if (strcmp (command_name, "init") != 0)
if (strcmp (cvs_cmd_name, "init") != 0)
{
error (1, save_errno, "%s", path);
}
@ -1020,7 +1023,11 @@ Copyright (c) 1989-2002 Brian Berliner, david d `zoo' zuhn, \n\
Lock_Cleanup ();
free (program_path);
/* It's okay to cast out the const below since we know we allocated this in
* this function. The const was to keep other functions from messing with
* this.
*/
free ((char *)program_path);
if (CVSroot_cmdline != NULL)
free (CVSroot_cmdline);
if (free_CVSroot)
@ -1154,7 +1161,7 @@ void
usage (cpp)
register const char *const *cpp;
{
(void) fprintf (stderr, *cpp++, program_name, command_name);
(void) fprintf (stderr, *cpp++, program_name, cvs_cmd_name);
for (; *cpp; cpp++)
(void) fprintf (stderr, *cpp);
error_exit ();

Some files were not shown because too many files have changed in this diff Show more