summaryrefslogtreecommitdiffstats
path: root/contrib/cvs/doc/cvs.texinfo
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/cvs/doc/cvs.texinfo')
-rw-r--r--contrib/cvs/doc/cvs.texinfo14892
1 files changed, 0 insertions, 14892 deletions
diff --git a/contrib/cvs/doc/cvs.texinfo b/contrib/cvs/doc/cvs.texinfo
deleted file mode 100644
index 6b1840a..0000000
--- a/contrib/cvs/doc/cvs.texinfo
+++ /dev/null
@@ -1,14892 +0,0 @@
-\input texinfo @c -*-texinfo-*-
-@comment Documentation for CVS.
-@setfilename cvs.info
-@macro copyleftnotice
-@noindent
-Copyright @copyright{} 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
- Free Software Foundation, Inc.
-
-@multitable @columnfractions .12 .88
-@item Portions
-@item @tab Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005,
- 2006, 2007 Derek R. Price,
-@item @tab Copyright @copyright{} 2002, 2003, 2004, 2005, 2006, 2007
- Ximbiot @url{http://ximbiot.com},
-@item @tab Copyright @copyright{} 1992, 1993, 1999 Signum Support AB,
-@item @tab and Copyright @copyright{} others.
-@end multitable
-
-@ignore
-Permission is granted to process this file through Tex and print the
-results, provided the printed document carries copying permission
-notice identical to this one except for the removal of this paragraph
-(this paragraph not being relevant to the printed manual).
-
-@end ignore
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
-Permission is granted to copy and distribute modified versions of this
-manual under the conditions for verbatim copying, provided also that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-
-Permission is granted to copy and distribute translations of this manual
-into another language, under the above conditions for modified versions,
-except that this permission notice may be stated in a translation
-approved by the Free Software Foundation.
-@end macro
-
-@comment This file is part of the CVS distribution.
-
-@comment CVS is free software; you can redistribute it and/or modify
-@comment it under the terms of the GNU General Public License as published by
-@comment the Free Software Foundation; either version 2, or (at your option)
-@comment any later version.
-
-@comment CVS is distributed in the hope that it will be useful,
-@comment but WITHOUT ANY WARRANTY; without even the implied warranty of
-@comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-@comment GNU General Public License for more details.
-
-@c See ../README for A4 vs. US letter size.
-@c When we provided A4 postscript, and people tried to
-@c print it on US letter, the usual complaint was that the
-@c page numbers would get cut off.
-@c If one prints US letter on A4, reportedly there is
-@c some extra space at the top and/or bottom, and the side
-@c margins are a bit narrow, but no text is lost.
-@c
-@c See
-@c http://www.ft.uni-erlangen.de/~mskuhn/iso-paper.html
-@c for more on paper sizes. Insuring that margins are
-@c big enough to print on either A4 or US letter does
-@c indeed seem to be the usual approach (RFC2346).
-
-@c This document seems to get overfull hboxes with some
-@c frequency (probably because the tendency is to
-@c sanity-check it with "make info" and run TeX less
-@c often). The big ugly boxes just seem to add insult
-@c to injury, and I'm not aware of them helping to fix
-@c the overfull hboxes at all.
-@finalout
-
-@include version.texi
-@settitle CVS---Concurrent Versions System v@value{VERSION}
-@setchapternewpage odd
-
-@c -- TODO list:
-@c -- Fix all lines that match "^@c -- "
-@c -- Also places marked with FIXME should be manual
-@c problems (as opposed to FIXCVS for CVS problems).
-
-@c @splitrcskeyword{} is used to avoid keyword expansion. It is replaced by
-@c @asis when generating info and dvi, and by <i></i> in the generated html,
-@c such that keywords are not expanded in the generated html.
-@ifnothtml
-@macro splitrcskeyword {arg}
-@asis{}\arg\
-@end macro
-@end ifnothtml
-
-@ifhtml
-@macro splitrcskeyword {arg}
-@i{}\arg\
-@end macro
-@end ifhtml
-
-@dircategory GNU Packages
-@direntry
-* CVS: (cvs). Concurrent Versions System
-@end direntry
-@dircategory Individual utilities
-@direntry
-* cvs: (cvs)CVS commands. Concurrent Versions System
-@end direntry
-
-@comment The titlepage section does not appear in the Info file.
-@titlepage
-@sp 4
-@comment The title is printed in a large font.
-@center @titlefont{Version Management}
-@sp
-@center @titlefont{with}
-@sp
-@center @titlefont{CVS}
-@sp 2
-@center for @sc{cvs} @value{VERSION}
-@comment -release-
-@sp 3
-@center Per Cederqvist et al
-
-@comment The following two commands start the copyright page
-@comment for the printed manual. This will not appear in the Info file.
-@page
-@vskip 0pt plus 1filll
-@copyleftnotice
-@end titlepage
-
-@summarycontents
-
-@contents
-
-@comment ================================================================
-@comment The real text starts here
-@comment ================================================================
-
-@ifnottex
-@c ---------------------------------------------------------------------
-@node Top
-@top
-
-This info manual describes how to use and administer
-@sc{cvs} version @value{VERSION}.
-@end ifnottex
-
-@ifinfo
-@copyleftnotice
-@end ifinfo
-
-@c This menu is pretty long. Not sure how easily that
-@c can be fixed (no brilliant ideas right away)...
-@menu
-* Overview:: An introduction to CVS
-* Repository:: Where all your sources are stored
-* Starting a new project:: Starting a project with CVS
-* Revisions:: Numeric and symbolic names for revisions
-* Branching and merging:: Diverging/rejoining branches of development
-* Recursive behavior:: CVS descends directories
-* Adding and removing:: Adding/removing/renaming files/directories
-* History browsing:: Viewing the history of files in various ways
-
-CVS and the Real World.
------------------------
-* Binary files:: CVS can handle binary files
-* Multiple developers:: How CVS helps a group of developers
-* Revision management:: Policy questions for revision management
-* Keyword substitution:: CVS can include the revision inside the file
-* Tracking sources:: Tracking third-party sources
-* Builds:: Issues related to CVS and builds
-* Special Files:: Devices, links and other non-regular files
-
-References.
------------
-* CVS commands:: CVS commands share some things
-* Invoking CVS:: Quick reference to CVS commands
-* Administrative files:: Reference manual for the Administrative files
-* Environment variables:: All environment variables which affect CVS
-* Compatibility:: Upgrading CVS versions
-* Troubleshooting:: Some tips when nothing works
-* Credits:: Some of the contributors to this manual
-* BUGS:: Dealing with bugs in CVS or this manual
-* Index:: Index
-@end menu
-
-@c ---------------------------------------------------------------------
-@node Overview
-@chapter Overview
-@cindex Overview
-
-This chapter is for people who have never used
-@sc{cvs}, and perhaps have never used version control
-software before.
-
-If you are already familiar with @sc{cvs} and are just
-trying to learn a particular feature or remember a
-certain command, you can probably skip everything here.
-
-@menu
-* What is CVS?:: What you can do with @sc{cvs}
-* What is CVS not?:: Problems @sc{cvs} doesn't try to solve
-* A sample session:: A tour of basic @sc{cvs} usage
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node What is CVS?
-@section What is CVS?
-@cindex What is CVS?
-@cindex Introduction to CVS
-@cindex CVS, introduction to
-
-@sc{cvs} is a version control system. Using it, you can
-record the history of your source files.
-
-@c -- ///
-@c -- ///Those who cannot remember the past are condemned to repeat it.
-@c -- /// -- George Santayana
-@c -- //////
-
-@c -- Insert history quote here!
-For example, bugs sometimes creep in when
-software is modified, and you might not detect the bug
-until a long time after you make the modification.
-With @sc{cvs}, you can easily retrieve old versions to see
-exactly which change caused the bug. This can
-sometimes be a big help.
-
-You could of course save every version of every file
-you have ever created. This would
-however waste an enormous amount of disk space. @sc{cvs}
-stores all the versions of a file in a single file in a
-clever way that only stores the differences between
-versions.
-
-@sc{cvs} also helps you if you are part of a group of people working
-on the same project. It is all too easy to overwrite
-each others' changes unless you are extremely careful.
-Some editors, like @sc{gnu} Emacs, try to make sure that
-two people never modify the same file at the
-same time. Unfortunately, if someone is using another
-editor, that safeguard will not work. @sc{cvs} solves this problem
-by insulating the different developers from each other. Every
-developer works in his own directory, and @sc{cvs} merges
-the work when each developer is done.
-
-@cindex History of CVS
-@cindex CVS, history of
-@cindex Credits (CVS program)
-@cindex Contributors (CVS program)
-@sc{cvs} started out as a bunch of shell scripts written by
-Dick Grune, posted to the newsgroup
-@code{comp.sources.unix} in the volume 6
-release of July, 1986. While no actual code from
-these shell scripts is present in the current version
-of @sc{cvs} much of the @sc{cvs} conflict resolution algorithms
-come from them.
-
-In April, 1989, Brian Berliner designed and coded @sc{cvs}.
-Jeff Polk later helped Brian with the design of the @sc{cvs}
-module and vendor branch support.
-
-@cindex Source, getting CVS source
-You can get @sc{cvs} in a variety of ways, including
-free download from the Internet. For more information
-on downloading @sc{cvs} and other @sc{cvs} topics, see:
-
-@example
-@url{http://cvs.nongnu.org/}
-@end example
-
-@cindex Mailing list
-@cindex List, mailing list
-@cindex Newsgroups
-There is a mailing list, known as @email{info-cvs@@nongnu.org},
-devoted to @sc{cvs}. To subscribe or
-unsubscribe
-write to
-@email{info-cvs-request@@nongnu.org}.
-If you prefer a Usenet group, there is a one-way mirror (posts to the email
-list are usually sent to the news group, but not vice versa) of
-@email{info-cvs@@nongnu.org} at @url{news:gnu.cvs.help}. The right
-Usenet group for posts is @url{news:comp.software.config-mgmt} which is for
-@sc{cvs} discussions (along with other configuration
-management systems). In the future, it might be
-possible to create a
-@code{comp.software.config-mgmt.cvs}, but probably only
-if there is sufficient @sc{cvs} traffic on
-@url{news:comp.software.config-mgmt}.
-@c Other random data is that the tale was very
-@c skeptical of comp.software.config-mgmt.cvs when the
-@c subject came up around 1995 or so (for one
-@c thing, because creating it would be a "reorg" which
-@c would need to take a more comprehensive look at the
-@c whole comp.software.config-mgmt.* hierarchy).
-
-You can also subscribe to the @email{bug-cvs@@nongnu.org} mailing list,
-described in more detail in @ref{BUGS}. To subscribe
-send mail to @email{bug-cvs-request@@nongnu.org}. There is a two-way
-Usenet mirror (posts to the Usenet group are usually sent to the email list and
-vice versa) of @email{bug-cvs@@nongnu.org} named @url{news:gnu.cvs.bug}.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node What is CVS not?
-@section What is CVS not?
-@cindex What is CVS not?
-
-@sc{cvs} can do a lot of things for you, but it does
-not try to be everything for everyone.
-
-@table @asis
-@item @sc{cvs} is not a build system.
-
-Though the structure of your repository and modules
-file interact with your build system
-(e.g. @file{Makefile}s), they are essentially
-independent.
-
-@sc{cvs} does not dictate how you build anything. It
-merely stores files for retrieval in a tree structure
-you devise.
-
-@sc{cvs} does not dictate how to use disk space in the
-checked out working directories. If you write your
-@file{Makefile}s or scripts in every directory so they
-have to know the relative positions of everything else,
-you wind up requiring the entire repository to be
-checked out.
-
-If you modularize your work, and construct a build
-system that will share files (via links, mounts,
-@code{VPATH} in @file{Makefile}s, etc.), you can
-arrange your disk usage however you like.
-
-But you have to remember that @emph{any} such system is
-a lot of work to construct and maintain. @sc{cvs} does
-not address the issues involved.
-
-Of course, you should place the tools created to
-support such a build system (scripts, @file{Makefile}s,
-etc.) under @sc{cvs}.
-
-Figuring out what files need to be rebuilt when
-something changes is, again, something to be handled
-outside the scope of @sc{cvs}. One traditional
-approach is to use @code{make} for building, and use
-some automated tool for generating the dependencies which
-@code{make} uses.
-
-See @ref{Builds}, for more information on doing builds
-in conjunction with @sc{cvs}.
-
-@item @sc{cvs} is not a substitute for management.
-
-Your managers and project leaders are expected to talk
-to you frequently enough to make certain you are aware
-of schedules, merge points, branch names and release
-dates. If they don't, @sc{cvs} can't help.
-
-@sc{cvs} is an instrument for making sources dance to
-your tune. But you are the piper and the composer. No
-instrument plays itself or writes its own music.
-
-@item @sc{cvs} is not a substitute for developer communication.
-
-When faced with conflicts within a single file, most
-developers manage to resolve them without too much
-effort. But a more general definition of ``conflict''
-includes problems too difficult to solve without
-communication between developers.
-
-@sc{cvs} cannot determine when simultaneous changes
-within a single file, or across a whole collection of
-files, will logically conflict with one another. Its
-concept of a @dfn{conflict} is purely textual, arising
-when two changes to the same base file are near enough
-to spook the merge (i.e., @code{diff3}) command.
-
-@sc{cvs} does not claim to help at all in figuring out
-non-textual or distributed conflicts in program logic.
-
-For example: Say you change the arguments to function
-@code{X} defined in file @file{A}. At the same time,
-someone edits file @file{B}, adding new calls to
-function @code{X} using the old arguments. You are
-outside the realm of @sc{cvs}'s competence.
-
-Acquire the habit of reading specs and talking to your
-peers.
-
-
-@item @sc{cvs} does not have change control
-
-Change control refers to a number of things. First of
-all it can mean @dfn{bug-tracking}, that is being able
-to keep a database of reported bugs and the status of
-each one (Is it fixed? In what release? Has the bug
-submitter agreed that it is fixed?). For interfacing
-@sc{cvs} to an external bug-tracking system, see the
-@file{rcsinfo} and @file{verifymsg} files
-(@pxref{Administrative files}).
-
-Another aspect of change control is keeping track of
-the fact that changes to several files were in fact
-changed together as one logical change. If you check
-in several files in a single @code{cvs commit}
-operation, @sc{cvs} then forgets that those files were
-checked in together, and the fact that they have the
-same log message is the only thing tying them
-together. Keeping a @sc{gnu} style @file{ChangeLog}
-can help somewhat.
-@c FIXME: should have an xref to a section which talks
-@c more about keeping ChangeLog's with CVS, but that
-@c section hasn't been written yet.
-
-Another aspect of change control, in some systems, is
-the ability to keep track of the status of each
-change. Some changes have been written by a developer,
-others have been reviewed by a second developer, and so
-on. Generally, the way to do this with @sc{cvs} is to
-generate a diff (using @code{cvs diff} or @code{diff})
-and email it to someone who can then apply it using the
-@code{patch} utility. This is very flexible, but
-depends on mechanisms outside @sc{cvs} to make sure
-nothing falls through the cracks.
-
-@item @sc{cvs} is not an automated testing program
-
-It should be possible to enforce mandatory use of a
-test suite using the @code{commitinfo} file. I haven't
-heard a lot about projects trying to do that or whether
-there are subtle gotchas, however.
-
-@item @sc{cvs} does not have a built-in process model
-
-Some systems provide ways to ensure that changes or
-releases go through various steps, with various
-approvals as needed. Generally, one can accomplish
-this with @sc{cvs} but it might be a little more work.
-In some cases you'll want to use the @file{commitinfo},
-@file{loginfo}, @file{rcsinfo}, or @file{verifymsg}
-files, to require that certain steps be performed
-before cvs will allow a checkin. Also consider whether
-features such as branches and tags can be used to
-perform tasks such as doing work in a development tree
-and then merging certain changes over to a stable tree
-only once they have been proven.
-@end table
-
-@c ---------------------------------------------------------------------
-@node A sample session
-@section A sample session
-@cindex Example of a work-session
-@cindex Getting started
-@cindex Work-session, example of
-@cindex tc, Trivial Compiler (example)
-@cindex Trivial Compiler (example)
-
-@c I think an example is a pretty good way to start. But
-@c somewhere in here, maybe after the sample session,
-@c we need something which is kind of
-@c a "roadmap" which is more directed at sketching out
-@c the functionality of CVS and pointing people to
-@c various other parts of the manual. As it stands now
-@c people who read in order get dumped right into all
-@c manner of hair regarding remote repositories,
-@c creating a repository, etc.
-@c
-@c The following was in the old Basic concepts node. I don't
-@c know how good a job it does at introducing modules,
-@c or whether they need to be introduced so soon, but
-@c something of this sort might go into some
-@c introductory material somewhere.
-@ignore
-@cindex Modules (intro)
-The repository contains directories and files, in an
-arbitrary tree. The @dfn{modules} feature can be used
-to group together a set of directories or files into a
-single entity (@pxref{modules}). A typical usage is to
-define one module per project.
-@end ignore
-
-As a way of introducing @sc{cvs}, we'll go through a
-typical work-session using @sc{cvs}. The first thing
-to understand is that @sc{cvs} stores all files in a
-centralized @dfn{repository} (@pxref{Repository}); this
-section assumes that a repository is set up.
-@c I'm not sure that the sentence concerning the
-@c repository quite tells the user what they need to
-@c know at this point. Might need to expand on "centralized"
-@c slightly (maybe not here, maybe further down in the example?)
-
-Suppose you are working on a simple compiler. The source
-consists of a handful of C files and a @file{Makefile}.
-The compiler is called @samp{tc} (Trivial Compiler),
-and the repository is set up so that there is a module
-called @samp{tc}.
-
-@menu
-* Getting the source:: Creating a workspace
-* Committing your changes:: Making your work available to others
-* Cleaning up:: Cleaning up
-* Viewing differences:: Viewing differences
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Getting the source
-@subsection Getting the source
-@cindex Getting the source
-@cindex Checking out source
-@cindex Fetching source
-@cindex Source, getting from CVS
-@cindex Checkout, example
-
-The first thing you must do is to get your own working copy of the
-source for @samp{tc}. For this, you use the @code{checkout} command:
-
-@example
-$ cvs checkout tc
-@end example
-
-@noindent
-This will create a new directory called @file{tc} and populate it with
-the source files.
-
-@example
-$ cd tc
-$ ls
-CVS Makefile backend.c driver.c frontend.c parser.c
-@end example
-
-The @file{CVS} directory is used internally by
-@sc{cvs}. Normally, you should not modify or remove
-any of the files in it.
-
-You start your favorite editor, hack away at @file{backend.c}, and a couple
-of hours later you have added an optimization pass to the compiler.
-A note to @sc{rcs} and @sc{sccs} users: There is no need to lock the files that
-you want to edit. @xref{Multiple developers}, for an explanation.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Committing your changes
-@subsection Committing your changes
-@cindex Committing changes to files
-@cindex Log message entry
-
-When you have checked that the compiler is still compilable you decide
-to make a new version of @file{backend.c}. This will
-store your new @file{backend.c} in the repository and
-make it available to anyone else who is using that same
-repository.
-
-@example
-$ cvs commit backend.c
-@end example
-
-@noindent
-@sc{cvs} starts an editor, to allow you to enter a log
-message. You type in ``Added an optimization pass.'',
-save the temporary file, and exit the editor.
-
-@cindex CVSEDITOR, environment variable
-@cindex EDITOR, environment variable
-The environment variable @code{$CVSEDITOR} determines
-which editor is started. If @code{$CVSEDITOR} is not
-set, then if the environment variable @code{$EDITOR} is
-set, it will be used. If both @code{$CVSEDITOR} and
-@code{$EDITOR} are not set then there is a default
-which will vary with your operating system, for example
-@code{vi} for unix or @code{notepad} for Windows
-NT/95.
-
-@cindex VISUAL, environment variable
-In addition, @sc{cvs} checks the @code{$VISUAL} environment
-variable. Opinions vary on whether this behavior is desirable and
-whether future releases of @sc{cvs} should check @code{$VISUAL} or
-ignore it. You will be OK either way if you make sure that
-@code{$VISUAL} is either unset or set to the same thing as
-@code{$EDITOR}.
-
-@c This probably should go into some new node
-@c containing detailed info on the editor, rather than
-@c the intro. In fact, perhaps some of the stuff with
-@c CVSEDITOR and -m and so on should too.
-When @sc{cvs} starts the editor, it includes a list of
-files which are modified. For the @sc{cvs} client,
-this list is based on comparing the modification time
-of the file against the modification time that the file
-had when it was last gotten or updated. Therefore, if
-a file's modification time has changed but its contents
-have not, it will show up as modified. The simplest
-way to handle this is simply not to worry about it---if
-you proceed with the commit @sc{cvs} will detect that
-the contents are not modified and treat it as an
-unmodified file. The next @code{update} will clue
-@sc{cvs} in to the fact that the file is unmodified,
-and it will reset its stored timestamp so that the file
-will not show up in future editor sessions.
-@c FIXCVS: Might be nice if "commit" and other commands
-@c would reset that timestamp too, but currently commit
-@c doesn't.
-@c FIXME: Need to talk more about the process of
-@c prompting for the log message. Like show an example
-@c of what it pops up in the editor, for example. Also
-@c a discussion of how to get the "a)bort, c)ontinue,
-@c e)dit" prompt and what to do with it. Might also
-@c work in the suggestion that if you want a diff, you
-@c should make it before running commit (someone
-@c suggested that the diff pop up in the editor. I'm
-@c not sure that is better than telling people to run
-@c "cvs diff" first if that is what they want, but if
-@c we want to tell people that, the manual possibly
-@c should say it).
-
-If you want to avoid
-starting an editor you can specify the log message on
-the command line using the @samp{-m} flag instead, like
-this:
-
-@example
-$ cvs commit -m "Added an optimization pass" backend.c
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Cleaning up
-@subsection Cleaning up
-@cindex Cleaning up
-@cindex Working copy, removing
-@cindex Removing your working copy
-@cindex Releasing your working copy
-
-Before you turn to other tasks you decide to remove your working copy of
-tc. One acceptable way to do that is of course
-
-@example
-$ cd ..
-$ rm -r tc
-@end example
-
-@noindent
-but a better way is to use the @code{release} command (@pxref{release}):
-
-@example
-$ cd ..
-$ cvs release -d tc
-M driver.c
-? tc
-You have [1] altered files in this repository.
-Are you sure you want to release (and delete) directory `tc': n
-** `release' aborted by user choice.
-@end example
-
-The @code{release} command checks that all your modifications have been
-committed. If history logging is enabled it also makes a note in the
-history file. @xref{history file}.
-
-When you use the @samp{-d} flag with @code{release}, it
-also removes your working copy.
-
-In the example above, the @code{release} command wrote a couple of lines
-of output. @samp{? tc} means that the file @file{tc} is unknown to @sc{cvs}.
-That is nothing to worry about: @file{tc} is the executable compiler,
-and it should not be stored in the repository. @xref{cvsignore},
-for information about how to make that warning go away.
-@xref{release output}, for a complete explanation of
-all possible output from @code{release}.
-
-@samp{M driver.c} is more serious. It means that the
-file @file{driver.c} has been modified since it was
-checked out.
-
-The @code{release} command always finishes by telling
-you how many modified files you have in your working
-copy of the sources, and then asks you for confirmation
-before deleting any files or making any note in the
-history file.
-
-You decide to play it safe and answer @kbd{n @key{RET}}
-when @code{release} asks for confirmation.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Viewing differences
-@subsection Viewing differences
-@cindex Viewing differences
-@cindex Diff
-
-You do not remember modifying @file{driver.c}, so you want to see what
-has happened to that file.
-
-@example
-$ cd tc
-$ cvs diff driver.c
-@end example
-
-This command runs @code{diff} to compare the version of @file{driver.c}
-that you checked out with your working copy. When you see the output
-you remember that you added a command line option that enabled the
-optimization pass. You check it in, and release the module.
-@c FIXME: we haven't yet defined the term "check in".
-
-@example
-$ cvs commit -m "Added an optimization pass" driver.c
-Checking in driver.c;
-/usr/local/cvsroot/tc/driver.c,v <-- driver.c
-new revision: 1.2; previous revision: 1.1
-done
-$ cd ..
-$ cvs release -d tc
-? tc
-You have [0] altered files in this repository.
-Are you sure you want to release (and delete) directory `tc': y
-@end example
-
-@c ---------------------------------------------------------------------
-@node Repository
-@chapter The Repository
-@cindex Repository (intro)
-@cindex Repository, example
-@cindex Layout of repository
-@cindex Typical repository
-@cindex /usr/local/cvsroot, as example repository
-@cindex cvsroot
-
-The @sc{cvs} @dfn{repository} stores a complete copy of
-all the files and directories which are under version
-control.
-
-Normally, you never access any of the files in the
-repository directly. Instead, you use @sc{cvs}
-commands to get your own copy of the files into a
-@dfn{working directory}, and then
-work on that copy. When you've finished a set of
-changes, you check (or @dfn{commit}) them back into the
-repository. The repository then contains the changes
-which you have made, as well as recording exactly what
-you changed, when you changed it, and other such
-information. Note that the repository is not a
-subdirectory of the working directory, or vice versa;
-they should be in separate locations.
-@c Need some example, e.g. repository
-@c /usr/local/cvsroot; working directory
-@c /home/joe/sources. But this node is too long
-@c as it is; need a little reorganization...
-
-@cindex :local:, setting up
-@sc{cvs} can access a repository by a variety of
-means. It might be on the local computer, or it might
-be on a computer across the room or across the world.
-To distinguish various ways to access a repository, the
-repository name can start with an @dfn{access method}.
-For example, the access method @code{:local:} means to
-access a repository directory, so the repository
-@code{:local:/usr/local/cvsroot} means that the
-repository is in @file{/usr/local/cvsroot} on the
-computer running @sc{cvs}. For information on other
-access methods, see @ref{Remote repositories}.
-
-@c Can se say this more concisely? Like by passing
-@c more of the buck to the Remote repositories node?
-If the access method is omitted, then if the repository
-starts with @samp{/}, then @code{:local:} is
-assumed. If it does not start with @samp{/} then either
-@code{:ext:} or @code{:server:} is assumed. For
-example, if you have a local repository in
-@file{/usr/local/cvsroot}, you can use
-@code{/usr/local/cvsroot} instead of
-@code{:local:/usr/local/cvsroot}. But if (under
-Windows NT, for example) your local repository is
-@file{c:\src\cvsroot}, then you must specify the access
-method, as in @code{:local:c:/src/cvsroot}.
-
-@c This might appear to go in Repository storage, but
-@c actually it is describing something which is quite
-@c user-visible, when you do a "cvs co CVSROOT". This
-@c isn't necessary the perfect place for that, though.
-The repository is split in two parts. @file{$CVSROOT/CVSROOT} contains
-administrative files for @sc{cvs}. The other directories contain the actual
-user-defined modules.
-
-@menu
-* Specifying a repository:: Telling CVS where your repository is
-* Repository storage:: The structure of the repository
-* Working directory storage:: The structure of working directories
-* Intro administrative files:: Defining modules
-* Multiple repositories:: Multiple repositories
-* Creating a repository:: Creating a repository
-* Backing up:: Backing up a repository
-* Moving a repository:: Moving a repository
-* Remote repositories:: Accessing repositories on remote machines
-* Read-only access:: Granting read-only access to the repository
-* Server temporary directory:: The server creates temporary directories
-@end menu
-
-@node Specifying a repository
-@section Telling CVS where your repository is
-
-There are several ways to tell @sc{cvs}
-where to find the repository. You can name the
-repository on the command line explicitly, with the
-@code{-d} (for "directory") option:
-
-@example
-cvs -d /usr/local/cvsroot checkout yoyodyne/tc
-@end example
-
-@cindex .profile, setting CVSROOT in
-@cindex .cshrc, setting CVSROOT in
-@cindex .tcshrc, setting CVSROOT in
-@cindex .bashrc, setting CVSROOT in
-@cindex CVSROOT, environment variable
- Or you can set the @code{$CVSROOT} environment
-variable to an absolute path to the root of the
-repository, @file{/usr/local/cvsroot} in this example.
-To set @code{$CVSROOT}, @code{csh} and @code{tcsh}
-users should have this line in their @file{.cshrc} or
-@file{.tcshrc} files:
-
-@example
-setenv CVSROOT /usr/local/cvsroot
-@end example
-
-@noindent
-@code{sh} and @code{bash} users should instead have these lines in their
-@file{.profile} or @file{.bashrc}:
-
-@example
-CVSROOT=/usr/local/cvsroot
-export CVSROOT
-@end example
-
-@cindex Root file, in CVS directory
-@cindex CVS/Root file
- A repository specified with @code{-d} will
-override the @code{$CVSROOT} environment variable.
-Once you've checked a working copy out from the
-repository, it will remember where its repository is
-(the information is recorded in the
-@file{CVS/Root} file in the working copy).
-
-The @code{-d} option and the @file{CVS/Root} file both
-override the @code{$CVSROOT} environment variable. If
-@code{-d} option differs from @file{CVS/Root}, the
-former is used. Of course, for proper operation they
-should be two ways of referring to the same repository.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Repository storage
-@section How data is stored in the repository
-@cindex Repository, how data is stored
-
-For most purposes it isn't important @emph{how}
-@sc{cvs} stores information in the repository. In
-fact, the format has changed in the past, and is likely
-to change in the future. Since in almost all cases one
-accesses the repository via @sc{cvs} commands, such
-changes need not be disruptive.
-
-However, in some cases it may be necessary to
-understand how @sc{cvs} stores data in the repository,
-for example you might need to track down @sc{cvs} locks
-(@pxref{Concurrency}) or you might need to deal with
-the file permissions appropriate for the repository.
-
-@menu
-* Repository files:: What files are stored in the repository
-* File permissions:: File permissions
-* Windows permissions:: Issues specific to Windows
-* Attic:: Some files are stored in the Attic
-* CVS in repository:: Additional information in CVS directory
-* Locks:: CVS locks control concurrent accesses
-* CVSROOT storage:: A few things about CVSROOT are different
-@end menu
-
-@node Repository files
-@subsection Where files are stored within the repository
-
-@c @cindex Filenames, legal
-@c @cindex Legal filenames
-@c Somewhere we need to say something about legitimate
-@c characters in filenames in working directory and
-@c repository. Not "/" (not even on non-unix). And
-@c here is a specific set of issues:
-@c Files starting with a - are handled inconsistently. They can not
-@c be added to a repository with an add command, because it they are
-@c interpreted as a switch. They can appear in a repository if they are
-@c part of a tree that is imported. They can not be removed from the tree
-@c once they are there.
-@c Note that "--" *is* supported (as a
-@c consequence of using GNU getopt). Should document
-@c this somewhere ("Common options"?). The other usual technique,
-@c "./-foo", isn't as effective, at least for "cvs add"
-@c which doesn't support pathnames containing "/".
-
-The overall structure of the repository is a directory
-tree corresponding to the directories in the working
-directory. For example, supposing the repository is in
-
-@example
-/usr/local/cvsroot
-@end example
-
-@noindent
-here is a possible directory tree (showing only the
-directories):
-
-@example
-@t{/usr}
- |
- +--@t{local}
- | |
- | +--@t{cvsroot}
- | | |
- | | +--@t{CVSROOT}
- | (administrative files)
- |
- +--@t{gnu}
- | |
- | +--@t{diff}
- | | (source code to @sc{gnu} diff)
- | |
- | +--@t{rcs}
- | | (source code to @sc{rcs})
- | |
- | +--@t{cvs}
- | (source code to @sc{cvs})
- |
- +--@t{yoyodyne}
- |
- +--@t{tc}
- | |
- | +--@t{man}
- | |
- | +--@t{testing}
- |
- +--(other Yoyodyne software)
-@end example
-
-With the directories are @dfn{history files} for each file
-under version control. The name of the history file is
-the name of the corresponding file with @samp{,v}
-appended to the end. Here is what the repository for
-the @file{yoyodyne/tc} directory might look like:
-@c FIXME: Should also mention CVS (CVSREP)
-@c FIXME? Should we introduce Attic with an xref to
-@c Attic? Not sure whether that is a good idea or not.
-@example
- @code{$CVSROOT}
- |
- +--@t{yoyodyne}
- | |
- | +--@t{tc}
- | | |
- +--@t{Makefile,v}
- +--@t{backend.c,v}
- +--@t{driver.c,v}
- +--@t{frontend.c,v}
- +--@t{parser.c,v}
- +--@t{man}
- | |
- | +--@t{tc.1,v}
- |
- +--@t{testing}
- |
- +--@t{testpgm.t,v}
- +--@t{test2.t,v}
-@end example
-
-@cindex History files
-@cindex RCS history files
-@c The first sentence, about what history files
-@c contain, is kind of redundant with our intro to what the
-@c repository does in node Repository....
-The history files contain, among other things, enough
-information to recreate any revision of the file, a log
-of all commit messages and the user-name of the person
-who committed the revision. The history files are
-known as @dfn{RCS files}, because the first program to
-store files in that format was a version control system
-known as @sc{rcs}. For a full
-description of the file format, see the @code{man} page
-@cite{rcsfile(5)}, distributed with @sc{rcs}, or the
-file @file{doc/RCSFILES} in the @sc{cvs} source
-distribution. This
-file format has become very common---many systems other
-than @sc{cvs} or @sc{rcs} can at least import history
-files in this format.
-@c FIXME: Think about including documentation for this
-@c rather than citing it? In the long run, getting
-@c this to be a standard (not sure if we can cope with
-@c a standards process as formal as IEEE/ANSI/ISO/etc,
-@c though...) is the way to go, so maybe citing is
-@c better.
-
-The @sc{rcs} files used in @sc{cvs} differ in a few
-ways from the standard format. The biggest difference
-is magic branches; for more information see @ref{Magic
-branch numbers}. Also in @sc{cvs} the valid tag names
-are a subset of what @sc{rcs} accepts; for @sc{cvs}'s
-rules see @ref{Tags}.
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node File permissions
-@subsection File permissions
-@c -- Move this to @node Creating a repository or similar
-@cindex Security, file permissions in repository
-@cindex File permissions, general
-@cindex Permissions, general
-@c FIXME: we need to somehow reflect "permissions in
-@c repository" versus "permissions in working
-@c directory" in the index entries.
-@cindex Group, UNIX file permissions, in repository
-@cindex Read-only files, in repository
-All @samp{,v} files are created read-only, and you
-should not change the permission of those files. The
-directories inside the repository should be writable by
-the persons that have permission to modify the files in
-each directory. This normally means that you must
-create a UNIX group (see group(5)) consisting of the
-persons that are to edit the files in a project, and
-set up the repository so that it is that group that
-owns the directory.
-(On some systems, you also need to set the set-group-ID-on-execution bit
-on the repository directories (see chmod(1)) so that newly-created files
-and directories get the group-ID of the parent directory rather than
-that of the current process.)
-
-@c See also comment in commitinfo node regarding cases
-@c which are really awkward with unix groups.
-
-This means that you can only control access to files on
-a per-directory basis.
-
-Note that users must also have write access to check
-out files, because @sc{cvs} needs to create lock files
-(@pxref{Concurrency}). You can use LockDir in CVSROOT/config
-to put the lock files somewhere other than in the repository
-if you want to allow read-only access to some directories
-(@pxref{config}).
-
-@c CVS seems to use CVSUMASK in picking permissions for
-@c val-tags, but maybe we should say more about this.
-@c Like val-tags gets created by someone who doesn't
-@c have CVSUMASK set right?
-@cindex CVSROOT/val-tags file, and read-only access to projects
-@cindex val-tags file, and read-only access to projects
-Also note that users must have write access to the
-@file{CVSROOT/val-tags} file. @sc{cvs} uses it to keep
-track of what tags are valid tag names (it is sometimes
-updated when tags are used, as well as when they are
-created).
-
-Each @sc{rcs} file will be owned by the user who last
-checked it in. This has little significance; what
-really matters is who owns the directories.
-
-@cindex CVSUMASK, environment variable
-@cindex Umask, for repository files
-@sc{cvs} tries to set up reasonable file permissions
-for new directories that are added inside the tree, but
-you must fix the permissions manually when a new
-directory should have different permissions than its
-parent directory. If you set the @code{CVSUMASK}
-environment variable, that will control the file
-permissions which @sc{cvs} uses in creating directories
-and/or files in the repository. @code{CVSUMASK} does
-not affect the file permissions in the working
-directory; such files have the permissions which are
-typical for newly created files, except that sometimes
-@sc{cvs} creates them read-only (see the sections on
-watches, @ref{Setting a watch}; -r, @ref{Global
-options}; or @code{CVSREAD}, @ref{Environment variables}).
-@c FIXME: Need more discussion of which
-@c group should own the file in the repository.
-@c Include a somewhat detailed example of the usual
-@c case where CVSUMASK is 007, the developers are all
-@c in a group, and that group owns stuff in the
-@c repository. Need to talk about group ownership of
-@c newly-created directories/files (on some unices,
-@c such as SunOS4, setting the setgid bit on the
-@c directories will make files inherit the directory's
-@c group. On other unices, your mileage may vary. I
-@c can't remember what POSIX says about this, if
-@c anything).
-
-Note that using the client/server @sc{cvs}
-(@pxref{Remote repositories}), there is no good way to
-set @code{CVSUMASK}; the setting on the client machine
-has no effect. If you are connecting with @code{rsh}, you
-can set @code{CVSUMASK} in @file{.bashrc} or @file{.cshrc}, as
-described in the documentation for your operating
-system. This behavior might change in future versions
-of @sc{cvs}; do not rely on the setting of
-@code{CVSUMASK} on the client having no effect.
-@c FIXME: need to explain what a umask is or cite
-@c someplace which does.
-@c
-@c There is also a larger (largely separate) issue
-@c about the meaning of CVSUMASK in a non-unix context.
-@c For example, whether there is
-@c an equivalent which fits better into other
-@c protection schemes like POSIX.6, VMS, &c.
-@c
-@c FIXME: Need one place which discusses this
-@c read-only files thing. Why would one use -r or
-@c CVSREAD? Why would one use watches? How do they
-@c interact?
-@c
-@c FIXME: We need to state
-@c whether using CVSUMASK removes the need for manually
-@c fixing permissions (in fact, if we are going to mention
-@c manually fixing permission, we better document a lot
-@c better just what we mean by "fix").
-
-Using pserver, you will generally need stricter
-permissions on the @sc{cvsroot} directory and
-directories above it in the tree; see @ref{Password
-authentication security}.
-
-@cindex Setuid
-@cindex Setgid
-@cindex Security, setuid
-@cindex Installed images (VMS)
-Some operating systems have features which allow a
-particular program to run with the ability to perform
-operations which the caller of the program could not.
-For example, the set user ID (setuid) or set group ID
-(setgid) features of unix or the installed image
-feature of VMS. @sc{cvs} was not written to use such
-features and therefore attempting to install @sc{cvs} in
-this fashion will provide protection against only
-accidental lapses; anyone who is trying to circumvent
-the measure will be able to do so, and depending on how
-you have set it up may gain access to more than just
-@sc{cvs}. You may wish to instead consider pserver. It
-shares some of the same attributes, in terms of
-possibly providing a false sense of security or opening
-security holes wider than the ones you are trying to
-fix, so read the documentation on pserver security
-carefully if you are considering this option
-(@ref{Password authentication security}).
-
-@node Windows permissions
-@subsection File Permission issues specific to Windows
-@cindex Windows, and permissions
-@cindex File permissions, Windows-specific
-@cindex Permissions, Windows-specific
-
-Some file permission issues are specific to Windows
-operating systems (Windows 95, Windows NT, and
-presumably future operating systems in this family.
-Some of the following might apply to OS/2 but I'm not
-sure).
-
-If you are using local @sc{cvs} and the repository is on a
-networked file system which is served by the Samba SMB
-server, some people have reported problems with
-permissions. Enabling WRITE=YES in the samba
-configuration is said to fix/workaround it.
-Disclaimer: I haven't investigated enough to know the
-implications of enabling that option, nor do I know
-whether there is something which @sc{cvs} could be doing
-differently in order to avoid the problem. If you find
-something out, please let us know as described in
-@ref{BUGS}.
-
-@node Attic
-@subsection The attic
-@cindex Attic
-
-You will notice that sometimes @sc{cvs} stores an
-@sc{rcs} file in the @code{Attic}. For example, if the
-@sc{cvsroot} is @file{/usr/local/cvsroot} and we are
-talking about the file @file{backend.c} in the
-directory @file{yoyodyne/tc}, then the file normally
-would be in
-
-@example
-/usr/local/cvsroot/yoyodyne/tc/backend.c,v
-@end example
-
-@noindent
-but if it goes in the attic, it would be in
-
-@example
-/usr/local/cvsroot/yoyodyne/tc/Attic/backend.c,v
-@end example
-
-@noindent
-@cindex Dead state
-instead. It should not matter from a user point of
-view whether a file is in the attic; @sc{cvs} keeps
-track of this and looks in the attic when it needs to.
-But in case you want to know, the rule is that the RCS
-file is stored in the attic if and only if the head
-revision on the trunk has state @code{dead}. A
-@code{dead} state means that file has been removed, or
-never added, for that revision. For example, if you
-add a file on a branch, it will have a trunk revision
-in @code{dead} state, and a branch revision in a
-non-@code{dead} state.
-@c Probably should have some more concrete examples
-@c here, or somewhere (not sure exactly how we should
-@c arrange the discussion of the dead state, versus
-@c discussion of the attic).
-
-@node CVS in repository
-@subsection The CVS directory in the repository
-@cindex CVS directory, in repository
-
-The @file{CVS} directory in each repository directory
-contains information such as file attributes (in a file
-called @file{CVS/fileattr}. In the
-future additional files may be added to this directory,
-so implementations should silently ignore additional
-files.
-
-This behavior is implemented only by @sc{cvs} 1.7 and
-later; for details see @ref{Watches Compatibility}.
-
-The format of the @file{fileattr} file is a series of entries
-of the following form (where @samp{@{} and @samp{@}}
-means the text between the braces can be repeated zero
-or more times):
-
-@var{ent-type} @var{filename} <tab> @var{attrname} = @var{attrval}
- @{; @var{attrname} = @var{attrval}@} <linefeed>
-
-@var{ent-type} is @samp{F} for a file, in which case the entry specifies the
-attributes for that file.
-
-@var{ent-type} is @samp{D},
-and @var{filename} empty, to specify default attributes
-to be used for newly added files.
-
-Other @var{ent-type} are reserved for future expansion. @sc{cvs} 1.9 and older
-will delete them any time it writes file attributes.
-@sc{cvs} 1.10 and later will preserve them.
-
-Note that the order of the lines is not significant;
-a program writing the fileattr file may
-rearrange them at its convenience.
-
-There is currently no way of quoting tabs or line feeds in the
-filename, @samp{=} in @var{attrname},
-@samp{;} in @var{attrval}, etc. Note: some implementations also
-don't handle a NUL character in any of the fields, but
-implementations are encouraged to allow it.
-
-By convention, @var{attrname} starting with @samp{_} is for an attribute given
-special meaning by @sc{cvs}; other @var{attrname}s are for user-defined attributes
-(or will be, once implementations start supporting user-defined attributes).
-
-Built-in attributes:
-
-@table @code
-@item _watched
-Present means the file is watched and should be checked out
-read-only.
-
-@item _watchers
-Users with watches for this file. Value is
-@var{watcher} > @var{type} @{ , @var{watcher} > @var{type} @}
-where @var{watcher} is a username, and @var{type}
-is zero or more of edit,unedit,commit separated by
-@samp{+} (that is, nothing if none; there is no "none" or "all" keyword).
-
-@item _editors
-Users editing this file. Value is
-@var{editor} > @var{val} @{ , @var{editor} > @var{val} @}
-where @var{editor} is a username, and @var{val} is
-@var{time}+@var{hostname}+@var{pathname}, where
-@var{time} is when the @code{cvs edit} command (or
-equivalent) happened,
-and @var{hostname} and @var{pathname} are for the working directory.
-@end table
-
-Example:
-
-@c FIXME: sanity.sh should contain a similar test case
-@c so we can compare this example from something from
-@c Real Life(TM). See cvsclient.texi (under Notify) for more
-@c discussion of the date format of _editors.
-@example
-Ffile1 _watched=;_watchers=joe>edit,mary>commit
-Ffile2 _watched=;_editors=sue>8 Jan 1975+workstn1+/home/sue/cvs
-D _watched=
-@end example
-
-@noindent
-means that the file @file{file1} should be checked out
-read-only. Furthermore, joe is watching for edits and
-mary is watching for commits. The file @file{file2}
-should be checked out read-only; sue started editing it
-on 8 Jan 1975 in the directory @file{/home/sue/cvs} on
-the machine @code{workstn1}. Future files which are
-added should be checked out read-only. To represent
-this example here, we have shown a space after
-@samp{D}, @samp{Ffile1}, and @samp{Ffile2}, but in fact
-there must be a single tab character there and no spaces.
-
-@node Locks
-@subsection CVS locks in the repository
-
-@cindex #cvs.rfl, technical details
-@cindex #cvs.wfl, technical details
-@cindex #cvs.lock, technical details
-@cindex Locks, cvs, technical details
-For an introduction to @sc{cvs} locks focusing on
-user-visible behavior, see @ref{Concurrency}. The
-following section is aimed at people who are writing
-tools which want to access a @sc{cvs} repository without
-interfering with other tools accessing the same
-repository. If you find yourself confused by concepts
-described here, like @dfn{read lock}, @dfn{write lock},
-and @dfn{deadlock}, you might consult the literature on
-operating systems or databases.
-
-@cindex #cvs.tfl
-Any file in the repository with a name starting
-with @file{#cvs.rfl.} is a read lock. Any file in
-the repository with a name starting with
-@file{#cvs.wfl} is a write lock. Old versions of @sc{cvs}
-(before @sc{cvs} 1.5) also created files with names starting
-with @file{#cvs.tfl}, but they are not discussed here.
-The directory @file{#cvs.lock} serves as a master
-lock. That is, one must obtain this lock first before
-creating any of the other locks.
-
-To obtain a read lock, first create the @file{#cvs.lock}
-directory. This operation must be atomic (which should
-be true for creating a directory under most operating
-systems). If it fails because the directory already
-existed, wait for a while and try again. After
-obtaining the @file{#cvs.lock} lock, create a file
-whose name is @file{#cvs.rfl.} followed by information
-of your choice (for example, hostname and process
-identification number). Then remove the
-@file{#cvs.lock} directory to release the master lock.
-Then proceed with reading the repository. When you are
-done, remove the @file{#cvs.rfl} file to release the
-read lock.
-
-To obtain a write lock, first create the
-@file{#cvs.lock} directory, as with read locks. Then
-check that there are no files whose names start with
-@file{#cvs.rfl.}. If there are, remove
-@file{#cvs.lock}, wait for a while, and try again. If
-there are no readers, then create a file whose name is
-@file{#cvs.wfl} followed by information of your choice
-(for example, hostname and process identification
-number). Hang on to the @file{#cvs.lock} lock. Proceed
-with writing the repository. When you are done, first
-remove the @file{#cvs.wfl} file and then the
-@file{#cvs.lock} directory. Note that unlike the
-@file{#cvs.rfl} file, the @file{#cvs.wfl} file is just
-informational; it has no effect on the locking operation
-beyond what is provided by holding on to the
-@file{#cvs.lock} lock itself.
-
-Note that each lock (write lock or read lock) only locks
-a single directory in the repository, including
-@file{Attic} and @file{CVS} but not including
-subdirectories which represent other directories under
-version control. To lock an entire tree, you need to
-lock each directory (note that if you fail to obtain
-any lock you need, you must release the whole tree
-before waiting and trying again, to avoid deadlocks).
-
-Note also that @sc{cvs} expects write locks to control
-access to individual @file{foo,v} files. @sc{rcs} has
-a scheme where the @file{,foo,} file serves as a lock,
-but @sc{cvs} does not implement it and so taking out a
-@sc{cvs} write lock is recommended. See the comments at
-rcs_internal_lockfile in the @sc{cvs} source code for
-further discussion/rationale.
-
-@node CVSROOT storage
-@subsection How files are stored in the CVSROOT directory
-@cindex CVSROOT, storage of files
-
-The @file{$CVSROOT/CVSROOT} directory contains the
-various administrative files. In some ways this
-directory is just like any other directory in the
-repository; it contains @sc{rcs} files whose names end
-in @samp{,v}, and many of the @sc{cvs} commands operate
-on it the same way. However, there are a few
-differences.
-
-For each administrative file, in addition to the
-@sc{rcs} file, there is also a checked out copy of the
-file. For example, there is an @sc{rcs} file
-@file{loginfo,v} and a file @file{loginfo} which
-contains the latest revision contained in
-@file{loginfo,v}. When you check in an administrative
-file, @sc{cvs} should print
-
-@example
-cvs commit: Rebuilding administrative file database
-@end example
-
-@noindent
-and update the checked out copy in
-@file{$CVSROOT/CVSROOT}. If it does not, there is
-something wrong (@pxref{BUGS}). To add your own files
-to the files to be updated in this fashion, you can add
-them to the @file{checkoutlist} administrative file
-(@pxref{checkoutlist}).
-
-@cindex modules.db
-@cindex modules.pag
-@cindex modules.dir
-By default, the @file{modules} file behaves as
-described above. If the modules file is very large,
-storing it as a flat text file may make looking up
-modules slow (I'm not sure whether this is as much of a
-concern now as when @sc{cvs} first evolved this
-feature; I haven't seen benchmarks). Therefore, by
-making appropriate edits to the @sc{cvs} source code
-one can store the modules file in a database which
-implements the @code{ndbm} interface, such as Berkeley
-db or GDBM. If this option is in use, then the modules
-database will be stored in the files @file{modules.db},
-@file{modules.pag}, and/or @file{modules.dir}.
-@c I think fileattr also will use the database stuff.
-@c Anything else?
-
-For information on the meaning of the various
-administrative files, see @ref{Administrative files}.
-
-@node Working directory storage
-@section How data is stored in the working directory
-
-@c FIXME: Somewhere we should discuss timestamps (test
-@c case "stamps" in sanity.sh). But not here. Maybe
-@c in some kind of "working directory" chapter which
-@c would encompass the "Builds" one? But I'm not sure
-@c whether that is a good organization (is it based on
-@c what the user wants to do?).
-
-@cindex CVS directory, in working directory
-While we are discussing @sc{cvs} internals which may
-become visible from time to time, we might as well talk
-about what @sc{cvs} puts in the @file{CVS} directories
-in the working directories. As with the repository,
-@sc{cvs} handles this information and one can usually
-access it via @sc{cvs} commands. But in some cases it
-may be useful to look at it, and other programs, such
-as the @code{jCVS} graphical user interface or the
-@code{VC} package for emacs, may need to look at it.
-Such programs should follow the recommendations in this
-section if they hope to be able to work with other
-programs which use those files, including future
-versions of the programs just mentioned and the
-command-line @sc{cvs} client.
-
-The @file{CVS} directory contains several files.
-Programs which are reading this directory should
-silently ignore files which are in the directory but
-which are not documented here, to allow for future
-expansion.
-
-The files are stored according to the text file
-convention for the system in question. This means that
-working directories are not portable between systems
-with differing conventions for storing text files.
-This is intentional, on the theory that the files being
-managed by @sc{cvs} probably will not be portable between
-such systems either.
-
-@table @file
-@item Root
-This file contains the current @sc{cvs} root, as
-described in @ref{Specifying a repository}.
-
-@cindex Repository file, in CVS directory
-@cindex CVS/Repository file
-@item Repository
-This file contains the directory within the repository
-which the current directory corresponds with. It can
-be either an absolute pathname or a relative pathname;
-@sc{cvs} has had the ability to read either format
-since at least version 1.3 or so. The relative
-pathname is relative to the root, and is the more
-sensible approach, but the absolute pathname is quite
-common and implementations should accept either. For
-example, after the command
-
-@example
-cvs -d :local:/usr/local/cvsroot checkout yoyodyne/tc
-@end example
-
-@noindent
-@file{Root} will contain
-
-@example
-:local:/usr/local/cvsroot
-@end example
-
-@noindent
-and @file{Repository} will contain either
-
-@example
-/usr/local/cvsroot/yoyodyne/tc
-@end example
-
-@noindent
-or
-
-@example
-yoyodyne/tc
-@end example
-
-If the particular working directory does not correspond
-to a directory in the repository, then @file{Repository}
-should contain @file{CVSROOT/Emptydir}.
-@cindex Emptydir, in CVSROOT directory
-@cindex CVSROOT/Emptydir directory
-
-@cindex Entries file, in CVS directory
-@cindex CVS/Entries file
-@item Entries
-This file lists the files and directories in the
-working directory.
-The first character of each line indicates what sort of
-line it is. If the character is unrecognized, programs
-reading the file should silently skip that line, to
-allow for future expansion.
-
-If the first character is @samp{/}, then the format is:
-
-@example
-/@var{name}/@var{revision}/@var{timestamp}[+@var{conflict}]/@var{options}/@var{tagdate}
-@end example
-
-@noindent
-where @samp{[} and @samp{]} are not part of the entry,
-but instead indicate that the @samp{+} and conflict
-marker are optional. @var{name} is the name of the
-file within the directory. @var{revision} is the
-revision that the file in the working derives from, or
-@samp{0} for an added file, or @samp{-} followed by a
-revision for a removed file. @var{timestamp} is the
-timestamp of the file at the time that @sc{cvs} created
-it; if the timestamp differs with the actual
-modification time of the file it means the file has
-been modified. It is stored in
-the format used by the ISO C asctime() function (for
-example, @samp{Sun Apr 7 01:29:26 1996}). One may
-write a string which is not in that format, for
-example, @samp{Result of merge}, to indicate that the
-file should always be considered to be modified. This
-is not a special case; to see whether a file is
-modified a program should take the timestamp of the file
-and simply do a string compare with @var{timestamp}.
-If there was a conflict, @var{conflict} can be set to
-the modification time of the file after the file has been
-written with conflict markers (@pxref{Conflicts example}).
-Thus if @var{conflict} is subsequently the same as the actual
-modification time of the file it means that the user
-has obviously not resolved the conflict. @var{options}
-contains sticky options (for example @samp{-kb} for a
-binary file). @var{tagdate} contains @samp{T} followed
-by a tag name, or @samp{D} for a date, followed by a
-sticky tag or date. Note that if @var{timestamp}
-contains a pair of timestamps separated by a space,
-rather than a single timestamp, you are dealing with a
-version of @sc{cvs} earlier than @sc{cvs} 1.5 (not
-documented here).
-
-The timezone on the timestamp in CVS/Entries (local or
-universal) should be the same as the operating system
-stores for the timestamp of the file itself. For
-example, on Unix the file's timestamp is in universal
-time (UT), so the timestamp in CVS/Entries should be
-too. On @sc{vms}, the file's timestamp is in local
-time, so @sc{cvs} on @sc{vms} should use local time.
-This rule is so that files do not appear to be modified
-merely because the timezone changed (for example, to or
-from summer time).
-@c See comments and calls to gmtime() and friends in
-@c src/vers_ts.c (function time_stamp).
-
-If the first character of a line in @file{Entries} is
-@samp{D}, then it indicates a subdirectory. @samp{D}
-on a line all by itself indicates that the program
-which wrote the @file{Entries} file does record
-subdirectories (therefore, if there is such a line and
-no other lines beginning with @samp{D}, one knows there
-are no subdirectories). Otherwise, the line looks
-like:
-
-@example
-D/@var{name}/@var{filler1}/@var{filler2}/@var{filler3}/@var{filler4}
-@end example
-
-@noindent
-where @var{name} is the name of the subdirectory, and
-all the @var{filler} fields should be silently ignored,
-for future expansion. Programs which modify
-@code{Entries} files should preserve these fields.
-
-The lines in the @file{Entries} file can be in any order.
-
-@cindex Entries.Log file, in CVS directory
-@cindex CVS/Entries.Log file
-@item Entries.Log
-This file does not record any information beyond that
-in @file{Entries}, but it does provide a way to update
-the information without having to rewrite the entire
-@file{Entries} file, including the ability to preserve
-the information even if the program writing
-@file{Entries} and @file{Entries.Log} abruptly aborts.
-Programs which are reading the @file{Entries} file
-should also check for @file{Entries.Log}. If the latter
-exists, they should read @file{Entries} and then apply
-the changes mentioned in @file{Entries.Log}. After
-applying the changes, the recommended practice is to
-rewrite @file{Entries} and then delete @file{Entries.Log}.
-The format of a line in @file{Entries.Log} is a single
-character command followed by a space followed by a
-line in the format specified for a line in
-@file{Entries}. The single character command is
-@samp{A} to indicate that the entry is being added,
-@samp{R} to indicate that the entry is being removed,
-or any other character to indicate that the entire line
-in @file{Entries.Log} should be silently ignored (for
-future expansion). If the second character of the line
-in @file{Entries.Log} is not a space, then it was
-written by an older version of @sc{cvs} (not documented
-here).
-
-Programs which are writing rather than reading can
-safely ignore @file{Entries.Log} if they so choose.
-
-@cindex Entries.Backup file, in CVS directory
-@cindex CVS/Entries.Backup file
-@item Entries.Backup
-This is a temporary file. Recommended usage is to
-write a new entries file to @file{Entries.Backup}, and
-then to rename it (atomically, where possible) to @file{Entries}.
-
-@cindex Entries.Static file, in CVS directory
-@cindex CVS/Entries.Static file
-@item Entries.Static
-The only relevant thing about this file is whether it
-exists or not. If it exists, then it means that only
-part of a directory was gotten and @sc{cvs} will
-not create additional files in that directory. To
-clear it, use the @code{update} command with the
-@samp{-d} option, which will get the additional files
-and remove @file{Entries.Static}.
-@c FIXME: This needs to be better documented, in places
-@c other than Working Directory Storage.
-@c FIXCVS: The fact that this setting exists needs to
-@c be more visible to the user. For example "cvs
-@c status foo", in the case where the file would be
-@c gotten except for Entries.Static, might say
-@c something to distinguish this from other cases.
-@c One thing that periodically gets suggested is to
-@c have "cvs update" print something when it skips
-@c files due to Entries.Static, but IMHO that kind of
-@c noise pretty much makes the Entries.Static feature
-@c useless.
-
-@cindex Tag file, in CVS directory
-@cindex CVS/Tag file
-@cindex Sticky tags/dates, per-directory
-@cindex Per-directory sticky tags/dates
-@item Tag
-This file contains per-directory sticky tags or dates.
-The first character is @samp{T} for a branch tag,
-@samp{N} for a non-branch tag, or @samp{D} for a date,
-or another character to mean the file should be
-silently ignored, for future expansion. This character
-is followed by the tag or date. Note that
-per-directory sticky tags or dates are used for things
-like applying to files which are newly added; they
-might not be the same as the sticky tags or dates on
-individual files. For general information on sticky
-tags and dates, see @ref{Sticky tags}.
-@c FIXME: This needs to be much better documented,
-@c preferably not in the context of "working directory
-@c storage".
-@c FIXME: The Sticky tags node needs to discuss, or xref to
-@c someplace which discusses, per-directory sticky
-@c tags and the distinction with per-file sticky tags.
-
-@cindex Notify file, in CVS directory
-@cindex CVS/Notify file
-@item Notify
-This file stores notifications (for example, for
-@code{edit} or @code{unedit}) which have not yet been
-sent to the server. Its format is not yet documented
-here.
-
-@cindex Notify.tmp file, in CVS directory
-@cindex CVS/Notify.tmp file
-@item Notify.tmp
-This file is to @file{Notify} as @file{Entries.Backup}
-is to @file{Entries}. That is, to write @file{Notify},
-first write the new contents to @file{Notify.tmp} and
-then (atomically where possible), rename it to
-@file{Notify}.
-
-@cindex Base directory, in CVS directory
-@cindex CVS/Base directory
-@item Base
-If watches are in use, then an @code{edit} command
-stores the original copy of the file in the @file{Base}
-directory. This allows the @code{unedit} command to
-operate even if it is unable to communicate with the
-server.
-
-@cindex Baserev file, in CVS directory
-@cindex CVS/Baserev file
-@item Baserev
-The file lists the revision for each of the files in
-the @file{Base} directory. The format is:
-
-@example
-B@var{name}/@var{rev}/@var{expansion}
-@end example
-
-@noindent
-where @var{expansion} should be ignored, to allow for
-future expansion.
-
-@cindex Baserev.tmp file, in CVS directory
-@cindex CVS/Baserev.tmp file
-@item Baserev.tmp
-This file is to @file{Baserev} as @file{Entries.Backup}
-is to @file{Entries}. That is, to write @file{Baserev},
-first write the new contents to @file{Baserev.tmp} and
-then (atomically where possible), rename it to
-@file{Baserev}.
-
-@cindex Template file, in CVS directory
-@cindex CVS/Template file
-@item Template
-This file contains the template specified by the
-@file{rcsinfo} file (@pxref{rcsinfo}). It is only used
-by the client; the non-client/server @sc{cvs} consults
-@file{rcsinfo} directly.
-@end table
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Intro administrative files
-@section The administrative files
-@cindex Administrative files (intro)
-@cindex Modules file
-@cindex CVSROOT, module name
-@cindex Defining modules (intro)
-
-@c FIXME: this node should be reorganized into "general
-@c information about admin files" and put the "editing
-@c admin files" stuff up front rather than jumping into
-@c the details of modules right away. Then the
-@c Administrative files node can go away, the information
-@c on each admin file distributed to a place appropriate
-@c to its function, and this node can contain a table
-@c listing each file and a @ref to its detailed description.
-
-The directory @file{$CVSROOT/CVSROOT} contains some @dfn{administrative
-files}. @xref{Administrative files}, for a complete description.
-You can use @sc{cvs} without any of these files, but
-some commands work better when at least the
-@file{modules} file is properly set up.
-
-The most important of these files is the @file{modules}
-file. It defines all modules in the repository. This
-is a sample @file{modules} file.
-
-@c FIXME: The CVSROOT line is a goofy example now that
-@c mkmodules doesn't exist.
-@example
-CVSROOT CVSROOT
-modules CVSROOT modules
-cvs gnu/cvs
-rcs gnu/rcs
-diff gnu/diff
-tc yoyodyne/tc
-@end example
-
-The @file{modules} file is line oriented. In its
-simplest form each line contains the name of the
-module, whitespace, and the directory where the module
-resides. The directory is a path relative to
-@code{$CVSROOT}. The last four lines in the example
-above are examples of such lines.
-
-@c FIXME: might want to introduce the concept of options in modules file
-@c (the old example which was here, -i mkmodules, is obsolete).
-
-The line that defines the module called @samp{modules}
-uses features that are not explained here.
-@xref{modules}, for a full explanation of all the
-available features.
-
-@c FIXME: subsection without node is bogus
-@subsection Editing administrative files
-@cindex Editing administrative files
-@cindex Administrative files, editing them
-
-You edit the administrative files in the same way that you would edit
-any other module. Use @samp{cvs checkout CVSROOT} to get a working
-copy, edit it, and commit your changes in the normal way.
-
-It is possible to commit an erroneous administrative
-file. You can often fix the error and check in a new
-revision, but sometimes a particularly bad error in the
-administrative file makes it impossible to commit new
-revisions. If and when this happens, you can correct
-the problem by temporarily copying a corrected administrative file
-directly into the @code{$CVSROOT/CVSROOT} repository directory,
-then committing the same correction via a checkout of the @file{CVSROOT}
-module. It is important that the correction also be made via the
-checked out copy, or the next checkout and commit to the
-<code>CVSROOT</code> module will overwrite the correction that was
-copied directly into the repository, possibly breaking things in such
-a way as to prevent commits again.
-@c @xref{Bad administrative files} for a hint
-@c about how to solve such situations.
-@c -- administrative file checking--
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Multiple repositories
-@section Multiple repositories
-@cindex Multiple repositories
-@cindex Repositories, multiple
-@cindex Many repositories
-@cindex Parallel repositories
-@cindex Disjoint repositories
-@cindex CVSROOT, multiple repositories
-
-In some situations it is a good idea to have more than
-one repository, for instance if you have two
-development groups that work on separate projects
-without sharing any code. All you have to do to have
-several repositories is to specify the appropriate
-repository, using the @code{CVSROOT} environment
-variable, the @samp{-d} option to @sc{cvs}, or (once
-you have checked out a working directory) by simply
-allowing @sc{cvs} to use the repository that was used
-to check out the working directory
-(@pxref{Specifying a repository}).
-
-The big advantage of having multiple repositories is
-that they can reside on different servers. With @sc{cvs}
-version 1.10, a single command cannot recurse into
-directories from different repositories. With development
-versions of @sc{cvs}, you can check out code from multiple
-servers into your working directory. @sc{cvs} will
-recurse and handle all the details of making
-connections to as many server machines as necessary to
-perform the requested command. Here is an example of
-how to set up a working directory:
-
-@example
-cvs -d server1:/cvs co dir1
-cd dir1
-cvs -d server2:/root co sdir
-cvs update
-@end example
-
-The @code{cvs co} commands set up the working
-directory, and then the @code{cvs update} command will
-contact server2, to update the dir1/sdir subdirectory,
-and server1, to update everything else.
-
-@c FIXME: Does the FAQ have more about this? I have a
-@c dim recollection, but I'm too lazy to check right now.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Creating a repository
-@section Creating a repository
-
-@cindex Repository, setting up
-@cindex Creating a repository
-@cindex Setting up a repository
-
-This section describes how to set up a @sc{cvs} repository for any
-sort of access method. After completing the setup described in this
-section, you should be able to access your @sc{cvs} repository immediately
-via the local access method and several remote access methods. For
-more information on setting up remote access to the repository you create
-in this section, please read the section on @xref{Remote repositories}.
-
-To set up a @sc{cvs} repository, first choose the
-machine and disk on which you want to store the
-revision history of the source files. CPU and memory
-requirements are modest, so most machines should be
-adequate. For details see @ref{Server requirements}.
-@c Possible that we should be providing a quick rule of
-@c thumb, like the 32M memory for the server. That
-@c might increase the number of people who are happy
-@c with the answer, without following the xref.
-
-To estimate disk space
-requirements, if you are importing RCS files from
-another system, the size of those files is the
-approximate initial size of your repository, or if you
-are starting without any version history, a rule of
-thumb is to allow for the server approximately three
-times the size of the code to be under @sc{cvs} for the
-repository (you will eventually outgrow this, but not
-for a while). On the machines on which the developers
-will be working, you'll want disk space for
-approximately one working directory for each developer
-(either the entire tree or a portion of it, depending
-on what each developer uses).
-
-The repository should be accessible
-(directly or via a networked file system) from all
-machines which want to use @sc{cvs} in server or local
-mode; the client machines need not have any access to
-it other than via the @sc{cvs} protocol. It is not
-possible to use @sc{cvs} to read from a repository
-which one only has read access to; @sc{cvs} needs to be
-able to create lock files (@pxref{Concurrency}).
-
-@cindex init (subcommand)
-To create a repository, run the @code{cvs init}
-command. It will set up an empty repository in the
-@sc{cvs} root specified in the usual way
-(@pxref{Repository}). For example,
-
-@example
-cvs -d /usr/local/cvsroot init
-@end example
-
-@code{cvs init} is careful to never overwrite any
-existing files in the repository, so no harm is done if
-you run @code{cvs init} on an already set-up
-repository.
-
-@code{cvs init} will enable history logging; if you
-don't want that, remove the history file after running
-@code{cvs init}. @xref{history file}.
-
-@node Backing up
-@section Backing up a repository
-@cindex Repository, backing up
-@cindex Backing up, repository
-
-There is nothing particularly magical about the files
-in the repository; for the most part it is possible to
-back them up just like any other files. However, there
-are a few issues to consider.
-
-@cindex Locks, cvs, and backups
-@cindex #cvs.rfl, and backups
-The first is that to be paranoid, one should either not
-use @sc{cvs} during the backup, or have the backup
-program lock @sc{cvs} while doing the backup. To not
-use @sc{cvs}, you might forbid logins to machines which
-can access the repository, turn off your @sc{cvs}
-server, or similar mechanisms. The details would
-depend on your operating system and how you have
-@sc{cvs} set up. To lock @sc{cvs}, you would create
-@file{#cvs.rfl} locks in each repository directory.
-See @ref{Concurrency}, for more on @sc{cvs} locks.
-Having said all this, if you just back up without any
-of these precautions, the results are unlikely to be
-particularly dire. Restoring from backup, the
-repository might be in an inconsistent state, but this
-would not be particularly hard to fix manually.
-
-When you restore a repository from backup, assuming
-that changes in the repository were made after the time
-of the backup, working directories which were not
-affected by the failure may refer to revisions which no
-longer exist in the repository. Trying to run @sc{cvs}
-in such directories will typically produce an error
-message. One way to get those changes back into the
-repository is as follows:
-
-@itemize @bullet
-@item
-Get a new working directory.
-
-@item
-Copy the files from the working directory from before
-the failure over to the new working directory (do not
-copy the contents of the @file{CVS} directories, of
-course).
-
-@item
-Working in the new working directory, use commands such
-as @code{cvs update} and @code{cvs diff} to figure out
-what has changed, and then when you are ready, commit
-the changes into the repository.
-@end itemize
-
-@node Moving a repository
-@section Moving a repository
-@cindex Repository, moving
-@cindex Moving a repository
-@cindex Copying a repository
-
-Just as backing up the files in the repository is
-pretty much like backing up any other files, if you
-need to move a repository from one place to another it
-is also pretty much like just moving any other
-collection of files.
-
-The main thing to consider is that working directories
-point to the repository. The simplest way to deal with
-a moved repository is to just get a fresh working
-directory after the move. Of course, you'll want to
-make sure that the old working directory had been
-checked in before the move, or you figured out some
-other way to make sure that you don't lose any
-changes. If you really do want to reuse the existing
-working directory, it should be possible with manual
-surgery on the @file{CVS/Repository} files. You can
-see @ref{Working directory storage}, for information on
-the @file{CVS/Repository} and @file{CVS/Root} files, but
-unless you are sure you want to bother, it probably
-isn't worth it.
-@c FIXME: Surgery on CVS/Repository should be avoided
-@c by making RELATIVE_REPOS the default.
-@c FIXME-maybe: might want some documented way to
-@c change the CVS/Root files in some particular tree.
-@c But then again, I don't know, maybe just having
-@c people do this in perl/shell/&c isn't so bad...
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Remote repositories
-@section Remote repositories
-@cindex Repositories, remote
-@cindex Remote repositories
-@cindex Client/Server Operation
-@cindex Server, CVS
-@cindex Remote repositories, port specification
-@cindex Repositories, remote, port specification
-@cindex Client/Server Operation, port specification
-@cindex pserver (client/server connection method), port specification
-@cindex kserver (client/server connection method), port specification
-@cindex gserver (client/server connection method), port specification
-@cindex port, specifying for remote repositories
-
- Your working copy of the sources can be on a
-different machine than the repository. Using @sc{cvs}
-in this manner is known as @dfn{client/server}
-operation. You run @sc{cvs} on a machine which can
-mount your working directory, known as the
-@dfn{client}, and tell it to communicate to a machine
-which can mount the repository, known as the
-@dfn{server}. Generally, using a remote
-repository is just like using a local one, except that
-the format of the repository name is:
-
-@example
-[:@var{method}:][[@var{user}][:@var{password}]@@]@var{hostname}[:[@var{port}]]/path/to/repository
-@end example
-
-Specifying a password in the repository name is not recommended during
-checkout, since this will cause @sc{cvs} to store a cleartext copy of the
-password in each created directory. @code{cvs login} first instead
-(@pxref{Password authentication client}).
-
-The details of exactly what needs to be set up depend
-on how you are connecting to the server.
-
-If @var{method} is not specified, and the repository
-name contains @samp{:}, then the default is @code{ext}
-or @code{server}, depending on your platform; both are
-described in @ref{Connecting via rsh}.
-@c Should we try to explain which platforms are which?
-@c Platforms like unix and VMS, which only allow
-@c privileged programs to bind to sockets <1024 lose on
-@c :server:
-@c Platforms like Mac and VMS, whose rsh program is
-@c unusable or nonexistent, lose on :ext:
-@c Platforms like OS/2 and NT probably could plausibly
-@c default either way (modulo -b troubles).
-
-@c FIXME: We need to have a better way of explaining
-@c what method to use. This presentation totally
-@c obscures the fact that :ext: and CVS_RSH is the way to
-@c use SSH, for example. Plus it incorrectly implies
-@c that you need an @code{rsh} binary on the client to use
-@c :server:.
-@c Also note that rsh not pserver is the right choice if you want
-@c users to be able to create their own repositories
-@c (because of the --allow-root related issues).
-@menu
-* Server requirements:: Memory and other resources for servers
-* Connecting via rsh:: Using the @code{rsh} program to connect
-* Password authenticated:: Direct connections using passwords
-* GSSAPI authenticated:: Direct connections using GSSAPI
-* Kerberos authenticated:: Direct connections with Kerberos
-* Connecting via fork:: Using a forked @code{cvs server} to connect
-@end menu
-
-@node Server requirements
-@subsection Server requirements
-
-The quick answer to what sort of machine is suitable as
-a server is that requirements are modest---a server
-with 32M of memory or even less can handle a fairly
-large source tree with a fair amount of activity.
-@c Say something about CPU speed too? I'm even less sure
-@c what to say on that subject...
-
-The real answer, of course, is more complicated.
-Estimating the known areas of large memory consumption
-should be sufficient to estimate memory requirements.
-There are two such areas documented here; other memory
-consumption should be small by comparison (if you find
-that is not the case, let us know, as described in
-@ref{BUGS}, so we can update this documentation).
-
-The first area of big memory consumption is large
-checkouts, when using the @sc{cvs} server. The server
-consists of two processes for each client that it is
-serving. Memory consumption on the child process
-should remain fairly small. Memory consumption on the
-parent process, particularly if the network connection
-to the client is slow, can be expected to grow to
-slightly more than the size of the sources in a single
-directory, or two megabytes, whichever is larger.
-@c "two megabytes" of course is SERVER_HI_WATER. But
-@c we don't mention that here because we are
-@c documenting the default configuration of CVS. If it
-@c is a "standard" thing to change that value, it
-@c should be some kind of run-time configuration.
-@c
-@c See cvsclient.texi for more on the design decision
-@c to not have locks in place while waiting for the
-@c client, which is what results in memory consumption
-@c as high as this.
-
-Multiplying the size of each @sc{cvs} server by the
-number of servers which you expect to have active at
-one time should give an idea of memory requirements for
-the server. For the most part, the memory consumed by
-the parent process probably can be swap space rather
-than physical memory.
-@c Has anyone verified that notion about swap space?
-@c I say it based pretty much on guessing that the
-@c ->text of the struct buffer_data only gets accessed
-@c in a first in, first out fashion, but I haven't
-@c looked very closely.
-
-@c What about disk usage in /tmp on the server? I think that
-@c it can be substantial, but I haven't looked at this
-@c again and tried to figure it out ("cvs import" is
-@c probably the worst case...).
-
-The second area of large memory consumption is
-@code{diff}, when checking in large files. This is
-required even for binary files. The rule of thumb is
-to allow about ten times the size of the largest file
-you will want to check in, although five times may be
-adequate. For example, if you want to check in a file
-which is 10 megabytes, you should have 100 megabytes of
-memory on the machine doing the checkin (the server
-machine for client/server, or the machine running
-@sc{cvs} for non-client/server). This can be swap
-space rather than physical memory. Because the memory
-is only required briefly, there is no particular need
-to allow memory for more than one such checkin at a
-time.
-@c The 5-10 times rule of thumb is from Paul Eggert for
-@c GNU diff. I don't think it is in the GNU diff
-@c manual or anyplace like that.
-@c
-@c Probably we could be saying more about
-@c non-client/server CVS.
-@c I would guess for non-client/server CVS in an NFS
-@c environment the biggest issues are the network and
-@c the NFS server.
-
-Resource consumption for the client is even more
-modest---any machine with enough capacity to run the
-operating system in question should have little
-trouble.
-@c Is that true? I think the client still wants to
-@c (bogusly) store entire files in memory at times.
-
-For information on disk space requirements, see
-@ref{Creating a repository}.
-
-@node Connecting via rsh
-@subsection Connecting with rsh or ssh
-
-@cindex ssh
-@sc{cvs} may use the @samp{ssh} protocol to perform
-these operations, so the remote user host needs to have
-a either an agent like @code{ssh-agent} to hold
-credentials or a @file{.shosts} file which grants
-access to the local user. Note that the program that
-@sc{cvs} uses for this purpose may be specified using
-the @file{--with-ssh} flag to configure.
-
-@cindex rsh
-@sc{cvs} uses the @samp{rsh} protocol to perform these
-operations, so the remote user host needs to have a
-@file{.rhosts} file which grants access to the local
-user. Note that the program that @sc{cvs} uses for this
-purpose may be specified using the @file{--with-rsh}
-flag to configure.
-
-For example, suppose you are the user @samp{mozart} on
-the local machine @samp{toe.example.com}, and the
-server machine is @samp{faun.example.org}. On
-faun, put the following line into the file
-@file{.rhosts} in @samp{bach}'s home directory:
-
-@example
-toe.example.com mozart
-@end example
-
-@noindent
-Then test that @samp{rsh} is working with
-
-@example
-rsh -l bach faun.example.org 'echo $PATH'
-@end example
-
-@noindent
-To test that @samp{ssh} is working use
-
-@example
-ssh -l bach faun.example.org 'echo $PATH'
-@end example
-
-@cindex CVS_SERVER, environment variable
-Next you have to make sure that @code{rsh} will be able
-to find the server. Make sure that the path which
-@code{rsh} printed in the above example includes the
-directory containing a program named @code{cvs} which
-is the server. You need to set the path in
-@file{.bashrc}, @file{.cshrc}, etc., not @file{.login}
-or @file{.profile}. Alternately, you can set the
-environment variable @code{CVS_SERVER} on the client
-machine to the filename of the server you want to use,
-for example @file{/usr/local/bin/cvs-1.6}.
-@c FIXME: there should be a way to specify the
-@c program in CVSROOT, not CVS_SERVER, so that one can use
-@c different ones for different roots. e.g. ":server;cvs=cvs-1.6:"
-@c instead of ":server:".
-
-There is no need to edit @file{inetd.conf} or start a
-@sc{cvs} server daemon.
-
-@cindex :server:, setting up
-@cindex :ext:, setting up
-@cindex :extssh:, setting up
-@cindex Kerberos, using kerberized rsh
-@cindex SSH (rsh replacement)
-@cindex rsh replacements (Kerberized, SSH, &c)
-There are three access methods that you use in @code{CVSROOT}
-for rsh or ssh. @code{:server:} specifies an internal rsh
-client, which is supported only by some @sc{cvs} ports.
-@code{:extssh:} specifies an external ssh program. By
-default this is @code{ssh} (unless otherwise specified
-by the @file{--with-ssh} flag to configure) but you may set the
-@code{CVS_SSH} environment variable to invoke another
-program or wrapper script.
-@code{:ext:} specifies an external rsh program. By
-default this is @code{rsh} (unless otherwise specified
-by the @file{--with-rsh} flag to configure) but you may set the
-@code{CVS_RSH} environment variable to invoke another
-program which can access the remote server (for
-example, @code{remsh} on HP-UX 9 because @code{rsh} is
-something different). It must be a program which can
-transmit data to and from the server without modifying
-it; for example the Windows NT @code{rsh} is not
-suitable since it by default translates between CRLF
-and LF. The OS/2 @sc{cvs} port has a hack to pass @samp{-b}
-to @code{rsh} to get around this, but since this could
-potentially cause problems for programs other than the
-standard @code{rsh}, it may change in the future. If
-you set @code{CVS_RSH} to @code{SSH} or some other rsh
-replacement, the instructions in the rest of this
-section concerning @file{.rhosts} and so on are likely
-to be inapplicable; consult the documentation for your rsh
-replacement.
-@c FIXME: there should be a way to specify the
-@c program in CVSROOT, not CVS_RSH, so that one can use
-@c different ones for different roots. e.g.
-@c ":ext;CVS_RSH=remsh:" instead of ":ext:".
-@c See also the comment in src/client.c for rationale
-@c concerning "rsh" being the default and never
-@c "remsh".
-
-Continuing our example, supposing you want to access
-the module @file{foo} in the repository
-@file{/usr/local/cvsroot/}, on machine
-@file{faun.example.org}, you are ready to go:
-
-@example
-cvs -d :ext:bach@@faun.example.org:/usr/local/cvsroot checkout foo
-@end example
-
-@noindent
-(The @file{bach@@} can be omitted if the username is
-the same on both the local and remote hosts.)
-
-@c Should we mention "rsh host echo hi" and "rsh host
-@c cat" (the latter followed by typing text and ^D)
-@c as troubleshooting techniques? Probably yes
-@c (people tend to have trouble setting this up),
-@c but this kind of thing can be hard to spell out.
-
-@node Password authenticated
-@subsection Direct connection with password authentication
-
-The @sc{cvs} client can also connect to the server
-using a password protocol. This is particularly useful
-if using @code{rsh} is not feasible (for example,
-the server is behind a firewall), and Kerberos also is
-not available.
-
- To use this method, it is necessary to make
-some adjustments on both the server and client sides.
-
-@menu
-* Password authentication server:: Setting up the server
-* Password authentication client:: Using the client
-* Password authentication security:: What this method does and does not do
-@end menu
-
-@node Password authentication server
-@subsubsection Setting up the server for password authentication
-
-First of all, you probably want to tighten the
-permissions on the @file{$CVSROOT} and
-@file{$CVSROOT/CVSROOT} directories. See @ref{Password
-authentication security}, for more details.
-
-@cindex pserver (subcommand)
-@cindex Remote repositories, port specification
-@cindex Repositories, remote, port specification
-@cindex Client/Server Operation, port specification
-@cindex pserver (client/server connection method), port specification
-@cindex kserver (client/server connection method), port specification
-@cindex gserver (client/server connection method), port specification
-@cindex port, specifying for remote repositories
-@cindex Password server, setting up
-@cindex Authenticating server, setting up
-@cindex inetd, configuring for pserver
-@cindex xinetd, configuring for pserver
-@c FIXME: this isn't quite right regarding port
-@c numbers; CVS looks up "cvspserver" in
-@c /etc/services (on unix, but what about non-unix?).
-On the server side, the file @file{/etc/inetd.conf}
-needs to be edited so @code{inetd} knows to run the
-command @code{cvs pserver} when it receives a
-connection on the right port. By default, the port
-number is 2401; it would be different if your client
-were compiled with @code{CVS_AUTH_PORT} defined to
-something else, though. This can also be specified in the CVSROOT variable
-(@pxref{Remote repositories}) or overridden with the CVS_CLIENT_PORT
-environment variable (@pxref{Environment variables}).
-
- If your @code{inetd} allows raw port numbers in
-@file{/etc/inetd.conf}, then the following (all on a
-single line in @file{inetd.conf}) should be sufficient:
-
-@example
-2401 stream tcp nowait root /usr/local/bin/cvs
-cvs -f --allow-root=/usr/cvsroot pserver
-@end example
-
-@noindent
-(You could also use the
-@samp{-T} option to specify a temporary directory.)
-
-The @samp{--allow-root} option specifies the allowable
-@sc{cvsroot} directory. Clients which attempt to use a
-different @sc{cvsroot} directory will not be allowed to
-connect. If there is more than one @sc{cvsroot}
-directory which you want to allow, repeat the option.
-(Unfortunately, many versions of @code{inetd} have very small
-limits on the number of arguments and/or the total length
-of the command. The usual solution to this problem is
-to have @code{inetd} run a shell script which then invokes
-@sc{cvs} with the necessary arguments.)
-
- If your @code{inetd} wants a symbolic service
-name instead of a raw port number, then put this in
-@file{/etc/services}:
-
-@example
-cvspserver 2401/tcp
-@end example
-
-@noindent
-and put @code{cvspserver} instead of @code{2401} in @file{inetd.conf}.
-
-If your system uses @code{xinetd} instead of @code{inetd},
-the procedure is slightly different.
-Create a file called @file{/etc/xinetd.d/cvspserver} containing the following:
-
-@example
-service cvspserver
-@{
- port = 2401
- socket_type = stream
- protocol = tcp
- wait = no
- user = root
- passenv = PATH
- server = /usr/local/bin/cvs
- server_args = -f --allow-root=/usr/cvsroot pserver
-@}
-@end example
-
-@noindent
-(If @code{cvspserver} is defined in @file{/etc/services}, you can omit
-the @code{port} line.)
-
- Once the above is taken care of, restart your
-@code{inetd}, or do whatever is necessary to force it
-to reread its initialization files.
-
-If you are having trouble setting this up, see
-@ref{Connection}.
-
-@cindex CVS passwd file
-@cindex passwd (admin file)
-Because the client stores and transmits passwords in
-cleartext (almost---see @ref{Password authentication
-security}, for details), a separate @sc{cvs} password
-file is generally used, so people don't compromise
-their regular passwords when they access the
-repository. This file is
-@file{$CVSROOT/CVSROOT/passwd} (@pxref{Intro
-administrative files}). It uses a colon-separated
-format, similar to @file{/etc/passwd} on Unix systems,
-except that it has fewer fields: @sc{cvs} username,
-optional password, and an optional system username for
-@sc{cvs} to run as if authentication succeeds. Here is
-an example @file{passwd} file with five entries:
-
-@example
-anonymous:
-bach:ULtgRLXo7NRxs
-spwang:1sOp854gDF3DY
-melissa:tGX1fS8sun6rY:pubcvs
-qproj:XR4EZcEs0szik:pubcvs
-@end example
-
-@noindent
-(The passwords are encrypted according to the standard
-Unix @code{crypt()} function, so it is possible to
-paste in passwords directly from regular Unix
-@file{/etc/passwd} files.)
-
-The first line in the example will grant access to any
-@sc{cvs} client attempting to authenticate as user
-@code{anonymous}, no matter what password they use,
-including an empty password. (This is typical for
-sites granting anonymous read-only access; for
-information on how to do the "read-only" part, see
-@ref{Read-only access}.)
-
-The second and third lines will grant access to
-@code{bach} and @code{spwang} if they supply their
-respective plaintext passwords.
-
-@cindex User aliases
-The fourth line will grant access to @code{melissa}, if
-she supplies the correct password, but her @sc{cvs}
-operations will actually run on the server side under
-the system user @code{pubcvs}. Thus, there need not be
-any system user named @code{melissa}, but there
-@emph{must} be one named @code{pubcvs}.
-
-The fifth line shows that system user identities can be
-shared: any client who successfully authenticates as
-@code{qproj} will actually run as @code{pubcvs}, just
-as @code{melissa} does. That way you could create a
-single, shared system user for each project in your
-repository, and give each developer their own line in
-the @file{$CVSROOT/CVSROOT/passwd} file. The @sc{cvs}
-username on each line would be different, but the
-system username would be the same. The reason to have
-different @sc{cvs} usernames is that @sc{cvs} will log their
-actions under those names: when @code{melissa} commits
-a change to a project, the checkin is recorded in the
-project's history under the name @code{melissa}, not
-@code{pubcvs}. And the reason to have them share a
-system username is so that you can arrange permissions
-in the relevant area of the repository such that only
-that account has write-permission there.
-
-If the system-user field is present, all
-password-authenticated @sc{cvs} commands run as that
-user; if no system user is specified, @sc{cvs} simply
-takes the @sc{cvs} username as the system username and
-runs commands as that user. In either case, if there
-is no such user on the system, then the @sc{cvs}
-operation will fail (regardless of whether the client
-supplied a valid password).
-
-The password and system-user fields can both be omitted
-(and if the system-user field is omitted, then also
-omit the colon that would have separated it from the
-encrypted password). For example, this would be a
-valid @file{$CVSROOT/CVSROOT/passwd} file:
-
-@example
-anonymous::pubcvs
-fish:rKa5jzULzmhOo:kfogel
-sussman:1sOp854gDF3DY
-@end example
-
-@noindent
-When the password field is omitted or empty, then the
-client's authentication attempt will succeed with any
-password, including the empty string. However, the
-colon after the @sc{cvs} username is always necessary,
-even if the password is empty.
-
-@sc{cvs} can also fall back to use system authentication.
-When authenticating a password, the server first checks
-for the user in the @file{$CVSROOT/CVSROOT/passwd}
-file. If it finds the user, it will use that entry for
-authentication as described above. But if it does not
-find the user, or if the @sc{cvs} @file{passwd} file
-does not exist, then the server can try to authenticate
-the username and password using the operating system's
-user-lookup routines (this "fallback" behavior can be
-disabled by setting @code{SystemAuth=no} in the
-@sc{cvs} @file{config} file, @pxref{config}). Be
-aware, however, that falling back to system
-authentication might be a security risk: @sc{cvs}
-operations would then be authenticated with that user's
-regular login password, and the password flies across
-the network in plaintext. See @ref{Password
-authentication security} for more on this.
-
-Right now, the only way to put a password in the
-@sc{cvs} @file{passwd} file is to paste it there from
-somewhere else. Someday, there may be a @code{cvs
-passwd} command.
-
-Unlike many of the files in @file{$CVSROOT/CVSROOT}, it
-is normal to edit the @file{passwd} file in-place,
-rather than via @sc{cvs}. This is because of the
-possible security risks of having the @file{passwd}
-file checked out to people's working copies. If you do
-want to include the @file{passwd} file in checkouts of
-@file{$CVSROOT/CVSROOT}, see @ref{checkoutlist}.
-
-@c We might also suggest using the @code{htpasswd} command
-@c from freely available web servers as well, but that
-@c would open up a can of worms in that the users next
-@c questions are likely to be "where do I get it?" and
-@c "how do I use it?"
-@c Also note that htpasswd, at least the version I had,
-@c likes to clobber the third field.
-
-@node Password authentication client
-@subsubsection Using the client with password authentication
-@cindex Login (subcommand)
-@cindex Password client, using
-@cindex Authenticated client, using
-@cindex :pserver:, setting up
-To run a @sc{cvs} command on a remote repository via
-the password-authenticating server, one specifies the
-@code{pserver} protocol, optional username, repository host, an
-optional port number, and path to the repository. For example:
-
-@example
-cvs -d :pserver:faun.example.org:/usr/local/cvsroot checkout someproj
-@end example
-
-@noindent
-or
-
-@example
-CVSROOT=:pserver:bach@@faun.example.org:2401/usr/local/cvsroot
-cvs checkout someproj
-@end example
-
-However, unless you're connecting to a public-access
-repository (i.e., one where that username doesn't
-require a password), you'll need to supply a password or @dfn{log in} first.
-Logging in verifies your password with the repository and stores it in a file.
-It's done with the @code{login} command, which will
-prompt you interactively for the password if you didn't supply one as part of
-@var{$CVSROOT}:
-
-@example
-cvs -d :pserver:bach@@faun.example.org:/usr/local/cvsroot login
-CVS password:
-@end example
-
-@noindent
-or
-
-@example
-cvs -d :pserver:bach:p4ss30rd@@faun.example.org:/usr/local/cvsroot login
-@end example
-
-After you enter the password, @sc{cvs} verifies it with
-the server. If the verification succeeds, then that
-combination of username, host, repository, and password
-is permanently recorded, so future transactions with
-that repository won't require you to run @code{cvs
-login}. (If verification fails, @sc{cvs} will exit
-complaining that the password was incorrect, and
-nothing will be recorded.)
-
-The records are stored, by default, in the file
-@file{$HOME/.cvspass}. That file's format is
-human-readable, and to a degree human-editable, but
-note that the passwords are not stored in
-cleartext---they are trivially encoded to protect them
-from "innocent" compromise (i.e., inadvertent viewing
-by a system administrator or other non-malicious
-person).
-
-@cindex CVS_PASSFILE, environment variable
-You can change the default location of this file by
-setting the @code{CVS_PASSFILE} environment variable.
-If you use this variable, make sure you set it
-@emph{before} @code{cvs login} is run. If you were to
-set it after running @code{cvs login}, then later
-@sc{cvs} commands would be unable to look up the
-password for transmission to the server.
-
-Once you have logged in, all @sc{cvs} commands using
-that remote repository and username will authenticate
-with the stored password. So, for example
-
-@example
-cvs -d :pserver:bach@@faun.example.org:/usr/local/cvsroot checkout foo
-@end example
-
-@noindent
-should just work (unless the password changes on the
-server side, in which case you'll have to re-run
-@code{cvs login}).
-
-Note that if the @samp{:pserver:} were not present in
-the repository specification, @sc{cvs} would assume it
-should use @code{rsh} to connect with the server
-instead (@pxref{Connecting via rsh}).
-
-Of course, once you have a working copy checked out and
-are running @sc{cvs} commands from within it, there is
-no longer any need to specify the repository
-explicitly, because @sc{cvs} can deduce the repository
-from the working copy's @file{CVS} subdirectory.
-
-@c FIXME: seems to me this needs somewhat more
-@c explanation.
-@cindex Logout (subcommand)
-The password for a given remote repository can be
-removed from the @code{CVS_PASSFILE} by using the
-@code{cvs logout} command.
-
-@node Password authentication security
-@subsubsection Security considerations with password authentication
-
-@cindex Security, of pserver
-The passwords are stored on the client side in a
-trivial encoding of the cleartext, and transmitted in
-the same encoding. The encoding is done only to
-prevent inadvertent password compromises (i.e., a
-system administrator accidentally looking at the file),
-and will not prevent even a naive attacker from gaining
-the password.
-
-@c FIXME: The bit about "access to the repository
-@c implies general access to the system is *not* specific
-@c to pserver; it applies to kerberos and SSH and
-@c everything else too. Should reorganize the
-@c documentation to make this clear.
-The separate @sc{cvs} password file (@pxref{Password
-authentication server}) allows people
-to use a different password for repository access than
-for login access. On the other hand, once a user has
-non-read-only
-access to the repository, she can execute programs on
-the server system through a variety of means. Thus, repository
-access implies fairly broad system access as well. It
-might be possible to modify @sc{cvs} to prevent that,
-but no one has done so as of this writing.
-@c OpenBSD uses chroot() and copies the repository to
-@c provide anonymous read-only access (for details see
-@c http://www.openbsd.org/anoncvs.shar). While this
-@c closes the most obvious holes, I'm not sure it
-@c closes enough holes to recommend it (plus it is
-@c *very* easy to accidentally screw up a setup of this
-@c type).
-
-Note that because the @file{$CVSROOT/CVSROOT} directory
-contains @file{passwd} and other files which are used
-to check security, you must control the permissions on
-this directory as tightly as the permissions on
-@file{/etc}. The same applies to the @file{$CVSROOT}
-directory itself and any directory
-above it in the tree. Anyone who has write access to
-such a directory will have the ability to become any
-user on the system. Note that these permissions are
-typically tighter than you would use if you are not
-using pserver.
-@c TODO: Would be really nice to document/implement a
-@c scheme where the CVS server can run as some non-root
-@c user, e.g. "cvs". CVSROOT/passwd would contain a
-@c bunch of entries of the form foo:xxx:cvs (or the "cvs"
-@c would be implicit). This would greatly reduce
-@c security risks such as those hinted at in the
-@c previous paragraph. I think minor changes to CVS
-@c might be required but mostly this would just need
-@c someone who wants to play with it, document it, &c.
-
-In summary, anyone who gets the password gets
-repository access (which may imply some measure of general system
-access as well). The password is available to anyone
-who can sniff network packets or read a protected
-(i.e., user read-only) file. If you want real
-security, get Kerberos.
-
-@node GSSAPI authenticated
-@subsection Direct connection with GSSAPI
-
-@cindex GSSAPI
-@cindex Security, GSSAPI
-@cindex :gserver:, setting up
-@cindex Kerberos, using :gserver:
-GSSAPI is a generic interface to network security
-systems such as Kerberos 5.
-If you have a working GSSAPI library, you can have
-@sc{cvs} connect via a direct @sc{tcp} connection,
-authenticating with GSSAPI.
-
-To do this, @sc{cvs} needs to be compiled with GSSAPI
-support; when configuring @sc{cvs} it tries to detect
-whether GSSAPI libraries using Kerberos version 5 are
-present. You can also use the @file{--with-gssapi}
-flag to configure.
-
-The connection is authenticated using GSSAPI, but the
-message stream is @emph{not} authenticated by default.
-You must use the @code{-a} global option to request
-stream authentication.
-
-The data transmitted is @emph{not} encrypted by
-default. Encryption support must be compiled into both
-the client and the server; use the
-@file{--enable-encrypt} configure option to turn it on.
-You must then use the @code{-x} global option to
-request encryption.
-
-GSSAPI connections are handled on the server side by
-the same server which handles the password
-authentication server; see @ref{Password authentication
-server}. If you are using a GSSAPI mechanism such as
-Kerberos which provides for strong authentication, you
-will probably want to disable the ability to
-authenticate via cleartext passwords. To do so, create
-an empty @file{CVSROOT/passwd} password file, and set
-@code{SystemAuth=no} in the config file
-(@pxref{config}).
-
-The GSSAPI server uses a principal name of
-cvs/@var{hostname}, where @var{hostname} is the
-canonical name of the server host. You will have to
-set this up as required by your GSSAPI mechanism.
-
-To connect using GSSAPI, use the @samp{:gserver:} method. For
-example,
-
-@example
-cvs -d :gserver:faun.example.org:/usr/local/cvsroot checkout foo
-@end example
-
-@node Kerberos authenticated
-@subsection Direct connection with Kerberos
-
-@cindex Kerberos, using :kserver:
-@cindex Security, Kerberos
-@cindex :kserver:, setting up
-The easiest way to use Kerberos is to use the Kerberos
-@code{rsh}, as described in @ref{Connecting via rsh}.
-The main disadvantage of using rsh is that all the data
-needs to pass through additional programs, so it may be
-slower. So if you have Kerberos installed you can
-connect via a direct @sc{tcp} connection,
-authenticating with Kerberos.
-
-This section concerns the Kerberos network security
-system, version 4. Kerberos version 5 is supported via
-the GSSAPI generic network security interface, as
-described in the previous section.
-
-To do this, @sc{cvs} needs to be compiled with Kerberos
-support; when configuring @sc{cvs} it tries to detect
-whether Kerberos is present or you can use the
-@file{--with-krb4} flag to configure.
-
-The data transmitted is @emph{not} encrypted by
-default. Encryption support must be compiled into both
-the client and server; use the
-@file{--enable-encryption} configure option to turn it
-on. You must then use the @code{-x} global option to
-request encryption.
-
-@cindex CVS_CLIENT_PORT
-You need to edit @file{inetd.conf} on the server
-machine to run @code{cvs kserver}. The client uses
-port 1999 by default; if you want to use another port
-specify it in the @code{CVSROOT} (@pxref{Remote repositories})
-or the @code{CVS_CLIENT_PORT} environment variable
-(@pxref{Environment variables}) on the client.
-
-@cindex kinit
-When you want to use @sc{cvs}, get a ticket in the
-usual way (generally @code{kinit}); it must be a ticket
-which allows you to log into the server machine. Then
-you are ready to go:
-
-@example
-cvs -d :kserver:faun.example.org:/usr/local/cvsroot checkout foo
-@end example
-
-Previous versions of @sc{cvs} would fall back to a
-connection via rsh; this version will not do so.
-
-@node Connecting via fork
-@subsection Connecting with fork
-
-@cindex fork, access method
-@cindex :fork:, setting up
-This access method allows you to connect to a
-repository on your local disk via the remote protocol.
-In other words it does pretty much the same thing as
-@code{:local:}, but various quirks, bugs and the like are
-those of the remote @sc{cvs} rather than the local
-@sc{cvs}.
-
-For day-to-day operations you might prefer either
-@code{:local:} or @code{:fork:}, depending on your
-preferences. Of course @code{:fork:} comes in
-particularly handy in testing or
-debugging @code{cvs} and the remote protocol.
-Specifically, we avoid all of the network-related
-setup/configuration, timeouts, and authentication
-inherent in the other remote access methods but still
-create a connection which uses the remote protocol.
-
-To connect using the @code{fork} method, use
-@samp{:fork:} and the pathname to your local
-repository. For example:
-
-@example
-cvs -d :fork:/usr/local/cvsroot checkout foo
-@end example
-
-@cindex CVS_SERVER, and :fork:
-As with @code{:ext:}, the server is called @samp{cvs}
-by default, or the value of the @code{CVS_SERVER}
-environment variable.
-
-@c ---------------------------------------------------------------------
-@node Read-only access
-@section Read-only repository access
-@cindex Read-only repository access
-@cindex readers (admin file)
-@cindex writers (admin file)
-
- It is possible to grant read-only repository
-access to people using the password-authenticated
-server (@pxref{Password authenticated}). (The
-other access methods do not have explicit support for
-read-only users because those methods all assume login
-access to the repository machine anyway, and therefore
-the user can do whatever local file permissions allow
-her to do.)
-
- A user who has read-only access can do only
-those @sc{cvs} operations which do not modify the
-repository, except for certain ``administrative'' files
-(such as lock files and the history file). It may be
-desirable to use this feature in conjunction with
-user-aliasing (@pxref{Password authentication server}).
-
-Unlike with previous versions of @sc{cvs}, read-only
-users should be able merely to read the repository, and
-not to execute programs on the server or otherwise gain
-unexpected levels of access. Or to be more accurate,
-the @emph{known} holes have been plugged. Because this
-feature is new and has not received a comprehensive
-security audit, you should use whatever level of
-caution seems warranted given your attitude concerning
-security.
-
- There are two ways to specify read-only access
-for a user: by inclusion, and by exclusion.
-
- "Inclusion" means listing that user
-specifically in the @file{$CVSROOT/CVSROOT/readers}
-file, which is simply a newline-separated list of
-users. Here is a sample @file{readers} file:
-
-@example
-melissa
-splotnik
-jrandom
-@end example
-
-@noindent
- (Don't forget the newline after the last user.)
-
- "Exclusion" means explicitly listing everyone
-who has @emph{write} access---if the file
-
-@example
-$CVSROOT/CVSROOT/writers
-@end example
-
-@noindent
-exists, then only
-those users listed in it have write access, and
-everyone else has read-only access (of course, even the
-read-only users still need to be listed in the
-@sc{cvs} @file{passwd} file). The
-@file{writers} file has the same format as the
-@file{readers} file.
-
- Note: if your @sc{cvs} @file{passwd}
-file maps cvs users onto system users (@pxref{Password
-authentication server}), make sure you deny or grant
-read-only access using the @emph{cvs} usernames, not
-the system usernames. That is, the @file{readers} and
-@file{writers} files contain cvs usernames, which may
-or may not be the same as system usernames.
-
- Here is a complete description of the server's
-behavior in deciding whether to grant read-only or
-read-write access:
-
- If @file{readers} exists, and this user is
-listed in it, then she gets read-only access. Or if
-@file{writers} exists, and this user is NOT listed in
-it, then she also gets read-only access (this is true
-even if @file{readers} exists but she is not listed
-there). Otherwise, she gets full read-write access.
-
- Of course there is a conflict if the user is
-listed in both files. This is resolved in the more
-conservative way, it being better to protect the
-repository too much than too little: such a user gets
-read-only access.
-
-@node Server temporary directory
-@section Temporary directories for the server
-@cindex Temporary directories, and server
-@cindex Server, temporary directories
-
-While running, the @sc{cvs} server creates temporary
-directories. They are named
-
-@example
-cvs-serv@var{pid}
-@end example
-
-@noindent
-where @var{pid} is the process identification number of
-the server.
-They are located in the directory specified by
-the @samp{-T} global option (@pxref{Global options}),
-the @code{TMPDIR} environment variable (@pxref{Environment variables}),
-or, failing that, @file{/tmp}.
-
-In most cases the server will remove the temporary
-directory when it is done, whether it finishes normally
-or abnormally. However, there are a few cases in which
-the server does not or cannot remove the temporary
-directory, for example:
-
-@itemize @bullet
-@item
-If the server aborts due to an internal server error,
-it may preserve the directory to aid in debugging
-
-@item
-If the server is killed in a way that it has no way of
-cleaning up (most notably, @samp{kill -KILL} on unix).
-
-@item
-If the system shuts down without an orderly shutdown,
-which tells the server to clean up.
-@end itemize
-
-In cases such as this, you will need to manually remove
-the @file{cvs-serv@var{pid}} directories. As long as
-there is no server running with process identification
-number @var{pid}, it is safe to do so.
-
-@c ---------------------------------------------------------------------
-@node Starting a new project
-@chapter Starting a project with CVS
-@cindex Starting a project with CVS
-@cindex Creating a project
-
-@comment --moduledb--
-Because renaming files and moving them between
-directories is somewhat inconvenient, the first thing
-you do when you start a new project should be to think
-through your file organization. It is not impossible
-to rename or move files, but it does increase the
-potential for confusion and @sc{cvs} does have some
-quirks particularly in the area of renaming
-directories. @xref{Moving files}.
-
-What to do next depends on the situation at hand.
-
-@menu
-* Setting up the files:: Getting the files into the repository
-* Defining the module:: How to make a module of the files
-@end menu
-@c -- File permissions!
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Setting up the files
-@section Setting up the files
-
-The first step is to create the files inside the repository. This can
-be done in a couple of different ways.
-
-@c -- The contributed scripts
-@menu
-* From files:: This method is useful with old projects
- where files already exists.
-* From other version control systems:: Old projects where you want to
- preserve history from another system.
-* From scratch:: Creating a directory tree from scratch.
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node From files
-@subsection Creating a directory tree from a number of files
-@cindex Importing files
-
-When you begin using @sc{cvs}, you will probably already have several
-projects that can be
-put under @sc{cvs} control. In these cases the easiest way is to use the
-@code{import} command. An example is probably the easiest way to
-explain how to use it. If the files you want to install in
-@sc{cvs} reside in @file{@var{wdir}}, and you want them to appear in the
-repository as @file{$CVSROOT/yoyodyne/@var{rdir}}, you can do this:
-
-@example
-$ cd @var{wdir}
-$ cvs import -m "Imported sources" yoyodyne/@var{rdir} yoyo start
-@end example
-
-Unless you supply a log message with the @samp{-m}
-flag, @sc{cvs} starts an editor and prompts for a
-message. The string @samp{yoyo} is a @dfn{vendor tag},
-and @samp{start} is a @dfn{release tag}. They may fill
-no purpose in this context, but since @sc{cvs} requires
-them they must be present. @xref{Tracking sources}, for
-more information about them.
-
-You can now verify that it worked, and remove your
-original source directory.
-@c FIXME: Need to say more about "verify that it
-@c worked". What should the user look for in the output
-@c from "diff -r"?
-
-@example
-$ cd ..
-$ cvs checkout yoyodyne/@var{rdir} # @r{Explanation below}
-$ diff -r @var{wdir} yoyodyne/@var{rdir}
-$ rm -r @var{wdir}
-@end example
-
-@noindent
-Erasing the original sources is a good idea, to make sure that you do
-not accidentally edit them in @var{wdir}, bypassing @sc{cvs}.
-Of course, it would be wise to make sure that you have
-a backup of the sources before you remove them.
-
-The @code{checkout} command can either take a module
-name as argument (as it has done in all previous
-examples) or a path name relative to @code{$CVSROOT},
-as it did in the example above.
-
-It is a good idea to check that the permissions
-@sc{cvs} sets on the directories inside @code{$CVSROOT}
-are reasonable, and that they belong to the proper
-groups. @xref{File permissions}.
-
-If some of the files you want to import are binary, you
-may want to use the wrappers features to specify which
-files are binary and which are not. @xref{Wrappers}.
-
-@c The node name is too long, but I am having trouble
-@c thinking of something more concise.
-@node From other version control systems
-@subsection Creating Files From Other Version Control Systems
-@cindex Importing files, from other version control systems
-
-If you have a project which you are maintaining with
-another version control system, such as @sc{rcs}, you
-may wish to put the files from that project into
-@sc{cvs}, and preserve the revision history of the
-files.
-
-@table @asis
-@cindex RCS, importing files from
-@item From RCS
-If you have been using @sc{rcs}, find the @sc{rcs}
-files---usually a file named @file{foo.c} will have its
-@sc{rcs} file in @file{RCS/foo.c,v} (but it could be
-other places; consult the @sc{rcs} documentation for
-details). Then create the appropriate directories in
-@sc{cvs} if they do not already exist. Then copy the
-files into the appropriate directories in the @sc{cvs}
-repository (the name in the repository must be the name
-of the source file with @samp{,v} added; the files go
-directly in the appropriate directory of the repository,
-not in an @file{RCS} subdirectory). This is one of the
-few times when it is a good idea to access the @sc{cvs}
-repository directly, rather than using @sc{cvs}
-commands. Then you are ready to check out a new
-working directory.
-@c Someday there probably should be a "cvs import -t
-@c rcs" or some such. It could even create magic
-@c branches. It could also do something about the case
-@c where the RCS file had a (non-magic) "0" branch.
-
-The @sc{rcs} file should not be locked when you move it
-into @sc{cvs}; if it is, @sc{cvs} will have trouble
-letting you operate on it.
-@c What is the easiest way to unlock your files if you
-@c have them locked? Especially if you have a lot of them?
-@c This is a CVS bug/misfeature; importing RCS files
-@c should ignore whether they are locked and leave them in
-@c an unlocked state. Yet another reason for a separate
-@c "import RCS file" command.
-
-@c How many is "many"? Or do they just import RCS files?
-@item From another version control system
-Many version control systems have the ability to export
-@sc{rcs} files in the standard format. If yours does,
-export the @sc{rcs} files and then follow the above
-instructions.
-
-Failing that, probably your best bet is to write a
-script that will check out the files one revision at a
-time using the command line interface to the other
-system, and then check the revisions into @sc{cvs}.
-The @file{sccs2rcs} script mentioned below may be a
-useful example to follow.
-
-@cindex SCCS, importing files from
-@item From SCCS
-There is a script in the @file{contrib} directory of
-the @sc{cvs} source distribution called @file{sccs2rcs}
-which converts @sc{sccs} files to @sc{rcs} files.
-Note: you must run it on a machine which has both
-@sc{sccs} and @sc{rcs} installed, and like everything
-else in contrib it is unsupported (your mileage may
-vary).
-
-@cindex PVCS, importing files from
-@item From PVCS
-There is a script in the @file{contrib} directory of
-the @sc{cvs} source distribution called @file{pvcs_to_rcs}
-which converts @sc{pvcs} archives to @sc{rcs} files.
-You must run it on a machine which has both
-@sc{pvcs} and @sc{rcs} installed, and like everything
-else in contrib it is unsupported (your mileage may
-vary). See the comments in the script for details.
-@end table
-@c CMZ and/or PATCHY were systems that were used in the
-@c high energy physics community (especially for
-@c CERNLIB). CERN has replaced them with CVS, but the
-@c CAR format seems to live on as a way to submit
-@c changes. There is a program car2cvs which converts
-@c but I'm not sure where one gets a copy.
-@c Not sure it is worth mentioning here, since it would
-@c appear to affect only one particular community.
-@c Best page for more information is:
-@c http://wwwcn1.cern.ch/asd/cvs/index.html
-@c See also:
-@c http://ecponion.cern.ch/ecpsa/cernlib.html
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node From scratch
-@subsection Creating a directory tree from scratch
-
-@c Also/instead should be documenting
-@c $ cvs co -l .
-@c $ mkdir tc
-@c $ cvs add tc
-@c $ cd tc
-@c $ mkdir man
-@c $ cvs add man
-@c etc.
-@c Using import to create the directories only is
-@c probably a somewhat confusing concept.
-For a new project, the easiest thing to do is probably
-to create an empty directory structure, like this:
-
-@example
-$ mkdir tc
-$ mkdir tc/man
-$ mkdir tc/testing
-@end example
-
-After that, you use the @code{import} command to create
-the corresponding (empty) directory structure inside
-the repository:
-
-@example
-$ cd tc
-$ cvs import -m "Created directory structure" yoyodyne/@var{dir} yoyo start
-@end example
-
-This will add yoyodyne/@var{dir} as a directory under
-@code{$CVSROOT}.
-
-Use @code{checkout} to get the new project. Then, use @code{add}
-to add files (and new directories) as needed.
-
-@example
-$ cd ..
-$ cvs co yoyodyne/@var{dir}
-@end example
-
-Check that the permissions @sc{cvs} sets on the
-directories inside @code{$CVSROOT} are reasonable.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Defining the module
-@section Defining the module
-@cindex Defining a module
-@cindex Editing the modules file
-@cindex Module, defining
-@cindex Modules file, changing
-
-The next step is to define the module in the
-@file{modules} file. This is not strictly necessary,
-but modules can be convenient in grouping together
-related files and directories.
-
-In simple cases these steps are sufficient to define a module.
-
-@enumerate
-@item
-Get a working copy of the modules file.
-
-@example
-$ cvs checkout CVSROOT/modules
-$ cd CVSROOT
-@end example
-
-@item
-Edit the file and insert a line that defines the module. @xref{Intro
-administrative files}, for an introduction. @xref{modules}, for a full
-description of the modules file. You can use the
-following line to define the module @samp{tc}:
-
-@example
-tc yoyodyne/tc
-@end example
-
-@item
-Commit your changes to the modules file.
-
-@example
-$ cvs commit -m "Added the tc module." modules
-@end example
-
-@item
-Release the modules module.
-
-@example
-$ cd ..
-$ cvs release -d CVSROOT
-@end example
-@end enumerate
-
-@c ---------------------------------------------------------------------
-@node Revisions
-@chapter Revisions
-
-For many uses of @sc{cvs}, one doesn't need to worry
-too much about revision numbers; @sc{cvs} assigns
-numbers such as @code{1.1}, @code{1.2}, and so on, and
-that is all one needs to know. However, some people
-prefer to have more knowledge and control concerning
-how @sc{cvs} assigns revision numbers.
-
-If one wants to keep track of a set of revisions
-involving more than one file, such as which revisions
-went into a particular release, one uses a @dfn{tag},
-which is a symbolic revision which can be assigned to a
-numeric revision in each file.
-
-@menu
-* Revision numbers:: The meaning of a revision number
-* Versions revisions releases:: Terminology used in this manual
-* Assigning revisions:: Assigning revisions
-* Tags:: Tags--Symbolic revisions
-* Tagging the working directory:: The cvs tag command
-* Tagging by date/tag:: The cvs rtag command
-* Modifying tags:: Adding, renaming, and deleting tags
-* Tagging add/remove:: Tags with adding and removing files
-* Sticky tags:: Certain tags are persistent
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Revision numbers
-@section Revision numbers
-@cindex Revision numbers
-@cindex Revision tree
-@cindex Linear development
-@cindex Number, revision-
-@cindex Decimal revision number
-@cindex Branch number
-@cindex Number, branch
-
-Each version of a file has a unique @dfn{revision
-number}. Revision numbers look like @samp{1.1},
-@samp{1.2}, @samp{1.3.2.2} or even @samp{1.3.2.2.4.5}.
-A revision number always has an even number of
-period-separated decimal integers. By default revision
-1.1 is the first revision of a file. Each successive
-revision is given a new number by increasing the
-rightmost number by one. The following figure displays
-a few revisions, with newer revisions to the right.
-
-@example
- +-----+ +-----+ +-----+ +-----+ +-----+
- ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
- +-----+ +-----+ +-----+ +-----+ +-----+
-@end example
-
-It is also possible to end up with numbers containing
-more than one period, for example @samp{1.3.2.2}. Such
-revisions represent revisions on branches
-(@pxref{Branching and merging}); such revision numbers
-are explained in detail in @ref{Branches and
-revisions}.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Versions revisions releases
-@section Versions, revisions and releases
-@cindex Revisions, versions and releases
-@cindex Versions, revisions and releases
-@cindex Releases, revisions and versions
-
-A file can have several versions, as described above.
-Likewise, a software product can have several versions.
-A software product is often given a version number such
-as @samp{4.1.1}.
-
-Versions in the first sense are called @dfn{revisions}
-in this document, and versions in the second sense are
-called @dfn{releases}. To avoid confusion, the word
-@dfn{version} is almost never used in this document.
-
-@node Assigning revisions
-@section Assigning revisions
-
-@c We avoid the "major revision" terminology. It seems
-@c like jargon. Hopefully "first number" is clear enough.
-By default, @sc{cvs} will assign numeric revisions by
-leaving the first number the same and incrementing the
-second number. For example, @code{1.1}, @code{1.2},
-@code{1.3}, etc.
-
-When adding a new file, the second number will always
-be one and the first number will equal the highest
-first number of any file in that directory. For
-example, the current directory contains files whose
-highest numbered revisions are @code{1.7}, @code{3.1},
-and @code{4.12}, then an added file will be given the
-numeric revision @code{4.1}.
-(When using client/server @sc{cvs},
-only files that are actually sent to the server are considered.)
-
-@c This is sort of redundant with something we said a
-@c while ago. Somewhere we need a better way of
-@c introducing how the first number can be anything
-@c except "1", perhaps. Also I don't think this
-@c presentation is clear on why we are discussing releases
-@c and first numbers of numeric revisions in the same
-@c breath.
-Normally there is no reason to care
-about the revision numbers---it is easier to treat them
-as internal numbers that @sc{cvs} maintains, and tags
-provide a better way to distinguish between things like
-release 1 versus release 2 of your product
-(@pxref{Tags}). However, if you want to set the
-numeric revisions, the @samp{-r} option to @code{cvs
-commit} can do that. The @samp{-r} option implies the
-@samp{-f} option, in the sense that it causes the
-files to be committed even if they are not modified.
-
-For example, to bring all your files up to
-revision 3.0 (including those that haven't changed),
-you might invoke:
-
-@example
-$ cvs commit -r 3.0
-@end example
-
-Note that the number you specify with @samp{-r} must be
-larger than any existing revision number. That is, if
-revision 3.0 exists, you cannot @samp{cvs commit
--r 1.3}. If you want to maintain several releases in
-parallel, you need to use a branch (@pxref{Branching and merging}).
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Tags
-@section Tags--Symbolic revisions
-@cindex Tags
-
-The revision numbers live a life of their own. They
-need not have anything at all to do with the release
-numbers of your software product. Depending
-on how you use @sc{cvs} the revision numbers might change several times
-between two releases. As an example, some of the
-source files that make up @sc{rcs} 5.6 have the following
-revision numbers:
-@cindex RCS revision numbers
-
-@example
-ci.c 5.21
-co.c 5.9
-ident.c 5.3
-rcs.c 5.12
-rcsbase.h 5.11
-rcsdiff.c 5.10
-rcsedit.c 5.11
-rcsfcmp.c 5.9
-rcsgen.c 5.10
-rcslex.c 5.11
-rcsmap.c 5.2
-rcsutil.c 5.10
-@end example
-
-@cindex tag, command, introduction
-@cindex Tag, symbolic name
-@cindex Symbolic name (tag)
-@cindex Name, symbolic (tag)
-@cindex HEAD, as reserved tag name
-@cindex BASE, as reserved tag name
-You can use the @code{tag} command to give a symbolic name to a
-certain revision of a file. You can use the @samp{-v} flag to the
-@code{status} command to see all tags that a file has, and
-which revision numbers they represent. Tag names must
-start with an uppercase or lowercase letter and can
-contain uppercase and lowercase letters, digits,
-@samp{-}, and @samp{_}. The two tag names @code{BASE}
-and @code{HEAD} are reserved for use by @sc{cvs}. It
-is expected that future names which are special to
-@sc{cvs} will be specially named, for example by
-starting with @samp{.}, rather than being named analogously to
-@code{BASE} and @code{HEAD}, to avoid conflicts with
-actual tag names.
-@c Including a character such as % or = has also been
-@c suggested as the naming convention for future
-@c special tag names. Starting with . is nice because
-@c that is not a legal tag name as far as RCS is concerned.
-@c FIXME: CVS actually accepts quite a few characters
-@c in tag names, not just the ones documented above
-@c (see RCS_check_tag). RCS
-@c defines legitimate tag names by listing illegal
-@c characters rather than legal ones. CVS is said to lose its
-@c mind if you try to use "/" (try making such a tag sticky
-@c and using "cvs status" client/server--see remote
-@c protocol format for entries line for probable cause).
-@c TODO: The testsuite
-@c should test for whatever are documented above as
-@c officially-OK tag names, and CVS should at least reject
-@c characters that won't work, like "/".
-
-You'll want to choose some convention for naming tags,
-based on information such as the name of the program
-and the version number of the release. For example,
-one might take the name of the program, immediately
-followed by the version number with @samp{.} changed to
-@samp{-}, so that @sc{cvs} 1.9 would be tagged with the name
-@code{cvs1-9}. If you choose a consistent convention,
-then you won't constantly be guessing whether a tag is
-@code{cvs-1-9} or @code{cvs1_9} or what. You might
-even want to consider enforcing your convention in the
-@file{taginfo} file (@pxref{taginfo}).
-@c Might be nice to say more about using taginfo this
-@c way, like giving an example, or pointing out any particular
-@c issues which arise.
-
-@cindex Adding a tag
-@cindex Tag, example
-The following example shows how you can add a tag to a
-file. The commands must be issued inside your working
-directory. That is, you should issue the
-command in the directory where @file{backend.c}
-resides.
-
-@example
-$ cvs tag rel-0-4 backend.c
-T backend.c
-$ cvs status -v backend.c
-===================================================================
-File: backend.c Status: Up-to-date
-
- Version: 1.4 Tue Dec 1 14:39:01 1992
- RCS Version: 1.4 /u/cvsroot/yoyodyne/tc/backend.c,v
- Sticky Tag: (none)
- Sticky Date: (none)
- Sticky Options: (none)
-
- Existing Tags:
- rel-0-4 (revision: 1.4)
-
-@end example
-
-For a complete summary of the syntax of @code{cvs tag},
-including the various options, see @ref{Invoking CVS}.
-
-There is seldom reason to tag a file in isolation. A more common use is
-to tag all the files that constitute a module with the same tag at
-strategic points in the development life-cycle, such as when a release
-is made.
-
-@example
-$ cvs tag rel-1-0 .
-cvs tag: Tagging .
-T Makefile
-T backend.c
-T driver.c
-T frontend.c
-T parser.c
-@end example
-
-@noindent
-(When you give @sc{cvs} a directory as argument, it generally applies the
-operation to all the files in that directory, and (recursively), to any
-subdirectories that it may contain. @xref{Recursive behavior}.)
-
-@cindex Retrieving an old revision using tags
-@cindex Tag, retrieving old revisions
-The @code{checkout} command has a flag, @samp{-r}, that lets you check out
-a certain revision of a module. This flag makes it easy to
-retrieve the sources that make up release 1.0 of the module @samp{tc} at
-any time in the future:
-
-@example
-$ cvs checkout -r rel-1-0 tc
-@end example
-
-@noindent
-This is useful, for instance, if someone claims that there is a bug in
-that release, but you cannot find the bug in the current working copy.
-
-You can also check out a module as it was at any given date.
-@xref{checkout options}. When specifying @samp{-r} to
-any of these commands, you will need beware of sticky
-tags; see @ref{Sticky tags}.
-
-When you tag more than one file with the same tag you
-can think about the tag as "a curve drawn through a
-matrix of filename vs.@: revision number." Say we have 5
-files with the following revisions:
-
-@example
-@group
- file1 file2 file3 file4 file5
-
- 1.1 1.1 1.1 1.1 /--1.1* <-*- TAG
- 1.2*- 1.2 1.2 -1.2*-
- 1.3 \- 1.3*- 1.3 / 1.3
- 1.4 \ 1.4 / 1.4
- \-1.5*- 1.5
- 1.6
-@end group
-@end example
-
-At some time in the past, the @code{*} versions were tagged.
-You can think of the tag as a handle attached to the curve
-drawn through the tagged revisions. When you pull on
-the handle, you get all the tagged revisions. Another
-way to look at it is that you "sight" through a set of
-revisions that is "flat" along the tagged revisions,
-like this:
-
-@example
-@group
- file1 file2 file3 file4 file5
-
- 1.1
- 1.2
- 1.1 1.3 _
- 1.1 1.2 1.4 1.1 /
- 1.2*----1.3*----1.5*----1.2*----1.1 (--- <--- Look here
- 1.3 1.6 1.3 \_
- 1.4 1.4
- 1.5
-@end group
-@end example
-
-@node Tagging the working directory
-@section Specifying what to tag from the working directory
-
-@cindex tag (subcommand)
-The example in the previous section demonstrates one of
-the most common ways to choose which revisions to tag.
-Namely, running the @code{cvs tag} command without
-arguments causes @sc{cvs} to select the revisions which
-are checked out in the current working directory. For
-example, if the copy of @file{backend.c} in working
-directory was checked out from revision 1.4, then
-@sc{cvs} will tag revision 1.4. Note that the tag is
-applied immediately to revision 1.4 in the repository;
-tagging is not like modifying a file, or other
-operations in which one first modifies the working
-directory and then runs @code{cvs commit} to transfer
-that modification to the repository.
-
-One potentially surprising aspect of the fact that
-@code{cvs tag} operates on the repository is that you
-are tagging the checked-in revisions, which may differ
-from locally modified files in your working directory.
-If you want to avoid doing this by mistake, specify the
-@samp{-c} option to @code{cvs tag}. If there are any
-locally modified files, @sc{cvs} will abort with an
-error before it tags any files:
-
-@example
-$ cvs tag -c rel-0-4
-cvs tag: backend.c is locally modified
-cvs [tag aborted]: correct the above errors first!
-@end example
-
-@node Tagging by date/tag
-@section Specifying what to tag by date or revision
-@cindex rtag (subcommand)
-
-The @code{cvs rtag} command tags the repository as of a
-certain date or time (or can be used to tag the latest
-revision). @code{rtag} works directly on the
-repository contents (it requires no prior checkout and
-does not look for a working directory).
-
-The following options specify which date or revision to
-tag. See @ref{Common options}, for a complete
-description of them.
-
-@table @code
-@item -D @var{date}
-Tag the most recent revision no later than @var{date}.
-
-@item -f
-Only useful with the @samp{-D @var{date}} or @samp{-r @var{tag}}
-flags. If no matching revision is found, use the most
-recent revision (instead of ignoring the file).
-
-@item -r @var{tag}
-Only tag those files that contain existing tag @var{tag}.
-@end table
-
-The @code{cvs tag} command also allows one to specify
-files by revision or date, using the same @samp{-r},
-@samp{-D}, and @samp{-f} options. However, this
-feature is probably not what you want. The reason is
-that @code{cvs tag} chooses which files to tag based on
-the files that exist in the working directory, rather
-than the files which existed as of the given tag/date.
-Therefore, you are generally better off using @code{cvs
-rtag}. The exceptions might be cases like:
-
-@example
-cvs tag -r 1.4 backend.c
-@end example
-
-@node Modifying tags
-@section Deleting, moving, and renaming tags
-
-@c Also see:
-@c "How do I move or rename a magic branch tag?"
-@c in the FAQ (I think the issues it talks about still
-@c apply, but this could use some sanity.sh work).
-
-Normally one does not modify tags. They exist in order
-to record the history of the repository and so deleting
-them or changing their meaning would, generally, not be
-what you want.
-
-However, there might be cases in which one uses a tag
-temporarily or accidentally puts one in the wrong
-place. Therefore, one might delete, move, or rename a
-tag.
-
-@noindent
-@strong{WARNING: The commands in this section are
-dangerous; they permanently discard historical
-information and it can be difficult or impossible to
-recover from errors. If you are a @sc{cvs}
-administrator, you may consider restricting these
-commands with the @file{taginfo} file (@pxref{taginfo}).}
-
-@cindex Deleting tags
-@cindex Deleting branch tags
-@cindex Removing tags
-@cindex Removing branch tags
-@cindex Tags, deleting
-@cindex Branch tags, deleting
-To delete a tag, specify the @samp{-d} option to either
-@code{cvs tag} or @code{cvs rtag}. For example:
-
-@example
-cvs rtag -d rel-0-4 tc
-@end example
-
-@noindent
-deletes the non-branch tag @code{rel-0-4} from the module @code{tc}.
-In the event that branch tags are encountered within the repository
-with the given name, a warning message will be issued and the branch
-tag will not be deleted. If you are absolutely certain you know what
-you are doing, the @code{-B} option may be specified to allow deletion
-of branch tags. In that case, any non-branch tags encountered will
-trigger warnings and will not be deleted.
-
-@noindent
-@strong{WARNING: Moving branch tags is very dangerous! If you think
-you need the @code{-B} option, think again and ask your @sc{cvs}
-administrator about it (if that isn't you). There is almost certainly
-another way to accomplish what you want to accomplish.}
-
-@cindex Moving tags
-@cindex Moving branch tags
-@cindex Tags, moving
-@cindex Branch tags, moving
-When we say @dfn{move} a tag, we mean to make the same
-name point to different revisions. For example, the
-@code{stable} tag may currently point to revision 1.4
-of @file{backend.c} and perhaps we want to make it
-point to revision 1.6. To move a non-branch tag, specify the
-@samp{-F} option to either @code{cvs tag} or @code{cvs
-rtag}. For example, the task just mentioned might be
-accomplished as:
-
-@example
-cvs tag -r 1.6 -F stable backend.c
-@end example
-
-@noindent
-If any branch tags are encountered in the repository
-with the given name, a warning is issued and the branch
-tag is not disturbed. If you are absolutely certain you
-wish to move the branch tag, the @code{-B} option may be specified.
-In that case, non-branch tags encountered with the given
-name are ignored with a warning message.
-
-@noindent
-@strong{WARNING: Moving branch tags is very dangerous! If you think you
-need the @code{-B} option, think again and ask your @sc{cvs}
-administrator about it (if that isn't you). There is almost certainly
-another way to accomplish what you want to accomplish.}
-
-@cindex Renaming tags
-@cindex Tags, renaming
-When we say @dfn{rename} a tag, we mean to make a
-different name point to the same revisions as the old
-tag. For example, one may have misspelled the tag name
-and want to correct it (hopefully before others are
-relying on the old spelling). To rename a tag, first
-create a new tag using the @samp{-r} option to
-@code{cvs rtag}, and then delete the old name. (Caution:
-this method will not work with branch tags.)
-This leaves the new tag on exactly the
-same files as the old tag. For example:
-
-@example
-cvs rtag -r old-name-0-4 rel-0-4 tc
-cvs rtag -d old-name-0-4 tc
-@end example
-
-@node Tagging add/remove
-@section Tagging and adding and removing files
-
-The subject of exactly how tagging interacts with
-adding and removing files is somewhat obscure; for the
-most part @sc{cvs} will keep track of whether files
-exist or not without too much fussing. By default,
-tags are applied to only files which have a revision
-corresponding to what is being tagged. Files which did
-not exist yet, or which were already removed, simply
-omit the tag, and @sc{cvs} knows to treat the absence
-of a tag as meaning that the file didn't exist as of
-that tag.
-
-However, this can lose a small amount of information.
-For example, suppose a file was added and then removed.
-Then, if the tag is missing for that file, there is no
-way to know whether the tag refers to the time before
-the file was added, or the time after it was removed.
-If you specify the @samp{-r} option to @code{cvs rtag},
-then @sc{cvs} tags the files which have been removed,
-and thereby avoids this problem. For example, one
-might specify @code{-r HEAD} to tag the head.
-
-On the subject of adding and removing files, the
-@code{cvs rtag} command has a @samp{-a} option which
-means to clear the tag from removed files that would
-not otherwise be tagged. For example, one might
-specify this option in conjunction with @samp{-F} when
-moving a tag. If one moved a tag without @samp{-a},
-then the tag in the removed files might still refer to
-the old revision, rather than reflecting the fact that
-the file had been removed. I don't think this is
-necessary if @samp{-r} is specified, as noted above.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Sticky tags
-@section Sticky tags
-@cindex Sticky tags
-@cindex Tags, sticky
-
-@c A somewhat related issue is per-directory sticky
-@c tags (see comment at CVS/Tag in node Working
-@c directory storage); we probably want to say
-@c something like "you can set a sticky tag for only
-@c some files, but you don't want to" or some such.
-
-Sometimes a working copy's revision has extra data
-associated with it, for example it might be on a branch
-(@pxref{Branching and merging}), or restricted to
-versions prior to a certain date by @samp{checkout -D}
-or @samp{update -D}. Because this data persists --
-that is, it applies to subsequent commands in the
-working copy -- we refer to it as @dfn{sticky}.
-
-Most of the time, stickiness is an obscure aspect of
-@sc{cvs} that you don't need to think about. However,
-even if you don't want to use the feature, you may need
-to know @emph{something} about sticky tags (for
-example, how to avoid them!).
-
-You can use the @code{status} command to see if any
-sticky tags or dates are set:
-
-@example
-$ cvs status driver.c
-===================================================================
-File: driver.c Status: Up-to-date
-
- Version: 1.7.2.1 Sat Dec 5 19:35:03 1992
- RCS Version: 1.7.2.1 /u/cvsroot/yoyodyne/tc/driver.c,v
- Sticky Tag: rel-1-0-patches (branch: 1.7.2)
- Sticky Date: (none)
- Sticky Options: (none)
-
-@end example
-
-@cindex Resetting sticky tags
-@cindex Sticky tags, resetting
-@cindex Deleting sticky tags
-The sticky tags will remain on your working files until
-you delete them with @samp{cvs update -A}. The
-@samp{-A} option merges local changes into the version of the
-file from the head of the trunk, removing any sticky tags,
-dates, or options (other than sticky @samp{-k} options on locally
-modified files). See @ref{update} for more on the operation
-of @code{cvs update}.
-
-@cindex Sticky date
-The most common use of sticky tags is to identify which
-branch one is working on, as described in
-@ref{Accessing branches}. However, non-branch
-sticky tags have uses as well. For example,
-suppose that you want to avoid updating your working
-directory, to isolate yourself from possibly
-destabilizing changes other people are making. You
-can, of course, just refrain from running @code{cvs
-update}. But if you want to avoid updating only a
-portion of a larger tree, then sticky tags can help.
-If you check out a certain revision (such as 1.4) it
-will become sticky. Subsequent @code{cvs update}
-commands will
-not retrieve the latest revision until you reset the
-tag with @code{cvs update -A}. Likewise, use of the
-@samp{-D} option to @code{update} or @code{checkout}
-sets a @dfn{sticky date}, which, similarly, causes that
-date to be used for future retrievals.
-
-People often want to retrieve an old version of
-a file without setting a sticky tag. This can
-be done with the @samp{-p} option to @code{checkout} or
-@code{update}, which sends the contents of the file to
-standard output. For example:
-@example
-$ cvs update -p -r 1.1 file1 >file1
-===================================================================
-Checking out file1
-RCS: /tmp/cvs-sanity/cvsroot/first-dir/Attic/file1,v
-VERS: 1.1
-***************
-$
-@end example
-
-However, this isn't the easiest way, if you are asking
-how to undo a previous checkin (in this example, put
-@file{file1} back to the way it was as of revision
-1.1). In that case you are better off using the
-@samp{-j} option to @code{update}; for further
-discussion see @ref{Merging two revisions}.
-
-@c ---------------------------------------------------------------------
-@node Branching and merging
-@chapter Branching and merging
-@cindex Branching
-@cindex Merging
-@cindex Copying changes
-@cindex Main trunk and branches
-@cindex Revision tree, making branches
-@cindex Branches, copying changes between
-@cindex Changes, copying between branches
-@cindex Modifications, copying between branches
-
-@sc{cvs} allows you to isolate changes onto a separate
-line of development, known as a @dfn{branch}. When you
-change files on a branch, those changes do not appear
-on the main trunk or other branches.
-
-Later you can move changes from one branch to another
-branch (or the main trunk) by @dfn{merging}. Merging
-involves first running @code{cvs update -j}, to merge
-the changes into the working directory.
-You can then commit that revision, and thus effectively
-copy the changes onto another branch.
-
-@menu
-* Branches motivation:: What branches are good for
-* Creating a branch:: Creating a branch
-* Accessing branches:: Checking out and updating branches
-* Branches and revisions:: Branches are reflected in revision numbers
-* Magic branch numbers:: Magic branch numbers
-* Merging a branch:: Merging an entire branch
-* Merging more than once:: Merging from a branch several times
-* Merging two revisions:: Merging differences between two revisions
-* Merging adds and removals:: What if files are added or removed?
-* Merging and keywords:: Avoiding conflicts due to keyword substitution
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Branches motivation
-@section What branches are good for
-@cindex Branches motivation
-@cindex What branches are good for
-@cindex Motivation for branches
-
-@c FIXME: this node mentions one way to use branches,
-@c but it is by no means the only way. For example,
-@c the technique of committing a new feature on a branch,
-@c until it is ready for the main trunk. The whole
-@c thing is generally speaking more akin to the
-@c "Revision management" node although it isn't clear to
-@c me whether policy matters should be centralized or
-@c distributed throughout the relevant sections.
-Suppose that release 1.0 of tc has been made. You are continuing to
-develop tc, planning to create release 1.1 in a couple of months. After a
-while your customers start to complain about a fatal bug. You check
-out release 1.0 (@pxref{Tags}) and find the bug
-(which turns out to have a trivial fix). However, the current revision
-of the sources are in a state of flux and are not expected to be stable
-for at least another month. There is no way to make a
-bug fix release based on the newest sources.
-
-The thing to do in a situation like this is to create a @dfn{branch} on
-the revision trees for all the files that make up
-release 1.0 of tc. You can then make
-modifications to the branch without disturbing the main trunk. When the
-modifications are finished you can elect to either incorporate them on
-the main trunk, or leave them on the branch.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Creating a branch
-@section Creating a branch
-@cindex Creating a branch
-@cindex Branch, creating a
-@cindex tag, creating a branch using
-@cindex rtag, creating a branch using
-
-You can create a branch with @code{tag -b}; for
-example, assuming you're in a working copy:
-
-@example
-$ cvs tag -b rel-1-0-patches
-@end example
-
-@c FIXME: we should be more explicit about the value of
-@c having a tag on the branchpoint. For example
-@c "cvs tag rel-1-0-patches-branchpoint" before
-@c the "cvs tag -b". This points out that
-@c rel-1-0-patches is a pretty awkward name for
-@c this example (more so than for the rtag example
-@c below).
-
-This splits off a branch based on the current revisions
-in the working copy, assigning that branch the name
-@samp{rel-1-0-patches}.
-
-It is important to understand that branches get created
-in the repository, not in the working copy. Creating a
-branch based on current revisions, as the above example
-does, will @emph{not} automatically switch the working
-copy to be on the new branch. For information on how
-to do that, see @ref{Accessing branches}.
-
-You can also create a branch without reference to any
-working copy, by using @code{rtag}:
-
-@example
-$ cvs rtag -b -r rel-1-0 rel-1-0-patches tc
-@end example
-
-@samp{-r rel-1-0} says that this branch should be
-rooted at the revision that
-corresponds to the tag @samp{rel-1-0}. It need not
-be the most recent revision -- it's often useful to
-split a branch off an old revision (for example, when
-fixing a bug in a past release otherwise known to be
-stable).
-
-As with @samp{tag}, the @samp{-b} flag tells
-@code{rtag} to create a branch (rather than just a
-symbolic revision name). Note that the numeric
-revision number that matches @samp{rel-1-0} will
-probably be different from file to file.
-
-So, the full effect of the command is to create a new
-branch -- named @samp{rel-1-0-patches} -- in module
-@samp{tc}, rooted in the revision tree at the point tagged
-by @samp{rel-1-0}.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Accessing branches
-@section Accessing branches
-@cindex Check out a branch
-@cindex Retrieve a branch
-@cindex Access a branch
-@cindex Identifying a branch
-@cindex Branch, check out
-@cindex Branch, retrieving
-@cindex Branch, accessing
-@cindex Branch, identifying
-
-You can retrieve a branch in one of two ways: by
-checking it out fresh from the repository, or by
-switching an existing working copy over to the branch.
-
-To check out a branch from the repository, invoke
-@samp{checkout} with the @samp{-r} flag, followed by
-the tag name of the branch (@pxref{Creating a branch}):
-
-@example
-$ cvs checkout -r rel-1-0-patches tc
-@end example
-
-Or, if you already have a working copy, you can switch
-it to a given branch with @samp{update -r}:
-
-@example
-$ cvs update -r rel-1-0-patches tc
-@end example
-
-@noindent
-or equivalently:
-
-@example
-$ cd tc
-$ cvs update -r rel-1-0-patches
-@end example
-
-It does not matter if the working copy was originally
-on the main trunk or on some other branch -- the above
-command will switch it to the named branch. And
-similarly to a regular @samp{update} command,
-@samp{update -r} merges any changes you have made,
-notifying you of conflicts where they occur.
-
-Once you have a working copy tied to a particular
-branch, it remains there until you tell it otherwise.
-This means that changes checked in from the working
-copy will add new revisions on that branch, while
-leaving the main trunk and other branches unaffected.
-
-@cindex Branches, sticky
-To find out what branch a working copy is on, you can
-use the @samp{status} command. In its output, look for
-the field named @samp{Sticky tag} (@pxref{Sticky tags})
--- that's @sc{cvs}'s way of telling you the branch, if
-any, of the current working files:
-
-@example
-$ cvs status -v driver.c backend.c
-===================================================================
-File: driver.c Status: Up-to-date
-
- Version: 1.7 Sat Dec 5 18:25:54 1992
- RCS Version: 1.7 /u/cvsroot/yoyodyne/tc/driver.c,v
- Sticky Tag: rel-1-0-patches (branch: 1.7.2)
- Sticky Date: (none)
- Sticky Options: (none)
-
- Existing Tags:
- rel-1-0-patches (branch: 1.7.2)
- rel-1-0 (revision: 1.7)
-
-===================================================================
-File: backend.c Status: Up-to-date
-
- Version: 1.4 Tue Dec 1 14:39:01 1992
- RCS Version: 1.4 /u/cvsroot/yoyodyne/tc/backend.c,v
- Sticky Tag: rel-1-0-patches (branch: 1.4.2)
- Sticky Date: (none)
- Sticky Options: (none)
-
- Existing Tags:
- rel-1-0-patches (branch: 1.4.2)
- rel-1-0 (revision: 1.4)
- rel-0-4 (revision: 1.4)
-
-@end example
-
-Don't be confused by the fact that the branch numbers
-for each file are different (@samp{1.7.2} and
-@samp{1.4.2} respectively). The branch tag is the
-same, @samp{rel-1-0-patches}, and the files are
-indeed on the same branch. The numbers simply reflect
-the point in each file's revision history at which the
-branch was made. In the above example, one can deduce
-that @samp{driver.c} had been through more changes than
-@samp{backend.c} before this branch was created.
-
-See @ref{Branches and revisions} for details about how
-branch numbers are constructed.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Branches and revisions
-@section Branches and revisions
-@cindex Branch number
-@cindex Number, branch
-@cindex Revision numbers (branches)
-
-Ordinarily, a file's revision history is a linear
-series of increments (@pxref{Revision numbers}):
-
-@example
- +-----+ +-----+ +-----+ +-----+ +-----+
- ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 !
- +-----+ +-----+ +-----+ +-----+ +-----+
-@end example
-
-However, @sc{cvs} is not limited to linear development. The
-@dfn{revision tree} can be split into @dfn{branches},
-where each branch is a self-maintained line of
-development. Changes made on one branch can easily be
-moved back to the main trunk.
-
-Each branch has a @dfn{branch number}, consisting of an
-odd number of period-separated decimal integers. The
-branch number is created by appending an integer to the
-revision number where the corresponding branch forked
-off. Having branch numbers allows more than one branch
-to be forked off from a certain revision.
-
-@need 3500
-All revisions on a branch have revision numbers formed
-by appending an ordinal number to the branch number.
-The following figure illustrates branching with an
-example.
-
-@example
-@c This example used to have a 1.2.2.4 revision, which
-@c might help clarify that development can continue on
-@c 1.2.2. Might be worth reinstating if it can be done
-@c without overfull hboxes.
-@group
- +-------------+
- Branch 1.2.2.3.2 -> ! 1.2.2.3.2.1 !
- / +-------------+
- /
- /
- +---------+ +---------+ +---------+
-Branch 1.2.2 -> _! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !
- / +---------+ +---------+ +---------+
- /
- /
-+-----+ +-----+ +-----+ +-----+ +-----+
-! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- The main trunk
-+-----+ +-----+ +-----+ +-----+ +-----+
- !
- !
- ! +---------+ +---------+ +---------+
-Branch 1.2.4 -> +---! 1.2.4.1 !----! 1.2.4.2 !----! 1.2.4.3 !
- +---------+ +---------+ +---------+
-
-@end group
-@end example
-
-@c -- However, at least for me the figure is not enough. I suggest more
-@c -- text to accompany it. "A picture is worth a thousand words", so you
-@c -- have to make sure the reader notices the couple of hundred words
-@c -- *you* had in mind more than the others!
-
-@c -- Why an even number of segments? This section implies that this is
-@c -- how the main trunk is distinguished from branch roots, but you never
-@c -- explicitly say that this is the purpose of the [by itself rather
-@c -- surprising] restriction to an even number of segments.
-
-The exact details of how the branch number is
-constructed is not something you normally need to be
-concerned about, but here is how it works: When
-@sc{cvs} creates a branch number it picks the first
-unused even integer, starting with 2. So when you want
-to create a branch from revision 6.4 it will be
-numbered 6.4.2. All branch numbers ending in a zero
-(such as 6.4.0) are used internally by @sc{cvs}
-(@pxref{Magic branch numbers}). The branch 1.1.1 has a
-special meaning. @xref{Tracking sources}.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Magic branch numbers
-@section Magic branch numbers
-
-@c Want xref to here from "log"?
-
-This section describes a @sc{cvs} feature called
-@dfn{magic branches}. For most purposes, you need not
-worry about magic branches; @sc{cvs} handles them for
-you. However, they are visible to you in certain
-circumstances, so it may be useful to have some idea of
-how it works.
-
-Externally, branch numbers consist of an odd number of
-dot-separated decimal integers. @xref{Revision
-numbers}. That is not the whole truth, however. For
-efficiency reasons @sc{cvs} sometimes inserts an extra 0
-in the second rightmost position (1.2.4 becomes
-1.2.0.4, 8.9.10.11.12 becomes 8.9.10.11.0.12 and so
-on).
-
-@sc{cvs} does a pretty good job at hiding these so
-called magic branches, but in a few places the hiding
-is incomplete:
-
-@itemize @bullet
-@ignore
-@c This is in ignore as I'm taking their word for it,
-@c that this was fixed
-@c a long time ago. But before deleting this
-@c entirely, I'd rather verify it (and add a test
-@c case to the testsuite).
-@item
-The magic branch can appear in the output from
-@code{cvs status} in vanilla @sc{cvs} 1.3. This is
-fixed in @sc{cvs} 1.3-s2.
-
-@end ignore
-@item
-The magic branch number appears in the output from
-@code{cvs log}.
-@c What output should appear instead?
-
-@item
-You cannot specify a symbolic branch name to @code{cvs
-admin}.
-
-@end itemize
-
-@c Can CVS do this automatically the first time
-@c you check something in to that branch? Should
-@c it?
-You can use the @code{admin} command to reassign a
-symbolic name to a branch the way @sc{rcs} expects it
-to be. If @code{R4patches} is assigned to the branch
-1.4.2 (magic branch number 1.4.0.2) in file
-@file{numbers.c} you can do this:
-
-@example
-$ cvs admin -NR4patches:1.4.2 numbers.c
-@end example
-
-It only works if at least one revision is already
-committed on the branch. Be very careful so that you
-do not assign the tag to the wrong number. (There is
-no way to see how the tag was assigned yesterday).
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Merging a branch
-@section Merging an entire branch
-@cindex Merging a branch
-@cindex -j (merging branches)
-
-You can merge changes made on a branch into your working copy by giving
-the @samp{-j @var{branchname}} flag to the @code{update} subcommand. With one
-@samp{-j @var{branchname}} option it merges the changes made between the
-greatest common ancestor (GCA) of the branch and the destination revision (in
-the simple case below the GCA is the point where the branch forked) and the
-newest revision on that branch into your working copy.
-
-@cindex Join
-The @samp{-j} stands for ``join''.
-
-@cindex Branch merge example
-@cindex Example, branch merge
-@cindex Merge, branch example
-Consider this revision tree:
-
-@example
-+-----+ +-----+ +-----+ +-----+
-! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 ! <- The main trunk
-+-----+ +-----+ +-----+ +-----+
- !
- !
- ! +---------+ +---------+
-Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !
- +---------+ +---------+
-@end example
-
-@noindent
-The branch 1.2.2 has been given the tag (symbolic name) @samp{R1fix}. The
-following example assumes that the module @samp{mod} contains only one
-file, @file{m.c}.
-
-@example
-$ cvs checkout mod # @r{Retrieve the latest revision, 1.4}
-
-$ cvs update -j R1fix m.c # @r{Merge all changes made on the branch,}
- # @r{i.e. the changes between revision 1.2}
- # @r{and 1.2.2.2, into your working copy}
- # @r{of the file.}
-
-$ cvs commit -m "Included R1fix" # @r{Create revision 1.5.}
-@end example
-
-A conflict can result from a merge operation. If that
-happens, you should resolve it before committing the
-new revision. @xref{Conflicts example}.
-
-If your source files contain keywords (@pxref{Keyword substitution}),
-you might be getting more conflicts than strictly necessary. See
-@ref{Merging and keywords}, for information on how to avoid this.
-
-The @code{checkout} command also supports the @samp{-j @var{branchname}} flag. The
-same effect as above could be achieved with this:
-
-@example
-$ cvs checkout -j R1fix mod
-$ cvs commit -m "Included R1fix"
-@end example
-
-It should be noted that @code{update -j @var{tagname}} will also work but may
-not produce the desired result. @xref{Merging adds and removals}, for more.
-
-@node Merging more than once
-@section Merging from a branch several times
-
-Continuing our example, the revision tree now looks
-like this:
-
-@example
-+-----+ +-----+ +-----+ +-----+ +-----+
-! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- The main trunk
-+-----+ +-----+ +-----+ +-----+ +-----+
- ! *
- ! *
- ! +---------+ +---------+
-Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !
- +---------+ +---------+
-@end example
-
-@noindent
-where the starred line represents the merge from the
-@samp{R1fix} branch to the main trunk, as just
-discussed.
-
-Now suppose that development continues on the
-@samp{R1fix} branch:
-
-@example
-+-----+ +-----+ +-----+ +-----+ +-----+
-! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- The main trunk
-+-----+ +-----+ +-----+ +-----+ +-----+
- ! *
- ! *
- ! +---------+ +---------+ +---------+
-Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !
- +---------+ +---------+ +---------+
-@end example
-
-@noindent
-and then you want to merge those new changes onto the
-main trunk. If you just use the @code{cvs update -j
-R1fix m.c} command again, @sc{cvs} will attempt to
-merge again the changes which you have already merged,
-which can have undesirable side effects.
-
-So instead you need to specify that you only want to
-merge the changes on the branch which have not yet been
-merged into the trunk. To do that you specify two
-@samp{-j} options, and @sc{cvs} merges the changes from
-the first revision to the second revision. For
-example, in this case the simplest way would be
-
-@example
-cvs update -j 1.2.2.2 -j R1fix m.c # @r{Merge changes from 1.2.2.2 to the}
- # @r{head of the R1fix branch}
-@end example
-
-The problem with this is that you need to specify the
-1.2.2.2 revision manually. A slightly better approach
-might be to use the date the last merge was done:
-
-@example
-cvs update -j R1fix:yesterday -j R1fix m.c
-@end example
-
-Better yet, tag the R1fix branch after every merge into
-the trunk, and then use that tag for subsequent merges:
-
-@example
-cvs update -j merged_from_R1fix_to_trunk -j R1fix m.c
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Merging two revisions
-@section Merging differences between any two revisions
-@cindex Merging two revisions
-@cindex Revisions, merging differences between
-@cindex Differences, merging
-
-With two @samp{-j @var{revision}} flags, the @code{update}
-(and @code{checkout}) command can merge the differences
-between any two revisions into your working file.
-
-@cindex Undoing a change
-@cindex Removing a change
-@example
-$ cvs update -j 1.5 -j 1.3 backend.c
-@end example
-
-@noindent
-will undo all changes made between revision
-1.3 and 1.5. Note the order of the revisions!
-
-If you try to use this option when operating on
-multiple files, remember that the numeric revisions will
-probably be very different between the various files.
-You almost always use symbolic
-tags rather than revision numbers when operating on
-multiple files.
-
-@cindex Restoring old version of removed file
-@cindex Resurrecting old version of dead file
-Specifying two @samp{-j} options can also undo file
-removals or additions. For example, suppose you have
-a file
-named @file{file1} which existed as revision 1.1, and
-you then removed it (thus adding a dead revision 1.2).
-Now suppose you want to add it again, with the same
-contents it had previously. Here is how to do it:
-
-@example
-$ cvs update -j 1.2 -j 1.1 file1
-U file1
-$ cvs commit -m test
-Checking in file1;
-/tmp/cvs-sanity/cvsroot/first-dir/file1,v <-- file1
-new revision: 1.3; previous revision: 1.2
-done
-$
-@end example
-
-@node Merging adds and removals
-@section Merging can add or remove files
-
-If the changes which you are merging involve removing
-or adding some files, @code{update -j} will reflect
-such additions or removals.
-
-@c FIXME: This example needs a lot more explanation.
-@c We also need other examples for some of the other
-@c cases (not all--there are too many--as long as we present a
-@c coherent general principle).
-For example:
-@example
-cvs update -A
-touch a b c
-cvs add a b c ; cvs ci -m "added" a b c
-cvs tag -b branchtag
-cvs update -r branchtag
-touch d ; cvs add d
-rm a ; cvs rm a
-cvs ci -m "added d, removed a"
-cvs update -A
-cvs update -jbranchtag
-@end example
-
-After these commands are executed and a @samp{cvs commit} is done,
-file @file{a} will be removed and file @file{d} added in the main branch.
-@c (which was determined by trying it)
-
-Note that using a single static tag (@samp{-j @var{tagname}})
-rather than a dynamic tag (@samp{-j @var{branchname}}) to merge
-changes from a branch will usually not remove files which were removed on the
-branch since @sc{cvs} does not automatically add static tags to dead revisions.
-The exception to this rule occurs when
-a static tag has been attached to a dead revision manually. Use the branch tag
-to merge all changes from the branch or use two static tags as merge endpoints
-to be sure that all intended changes are propagated in the merge.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Merging and keywords
-@section Merging and keywords
-@cindex Merging, and keyword substitution
-@cindex Keyword substitution, and merging
-@cindex -j (merging branches), and keyword substitution
-@cindex -kk, to avoid conflicts during a merge
-
-If you merge files containing keywords (@pxref{Keyword
-substitution}), you will normally get numerous
-conflicts during the merge, because the keywords are
-expanded differently in the revisions which you are
-merging.
-
-Therefore, you will often want to specify the
-@samp{-kk} (@pxref{Substitution modes}) switch to the
-merge command line. By substituting just the name of
-the keyword, not the expanded value of that keyword,
-this option ensures that the revisions which you are
-merging will be the same as each other, and avoid
-spurious conflicts.
-
-For example, suppose you have a file like this:
-
-@example
- +---------+
- _! 1.1.2.1 ! <- br1
- / +---------+
- /
- /
-+-----+ +-----+
-! 1.1 !----! 1.2 !
-+-----+ +-----+
-@end example
-
-@noindent
-and your working directory is currently on the trunk
-(revision 1.2). Then you might get the following
-results from a merge:
-
-@example
-$ cat file1
-key $@splitrcskeyword{Revision}: 1.2 $
-. . .
-$ cvs update -j br1
-U file1
-RCS file: /cvsroot/first-dir/file1,v
-retrieving revision 1.1
-retrieving revision 1.1.2.1
-Merging differences between 1.1 and 1.1.2.1 into file1
-rcsmerge: warning: conflicts during merge
-$ cat file1
-@asis{}<<<<<<< file1
-key $@splitrcskeyword{Revision}: 1.2 $
-@asis{}=======
-key $@splitrcskeyword{Revision}: 1.1.2.1 $
-@asis{}>>>>>>> 1.1.2.1
-. . .
-@end example
-
-What happened was that the merge tried to merge the
-differences between 1.1 and 1.1.2.1 into your working
-directory. So, since the keyword changed from
-@code{Revision: 1.1} to @code{Revision: 1.1.2.1},
-@sc{cvs} tried to merge that change into your working
-directory, which conflicted with the fact that your
-working directory had contained @code{Revision: 1.2}.
-
-Here is what happens if you had used @samp{-kk}:
-
-@example
-$ cat file1
-key $@splitrcskeyword{Revision}: 1.2 $
-. . .
-$ cvs update -kk -j br1
-U file1
-RCS file: /cvsroot/first-dir/file1,v
-retrieving revision 1.1
-retrieving revision 1.1.2.1
-Merging differences between 1.1 and 1.1.2.1 into file1
-$ cat file1
-key $@splitrcskeyword{Revision}$
-. . .
-@end example
-
-What is going on here is that revision 1.1 and 1.1.2.1
-both expand as plain @code{Revision}, and therefore
-merging the changes between them into the working
-directory need not change anything. Therefore, there
-is no conflict.
-
-There is, however, one major caveat with using
-@samp{-kk} on merges. Namely, it overrides whatever
-keyword expansion mode @sc{cvs} would normally have
-used. In particular, this is a problem if the mode had
-been @samp{-kb} for a binary file. Therefore, if your
-repository contains binary files, you will need to deal
-with the conflicts rather than using @samp{-kk}.
-
-@ignore
-The following seems rather confusing, possibly buggy,
-and in general, in need of much more thought before it
-is a recommended technique. For one thing, does it
-apply on Windows as well as on Unix?
-
-Unchanged binary files will undergo the same keyword substitution
-but will not be checked in on a subsequent
-@code{cvs commit}. Be aware that binary files containing keyword
-strings which are present in or below the working directory
-will most likely remain corrupt until repaired, however. A simple
-@code{cvs update -A} is sufficient to fix these otherwise unaltered binary files
-if the merge is being done to the main branch but
-this must be done after the merge has been committed or the merge itself
-will be lost.
-
-For Example:
-@example
-cvs update -Akk -jbranchtag
-cvs commit
-cvs update -A
-@end example
-
-@noindent
-will update the current directory from the main trunk of the
-repository, substituting the base keyword strings for keywords,
-and merge changes made on the branch @samp{branchtag} into the new
-work files, performing the same keyword substitution on that file set before
-comparing the two sets. The final @code{cvs update -A} will restore any
-corrupted binary files as well as resetting the sticky @samp{-kk} tags which
-were present on the files in and below the working directory.
-Unfortunately, this doesn't work as well with an arbitrary branch tag, as the
-@samp{-r @var{branchtag}} switch does not reset the sticky @samp{-kk}
-switches attached to the working files as @samp{-A} does. The workaround
-for this is to release the working directory after the merge has been
-committed and check it out again.
-@end ignore
-
-As a result of using @samp{-kk} during the merge, each file examined by the
-update will have @samp{-kk} set as sticky options. Running @code{update -A}
-will clear the sticky options on unmodified files, but it will not clear
-the sticky options on modified files. To get back to the default keyword
-substitution for modified files, you must commit the results of the merge
-and then run @code{update -A}.
-
-@c ---------------------------------------------------------------------
-@node Recursive behavior
-@chapter Recursive behavior
-@cindex Recursive (directory descending)
-@cindex Directory, descending
-@cindex Descending directories
-@cindex Subdirectories
-
-Almost all of the subcommands of @sc{cvs} work
-recursively when you specify a directory as an
-argument. For instance, consider this directory
-structure:
-
-@example
- @code{$HOME}
- |
- +--@t{tc}
- | |
- +--@t{CVS}
- | (internal @sc{cvs} files)
- +--@t{Makefile}
- +--@t{backend.c}
- +--@t{driver.c}
- +--@t{frontend.c}
- +--@t{parser.c}
- +--@t{man}
- | |
- | +--@t{CVS}
- | | (internal @sc{cvs} files)
- | +--@t{tc.1}
- |
- +--@t{testing}
- |
- +--@t{CVS}
- | (internal @sc{cvs} files)
- +--@t{testpgm.t}
- +--@t{test2.t}
-@end example
-
-@noindent
-If @file{tc} is the current working directory, the
-following is true:
-
-@itemize @bullet
-@item
-@samp{cvs update testing} is equivalent to
-
-@example
-cvs update testing/testpgm.t testing/test2.t
-@end example
-
-@item
-@samp{cvs update testing man} updates all files in the
-subdirectories
-
-@item
-@samp{cvs update .} or just @samp{cvs update} updates
-all files in the @code{tc} directory
-@end itemize
-
-If no arguments are given to @code{update} it will
-update all files in the current working directory and
-all its subdirectories. In other words, @file{.} is a
-default argument to @code{update}. This is also true
-for most of the @sc{cvs} subcommands, not only the
-@code{update} command.
-
-The recursive behavior of the @sc{cvs} subcommands can be
-turned off with the @samp{-l} option.
-Conversely, the @samp{-R} option can be used to force recursion if
-@samp{-l} is specified in @file{~/.cvsrc} (@pxref{~/.cvsrc}).
-
-@example
-$ cvs update -l # @r{Don't update files in subdirectories}
-@end example
-
-@c ---------------------------------------------------------------------
-@node Adding and removing
-@chapter Adding, removing, and renaming files and directories
-
-In the course of a project, one will often add new
-files. Likewise with removing or renaming, or with
-directories. The general concept to keep in mind in
-all these cases is that instead of making an
-irreversible change you want @sc{cvs} to record the
-fact that a change has taken place, just as with
-modifying an existing file. The exact mechanisms to do
-this in @sc{cvs} vary depending on the situation.
-
-@menu
-* Adding files:: Adding files
-* Removing files:: Removing files
-* Removing directories:: Removing directories
-* Moving files:: Moving and renaming files
-* Moving directories:: Moving and renaming directories
-@end menu
-
-@node Adding files
-@section Adding files to a directory
-@cindex Adding files
-
-To add a new file to a directory, follow these steps.
-
-@itemize @bullet
-@item
-You must have a working copy of the directory.
-@xref{Getting the source}.
-
-@item
-Create the new file inside your working copy of the directory.
-
-@item
-Use @samp{cvs add @var{filename}} to tell @sc{cvs} that you
-want to version control the file. If the file contains
-binary data, specify @samp{-kb} (@pxref{Binary files}).
-
-@item
-Use @samp{cvs commit @var{filename}} to actually check
-in the file into the repository. Other developers
-cannot see the file until you perform this step.
-@end itemize
-
-You can also use the @code{add} command to add a new
-directory.
-@c FIXCVS and/or FIXME: Adding a directory doesn't
-@c require the commit step. This probably can be
-@c considered a CVS bug, but it is possible we should
-@c warn people since this behavior probably won't be
-@c changing right away.
-
-Unlike most other commands, the @code{add} command is
-not recursive. You have to explicitly name files and
-directories that you wish to add to the repository.
-However, each directory will need to be added
-separately before you will be able to add new files
-to those directories.
-
-@example
-$ mkdir -p foo/bar
-$ cp ~/myfile foo/bar/myfile
-$ cvs add foo foo/bar
-$ cvs add foo/bar/myfile
-@end example
-
-@cindex add (subcommand)
-@deffn Command {cvs add} [@code{-k} kflag] [@code{-m} message] files @dots{}
-
-Schedule @var{files} to be added to the repository.
-The files or directories specified with @code{add} must
-already exist in the current directory. To add a whole
-new directory hierarchy to the source repository (for
-example, files received from a third-party vendor), use
-the @code{import} command instead. @xref{import}.
-
-The added files are not placed in the source repository
-until you use @code{commit} to make the change
-permanent. Doing an @code{add} on a file that was
-removed with the @code{remove} command will undo the
-effect of the @code{remove}, unless a @code{commit}
-command intervened. @xref{Removing files}, for an
-example.
-
-The @samp{-k} option specifies the default way that
-this file will be checked out; for more information see
-@ref{Substitution modes}.
-
-@c As noted in BUGS, -m is broken client/server (Nov
-@c 96). Also see testsuite log2-* tests.
-The @samp{-m} option specifies a description for the
-file. This description appears in the history log (if
-it is enabled, @pxref{history file}). It will also be
-saved in the version history inside the repository when
-the file is committed. The @code{log} command displays
-this description. The description can be changed using
-@samp{admin -t}. @xref{admin}. If you omit the
-@samp{-m @var{description}} flag, an empty string will
-be used. You will not be prompted for a description.
-@end deffn
-
-For example, the following commands add the file
-@file{backend.c} to the repository:
-
-@c This example used to specify
-@c -m "Optimizer and code generation passes."
-@c to the cvs add command, but that doesn't work
-@c client/server (see log2 in sanity.sh). Should fix CVS,
-@c but also seems strange to document things which
-@c don't work...
-@example
-$ cvs add backend.c
-$ cvs commit -m "Early version. Not yet compilable." backend.c
-@end example
-
-When you add a file it is added only on the branch
-which you are working on (@pxref{Branching and merging}). You can
-later merge the additions to another branch if you want
-(@pxref{Merging adds and removals}).
-@c Should we mention that earlier versions of CVS
-@c lacked this feature (1.3) or implemented it in a buggy
-@c way (well, 1.8 had many bugs in cvs update -j)?
-@c Should we mention the bug/limitation regarding a
-@c file being a regular file on one branch and a directory
-@c on another?
-@c FIXME: This needs an example, or several, here or
-@c elsewhere, for it to make much sense.
-@c Somewhere we need to discuss the aspects of death
-@c support which don't involve branching, I guess.
-@c Like the ability to re-create a release from a tag.
-
-@c ---------------------------------------------------------------------
-@node Removing files
-@section Removing files
-@cindex Removing files
-@cindex Deleting files
-
-@c FIXME: this node wants to be split into several
-@c smaller nodes. Could make these children of
-@c "Adding and removing", probably (death support could
-@c be its own section, for example, as could the
-@c various bits about undoing mistakes in adding and
-@c removing).
-Directories change. New files are added, and old files
-disappear. Still, you want to be able to retrieve an
-exact copy of old releases.
-
-Here is what you can do to remove a file,
-but remain able to retrieve old revisions:
-
-@itemize @bullet
-@c FIXME: should probably be saying something about
-@c having a working directory in the first place.
-@item
-Make sure that you have not made any uncommitted
-modifications to the file. @xref{Viewing differences},
-for one way to do that. You can also use the
-@code{status} or @code{update} command. If you remove
-the file without committing your changes, you will of
-course not be able to retrieve the file as it was
-immediately before you deleted it.
-
-@item
-Remove the file from your working copy of the directory.
-You can for instance use @code{rm}.
-
-@item
-Use @samp{cvs remove @var{filename}} to tell @sc{cvs} that
-you really want to delete the file.
-
-@item
-Use @samp{cvs commit @var{filename}} to actually
-perform the removal of the file from the repository.
-@end itemize
-
-@c FIXME: Somehow this should be linked in with a more
-@c general discussion of death support. I don't know
-@c whether we want to use the term "death support" or
-@c not (we can perhaps get by without it), but we do
-@c need to discuss the "dead" state in "cvs log" and
-@c related subjects. The current discussion is
-@c scattered around, and not xref'd to each other.
-@c FIXME: I think this paragraph wants to be moved
-@c later down, at least after the first example.
-When you commit the removal of the file, @sc{cvs}
-records the fact that the file no longer exists. It is
-possible for a file to exist on only some branches and
-not on others, or to re-add another file with the same
-name later. @sc{cvs} will correctly create or not create
-the file, based on the @samp{-r} and @samp{-D} options
-specified to @code{checkout} or @code{update}.
-
-@c FIXME: This style seems to clash with how we
-@c document things in general.
-@cindex Remove (subcommand)
-@deffn Command {cvs remove} [options] files @dots{}
-
-Schedule file(s) to be removed from the repository
-(files which have not already been removed from the
-working directory are not processed). This command
-does not actually remove the file from the repository
-until you commit the removal. For a full list of
-options, see @ref{Invoking CVS}.
-@end deffn
-
-Here is an example of removing several files:
-
-@example
-$ cd test
-$ rm *.c
-$ cvs remove
-cvs remove: Removing .
-cvs remove: scheduling a.c for removal
-cvs remove: scheduling b.c for removal
-cvs remove: use 'cvs commit' to remove these files permanently
-$ cvs ci -m "Removed unneeded files"
-cvs commit: Examining .
-cvs commit: Committing .
-@end example
-
-As a convenience you can remove the file and @code{cvs
-remove} it in one step, by specifying the @samp{-f}
-option. For example, the above example could also be
-done like this:
-
-@example
-$ cd test
-$ cvs remove -f *.c
-cvs remove: scheduling a.c for removal
-cvs remove: scheduling b.c for removal
-cvs remove: use 'cvs commit' to remove these files permanently
-$ cvs ci -m "Removed unneeded files"
-cvs commit: Examining .
-cvs commit: Committing .
-@end example
-
-If you execute @code{remove} for a file, and then
-change your mind before you commit, you can undo the
-@code{remove} with an @code{add} command.
-@ignore
-@c is this worth saying or not? Somehow it seems
-@c confusing to me.
-Of course,
-since you have removed your copy of file in the working
-directory, @sc{cvs} does not necessarily bring back the
-contents of the file from right before you executed
-@code{remove}; instead it gets the file from the
-repository again.
-@end ignore
-
-@c FIXME: what if you change your mind after you commit
-@c it? (answer is also "cvs add" but we don't say that...).
-@c We need some index entries for thinks like "undoing
-@c removal" too.
-
-@example
-$ ls
-CVS ja.h oj.c
-$ rm oj.c
-$ cvs remove oj.c
-cvs remove: scheduling oj.c for removal
-cvs remove: use 'cvs commit' to remove this file permanently
-$ cvs add oj.c
-U oj.c
-cvs add: oj.c, version 1.1.1.1, resurrected
-@end example
-
-If you realize your mistake before you run the
-@code{remove} command you can use @code{update} to
-resurrect the file:
-
-@example
-$ rm oj.c
-$ cvs update oj.c
-cvs update: warning: oj.c was lost
-U oj.c
-@end example
-
-When you remove a file it is removed only on the branch
-which you are working on (@pxref{Branching and merging}). You can
-later merge the removals to another branch if you want
-(@pxref{Merging adds and removals}).
-
-@node Removing directories
-@section Removing directories
-@cindex Removing directories
-@cindex Directories, removing
-
-In concept, removing directories is somewhat similar to
-removing files---you want the directory to not exist in
-your current working directories, but you also want to
-be able to retrieve old releases in which the directory
-existed.
-
-The way that you remove a directory is to remove all
-the files in it. You don't remove the directory
-itself; there is no way to do that.
-Instead you specify the @samp{-P} option to
-@code{cvs update} or @code{cvs checkout},
-which will cause @sc{cvs} to remove empty
-directories from working directories.
-(Note that @code{cvs export} always removes empty directories.)
-Probably the
-best way to do this is to always specify @samp{-P}; if
-you want an empty directory then put a dummy file (for
-example @file{.keepme}) in it to prevent @samp{-P} from
-removing it.
-
-@c I'd try to give a rationale for this, but I'm not
-@c sure there is a particularly convincing one. What
-@c we would _like_ is for CVS to do a better job of version
-@c controlling whether directories exist, to eliminate the
-@c need for -P and so that a file can be a directory in
-@c one revision and a regular file in another.
-Note that @samp{-P} is implied by the @samp{-r} or @samp{-D}
-options of @code{checkout}. This way,
-@sc{cvs} will be able to correctly create the directory
-or not depending on whether the particular version you
-are checking out contains any files in that directory.
-
-@c ---------------------------------------------------------------------
-@node Moving files
-@section Moving and renaming files
-@cindex Moving files
-@cindex Renaming files
-@cindex Files, moving
-
-Moving files to a different directory or renaming them
-is not difficult, but some of the ways in which this
-works may be non-obvious. (Moving or renaming a
-directory is even harder. @xref{Moving directories}.).
-
-The examples below assume that the file @var{old} is renamed to
-@var{new}.
-
-@menu
-* Outside:: The normal way to Rename
-* Inside:: A tricky, alternative way
-* Rename by copying:: Another tricky, alternative way
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Outside
-@subsection The Normal way to Rename
-
-@c More rename issues. Not sure whether these are
-@c worth documenting; I'm putting them here because
-@c it seems to be as good a place as any to try to
-@c set down the issues.
-@c * "cvs annotate" will annotate either the new
-@c file or the old file; it cannot annotate _each
-@c line_ based on whether it was last changed in the
-@c new or old file. Unlike "cvs log", where the
-@c consequences of having to select either the new
-@c or old name seem fairly benign, this may be a
-@c real advantage to having CVS know about renames
-@c other than as a deletion and an addition.
-
-The normal way to move a file is to copy @var{old} to
-@var{new}, and then issue the normal @sc{cvs} commands
-to remove @var{old} from the repository, and add
-@var{new} to it.
-@c The following sentence is not true: one must cd into
-@c the directory to run "cvs add".
-@c (Both @var{old} and @var{new} could
-@c contain relative paths, for example @file{foo/bar.c}).
-
-@example
-$ mv @var{old} @var{new}
-$ cvs remove @var{old}
-$ cvs add @var{new}
-$ cvs commit -m "Renamed @var{old} to @var{new}" @var{old} @var{new}
-@end example
-
-This is the simplest way to move a file, it is not
-error-prone, and it preserves the history of what was
-done. Note that to access the history of the file you
-must specify the old or the new name, depending on what
-portion of the history you are accessing. For example,
-@code{cvs log @var{old}} will give the log up until the
-time of the rename.
-
-When @var{new} is committed its revision numbers will
-start again, usually at 1.1, so if that bothers you,
-use the @samp{-r rev} option to commit. For more
-information see @ref{Assigning revisions}.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Inside
-@subsection Moving the history file
-
-This method is more dangerous, since it involves moving
-files inside the repository. Read this entire section
-before trying it out!
-
-@example
-$ cd $CVSROOT/@var{dir}
-$ mv @var{old},v @var{new},v
-@end example
-
-@noindent
-Advantages:
-
-@itemize @bullet
-@item
-The log of changes is maintained intact.
-
-@item
-The revision numbers are not affected.
-@end itemize
-
-@noindent
-Disadvantages:
-
-@itemize @bullet
-@item
-Old releases cannot easily be fetched from the
-repository. (The file will show up as @var{new} even
-in revisions from the time before it was renamed).
-
-@item
-There is no log information of when the file was renamed.
-
-@item
-Nasty things might happen if someone accesses the history file
-while you are moving it. Make sure no one else runs any of the @sc{cvs}
-commands while you move it.
-@end itemize
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Rename by copying
-@subsection Copying the history file
-
-This way also involves direct modifications to the
-repository. It is safe, but not without drawbacks.
-
-@example
-# @r{Copy the @sc{rcs} file inside the repository}
-$ cd $CVSROOT/@var{dir}
-$ cp @var{old},v @var{new},v
-# @r{Remove the old file}
-$ cd ~/@var{dir}
-$ rm @var{old}
-$ cvs remove @var{old}
-$ cvs commit @var{old}
-# @r{Remove all tags from @var{new}}
-$ cvs update @var{new}
-$ cvs log @var{new} # @r{Remember the non-branch tag names}
-$ cvs tag -d @var{tag1} @var{new}
-$ cvs tag -d @var{tag2} @var{new}
-@dots{}
-@end example
-
-By removing the tags you will be able to check out old
-revisions.
-
-@noindent
-Advantages:
-
-@itemize @bullet
-@item
-@c FIXME: Is this true about -D now that we have death
-@c support? See 5B.3 in the FAQ.
-Checking out old revisions works correctly, as long as
-you use @samp{-r@var{tag}} and not @samp{-D@var{date}}
-to retrieve the revisions.
-
-@item
-The log of changes is maintained intact.
-
-@item
-The revision numbers are not affected.
-@end itemize
-
-@noindent
-Disadvantages:
-
-@itemize @bullet
-@item
-You cannot easily see the history of the file across the rename.
-
-@ignore
-@c Is this true? I don't see how the revision numbers
-@c _could_ start over, when new,v is just old,v with
-@c the tags deleted.
-@c If there is some need to reinstate this text,
-@c it is "usually 1.1", not "1.0" and it needs an
-@c xref to Assigning revisions
-@item
-Unless you use the @samp{-r rev} (@pxref{commit
-options}) flag when @var{new} is committed its revision
-numbers will start at 1.0 again.
-@end ignore
-@end itemize
-
-@c ---------------------------------------------------------------------
-@node Moving directories
-@section Moving and renaming directories
-@cindex Moving directories
-@cindex Renaming directories
-@cindex Directories, moving
-
-The normal way to rename or move a directory is to
-rename or move each file within it as described in
-@ref{Outside}. Then check out with the @samp{-P}
-option, as described in @ref{Removing directories}.
-
-If you really want to hack the repository to rename or
-delete a directory in the repository, you can do it
-like this:
-
-@enumerate
-@item
-Inform everyone who has a checked out copy of the directory that the
-directory will be renamed. They should commit all their changes in all their
-copies of the project containing the directory to be removed, and remove
-all their working copies of said project, before you take the steps below.
-
-@item
-Rename the directory inside the repository.
-
-@example
-$ cd $CVSROOT/@var{parent-dir}
-$ mv @var{old-dir} @var{new-dir}
-@end example
-
-@item
-Fix the @sc{cvs} administrative files, if necessary (for
-instance if you renamed an entire module).
-
-@item
-Tell everyone that they can check out again and continue
-working.
-
-@end enumerate
-
-If someone had a working copy the @sc{cvs} commands will
-cease to work for him, until he removes the directory
-that disappeared inside the repository.
-
-It is almost always better to move the files in the
-directory instead of moving the directory. If you move the
-directory you are unlikely to be able to retrieve old
-releases correctly, since they probably depend on the
-name of the directories.
-
-@c ---------------------------------------------------------------------
-@node History browsing
-@chapter History browsing
-@cindex History browsing
-@cindex Traceability
-@cindex Isolation
-
-@ignore
-@c This is too long for an introduction (goal is
-@c one 20x80 character screen), and also mixes up a
-@c variety of issues (parallel development, history,
-@c maybe even touches on process control).
-
-@c -- @quote{To lose ones history is to lose ones soul.}
-@c -- ///
-@c -- ///Those who cannot remember the past are condemned to repeat it.
-@c -- /// -- George Santayana
-@c -- ///
-
-@sc{cvs} tries to make it easy for a group of people to work
-together. This is done in two ways:
-
-@itemize @bullet
-@item
-Isolation---You have your own working copy of the
-source. You are not affected by modifications made by
-others until you decide to incorporate those changes
-(via the @code{update} command---@pxref{update}).
-
-@item
-Traceability---When something has changed, you can
-always see @emph{exactly} what changed.
-@end itemize
-
-There are several features of @sc{cvs} that together lead
-to traceability:
-
-@itemize @bullet
-@item
-Each revision of a file has an accompanying log
-message.
-
-@item
-All commits are optionally logged to a central history
-database.
-
-@item
-Logging information can be sent to a user-defined
-program (@pxref{loginfo}).
-@end itemize
-
-@c -- More text here.
-
-This chapter should talk about the history file, the
-@code{log} command, the usefulness of ChangeLogs
-even when you run @sc{cvs}, and things like that.
-
-@end ignore
-
-@c kind of lame, in a lot of ways the above text inside
-@c the @ignore motivates this chapter better
-Once you have used @sc{cvs} to store a version control
-history---what files have changed when, how, and by
-whom, there are a variety of mechanisms for looking
-through the history.
-
-@c FIXME: should also be talking about how you look at
-@c old revisions (e.g. "cvs update -p -r 1.2 foo.c").
-@menu
-* log messages:: Log messages
-* history database:: The history database
-* user-defined logging:: User-defined logging
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node log messages
-@section Log messages
-
-@c FIXME: @xref to place where we talk about how to
-@c specify message to commit.
-Whenever you commit a file you specify a log message.
-
-@c FIXME: bring the information here, and get rid of or
-@c greatly shrink the "log" node.
-To look through the log messages which have been
-specified for every revision which has been committed,
-use the @code{cvs log} command (@pxref{log}).
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node history database
-@section The history database
-
-@c FIXME: bring the information from the history file
-@c and history nodes here. Rewrite it to be motivated
-@c better (start out by clearly explaining what gets
-@c logged in history, for example).
-You can use the history file (@pxref{history file}) to
-log various @sc{cvs} actions. To retrieve the
-information from the history file, use the @code{cvs
-history} command (@pxref{history}).
-
-Note: you can control what is logged to this file by using the
-@samp{LogHistory} keyword in the @file{CVSROOT/config} file
-(@pxref{config}).
-
-@c
-@c The history database has many problems:
-@c * It is very unclear what field means what. This
-@c could be improved greatly by better documentation,
-@c but there are still non-orthogonalities (for
-@c example, tag does not record the "repository"
-@c field but most records do).
-@c * Confusion about files, directories, and modules.
-@c Some commands record one, some record others.
-@c * File removal is not logged. There is an 'R'
-@c record type documented, but CVS never uses it.
-@c * Tags are only logged for the "cvs rtag" command,
-@c not "cvs tag". The fix for this is not completely
-@c clear (see above about modules vs. files).
-@c * Are there other cases of operations that are not
-@c logged? One would hope for all changes to the
-@c repository to be logged somehow (particularly
-@c operations like tagging, "cvs admin -k", and other
-@c operations which do not record a history that one
-@c can get with "cvs log"). Operations on the working
-@c directory, like export, get, and release, are a
-@c second category also covered by the current "cvs
-@c history".
-@c * The history file does not record the options given
-@c to a command. The most serious manifestation of
-@c this is perhaps that it doesn't record whether a command
-@c was recursive. It is not clear to me whether one
-@c wants to log at a level very close to the command
-@c line, as a sort of way of logging each command
-@c (more or less), or whether one wants
-@c to log more at the level of what was changed (or
-@c something in between), but either way the current
-@c information has pretty big gaps.
-@c * Further details about a tag--like whether it is a
-@c branch tag or, if a non-branch tag, which branch it
-@c is on. One can find out this information about the
-@c tag as it exists _now_, but if the tag has been
-@c moved, one doesn't know what it was like at the time
-@c the history record was written.
-@c * Whether operating on a particular tag, date, or
-@c options was implicit (sticky) or explicit.
-@c
-@c Another item, only somewhat related to the above, is a
-@c way to control what is logged in the history file.
-@c This is probably the only good way to handle
-@c different people having different ideas about
-@c information/space tradeoffs.
-@c
-@c It isn't really clear that it makes sense to try to
-@c patch up the history file format as it exists now to
-@c include all that stuff. It might be better to
-@c design a whole new CVSROOT/nhistory file and "cvs
-@c nhistory" command, or some such, or in some other
-@c way trying to come up with a clean break from the
-@c past, which can address the above concerns. Another
-@c open question is how/whether this relates to
-@c taginfo/loginfo/etc.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node user-defined logging
-@section User-defined logging
-
-@c FIXME: probably should centralize this information
-@c here, at least to some extent. Maybe by moving the
-@c loginfo, etc., nodes here and replacing
-@c the "user-defined logging" node with one node for
-@c each method.
-You can customize @sc{cvs} to log various kinds of
-actions, in whatever manner you choose. These
-mechanisms operate by executing a script at various
-times. The script might append a message to a file
-listing the information and the programmer who created
-it, or send mail to a group of developers, or, perhaps,
-post a message to a particular newsgroup. To log
-commits, use the @file{loginfo} file (@pxref{loginfo}).
-To log tags, use the @file{taginfo} file (@pxref{taginfo}).
-@c FIXME: What is difference between doing it in the
-@c modules file and using loginfo/taginfo? Why should
-@c user use one or the other?
-To log checkouts, exports, and tags,
-respectively, you can also use the
-@samp{-o}, @samp{-e}, and @samp{-t} options in the
-modules file. For a more flexible way of giving
-notifications to various users, which requires less in
-the way of keeping centralized scripts up to date, use
-the @code{cvs watch add} command (@pxref{Getting
-Notified}); this command is useful even if you are not
-using @code{cvs watch on}.
-
-@c ---------------------------------------------------------------------
-@node Binary files
-@chapter Handling binary files
-@cindex Binary files
-
-The most common use for @sc{cvs} is to store text
-files. With text files, @sc{cvs} can merge revisions,
-display the differences between revisions in a
-human-visible fashion, and other such operations.
-However, if you are willing to give up a few of these
-abilities, @sc{cvs} can store binary files. For
-example, one might store a web site in @sc{cvs}
-including both text files and binary images.
-
-@menu
-* Binary why:: More details on issues with binary files
-* Binary howto:: How to store them
-@end menu
-
-@node Binary why
-@section The issues with binary files
-
-While the need to manage binary files may seem obvious
-if the files that you customarily work with are binary,
-putting them into version control does present some
-additional issues.
-
-One basic function of version control is to show the
-differences between two revisions. For example, if
-someone else checked in a new version of a file, you
-may wish to look at what they changed and determine
-whether their changes are good. For text files,
-@sc{cvs} provides this functionality via the @code{cvs
-diff} command. For binary files, it may be possible to
-extract the two revisions and then compare them with a
-tool external to @sc{cvs} (for example, word processing
-software often has such a feature). If there is no
-such tool, one must track changes via other mechanisms,
-such as urging people to write good log messages, and
-hoping that the changes they actually made were the
-changes that they intended to make.
-
-Another ability of a version control system is the
-ability to merge two revisions. For @sc{cvs} this
-happens in two contexts. The first is when users make
-changes in separate working directories
-(@pxref{Multiple developers}). The second is when one
-merges explicitly with the @samp{update -j} command
-(@pxref{Branching and merging}).
-
-In the case of text
-files, @sc{cvs} can merge changes made independently,
-and signal a conflict if the changes conflict. With
-binary files, the best that @sc{cvs} can do is present
-the two different copies of the file, and leave it to
-the user to resolve the conflict. The user may choose
-one copy or the other, or may run an external merge
-tool which knows about that particular file format, if
-one exists.
-Note that having the user merge relies primarily on the
-user to not accidentally omit some changes, and thus is
-potentially error prone.
-
-If this process is thought to be undesirable, the best
-choice may be to avoid merging. To avoid the merges
-that result from separate working directories, see the
-discussion of reserved checkouts (file locking) in
-@ref{Multiple developers}. To avoid the merges
-resulting from branches, restrict use of branches.
-
-@node Binary howto
-@section How to store binary files
-
-There are two issues with using @sc{cvs} to store
-binary files. The first is that @sc{cvs} by default
-converts line endings between the canonical form in
-which they are stored in the repository (linefeed
-only), and the form appropriate to the operating system
-in use on the client (for example, carriage return
-followed by line feed for Windows NT).
-
-The second is that a binary file might happen to
-contain data which looks like a keyword (@pxref{Keyword
-substitution}), so keyword expansion must be turned
-off.
-
-@c FIXME: the third is that one can't do merges with
-@c binary files. xref to Multiple Developers and the
-@c reserved checkout issues.
-
-The @samp{-kb} option available with some @sc{cvs}
-commands insures that neither line ending conversion
-nor keyword expansion will be done.
-
-Here is an example of how you can create a new file
-using the @samp{-kb} flag:
-
-@example
-$ echo '$@splitrcskeyword{Id}$' > kotest
-$ cvs add -kb -m"A test file" kotest
-$ cvs ci -m"First checkin; contains a keyword" kotest
-@end example
-
-If a file accidentally gets added without @samp{-kb},
-one can use the @code{cvs admin} command to recover.
-For example:
-
-@example
-$ echo '$@splitrcskeyword{Id}$' > kotest
-$ cvs add -m"A test file" kotest
-$ cvs ci -m"First checkin; contains a keyword" kotest
-$ cvs admin -kb kotest
-$ cvs update -A kotest
-# @r{For non-unix systems:}
-# @r{Copy in a good copy of the file from outside CVS}
-$ cvs commit -m "make it binary" kotest
-@end example
-
-@c Trying to describe this for both unix and non-unix
-@c in the same description is very confusing. Might
-@c want to split the two, or just ditch the unix "shortcut"
-@c (unixheads don't do much with binary files, anyway).
-@c This used to say "(Try the above example, and do a
-@c @code{cat kotest} after every command)". But that
-@c only really makes sense for the unix case.
-When you check in the file @file{kotest} the file is
-not preserved as a binary file, because you did not
-check it in as a binary file. The @code{cvs
-admin -kb} command sets the default keyword
-substitution method for this file, but it does not
-alter the working copy of the file that you have. If you need to
-cope with line endings (that is, you are using
-@sc{cvs} on a non-unix system), then you need to
-check in a new copy of the file, as shown by the
-@code{cvs commit} command above.
-On unix, the @code{cvs update -A} command suffices.
-@c FIXME: should also describe what the *other users*
-@c need to do, if they have checked out copies which
-@c have been corrupted by lack of -kb. I think maybe
-@c "cvs update -kb" or "cvs
-@c update -A" would suffice, although the user who
-@c reported this suggested removing the file, manually
-@c removing it from CVS/Entries, and then "cvs update"
-(Note that you can use @code{cvs log} to determine the default keyword
-substitution method for a file and @code{cvs status} to determine
-the keyword substitution method for a working copy.)
-
-However, in using @code{cvs admin -k} to change the
-keyword expansion, be aware that the keyword expansion
-mode is not version controlled. This means that, for
-example, that if you have a text file in old releases,
-and a binary file with the same name in new releases,
-@sc{cvs} provides no way to check out the file in text
-or binary mode depending on what version you are
-checking out. There is no good workaround for this
-problem.
-
-You can also set a default for whether @code{cvs add}
-and @code{cvs import} treat a file as binary based on
-its name; for example you could say that files who
-names end in @samp{.exe} are binary. @xref{Wrappers}.
-There is currently no way to have @sc{cvs} detect
-whether a file is binary based on its contents. The
-main difficulty with designing such a feature is that
-it is not clear how to distinguish between binary and
-non-binary files, and the rules to apply would vary
-considerably with the operating system.
-@c For example, it would be good on MS-DOS-family OSes
-@c for anything containing ^Z to be binary. Having
-@c characters with the 8th bit set imply binary is almost
-@c surely a bad idea in the context of ISO-8859-* and
-@c other such character sets. On VMS or the Mac, we
-@c could use the OS's file typing. This is a
-@c commonly-desired feature, and something of this sort
-@c may make sense. But there are a lot of pitfalls here.
-@c
-@c Another, probably better, way to tell is to read the
-@c file in text mode, write it to a temp file in text
-@c mode, and then do a binary mode compare of the two
-@c files. If they differ, it is a binary file. This
-@c might have problems on VMS (or some other system
-@c with several different text modes), but in general
-@c should be relatively portable. The only other
-@c downside I can think of is that it would be fairly
-@c slow, but that is perhaps a small price to pay for
-@c not having your files corrupted. Another issue is
-@c what happens if you import a text file with bare
-@c linefeeds on Windows. Such files will show up on
-@c Windows sometimes (I think some native windows
-@c programs even write them, on occasion). Perhaps it
-@c is reasonable to treat such files as binary; after
-@c all it is something of a presumption to assume that
-@c the user would want the linefeeds converted to CRLF.
-
-@c ---------------------------------------------------------------------
-@node Multiple developers
-@chapter Multiple developers
-@cindex Multiple developers
-@cindex Team of developers
-@cindex File locking
-@cindex Locking files
-@cindex Working copy
-@cindex Reserved checkouts
-@cindex Unreserved checkouts
-@cindex RCS-style locking
-
-When more than one person works on a software project
-things often get complicated. Often, two people try to
-edit the same file simultaneously. One solution, known
-as @dfn{file locking} or @dfn{reserved checkouts}, is
-to allow only one person to edit each file at a time.
-This is the only solution with some version control
-systems, including @sc{rcs} and @sc{sccs}. Currently
-the usual way to get reserved checkouts with @sc{cvs}
-is the @code{cvs admin -l} command (@pxref{admin
-options}). This is not as nicely integrated into
-@sc{cvs} as the watch features, described below, but it
-seems that most people with a need for reserved
-checkouts find it adequate.
-@c Or "find it better than worrying about implementing
-@c nicely integrated reserved checkouts" or ...?
-It also may be possible to use the watches
-features described below, together with suitable
-procedures (not enforced by software), to avoid having
-two people edit at the same time.
-
-@c Our unreserved checkout model might not
-@c be quite the same as others. For example, I
-@c think that some systems will tend to create a branch
-@c in the case where CVS prints "up-to-date check failed".
-@c It isn't clear to me whether we should try to
-@c explore these subtleties; it could easily just
-@c confuse people.
-The default model with @sc{cvs} is known as
-@dfn{unreserved checkouts}. In this model, developers
-can edit their own @dfn{working copy} of a file
-simultaneously. The first person that commits his
-changes has no automatic way of knowing that another
-has started to edit it. Others will get an error
-message when they try to commit the file. They must
-then use @sc{cvs} commands to bring their working copy
-up to date with the repository revision. This process
-is almost automatic.
-
-@c FIXME? should probably use the word "watch" here, to
-@c tie this into the text below and above.
-@sc{cvs} also supports mechanisms which facilitate
-various kinds of communication, without actually
-enforcing rules like reserved checkouts do.
-
-The rest of this chapter describes how these various
-models work, and some of the issues involved in
-choosing between them.
-
-@ignore
-Here is a draft reserved checkout design or discussion
-of the issues. This seems like as good a place as any
-for this.
-
-Might want a cvs lock/cvs unlock--in which the names
-differ from edit/unedit because the network must be up
-for these to work. unedit gives an error if there is a
-reserved checkout in place (so that people don't
-accidentally leave locks around); unlock gives an error
-if one is not in place (this is more arguable; perhaps
-it should act like unedit in that case).
-
-On the other hand, might want it so that emacs,
-scripts, etc., can get ready to edit a file without
-having to know which model is in use. In that case we
-would have a "cvs watch lock" (or .cvsrc?) (that is,
-three settings, "on", "off", and "lock"). Having cvs
-watch lock set would cause a get to record in the CVS
-directory which model is in use, and cause "cvs edit"
-to change behaviors. We'd want a way to query which
-setting is in effect (this would be handy even if it is
-only "on" or "off" as presently). If lock is in
-effect, then commit would require a lock before
-allowing a checkin; chmod wouldn't suffice (might be
-debatable--see chmod comment below, in watches--but it
-is the way people expect RCS to work and I can't think
-of any significant downside. On the other hand, maybe
-it isn't worth bothering, because people who are used
-to RCS wouldn't think to use chmod anyway).
-
-Implementation: use file attributes or use RCS
-locking. The former avoids more dependence on RCS
-behaviors we will need to re-implement as we librarify
-RCS, and makes it easier to import/export RCS files (in
-that context, want to ignore the locker field). But
-note that RCS locks are per-branch, which is the
-correct behavior (this is also an issue for the "watch
-on" features; they should be per-branch too).
-
-Here are a few more random notes about implementation
-details, assuming "cvs watch lock" and
-
-CVS/Watched file? Or try to fit this into CVS/Entries somehow?
-Cases: (1) file is checked out (unreserved or with watch on) by old
-version of @sc{cvs}, now we do something with new one, (2) file is checked
-out by new version, now we do something with old one.
-
-Remote protocol would have a "Watched" analogous to "Mode". Of course
-it would apply to all Updated-like requests. How do we keep this
-setting up to date? I guess that there wants to be a Watched request,
-and the server would send a new one if it isn't up to date? (Ugh--hard
-to implement and slows down "cvs -q update"--is there an easier way?)
-
-"cvs edit"--checks CVS/Watched, and if watch lock, then sends
-"edit-lock" request. Which comes back with a Checked-in with
-appropriate Watched (off, on, lock, locked, or some such?), or error
-message if already locked.
-
-"cvs commit"--only will commit if off/on/locked. lock is not OK.
-
-Doc:
-note that "cvs edit" must be connected to network if watch lock is in
-effect.
-
-Talk about what to do if someone has locked a file and you want to
-edit that file. (breaking locks, or lack thereof).
-
-
-One other idea (which could work along with the
-existing "cvs admin -l" reserved checkouts, as well as
-the above):
-
-"cvs editors" could show who has the file locked, if
-someone does.
-
-@end ignore
-
-@menu
-* File status:: A file can be in several states
-* Updating a file:: Bringing a file up-to-date
-* Conflicts example:: An informative example
-* Informing others:: To cooperate you must inform
-* Concurrency:: Simultaneous repository access
-* Watches:: Mechanisms to track who is editing files
-* Choosing a model:: Reserved or unreserved checkouts?
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node File status
-@section File status
-@cindex File status
-@cindex Status of a file
-
-@c Shouldn't this start with an example or something,
-@c introducing the unreserved checkout model? Before we
-@c dive into listing states?
-Based on what operations you have performed on a
-checked out file, and what operations others have
-performed to that file in the repository, one can
-classify a file in a number of states. The states, as
-reported by the @code{status} command, are:
-
-@c The order of items is chosen to group logically
-@c similar outputs together.
-@c People who want alphabetical can use the index...
-@table @asis
-@cindex Up-to-date
-@item Up-to-date
-The file is identical with the latest revision in the
-repository for the branch in use.
-@c FIXME: should we clarify "in use"? The answer is
-@c sticky tags, and trying to distinguish branch sticky
-@c tags from non-branch sticky tags seems rather awkward
-@c here.
-@c FIXME: What happens with non-branch sticky tags? Is
-@c a stuck file "Up-to-date" or "Needs checkout" or what?
-
-@item Locally Modified
-@cindex Locally Modified
-You have edited the file, and not yet committed your changes.
-
-@item Locally Added
-@cindex Locally Added
-You have added the file with @code{add}, and not yet
-committed your changes.
-@c There are many cases involving the file being
-@c added/removed/modified in the working directory, and
-@c added/removed/modified in the repository, which we
-@c don't try to describe here. I'm not sure that "cvs
-@c status" produces a non-confusing output in most of
-@c those cases.
-
-@item Locally Removed
-@cindex Locally Removed
-You have removed the file with @code{remove}, and not yet
-committed your changes.
-
-@item Needs Checkout
-@cindex Needs Checkout
-Someone else has committed a newer revision to the
-repository. The name is slightly misleading; you will
-ordinarily use @code{update} rather than
-@code{checkout} to get that newer revision.
-
-@item Needs Patch
-@cindex Needs Patch
-@c See also newb-123j0 in sanity.sh (although that case
-@c should probably be changed rather than documented).
-Like Needs Checkout, but the @sc{cvs} server will send
-a patch rather than the entire file. Sending a patch or
-sending an entire file accomplishes the same thing.
-
-@item Needs Merge
-@cindex Needs Merge
-Someone else has committed a newer revision to the repository, and you
-have also made modifications to the file.
-
-@item Unresolved Conflict
-@cindex Unresolved Conflict
-@c FIXCVS - This file status needs to be changed to some more informative
-@c text that distinguishes it more clearly from each of the Locally Added,
-@c File had conflicts on merge, and Unknown status types, but an exact and
-@c succinct wording escapes me at the moment.
-A file with the same name as this new file has been added to the repository
-from a second workspace. This file will need to be moved out of the way
-to allow an @code{update} to complete.
-
-@item File had conflicts on merge
-@cindex File had conflicts on merge
-@c is it worth saying that this message was "Unresolved
-@c Conflict" in CVS 1.9 and earlier? I'm inclined to
-@c think that is unnecessarily confusing to new users.
-This is like Locally Modified, except that a previous
-@code{update} command gave a conflict. If you have not
-already done so, you need to
-resolve the conflict as described in @ref{Conflicts example}.
-
-@item Unknown
-@cindex Unknown
-@sc{cvs} doesn't know anything about this file. For
-example, you have created a new file and have not run
-@code{add}.
-@c
-@c "Entry Invalid" and "Classify Error" are also in the
-@c status.c. The latter definitely indicates a CVS bug
-@c (should it be worded more like "internal error" so
-@c people submit bug reports if they see it?). The former
-@c I'm not as sure; I haven't tracked down whether/when it
-@c appears in "cvs status" output.
-
-@end table
-
-To help clarify the file status, @code{status} also
-reports the @code{Working revision} which is the
-revision that the file in the working directory derives
-from, and the @code{Repository revision} which is the
-latest revision in the repository for the branch in
-use.
-@c FIXME: should we clarify "in use"? The answer is
-@c sticky tags, and trying to distinguish branch sticky
-@c tags from non-branch sticky tags seems rather awkward
-@c here.
-@c FIXME: What happens with non-branch sticky tags?
-@c What is the Repository Revision there? See the
-@c comment at vn_rcs in cvs.h, which is kind of
-@c confused--we really need to document better what this
-@c field contains.
-@c Q: Should we document "New file!" and other such
-@c outputs or are they self-explanatory?
-@c FIXME: what about the date to the right of "Working
-@c revision"? It doesn't appear with client/server and
-@c seems unnecessary (redundant with "ls -l") so
-@c perhaps it should be removed for non-client/server too?
-@c FIXME: Need some examples.
-@c FIXME: Working revision can also be something like
-@c "-1.3" for a locally removed file. Not at all
-@c self-explanatory (and it is possible that CVS should
-@c be changed rather than documenting this).
-
-@c Would be nice to have an @example showing output
-@c from cvs status, with comments showing the xref
-@c where each part of the output is described. This
-@c might fit in nicely if it is desirable to split this
-@c node in two; one to introduce "cvs status" and one
-@c to list each of the states.
-The options to @code{status} are listed in
-@ref{Invoking CVS}. For information on its @code{Sticky tag}
-and @code{Sticky date} output, see @ref{Sticky tags}.
-For information on its @code{Sticky options} output,
-see the @samp{-k} option in @ref{update options}.
-
-You can think of the @code{status} and @code{update}
-commands as somewhat complementary. You use
-@code{update} to bring your files up to date, and you
-can use @code{status} to give you some idea of what an
-@code{update} would do (of course, the state of the
-repository might change before you actually run
-@code{update}). In fact, if you want a command to
-display file status in a more brief format than is
-displayed by the @code{status} command, you can invoke
-
-@cindex update, to display file status
-@example
-$ cvs -n -q update
-@end example
-
-The @samp{-n} option means to not actually do the
-update, but merely to display statuses; the @samp{-q}
-option avoids printing the name of each directory. For
-more information on the @code{update} command, and
-these options, see @ref{Invoking CVS}.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Updating a file
-@section Bringing a file up to date
-@cindex Bringing a file up to date
-@cindex Updating a file
-@cindex Merging a file
-@cindex Update, introduction
-
-When you want to update or merge a file, use the @code{cvs update -d}
-command. For files that are not up to date this is roughly equivalent
-to a @code{checkout} command: the newest revision of the file is
-extracted from the repository and put in your working directory. The
-@code{-d} option, not necessary with @code{checkout}, tells @sc{cvs}
-that you wish it to create directories added by other developers.
-
-Your modifications to a file are never lost when you
-use @code{update}. If no newer revision exists,
-running @code{update} has no effect. If you have
-edited the file, and a newer revision is available,
-@sc{cvs} will merge all changes into your working copy.
-
-For instance, imagine that you checked out revision 1.4 and started
-editing it. In the meantime someone else committed revision 1.5, and
-shortly after that revision 1.6. If you run @code{update} on the file
-now, @sc{cvs} will incorporate all changes between revision 1.4 and 1.6 into
-your file.
-
-@cindex Overlap
-If any of the changes between 1.4 and 1.6 were made too
-close to any of the changes you have made, an
-@dfn{overlap} occurs. In such cases a warning is
-printed, and the resulting file includes both
-versions of the lines that overlap, delimited by
-special markers.
-@xref{update}, for a complete description of the
-@code{update} command.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Conflicts example
-@section Conflicts example
-@cindex Merge, an example
-@cindex Example of merge
-@cindex driver.c (merge example)
-
-Suppose revision 1.4 of @file{driver.c} contains this:
-
-@example
-#include <stdio.h>
-
-void main()
-@{
- parse();
- if (nerr == 0)
- gencode();
- else
- fprintf(stderr, "No code generated.\n");
- exit(nerr == 0 ? 0 : 1);
-@}
-@end example
-
-@noindent
-Revision 1.6 of @file{driver.c} contains this:
-
-@example
-#include <stdio.h>
-
-int main(int argc,
- char **argv)
-@{
- parse();
- if (argc != 1)
- @{
- fprintf(stderr, "tc: No args expected.\n");
- exit(1);
- @}
- if (nerr == 0)
- gencode();
- else
- fprintf(stderr, "No code generated.\n");
- exit(!!nerr);
-@}
-@end example
-
-@noindent
-Your working copy of @file{driver.c}, based on revision
-1.4, contains this before you run @samp{cvs update}:
-@c -- Really include "cvs"?
-
-@example
-#include <stdlib.h>
-#include <stdio.h>
-
-void main()
-@{
- init_scanner();
- parse();
- if (nerr == 0)
- gencode();
- else
- fprintf(stderr, "No code generated.\n");
- exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
-@}
-@end example
-
-@noindent
-You run @samp{cvs update}:
-@c -- Really include "cvs"?
-
-@example
-$ cvs update driver.c
-RCS file: /usr/local/cvsroot/yoyodyne/tc/driver.c,v
-retrieving revision 1.4
-retrieving revision 1.6
-Merging differences between 1.4 and 1.6 into driver.c
-rcsmerge warning: overlaps during merge
-cvs update: conflicts found in driver.c
-C driver.c
-@end example
-
-@noindent
-@cindex Conflicts (merge example)
-@sc{cvs} tells you that there were some conflicts.
-Your original working file is saved unmodified in
-@file{.#driver.c.1.4}. The new version of
-@file{driver.c} contains this:
-
-@example
-#include <stdlib.h>
-#include <stdio.h>
-
-int main(int argc,
- char **argv)
-@{
- init_scanner();
- parse();
- if (argc != 1)
- @{
- fprintf(stderr, "tc: No args expected.\n");
- exit(1);
- @}
- if (nerr == 0)
- gencode();
- else
- fprintf(stderr, "No code generated.\n");
-@asis{}<<<<<<< driver.c
- exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
-@asis{}=======
- exit(!!nerr);
-@asis{}>>>>>>> 1.6
-@}
-@end example
-
-@noindent
-@cindex Markers, conflict
-@cindex Conflict markers
-@cindex <<<<<<<
-@cindex >>>>>>>
-@cindex =======
-
-Note how all non-overlapping modifications are incorporated in your working
-copy, and that the overlapping section is clearly marked with
-@samp{<<<<<<<}, @samp{=======} and @samp{>>>>>>>}.
-
-@cindex Resolving a conflict
-@cindex Conflict resolution
-You resolve the conflict by editing the file, removing the markers and
-the erroneous line. Suppose you end up with this file:
-@c -- Add xref to the pcl-cvs manual when it talks
-@c -- about this.
-@example
-#include <stdlib.h>
-#include <stdio.h>
-
-int main(int argc,
- char **argv)
-@{
- init_scanner();
- parse();
- if (argc != 1)
- @{
- fprintf(stderr, "tc: No args expected.\n");
- exit(1);
- @}
- if (nerr == 0)
- gencode();
- else
- fprintf(stderr, "No code generated.\n");
- exit(nerr == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
-@}
-@end example
-
-@noindent
-You can now go ahead and commit this as revision 1.7.
-
-@example
-$ cvs commit -m "Initialize scanner. Use symbolic exit values." driver.c
-Checking in driver.c;
-/usr/local/cvsroot/yoyodyne/tc/driver.c,v <-- driver.c
-new revision: 1.7; previous revision: 1.6
-done
-@end example
-
-For your protection, @sc{cvs} will refuse to check in a
-file if a conflict occurred and you have not resolved
-the conflict. Currently to resolve a conflict, you
-must change the timestamp on the file. In previous
-versions of @sc{cvs}, you also needed to
-insure that the file contains no conflict markers.
-Because
-your file may legitimately contain conflict markers (that
-is, occurrences of @samp{>>>>>>> } at the start of a
-line that don't mark a conflict), the current
-version of @sc{cvs} will print a warning and proceed to
-check in the file.
-@c The old behavior was really icky; the only way out
-@c was to start hacking on
-@c the @code{CVS/Entries} file or other such workarounds.
-@c
-@c If the timestamp thing isn't considered nice enough,
-@c maybe there should be a "cvs resolved" command
-@c which clears the conflict indication. For a nice user
-@c interface, this should be invoked by an interactive
-@c merge tool like emerge rather than by the user
-@c directly--such a tool can verify that the user has
-@c really dealt with each conflict.
-
-@cindex emerge
-If you use release 1.04 or later of pcl-cvs (a @sc{gnu}
-Emacs front-end for @sc{cvs}) you can use an Emacs
-package called emerge to help you resolve conflicts.
-See the documentation for pcl-cvs.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Informing others
-@section Informing others about commits
-@cindex Informing others
-@cindex Spreading information
-@cindex Mail, automatic mail on commit
-
-It is often useful to inform others when you commit a
-new revision of a file. The @file{loginfo} file can be
-used to automate this process.
-@xref{loginfo}. You can use these features of @sc{cvs}
-to, for instance, instruct @sc{cvs} to mail a
-message to all developers, or post a message to a local
-newsgroup.
-@c -- More text would be nice here.
-
-@node Concurrency
-@section Several developers simultaneously attempting to run CVS
-
-@cindex Locks, cvs, introduction
-@c For a discussion of *why* CVS creates locks, see
-@c the comment at the start of src/lock.c
-If several developers try to run @sc{cvs} at the same
-time, one may get the following message:
-
-@example
-[11:43:23] waiting for bach's lock in /usr/local/cvsroot/foo
-@end example
-
-@cindex #cvs.rfl, removing
-@cindex #cvs.wfl, removing
-@cindex #cvs.lock, removing
-@sc{cvs} will try again every 30 seconds, and either
-continue with the operation or print the message again,
-if it still needs to wait. If a lock seems to stick
-around for an undue amount of time, find the person
-holding the lock and ask them about the cvs command
-they are running. If they aren't running a cvs
-command, look in the repository directory mentioned in
-the message and remove files which they own whose names
-start with @file{#cvs.rfl},
-@file{#cvs.wfl}, or @file{#cvs.lock}.
-
-Note that these locks are to protect @sc{cvs}'s
-internal data structures and have no relationship to
-the word @dfn{lock} in the sense used by
-@sc{rcs}---which refers to reserved checkouts
-(@pxref{Multiple developers}).
-
-Any number of people can be reading from a given
-repository at a time; only when someone is writing do
-the locks prevent other people from reading or writing.
-
-@cindex Atomic transactions, lack of
-@cindex Transactions, atomic, lack of
-@c the following talks about what one might call commit/update
-@c atomicity.
-@c Probably also should say something about
-@c commit/commit atomicity, that is, "An update will
-@c not get partial versions of more than one commit".
-@c CVS currently has this property and I guess we can
-@c make it a documented feature.
-@c For example one person commits
-@c a/one.c and b/four.c and another commits a/two.c and
-@c b/three.c. Then an update cannot get the new a/one.c
-@c and a/two.c and the old b/four.c and b/three.c.
-One might hope for the following property:
-
-@quotation
-If someone commits some changes in one cvs command,
-then an update by someone else will either get all the
-changes, or none of them.
-@end quotation
-
-@noindent
-but @sc{cvs} does @emph{not} have this property. For
-example, given the files
-
-@example
-a/one.c
-a/two.c
-b/three.c
-b/four.c
-@end example
-
-@noindent
-if someone runs
-
-@example
-cvs ci a/two.c b/three.c
-@end example
-
-@noindent
-and someone else runs @code{cvs update} at the same
-time, the person running @code{update} might get only
-the change to @file{b/three.c} and not the change to
-@file{a/two.c}.
-
-@node Watches
-@section Mechanisms to track who is editing files
-@cindex Watches
-
-For many groups, use of @sc{cvs} in its default mode is
-perfectly satisfactory. Users may sometimes go to
-check in a modification only to find that another
-modification has intervened, but they deal with it and
-proceed with their check in. Other groups prefer to be
-able to know who is editing what files, so that if two
-people try to edit the same file they can choose to
-talk about who is doing what when rather than be
-surprised at check in time. The features in this
-section allow such coordination, while retaining the
-ability of two developers to edit the same file at the
-same time.
-
-@c Some people might ask why CVS does not enforce the
-@c rule on chmod, by requiring a cvs edit before a cvs
-@c commit. The main reason is that it could always be
-@c circumvented--one could edit the file, and
-@c then when ready to check it in, do the cvs edit and put
-@c in the new contents and do the cvs commit. One
-@c implementation note: if we _do_ want to have cvs commit
-@c require a cvs edit, we should store the state on
-@c whether the cvs edit has occurred in the working
-@c directory, rather than having the server try to keep
-@c track of what working directories exist.
-@c FIXME: should the above discussion be part of the
-@c manual proper, somewhere, not just in a comment?
-For maximum benefit developers should use @code{cvs
-edit} (not @code{chmod}) to make files read-write to
-edit them, and @code{cvs release} (not @code{rm}) to
-discard a working directory which is no longer in use,
-but @sc{cvs} is not able to enforce this behavior.
-
-@c I'm a little dissatisfied with this presentation,
-@c because "watch on"/"edit"/"editors" are one set of
-@c functionality, and "watch add"/"watchers" is another
-@c which is somewhat orthogonal even though they interact in
-@c various ways. But I think it might be
-@c confusing to describe them separately (e.g. "watch
-@c add" with loginfo). I don't know.
-
-@menu
-* Setting a watch:: Telling CVS to watch certain files
-* Getting Notified:: Telling CVS to notify you
-* Editing files:: How to edit a file which is being watched
-* Watch information:: Information about who is watching and editing
-* Watches Compatibility:: Watches interact poorly with CVS 1.6 or earlier
-@end menu
-
-@node Setting a watch
-@subsection Telling CVS to watch certain files
-
-To enable the watch features, you first specify that
-certain files are to be watched.
-
-@cindex watch on (subcommand)
-@deffn Command {cvs watch on} [@code{-lR}] [@var{files}]@dots{}
-
-@cindex Read-only files, and watches
-Specify that developers should run @code{cvs edit}
-before editing @var{files}. @sc{cvs} will create working
-copies of @var{files} read-only, to remind developers
-to run the @code{cvs edit} command before working on
-them.
-
-If @var{files} includes the name of a directory, @sc{cvs}
-arranges to watch all files added to the corresponding
-repository directory, and sets a default for files
-added in the future; this allows the user to set
-notification policies on a per-directory basis. The
-contents of the directory are processed recursively,
-unless the @code{-l} option is given.
-The @code{-R} option can be used to force recursion if the @code{-l}
-option is set in @file{~/.cvsrc} (@pxref{~/.cvsrc}).
-
-If @var{files} is omitted, it defaults to the current directory.
-
-@cindex watch off (subcommand)
-@end deffn
-
-@deffn Command {cvs watch off} [@code{-lR}] [@var{files}]@dots{}
-
-Do not create @var{files} read-only on checkout; thus,
-developers will not be reminded to use @code{cvs edit}
-and @code{cvs unedit}.
-@ignore
-@sc{cvs} will check out @var{files}
-read-write as usual, unless other permissions override
-due to the @code{PreservePermissions} option being
-enabled in the @file{config} administrative file
-(@pxref{Special Files}, @pxref{config})
-@end ignore
-
-The @var{files} and options are processed as for @code{cvs
-watch on}.
-
-@end deffn
-
-@node Getting Notified
-@subsection Telling CVS to notify you
-
-You can tell @sc{cvs} that you want to receive
-notifications about various actions taken on a file.
-You can do this without using @code{cvs watch on} for
-the file, but generally you will want to use @code{cvs
-watch on}, to remind developers to use the @code{cvs edit}
-command.
-
-@cindex watch add (subcommand)
-@deffn Command {cvs watch add} [@code{-lR}] [@code{-a} @var{action}]@dots{} [@var{files}]@dots{}
-
-Add the current user to the list of people to receive notification of
-work done on @var{files}.
-
-The @code{-a} option specifies what kinds of events @sc{cvs} should notify
-the user about. @var{action} is one of the following:
-
-@table @code
-
-@item edit
-Another user has applied the @code{cvs edit} command (described
-below) to a watched file.
-
-@item commit
-Another user has committed changes to one of the named @var{files}.
-
-@item unedit
-Another user has abandoned editing a file (other than by committing changes).
-They can do this in several ways, by:
-
-@itemize @bullet
-
-@item
-applying the @code{cvs unedit} command (described below) to the file
-
-@item
-applying the @code{cvs release} command (@pxref{release}) to the file's parent directory
-(or recursively to a directory more than one level up)
-
-@item
-deleting the file and allowing @code{cvs update} to recreate it
-
-@end itemize
-
-@item all
-All of the above.
-
-@item none
-None of the above. (This is useful with @code{cvs edit},
-described below.)
-
-@end table
-
-The @code{-a} option may appear more than once, or not at all. If
-omitted, the action defaults to @code{all}.
-
-The @var{files} and options are processed as for
-@code{cvs watch on}.
-
-@end deffn
-
-
-@cindex watch remove (subcommand)
-@deffn Command {cvs watch remove} [@code{-lR}] [@code{-a} @var{action}]@dots{} [@var{files}]@dots{}
-
-Remove a notification request established using @code{cvs watch add};
-the arguments are the same. If the @code{-a} option is present, only
-watches for the specified actions are removed.
-
-@end deffn
-
-@cindex notify (admin file)
-When the conditions exist for notification, @sc{cvs}
-calls the @file{notify} administrative file. Edit
-@file{notify} as one edits the other administrative
-files (@pxref{Intro administrative files}). This
-file follows the usual conventions for administrative
-files (@pxref{syntax}), where each line is a regular
-expression followed by a command to execute. The
-command should contain a single occurrence of @samp{%s}
-which will be replaced by the user to notify; the rest
-of the information regarding the notification will be
-supplied to the command on standard input. The
-standard thing to put in the @code{notify} file is the
-single line:
-
-@example
-ALL mail %s -s "CVS notification"
-@end example
-
-@noindent
-This causes users to be notified by electronic mail.
-@c FIXME: should it be this hard to set up this
-@c behavior (and the result when one fails to do so,
-@c silent failure to notify, so non-obvious)? Should
-@c CVS give a warning if no line in notify matches (and
-@c document the use of "DEFAULT :" for the case where
-@c skipping the notification is indeed desired)?
-
-@cindex users (admin file)
-Note that if you set this up in the straightforward
-way, users receive notifications on the server machine.
-One could of course write a @file{notify} script which
-directed notifications elsewhere, but to make this
-easy, @sc{cvs} allows you to associate a notification
-address for each user. To do so create a file
-@file{users} in @file{CVSROOT} with a line for each
-user in the format @var{user}:@var{value}. Then
-instead of passing the name of the user to be notified
-to @file{notify}, @sc{cvs} will pass the @var{value}
-(normally an email address on some other machine).
-
-@sc{cvs} does not notify you for your own changes.
-Currently this check is done based on whether the user
-name of the person taking the action which triggers
-notification matches the user name of the person
-getting notification. In fact, in general, the watches
-features only track one edit by each user. It probably
-would be more useful if watches tracked each working
-directory separately, so this behavior might be worth
-changing.
-@c "behavior might be worth changing" is an effort to
-@c point to future directions while also not promising
-@c that "they" (as in "why don't they fix CVS to....")
-@c will do this.
-@c one implementation issue is identifying whether a
-@c working directory is same or different. Comparing
-@c pathnames/hostnames is hopeless, but having the server
-@c supply a serial number which the client stores in the
-@c CVS directory as a magic cookie should work.
-
-@node Editing files
-@subsection How to edit a file which is being watched
-
-@cindex Checkout, as term for getting ready to edit
-Since a file which is being watched is checked out
-read-only, you cannot simply edit it. To make it
-read-write, and inform others that you are planning to
-edit it, use the @code{cvs edit} command. Some systems
-call this a @dfn{checkout}, but @sc{cvs} uses that term
-for obtaining a copy of the sources (@pxref{Getting the
-source}), an operation which those systems call a
-@dfn{get} or a @dfn{fetch}.
-@c Issue to think about: should we transition CVS
-@c towards the "get" terminology? "cvs get" is already a
-@c synonym for "cvs checkout" and that section of the
-@c manual refers to "Getting the source". If this is
-@c done, needs to be done gingerly (for example, we should
-@c still accept "checkout" in .cvsrc files indefinitely
-@c even if the CVS's messages are changed from "cvs checkout: "
-@c to "cvs get: ").
-@c There is a concern about whether "get" is not as
-@c good for novices because it is a more general term
-@c than "checkout" (and thus arguably harder to assign
-@c a technical meaning for).
-
-@cindex edit (subcommand)
-@deffn Command {cvs edit} [@code{-lR}] [@code{-a} @var{action}]@dots{} [@var{files}]@dots{}
-
-Prepare to edit the working files @var{files}. @sc{cvs} makes the
-@var{files} read-write, and notifies users who have requested
-@code{edit} notification for any of @var{files}.
-
-The @code{cvs edit} command accepts the same options as the
-@code{cvs watch add} command, and establishes a temporary watch for the
-user on @var{files}; @sc{cvs} will remove the watch when @var{files} are
-@code{unedit}ed or @code{commit}ted. If the user does not wish to
-receive notifications, she should specify @code{-a none}.
-
-The @var{files} and the options are processed as for the @code{cvs
-watch} commands.
-
-@ignore
-@strong{Caution: If the @code{PreservePermissions}
-option is enabled in the repository (@pxref{config}),
-@sc{cvs} will not change the permissions on any of the
-@var{files}. The reason for this change is to ensure
-that using @samp{cvs edit} does not interfere with the
-ability to store file permissions in the @sc{cvs}
-repository.}
-@end ignore
-
-@end deffn
-
-Normally when you are done with a set of changes, you
-use the @code{cvs commit} command, which checks in your
-changes and returns the watched files to their usual
-read-only state. But if you instead decide to abandon
-your changes, or not to make any changes, you can use
-the @code{cvs unedit} command.
-
-@cindex unedit (subcommand)
-@cindex Abandoning work
-@cindex Reverting to repository version
-@deffn Command {cvs unedit} [@code{-lR}] [@var{files}]@dots{}
-
-Abandon work on the working files @var{files}, and revert them to the
-repository versions on which they are based. @sc{cvs} makes those
-@var{files} read-only for which users have requested notification using
-@code{cvs watch on}. @sc{cvs} notifies users who have requested @code{unedit}
-notification for any of @var{files}.
-
-The @var{files} and options are processed as for the
-@code{cvs watch} commands.
-
-If watches are not in use, the @code{unedit} command
-probably does not work, and the way to revert to the
-repository version is with the command @code{cvs update -C file}
-(@pxref{update}).
-The meaning is
-not precisely the same; the latter may also
-bring in some changes which have been made in the
-repository since the last time you updated.
-@c It would be a useful enhancement to CVS to make
-@c unedit work in the non-watch case as well.
-@end deffn
-
-When using client/server @sc{cvs}, you can use the
-@code{cvs edit} and @code{cvs unedit} commands even if
-@sc{cvs} is unable to successfully communicate with the
-server; the notifications will be sent upon the next
-successful @sc{cvs} command.
-
-@node Watch information
-@subsection Information about who is watching and editing
-
-@cindex watchers (subcommand)
-@deffn Command {cvs watchers} [@code{-lR}] [@var{files}]@dots{}
-
-List the users currently watching changes to @var{files}. The report
-includes the files being watched, and the mail address of each watcher.
-
-The @var{files} and options are processed as for the
-@code{cvs watch} commands.
-
-@end deffn
-
-
-@cindex editors (subcommand)
-@deffn Command {cvs editors} [@code{-lR}] [@var{files}]@dots{}
-
-List the users currently working on @var{files}. The report
-includes the mail address of each user, the time when the user began
-working with the file, and the host and path of the working directory
-containing the file.
-
-The @var{files} and options are processed as for the
-@code{cvs watch} commands.
-
-@end deffn
-
-@node Watches Compatibility
-@subsection Using watches with old versions of CVS
-
-@cindex CVS 1.6, and watches
-If you use the watch features on a repository, it
-creates @file{CVS} directories in the repository and
-stores the information about watches in that directory.
-If you attempt to use @sc{cvs} 1.6 or earlier with the
-repository, you get an error message such as the
-following (all on one line):
-
-@example
-cvs update: cannot open CVS/Entries for reading:
-No such file or directory
-@end example
-
-@noindent
-and your operation will likely be aborted. To use the
-watch features, you must upgrade all copies of @sc{cvs}
-which use that repository in local or server mode. If
-you cannot upgrade, use the @code{watch off} and
-@code{watch remove} commands to remove all watches, and
-that will restore the repository to a state which
-@sc{cvs} 1.6 can cope with.
-
-@node Choosing a model
-@section Choosing between reserved or unreserved checkouts
-@cindex Choosing, reserved or unreserved checkouts
-
-Reserved and unreserved checkouts each have pros and
-cons. Let it be said that a lot of this is a matter of
-opinion or what works given different groups' working
-styles, but here is a brief description of some of the
-issues. There are many ways to organize a team of
-developers. @sc{cvs} does not try to enforce a certain
-organization. It is a tool that can be used in several
-ways.
-
-Reserved checkouts can be very counter-productive. If
-two persons want to edit different parts of a file,
-there may be no reason to prevent either of them from
-doing so. Also, it is common for someone to take out a
-lock on a file, because they are planning to edit it,
-but then forget to release the lock.
-
-@c "many groups"? specifics? cites to papers on this?
-@c some way to weasel-word it a bit more so we don't
-@c need facts :-)?
-People, especially people who are familiar with
-reserved checkouts, often wonder how often conflicts
-occur if unreserved checkouts are used, and how
-difficult they are to resolve. The experience with
-many groups is that they occur rarely and usually are
-relatively straightforward to resolve.
-
-The rarity of serious conflicts may be surprising, until one realizes
-that they occur only when two developers disagree on the proper design
-for a given section of code; such a disagreement suggests that the
-team has not been communicating properly in the first place. In order
-to collaborate under @emph{any} source management regimen, developers
-must agree on the general design of the system; given this agreement,
-overlapping changes are usually straightforward to merge.
-
-In some cases unreserved checkouts are clearly
-inappropriate. If no merge tool exists for the kind of
-file you are managing (for example word processor files
-or files edited by Computer Aided Design programs), and
-it is not desirable to change to a program which uses a
-mergeable data format, then resolving conflicts is
-going to be unpleasant enough that you generally will
-be better off to simply avoid the conflicts instead, by
-using reserved checkouts.
-
-The watches features described above in @ref{Watches}
-can be considered to be an intermediate model between
-reserved checkouts and unreserved checkouts. When you
-go to edit a file, it is possible to find out who else
-is editing it. And rather than having the system
-simply forbid both people editing the file, it can tell
-you what the situation is and let you figure out
-whether it is a problem in that particular case or not.
-Therefore, for some groups it can be considered the
-best of both the reserved checkout and unreserved
-checkout worlds.
-
-@c ---------------------------------------------------------------------
-@node Revision management
-@chapter Revision management
-@cindex Revision management
-
-@c -- This chapter could be expanded a lot.
-@c -- Experiences are very welcome!
-
-If you have read this far, you probably have a pretty
-good grasp on what @sc{cvs} can do for you. This
-chapter talks a little about things that you still have
-to decide.
-
-If you are doing development on your own using @sc{cvs}
-you could probably skip this chapter. The questions
-this chapter takes up become more important when more
-than one person is working in a repository.
-
-@menu
-* When to commit:: Some discussion on the subject
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node When to commit
-@section When to commit?
-@cindex When to commit
-@cindex Committing, when to
-@cindex Policy
-
-Your group should decide which policy to use regarding
-commits. Several policies are possible, and as your
-experience with @sc{cvs} grows you will probably find
-out what works for you.
-
-If you commit files too quickly you might commit files
-that do not even compile. If your partner updates his
-working sources to include your buggy file, he will be
-unable to compile the code. On the other hand, other
-persons will not be able to benefit from the
-improvements you make to the code if you commit very
-seldom, and conflicts will probably be more common.
-
-It is common to only commit files after making sure
-that they can be compiled. Some sites require that the
-files pass a test suite. Policies like this can be
-enforced using the commitinfo file
-(@pxref{commitinfo}), but you should think twice before
-you enforce such a convention. By making the
-development environment too controlled it might become
-too regimented and thus counter-productive to the real
-goal, which is to get software written.
-
-@c ---------------------------------------------------------------------
-@node Keyword substitution
-@chapter Keyword substitution
-@cindex Keyword substitution
-@cindex Keyword expansion
-@cindex Identifying files
-
-@comment Be careful when editing this chapter.
-@comment Remember that this file is kept under
-@comment version control, so we must not accidentally
-@comment include a valid keyword in the running text.
-
-As long as you edit source files inside a working
-directory you can always find out the state of
-your files via @samp{cvs status} and @samp{cvs log}.
-But as soon as you export the files from your
-development environment it becomes harder to identify
-which revisions they are.
-
-@sc{cvs} can use a mechanism known as @dfn{keyword
-substitution} (or @dfn{keyword expansion}) to help
-identifying the files. Embedded strings of the form
-@code{$@var{keyword}$} and
-@code{$@var{keyword}:@dots{}$} in a file are replaced
-with strings of the form
-@code{$@var{keyword}:@var{value}$} whenever you obtain
-a new revision of the file.
-
-@menu
-* Keyword list:: Keywords
-* Using keywords:: Using keywords
-* Avoiding substitution:: Avoiding substitution
-* Substitution modes:: Substitution modes
-* Log keyword:: Problems with the $@splitrcskeyword{Log}$ keyword.
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Keyword list
-@section Keyword List
-@cindex Keyword List
-
-@c FIXME: need some kind of example here I think,
-@c perhaps in a
-@c "Keyword intro" node. The intro in the "Keyword
-@c substitution" node itself seems OK, but to launch
-@c into a list of the keywords somehow seems too abrupt.
-
-This is a list of the keywords:
-
-@table @code
-@cindex Author keyword
-@item $@splitrcskeyword{Author}$
-The login name of the user who checked in the revision.
-
-@cindex Date keyword
-@item $@splitrcskeyword{Date}$
-The date and time (UTC) the revision was checked in.
-
-@cindex Header keyword
-@item $@splitrcskeyword{Header}$
-A standard header containing the full pathname of the
-@sc{rcs} file, the revision number, the date (UTC), the
-author, the state, and the locker (if locked). Files
-will normally never be locked when you use @sc{cvs}.
-
-@cindex Id keyword
-@item $@splitrcskeyword{Id}$
-Same as @code{$@splitrcskeyword{Header}$}, except that the @sc{rcs}
-filename is without a path.
-
-@cindex Name keyword
-@item $@splitrcskeyword{Name}$
-Tag name used to check out this file. The keyword is
-expanded only if one checks out with an explicit tag
-name. For example, when running the command @code{cvs
-co -r first}, the keyword expands to @samp{Name: first}.
-
-@cindex Locker keyword
-@item $@splitrcskeyword{Locker}$
-The login name of the user who locked the revision
-(empty if not locked, which is the normal case unless
-@code{cvs admin -l} is in use).
-
-@cindex Log keyword
-@item $@splitrcskeyword{Log}$
-The log message supplied during commit, preceded by a
-header containing the @sc{rcs} filename, the revision
-number, the author, and the date (UTC). Existing log
-messages are @emph{not} replaced. Instead, the new log
-message is inserted after @code{$@splitrcskeyword{Log}:@dots{}$}.
-Each new line is prefixed with the same string which
-precedes the @code{$Log} keyword. For example, if the
-file contains:
-
-@example
- /* Here is what people have been up to:
- *
- * $@splitrcskeyword{Log}: frob.c,v $
- * Revision 1.1 1997/01/03 14:23:51 joe
- * Add the superfrobnicate option
- *
- */
-@end example
-
-@noindent
-then additional lines which are added when expanding
-the @code{$Log} keyword will be preceded by @samp{ * }.
-Unlike previous versions of @sc{cvs} and @sc{rcs}, the
-@dfn{comment leader} from the @sc{rcs} file is not used.
-The @code{$Log} keyword is useful for
-accumulating a complete change log in a source file,
-but for several reasons it can be problematic.
-@xref{Log keyword}.
-
-@cindex RCSfile keyword
-@item $@splitrcskeyword{RCSfile}$
-The name of the RCS file without a path.
-
-@cindex Revision keyword
-@item $@splitrcskeyword{Revision}$
-The revision number assigned to the revision.
-
-@cindex Source keyword
-@item $@splitrcskeyword{Source}$
-The full pathname of the RCS file.
-
-@cindex State keyword
-@item $@splitrcskeyword{State}$
-The state assigned to the revision. States can be
-assigned with @code{cvs admin -s}---see @ref{admin options}.
-
-@end table
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Using keywords
-@section Using keywords
-
-To include a keyword string you simply include the
-relevant text string, such as @code{$@splitrcskeyword{Id}$}, inside the
-file, and commit the file. @sc{cvs} will automatically (Or,
-more accurately, as part of the update run that
-automatically happens after a commit.)
-expand the string as part of the commit operation.
-
-It is common to embed the @code{$@splitrcskeyword{Id}$} string in
-the source files so that it gets passed through to
-generated files. For example, if you are managing
-computer program source code, you might include a
-variable which is initialized to contain that string.
-Or some C compilers may provide a @code{#pragma ident}
-directive. Or a document management system might
-provide a way to pass a string through to generated
-files.
-
-@c Would be nice to give an example, but doing this in
-@c portable C is not possible and the problem with
-@c picking any one language (VMS HELP files, Ada,
-@c troff, whatever) is that people use CVS for all
-@c kinds of files.
-
-@cindex Ident (shell command)
-The @code{ident} command (which is part of the @sc{rcs}
-package) can be used to extract keywords and their
-values from a file. This can be handy for text files,
-but it is even more useful for extracting keywords from
-binary files.
-
-@example
-$ ident samp.c
-samp.c:
- $@splitrcskeyword{Id}: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
-$ gcc samp.c
-$ ident a.out
-a.out:
- $@splitrcskeyword{Id}: samp.c,v 1.5 1993/10/19 14:57:32 ceder Exp $
-@end example
-
-@cindex What (shell command)
-S@sc{ccs} is another popular revision control system.
-It has a command, @code{what}, which is very similar to
-@code{ident} and used for the same purpose. Many sites
-without @sc{rcs} have @sc{sccs}. Since @code{what}
-looks for the character sequence @code{@@(#)} it is
-easy to include keywords that are detected by either
-command. Simply prefix the keyword with the
-magic @sc{sccs} phrase, like this:
-
-@example
-static char *id="@@(#) $@splitrcskeyword{Id}: ab.c,v 1.5 1993/10/19 14:57:32 ceder Exp $";
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Avoiding substitution
-@section Avoiding substitution
-
-Keyword substitution has its disadvantages. Sometimes
-you might want the literal text string
-@samp{$@splitrcskeyword{Author}$} to appear inside a file without
-@sc{cvs} interpreting it as a keyword and expanding it
-into something like @samp{$@splitrcskeyword{Author}: ceder $}.
-
-There is unfortunately no way to selectively turn off
-keyword substitution. You can use @samp{-ko}
-(@pxref{Substitution modes}) to turn off keyword
-substitution entirely.
-
-In many cases you can avoid using keywords in
-the source, even though they appear in the final
-product. For example, the source for this manual
-contains @samp{$@@asis@{@}Author$} whenever the text
-@samp{$@splitrcskeyword{Author}$} should appear. In @code{nroff}
-and @code{troff} you can embed the null-character
-@code{\&} inside the keyword for a similar effect.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Substitution modes
-@section Substitution modes
-@cindex Keyword substitution, changing modes
-@cindex -k (keyword substitution)
-@cindex Kflag
-
-@c FIXME: This could be made more coherent, by expanding it
-@c with more examples or something.
-Each file has a stored default substitution mode, and
-each working directory copy of a file also has a
-substitution mode. The former is set by the @samp{-k}
-option to @code{cvs add} and @code{cvs admin}; the
-latter is set by the @samp{-k} or @samp{-A} options to @code{cvs
-checkout} or @code{cvs update}.
-@code{cvs diff} and @code{cvs rdiff} also
-have @samp{-k} options.
-For some examples,
-see @ref{Binary files}, and @ref{Merging and keywords}.
-@c The fact that -A is overloaded to mean both reset
-@c sticky options and reset sticky tags/dates is
-@c somewhat questionable. Perhaps there should be
-@c separate options to reset sticky options (e.g. -k
-@c A") and tags/dates (someone suggested -r HEAD could
-@c do this instead of setting a sticky tag of "HEAD"
-@c as in the status quo but I haven't thought much
-@c about that idea. Of course -r .reset or something
-@c could be coined if this needs to be a new option).
-@c On the other hand, having -A mean "get things back
-@c into the state after a fresh checkout" has a certain
-@c appeal, and maybe there is no sufficient reason for
-@c creeping featurism in this area.
-
-The modes available are:
-
-@table @samp
-@item -kkv
-Generate keyword strings using the default form, e.g.
-@code{$@splitrcskeyword{Revision}: 5.7 $} for the @code{Revision}
-keyword.
-
-@item -kkvl
-Like @samp{-kkv}, except that a locker's name is always
-inserted if the given revision is currently locked.
-The locker's name is only relevant if @code{cvs admin
--l} is in use.
-
-@item -kk
-Generate only keyword names in keyword strings; omit
-their values. For example, for the @code{Revision}
-keyword, generate the string @code{$@splitrcskeyword{Revision}$}
-instead of @code{$@splitrcskeyword{Revision}: 5.7 $}. This option
-is useful to ignore differences due to keyword
-substitution when comparing different revisions of a
-file (@pxref{Merging and keywords}).
-
-@item -ko
-Generate the old keyword string, present in the working
-file just before it was checked in. For example, for
-the @code{Revision} keyword, generate the string
-@code{$@splitrcskeyword{Revision}: 1.1 $} instead of
-@code{$@splitrcskeyword{Revision}: 5.7 $} if that is how the
-string appeared when the file was checked in.
-
-@item -kb
-Like @samp{-ko}, but also inhibit conversion of line
-endings between the canonical form in which they are
-stored in the repository (linefeed only), and the form
-appropriate to the operating system in use on the
-client. For systems, like unix, which use linefeed
-only to terminate lines, this is the same as
-@samp{-ko}. For more information on binary files, see
-@ref{Binary files}.
-
-@item -kv
-Generate only keyword values for keyword strings. For
-example, for the @code{Revision} keyword, generate the string
-@code{5.7} instead of @code{$@splitrcskeyword{Revision}: 5.7 $}.
-This can help generate files in programming languages
-where it is hard to strip keyword delimiters like
-@code{$@splitrcskeyword{Revision}: $} from a string. However,
-further keyword substitution cannot be performed once
-the keyword names are removed, so this option should be
-used with care.
-
-One often would like to use @samp{-kv} with @code{cvs
-export}---@pxref{export}. But be aware that doesn't
-handle an export containing binary files correctly.
-
-@end table
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Log keyword
-@section Problems with the $@splitrcskeyword{Log}$ keyword.
-
-The @code{$@splitrcskeyword{Log}$} keyword is somewhat
-controversial. As long as you are working on your
-development system the information is easily accessible
-even if you do not use the @code{$@splitrcskeyword{Log}$}
-keyword---just do a @code{cvs log}. Once you export
-the file the history information might be useless
-anyhow.
-
-A more serious concern is that @sc{cvs} is not good at
-handling @code{$@splitrcskeyword{Log}$} entries when a branch is
-merged onto the main trunk. Conflicts often result
-from the merging operation.
-@c Might want to check whether the CVS implementation
-@c of RCS_merge has this problem the same way rcsmerge
-@c does. I would assume so....
-
-People also tend to "fix" the log entries in the file
-(correcting spelling mistakes and maybe even factual
-errors). If that is done the information from
-@code{cvs log} will not be consistent with the
-information inside the file. This may or may not be a
-problem in real life.
-
-It has been suggested that the @code{$@splitrcskeyword{Log}$}
-keyword should be inserted @emph{last} in the file, and
-not in the files header, if it is to be used at all.
-That way the long list of change messages will not
-interfere with everyday source file browsing.
-
-@c ---------------------------------------------------------------------
-@node Tracking sources
-@chapter Tracking third-party sources
-@cindex Third-party sources
-@cindex Tracking sources
-
-@c FIXME: Need discussion of added and removed files.
-@c FIXME: This doesn't really adequately introduce the
-@c concepts of "vendor" and "you". They don't *have*
-@c to be separate organizations or separate people.
-@c We want a description which is somewhat more based on
-@c the technical issues of which sources go where, but
-@c also with enough examples of how this relates to
-@c relationships like customer-supplier, developer-QA,
-@c maintainer-contributor, or whatever, to make it
-@c seem concrete.
-If you modify a program to better fit your site, you
-probably want to include your modifications when the next
-release of the program arrives. @sc{cvs} can help you with
-this task.
-
-@cindex Vendor
-@cindex Vendor branch
-@cindex Branch, vendor-
-In the terminology used in @sc{cvs}, the supplier of the
-program is called a @dfn{vendor}. The unmodified
-distribution from the vendor is checked in on its own
-branch, the @dfn{vendor branch}. @sc{cvs} reserves branch
-1.1.1 for this use.
-
-When you modify the source and commit it, your revision
-will end up on the main trunk. When a new release is
-made by the vendor, you commit it on the vendor branch
-and copy the modifications onto the main trunk.
-
-Use the @code{import} command to create and update
-the vendor branch. When you import a new file,
-the vendor branch is made the `head' revision, so
-anyone that checks out a copy of the file gets that
-revision. When a local modification is committed it is
-placed on the main trunk, and made the `head'
-revision.
-
-@menu
-* First import:: Importing for the first time
-* Update imports:: Updating with the import command
-* Reverting local changes:: Reverting to the latest vendor release
-* Binary files in imports:: Binary files require special handling
-* Keywords in imports:: Keyword substitution might be undesirable
-* Multiple vendor branches:: What if you get sources from several places?
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node First import
-@section Importing for the first time
-@cindex Importing modules
-
-@c Should mention naming conventions for vendor tags,
-@c release tags, and perhaps directory names.
-Use the @code{import} command to check in the sources
-for the first time. When you use the @code{import}
-command to track third-party sources, the @dfn{vendor
-tag} and @dfn{release tags} are useful. The
-@dfn{vendor tag} is a symbolic name for the branch
-(which is always 1.1.1, unless you use the @samp{-b
-@var{branch}} flag---see @ref{Multiple vendor branches}.). The
-@dfn{release tags} are symbolic names for a particular
-release, such as @samp{FSF_0_04}.
-
-@c I'm not completely sure this belongs here. But
-@c we need to say it _somewhere_ reasonably obvious; it
-@c is a common misconception among people first learning CVS
-Note that @code{import} does @emph{not} change the
-directory in which you invoke it. In particular, it
-does not set up that directory as a @sc{cvs} working
-directory; if you want to work with the sources import
-them first and then check them out into a different
-directory (@pxref{Getting the source}).
-
-@cindex wdiff (import example)
-Suppose you have the sources to a program called
-@code{wdiff} in a directory @file{wdiff-0.04},
-and are going to make private modifications that you
-want to be able to use even when new releases are made
-in the future. You start by importing the source to
-your repository:
-
-@example
-$ cd wdiff-0.04
-$ cvs import -m "Import of FSF v. 0.04" fsf/wdiff FSF_DIST WDIFF_0_04
-@end example
-
-The vendor tag is named @samp{FSF_DIST} in the above
-example, and the only release tag assigned is
-@samp{WDIFF_0_04}.
-@c FIXME: Need to say where fsf/wdiff comes from.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Update imports
-@section Updating with the import command
-
-When a new release of the source arrives, you import it into the
-repository with the same @code{import} command that you used to set up
-the repository in the first place. The only difference is that you
-specify a different release tag this time:
-
-@example
-$ tar xfz wdiff-0.05.tar.gz
-$ cd wdiff-0.05
-$ cvs import -m "Import of FSF v. 0.05" fsf/wdiff FSF_DIST WDIFF_0_05
-@end example
-
-@strong{WARNING: If you use a release tag that already exists in one of the
-repository archives, files removed by an import may not be detected.}
-
-For files that have not been modified locally, the newly created
-revision becomes the head revision. If you have made local
-changes, @code{import} will warn you that you must merge the changes
-into the main trunk, and tell you to use @samp{checkout -j} to do so:
-
-@c FIXME: why "wdiff" here and "fsf/wdiff" in the
-@c "import"? I think the assumption is that one has
-@c "wdiff fsf/wdiff" or some such in modules, but it
-@c would be better to not use modules in this example.
-@example
-$ cvs checkout -jFSF_DIST:yesterday -jFSF_DIST wdiff
-@end example
-
-@noindent
-The above command will check out the latest revision of
-@samp{wdiff}, merging the changes made on the vendor branch @samp{FSF_DIST}
-since yesterday into the working copy. If any conflicts arise during
-the merge they should be resolved in the normal way (@pxref{Conflicts
-example}). Then, the modified files may be committed.
-
-However, it is much better to use the two release tags rather than using
-a date on the branch as suggested above:
-
-@example
-$ cvs checkout -jWDIFF_0_04 -jWDIFF_0_05 wdiff
-@end example
-
-@noindent
-The reason this is better is that
-using a date, as suggested above, assumes that you do
-not import more than one release of a product per day.
-More importantly, using the release tags allows @sc{cvs} to detect files
-that were removed between the two vendor releases and mark them for
-removal. Since @code{import} has no way to detect removed files, you
-should do a merge like this even if @code{import} doesn't tell you to.
-
-@node Reverting local changes
-@section Reverting to the latest vendor release
-
-You can also revert local changes completely and return
-to the latest vendor release by changing the `head'
-revision back to the vendor branch on all files. For
-example, if you have a checked-out copy of the sources
-in @file{~/work.d/wdiff}, and you want to revert to the
-vendor's version for all the files in that directory,
-you would type:
-
-@example
-$ cd ~/work.d/wdiff
-$ cvs admin -bFSF_DIST .
-@end example
-
-@noindent
-You must specify the @samp{-bFSF_DIST} without any space
-after the @samp{-b}. @xref{admin options}.
-
-@node Binary files in imports
-@section How to handle binary files with cvs import
-
-Use the @samp{-k} wrapper option to tell import which
-files are binary. @xref{Wrappers}.
-
-@node Keywords in imports
-@section How to handle keyword substitution with cvs import
-
-The sources which you are importing may contain
-keywords (@pxref{Keyword substitution}). For example,
-the vendor may use @sc{cvs} or some other system
-which uses similar keyword expansion syntax. If you
-just import the files in the default fashion, then
-the keyword expansions supplied by the vendor will
-be replaced by keyword expansions supplied by your
-own copy of @sc{cvs}. It may be more convenient to
-maintain the expansions supplied by the vendor, so
-that this information can supply information about
-the sources that you imported from the vendor.
-
-To maintain the keyword expansions supplied by the
-vendor, supply the @samp{-ko} option to @code{cvs
-import} the first time you import the file.
-This will turn off keyword expansion
-for that file entirely, so if you want to be more
-selective you'll have to think about what you want
-and use the @samp{-k} option to @code{cvs update} or
-@code{cvs admin} as appropriate.
-@c Supplying -ko to import if the file already existed
-@c has no effect. Not clear to me whether it should
-@c or not.
-
-@node Multiple vendor branches
-@section Multiple vendor branches
-
-All the examples so far assume that there is only one
-vendor from which you are getting sources. In some
-situations you might get sources from a variety of
-places. For example, suppose that you are dealing with
-a project where many different people and teams are
-modifying the software. There are a variety of ways to
-handle this, but in some cases you have a bunch of
-source trees lying around and what you want to do more
-than anything else is just to all put them in @sc{cvs} so
-that you at least have them in one place.
-
-For handling situations in which there may be more than
-one vendor, you may specify the @samp{-b} option to
-@code{cvs import}. It takes as an argument the vendor
-branch to import to. The default is @samp{-b 1.1.1}.
-
-For example, suppose that there are two teams, the red
-team and the blue team, that are sending you sources.
-You want to import the red team's efforts to branch
-1.1.1 and use the vendor tag RED. You want to import
-the blue team's efforts to branch 1.1.3 and use the
-vendor tag BLUE. So the commands you might use are:
-
-@example
-$ cvs import dir RED RED_1-0
-$ cvs import -b 1.1.3 dir BLUE BLUE_1-5
-@end example
-
-Note that if your vendor tag does not match your
-@samp{-b} option, @sc{cvs} will not detect this case! For
-example,
-
-@example
-$ cvs import -b 1.1.3 dir RED RED_1-0
-@end example
-
-@noindent
-Be careful; this kind of mismatch is sure to sow
-confusion or worse. I can't think of a useful purpose
-for the ability to specify a mismatch here, but if you
-discover such a use, don't. @sc{cvs} is likely to make this
-an error in some future release.
-
-@c Probably should say more about the semantics of
-@c multiple branches. What about the default branch?
-@c What about joining (perhaps not as useful with
-@c multiple branches, or perhaps it is. Either way
-@c should be mentioned).
-
-@c I'm not sure about the best location for this. In
-@c one sense, it might belong right after we've introduced
-@c CVS's basic version control model, because people need
-@c to figure out builds right away. The current location
-@c is based on the theory that it kind of akin to the
-@c "Revision management" section.
-@node Builds
-@chapter How your build system interacts with CVS
-@cindex Builds
-@cindex make
-
-As mentioned in the introduction, @sc{cvs} does not
-contain software for building your software from source
-code. This section describes how various aspects of
-your build system might interact with @sc{cvs}.
-
-@c Is there a way to discuss this without reference to
-@c tools other than CVS? I'm not sure there is; I
-@c wouldn't think that people who learn CVS first would
-@c even have this concern.
-One common question, especially from people who are
-accustomed to @sc{rcs}, is how to make their build get
-an up to date copy of the sources. The answer to this
-with @sc{cvs} is two-fold. First of all, since
-@sc{cvs} itself can recurse through directories, there
-is no need to modify your @file{Makefile} (or whatever
-configuration file your build tool uses) to make sure
-each file is up to date. Instead, just use two
-commands, first @code{cvs -q update} and then
-@code{make} or whatever the command is to invoke your
-build tool. Secondly, you do not necessarily
-@emph{want} to get a copy of a change someone else made
-until you have finished your own work. One suggested
-approach is to first update your sources, then
-implement, build and
-test the change you were thinking of, and then commit
-your sources (updating first if necessary). By
-periodically (in between changes, using the approach
-just described) updating your entire tree, you ensure
-that your sources are sufficiently up to date.
-
-@cindex Bill of materials
-One common need is to record which versions of which
-source files went into a particular build. This kind
-of functionality is sometimes called @dfn{bill of
-materials} or something similar. The best way to do
-this with @sc{cvs} is to use the @code{tag} command to
-record which versions went into a given build
-(@pxref{Tags}).
-
-Using @sc{cvs} in the most straightforward manner
-possible, each developer will have a copy of the entire
-source tree which is used in a particular build. If
-the source tree is small, or if developers are
-geographically dispersed, this is the preferred
-solution. In fact one approach for larger projects is
-to break a project down into smaller
-@c I say subsystem instead of module because they may or
-@c may not use the modules file.
-separately-compiled subsystems, and arrange a way of
-releasing them internally so that each developer need
-check out only those subsystems which they are
-actively working on.
-
-Another approach is to set up a structure which allows
-developers to have their own copies of some files, and
-for other files to access source files from a central
-location. Many people have come up with some such a
-@c two such people are paul@sander.cupertino.ca.us (for
-@c a previous employer)
-@c and gunnar.tornblom@se.abb.com (spicm and related tools),
-@c but as far as I know
-@c no one has nicely packaged or released such a system (or
-@c instructions for constructing one).
-system using features such as the symbolic link feature
-found in many operating systems, or the @code{VPATH}
-feature found in many versions of @code{make}. One build
-tool which is designed to help with this kind of thing
-is Odin (see
-@code{ftp://ftp.cs.colorado.edu/pub/distribs/odin}).
-@c Should we be saying more about Odin? Or how you use
-@c it with CVS? Also, the Prime Time Freeware for Unix
-@c disk (see http://www.ptf.com/) has Odin (with a nice
-@c paragraph summarizing it on the web), so that might be a
-@c semi-"official" place to point people.
-@c
-@c Of course, many non-CVS systems have this kind of
-@c functionality, for example OSF's ODE
-@c (http://www.osf.org/ode/) or mk
-@c (http://www.grin.net/~pzi/mk-3.18.4.docs/mk_toc.html
-@c He has changed providers in the past; a search engine search
-@c for "Peter Ziobrzynski" probably won't get too many
-@c spurious hits :-). A more stable URL might be
-@c ftp://ftp.uu.net/pub/cmvc/mk). But I'm not sure
-@c there is any point in mentioning them here unless they
-@c can work with CVS.
-
-@c ---------------------------------------------------------------------
-@node Special Files
-@chapter Special Files
-
-@cindex Special files
-@cindex Device nodes
-@cindex Ownership, saving in CVS
-@cindex Permissions, saving in CVS
-@cindex Hard links
-@cindex Symbolic links
-
-In normal circumstances, @sc{cvs} works only with regular
-files. Every file in a project is assumed to be
-persistent; it must be possible to open, read and close
-them; and so on. @sc{cvs} also ignores file permissions and
-ownerships, leaving such issues to be resolved by the
-developer at installation time. In other words, it is
-not possible to "check in" a device into a repository;
-if the device file cannot be opened, @sc{cvs} will refuse to
-handle it. Files also lose their ownerships and
-permissions during repository transactions.
-
-@ignore
-If the configuration variable @code{PreservePermissions}
-(@pxref{config}) is set in the repository, @sc{cvs} will
-save the following file characteristics in the
-repository:
-
-@itemize @bullet
-@item user and group ownership
-@item permissions
-@item major and minor device numbers
-@item symbolic links
-@item hard link structure
-@end itemize
-
-Using the @code{PreservePermissions} option affects the
-behavior of @sc{cvs} in several ways. First, some of the
-new operations supported by @sc{cvs} are not accessible to
-all users. In particular, file ownership and special
-file characteristics may only be changed by the
-superuser. When the @code{PreservePermissions}
-configuration variable is set, therefore, users will
-have to be `root' in order to perform @sc{cvs} operations.
-
-When @code{PreservePermissions} is in use, some @sc{cvs}
-operations (such as @samp{cvs status}) will not
-recognize a file's hard link structure, and so will
-emit spurious warnings about mismatching hard links.
-The reason is that @sc{cvs}'s internal structure does not
-make it easy for these operations to collect all the
-necessary data about hard links, so they check for file
-conflicts with inaccurate data.
-
-A more subtle difference is that @sc{cvs} considers a file
-to have changed only if its contents have changed
-(specifically, if the modification time of the working
-file does not match that of the repository's file).
-Therefore, if only the permissions, ownership or hard
-linkage have changed, or if a device's major or minor
-numbers have changed, @sc{cvs} will not notice. In order to
-commit such a change to the repository, you must force
-the commit with @samp{cvs commit -f}. This also means
-that if a file's permissions have changed and the
-repository file is newer than the working copy,
-performing @samp{cvs update} will silently change the
-permissions on the working copy.
-
-Changing hard links in a @sc{cvs} repository is particularly
-delicate. Suppose that file @file{foo} is linked to
-file @file{old}, but is later relinked to file
-@file{new}. You can wind up in the unusual situation
-where, although @file{foo}, @file{old} and @file{new}
-have all had their underlying link patterns changed,
-only @file{foo} and @file{new} have been modified, so
-@file{old} is not considered a candidate for checking
-in. It can be very easy to produce inconsistent
-results this way. Therefore, we recommend that when it
-is important to save hard links in a repository, the
-prudent course of action is to @code{touch} any file
-whose linkage or status has changed since the last
-checkin. Indeed, it may be wise to @code{touch *}
-before each commit in a directory with complex hard
-link structures.
-
-It is worth noting that only regular files may
-be merged, for reasons that hopefully are obvious. If
-@samp{cvs update} or @samp{cvs checkout -j} attempts to
-merge a symbolic link with a regular file, or two
-device files for different kinds of devices, @sc{cvs} will
-report a conflict and refuse to perform the merge. At
-the same time, @samp{cvs diff} will not report any
-differences between these files, since no meaningful
-textual comparisons can be made on files which contain
-no text.
-
-The @code{PreservePermissions} features do not work
-with client/server @sc{cvs}. Another limitation is
-that hard links must be to other files within the same
-directory; hard links across directories are not
-supported.
-@end ignore
-
-@c ---------------------------------------------------------------------
-@c ----- START MAN 1 -----
-@node CVS commands
-@appendix Guide to CVS commands
-
-This appendix describes the overall structure of
-@sc{cvs} commands, and describes some commands in
-detail (others are described elsewhere; for a quick
-reference to @sc{cvs} commands, @pxref{Invoking CVS}).
-@c The idea is that we want to move the commands which
-@c are described here into the main body of the manual,
-@c in the process reorganizing the manual to be
-@c organized around what the user wants to do, not
-@c organized around CVS commands.
-@c
-@c Note that many users do expect a manual which is
-@c organized by command. At least some users do.
-@c One good addition to the "organized by command"
-@c section (if any) would be "see also" links.
-@c The awk manual might be a good example; it has a
-@c reference manual which is more verbose than Invoking
-@c CVS but probably somewhat less verbose than CVS
-@c Commands.
-
-@menu
-* Structure:: Overall structure of CVS commands
-* Exit status:: Indicating CVS's success or failure
-* ~/.cvsrc:: Default options with the ~/.cvsrc file
-* Global options:: Options you give to the left of cvs_command
-* Common options:: Options you give to the right of cvs_command
-* add:: Add files and directories to the repository
-* admin:: Administration
-* annotate:: What revision modified each line of a file?
-* checkout:: Checkout sources for editing
-* commit:: Check files into the repository
-* diff:: Show differences between revisions
-* export:: Export sources from CVS, similar to checkout
-* history:: Show status of files and users
-* import:: Import sources into CVS, using vendor branches
-* log:: Show log messages for files
-* rdiff:: 'patch' format diffs between releases
-* release:: Indicate that a directory is no longer in use
-* remove:: Remove files from active development
-* update:: Bring work tree in sync with repository
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Structure
-@appendixsec Overall structure of CVS commands
-@cindex Structure
-@cindex CVS command structure
-@cindex Command structure
-@cindex Format of CVS commands
-
-The overall format of all @sc{cvs} commands is:
-
-@example
-cvs [ cvs_options ] cvs_command [ command_options ] [ command_args ]
-@end example
-
-@table @code
-@item cvs
-The name of the @sc{cvs} program.
-
-@item cvs_options
-Some options that affect all sub-commands of @sc{cvs}. These are
-described below.
-
-@item cvs_command
-One of several different sub-commands. Some of the commands have
-aliases that can be used instead; those aliases are noted in the
-reference manual for that command. There are only two situations
-where you may omit @samp{cvs_command}: @samp{cvs -H} elicits a
-list of available commands, and @samp{cvs -v} displays version
-information on @sc{cvs} itself.
-
-@item command_options
-Options that are specific for the command.
-
-@item command_args
-Arguments to the commands.
-@end table
-
-There is unfortunately some confusion between
-@code{cvs_options} and @code{command_options}.
-When given as a @code{cvs_option}, some options only
-affect some of the commands. When given as a
-@code{command_option} it may have a different meaning, and
-be accepted by more commands. In other words, do not
-take the above categorization too seriously. Look at
-the documentation instead.
-
-@node Exit status
-@appendixsec CVS's exit status
-@cindex Exit status, of CVS
-
-@sc{cvs} can indicate to the calling environment whether it
-succeeded or failed by setting its @dfn{exit status}.
-The exact way of testing the exit status will vary from
-one operating system to another. For example in a unix
-shell script the @samp{$?} variable will be 0 if the
-last command returned a successful exit status, or
-greater than 0 if the exit status indicated failure.
-
-If @sc{cvs} is successful, it returns a successful status;
-if there is an error, it prints an error message and
-returns a failure status. The one exception to this is
-the @code{cvs diff} command. It will return a
-successful status if it found no differences, or a
-failure status if there were differences or if there
-was an error. Because this behavior provides no good
-way to detect errors, in the future it is possible that
-@code{cvs diff} will be changed to behave like the
-other @sc{cvs} commands.
-@c It might seem like checking whether cvs -q diff
-@c produces empty or non-empty output can tell whether
-@c there were differences or not. But it seems like
-@c there are cases with output but no differences
-@c (testsuite basica-8b). It is not clear to me how
-@c useful it is for a script to be able to check
-@c whether there were differences.
-@c FIXCVS? In previous versions of CVS, cvs diff
-@c returned 0 for no differences, 1 for differences, or
-@c 2 for errors. Is this behavior worth trying to
-@c bring back (but what does it mean for VMS?)?
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node ~/.cvsrc
-@appendixsec Default options and the ~/.cvsrc file
-@cindex .cvsrc file
-@cindex Option defaults
-
-There are some @code{command_options} that are used so
-often that you might have set up an alias or some other
-means to make sure you always specify that option. One
-example (the one that drove the implementation of the
-@file{.cvsrc} support, actually) is that many people find the
-default output of the @samp{diff} command to be very
-hard to read, and that either context diffs or unidiffs
-are much easier to understand.
-
-The @file{~/.cvsrc} file is a way that you can add
-default options to @code{cvs_commands} within cvs,
-instead of relying on aliases or other shell scripts.
-
-The format of the @file{~/.cvsrc} file is simple. The
-file is searched for a line that begins with the same
-name as the @code{cvs_command} being executed. If a
-match is found, then the remainder of the line is split
-up (at whitespace characters) into separate options and
-added to the command arguments @emph{before} any
-options from the command line.
-
-If a command has two names (e.g., @code{checkout} and
-@code{co}), the official name, not necessarily the one
-used on the command line, will be used to match against
-the file. So if this is the contents of the user's
-@file{~/.cvsrc} file:
-
-@example
-log -N
-diff -uN
-rdiff -u
-update -Pd
-checkout -P
-release -d
-@end example
-
-@noindent
-the command @samp{cvs checkout foo} would have the
-@samp{-P} option added to the arguments, as well as
-@samp{cvs co foo}.
-
-With the example file above, the output from @samp{cvs
-diff foobar} will be in unidiff format. @samp{cvs diff
--c foobar} will provide context diffs, as usual.
-Getting "old" format diffs would be slightly more
-complicated, because @code{diff} doesn't have an option
-to specify use of the "old" format, so you would need
-@samp{cvs -f diff foobar}.
-
-In place of the command name you can use @code{cvs} to
-specify global options (@pxref{Global options}). For
-example the following line in @file{.cvsrc}
-
-@example
-cvs -z6
-@end example
-
-@noindent
-causes @sc{cvs} to use compression level 6.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Global options
-@appendixsec Global options
-@cindex Options, global
-@cindex Global options
-@cindex Left-hand options
-
-The available @samp{cvs_options} (that are given to the
-left of @samp{cvs_command}) are:
-
-@table @code
-@item --allow-root=@var{rootdir}
-Specify legal @sc{cvsroot} directory. See
-@ref{Password authentication server}.
-
-@cindex Authentication, stream
-@cindex Stream authentication
-@item -a
-Authenticate all communication between the client and
-the server. Only has an effect on the @sc{cvs} client.
-As of this writing, this is only implemented when using
-a GSSAPI connection (@pxref{GSSAPI authenticated}).
-Authentication prevents certain sorts of attacks
-involving hijacking the active @sc{tcp} connection.
-Enabling authentication does not enable encryption.
-
-@cindex RCSBIN, overriding
-@cindex Overriding RCSBIN
-@item -b @var{bindir}
-In @sc{cvs} 1.9.18 and older, this specified that
-@sc{rcs} programs are in the @var{bindir} directory.
-Current versions of @sc{cvs} do not run @sc{rcs}
-programs; for compatibility this option is accepted,
-but it does nothing.
-
-@cindex TMPDIR, overriding
-@cindex Overriding TMPDIR
-@item -T @var{tempdir}
-Use @var{tempdir} as the directory where temporary files are
-located. Overrides the setting of the @code{$TMPDIR} environment
-variable and any precompiled directory. This parameter should be
-specified as an absolute pathname.
-(When running client/server, @samp{-T} affects only the local process;
-specifying @samp{-T} for the client has no effect on the server and
-vice versa.)
-
-@cindex CVSROOT, overriding
-@cindex Overriding CVSROOT
-@item -d @var{cvs_root_directory}
-Use @var{cvs_root_directory} as the root directory
-pathname of the repository. Overrides the setting of
-the @code{$CVSROOT} environment variable. See @ref{Repository}.
-
-@cindex EDITOR, overriding
-@cindex Overriding EDITOR
-@item -e @var{editor}
-Use @var{editor} to enter revision log information. Overrides the
-setting of the @code{$CVSEDITOR} and @code{$EDITOR}
-environment variables. For more information, see
-@ref{Committing your changes}.
-
-@item -f
-Do not read the @file{~/.cvsrc} file. This
-option is most often used because of the
-non-orthogonality of the @sc{cvs} option set. For
-example, the @samp{cvs log} option @samp{-N} (turn off
-display of tag names) does not have a corresponding
-option to turn the display on. So if you have
-@samp{-N} in the @file{~/.cvsrc} entry for @samp{log},
-you may need to use @samp{-f} to show the tag names.
-
-@item -H
-@itemx --help
-Display usage information about the specified @samp{cvs_command}
-(but do not actually execute the command). If you don't specify
-a command name, @samp{cvs -H} displays overall help for
-@sc{cvs}, including a list of other help options.
-@c It seems to me it is better to document it this way
-@c rather than trying to update this documentation
-@c every time that we add a --help-foo option. But
-@c perhaps that is confusing...
-
-@cindex Read-only mode
-@item -n
-Do not change any files. Attempt to execute the
-@samp{cvs_command}, but only to issue reports; do not remove,
-update, or merge any existing files, or create any new files.
-
-Note that @sc{cvs} will not necessarily produce exactly
-the same output as without @samp{-n}. In some cases
-the output will be the same, but in other cases
-@sc{cvs} will skip some of the processing that would
-have been required to produce the exact same output.
-
-@item -Q
-Cause the command to be really quiet; the command will only
-generate output for serious problems.
-
-@item -q
-Cause the command to be somewhat quiet; informational messages,
-such as reports of recursion through subdirectories, are
-suppressed.
-
-@cindex Read-only files, and -r
-@item -r
-Make new working files read-only. Same effect
-as if the @code{$CVSREAD} environment variable is set
-(@pxref{Environment variables}). The default is to
-make working files writable, unless watches are on
-(@pxref{Watches}).
-
-@item -s @var{variable}=@var{value}
-Set a user variable (@pxref{Variables}).
-
-@cindex Trace
-@item -t
-Trace program execution; display messages showing the steps of
-@sc{cvs} activity. Particularly useful with @samp{-n} to explore the
-potential impact of an unfamiliar command.
-
-@item -v
-@item --version
-Display version and copyright information for @sc{cvs}.
-
-@cindex CVSREAD, overriding
-@cindex Overriding CVSREAD
-@item -w
-Make new working files read-write. Overrides the
-setting of the @code{$CVSREAD} environment variable.
-Files are created read-write by default, unless @code{$CVSREAD} is
-set or @samp{-r} is given.
-@c Note that -w only overrides -r and CVSREAD; it has
-@c no effect on files which are readonly because of
-@c "cvs watch on". My guess is that is the way it
-@c should be (or should "cvs -w get" on a watched file
-@c be the same as a get and a cvs edit?), but I'm not
-@c completely sure whether to document it this way.
-
-@item -x
-@cindex Encryption
-Encrypt all communication between the client and the
-server. Only has an effect on the @sc{cvs} client. As
-of this writing, this is only implemented when using a
-GSSAPI connection (@pxref{GSSAPI authenticated}) or a
-Kerberos connection (@pxref{Kerberos authenticated}).
-Enabling encryption implies that message traffic is
-also authenticated. Encryption support is not
-available by default; it must be enabled using a
-special configure option, @file{--enable-encryption},
-when you build @sc{cvs}.
-
-@item -z @var{gzip-level}
-@cindex Compression
-@cindex Gzip
-Set the compression level.
-Valid levels are 1 (high speed, low compression) to
-9 (low speed, high compression), or 0 to disable
-compression (the default).
-Only has an effect on the @sc{cvs} client.
-
-@end table
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Common options
-@appendixsec Common command options
-@cindex Common options
-@cindex Right-hand options
-
-This section describes the @samp{command_options} that
-are available across several @sc{cvs} commands. These
-options are always given to the right of
-@samp{cvs_command}. Not all
-commands support all of these options; each option is
-only supported for commands where it makes sense.
-However, when a command has one of these options you
-can almost always count on the same behavior of the
-option as in other commands. (Other command options,
-which are listed with the individual commands, may have
-different behavior from one @sc{cvs} command to the other).
-
-@strong{The @samp{history} command is an exception; it supports
-many options that conflict even with these standard options.}
-
-@table @code
-@cindex Dates
-@cindex Time
-@cindex Specifying dates
-@item -D @var{date_spec}
-Use the most recent revision no later than @var{date_spec}.
-@var{date_spec} is a single argument, a date description
-specifying a date in the past.
-
-The specification is @dfn{sticky} when you use it to make a
-private copy of a source file; that is, when you get a working
-file using @samp{-D}, @sc{cvs} records the date you specified, so that
-further updates in the same directory will use the same date
-(for more information on sticky tags/dates, @pxref{Sticky tags}).
-
-@samp{-D} is available with the @code{annotate}, @code{checkout},
-@code{diff}, @code{export}, @code{history},
-@code{rdiff}, @code{rtag}, and @code{update} commands.
-(The @code{history} command uses this option in a
-slightly different way; @pxref{history options}).
-
-@c What other formats should we accept? I don't want
-@c to start accepting a whole mess of non-standard
-@c new formats (there are a lot which are in wide use in
-@c one context or another), but practicality does
-@c dictate some level of flexibility.
-@c * POSIX.2 (e.g. touch, ls output, date) and other
-@c POSIX and/or de facto unix standards (e.g. at). The
-@c practice here is too inconsistent to be of any use.
-@c * VMS dates. This is not a formal standard, but
-@c there is a published specification (see SYS$ASCTIM
-@c and SYS$BINTIM in the _VMS System Services Reference
-@c Manual_), it is implemented consistently in VMS
-@c utilities, and VMS users will expect CVS running on
-@c VMS to support this format (and if we're going to do
-@c that, better to make CVS support it on all
-@c platforms. Maybe).
-@c
-@c NOTE: The tar manual has some documentation for
-@c getdate.y (just for our info; we don't want to
-@c attempt to document all the formats accepted by
-@c getdate.y).
-@c
-@c One more note: In output, CVS should consistently
-@c use one date format, and that format should be one that
-@c it accepts in input as well. The former isn't
-@c really true (see survey below), and I'm not
-@c sure that either of those formats is accepted in
-@c input.
-@c
-@c cvs log
-@c current 1996/01/02 13:45:31
-@c Internet 02 Jan 1996 13:45:31 UT
-@c ISO 1996-01-02 13:45:31
-@c cvs ann
-@c current 02-Jan-96
-@c Internet-like 02 Jan 96
-@c ISO 96-01-02
-@c cvs status
-@c current Tue Jun 11 02:54:53 1996
-@c Internet [Tue,] 11 Jun 1996 02:54:53
-@c ISO 1996-06-11 02:54:53
-@c note: date possibly should be omitted entirely for
-@c other reasons.
-@c cvs editors
-@c current Tue Jun 11 02:54:53 1996 GMT
-@c cvs history
-@c current 06/11 02:54 +0000
-@c any others?
-@c There is a good chance the proper solution has to
-@c involve at least some level of letting the user
-@c decide which format (with the default being the
-@c formats CVS has always used; changing these might be
-@c _very_ disruptive since scripts may very well be
-@c parsing them).
-@c
-@c Another random bit of prior art concerning dates is
-@c the strptime function which takes templates such as
-@c "%m/%d/%y", and apparent a variant of getdate()
-@c which also honors them. See
-@c X/Open CAE Specification, System Interfaces and
-@c Headers Issue 4, Version 2 (September 1994), in the
-@c entry for getdate() on page 231
-
-@cindex Timezone, in input
-@cindex Zone, time, in input
-A wide variety of date formats are supported by
-@sc{cvs}. The most standard ones are ISO8601 (from the
-International Standards Organization) and the Internet
-e-mail standard (specified in RFC822 as amended by
-RFC1123).
-
-@c Probably should be doing more to spell out just what
-@c the rules are, rather than just giving examples.
-@c But I want to keep this simple too.
-@c So I don't know....
-@c A few specific issues: (1) Maybe should reassure
-@c people that years after 2000
-@c work (they are in the testsuite, so they do indeed
-@c work). (2) What do two digit years
-@c mean? Where do we accept them? (3) Local times can
-@c be ambiguous or nonexistent if they fall during the
-@c hour when daylight savings time goes into or out of
-@c effect. Pretty obscure, so I'm not at all sure we
-@c should be documenting the behavior in that case.
-ISO8601 dates have many variants but a few examples
-are:
-
-@example
-1972-09-24
-1972-09-24 20:05
-@end example
-@c I doubt we really accept all ISO8601 format dates
-@c (for example, decimal hours like 1972-09-24 20,2)
-@c I'm not sure we should, many of them are pretty
-@c bizarre and it has lots of gratuitous multiple ways
-@c to specify the same thing.
-
-There are a lot more ISO8601 date formats, and @sc{cvs}
-accepts many of them, but you probably don't want to
-hear the @emph{whole} long story :-).
-
-@c Citing a URL here is kind of problematic given how
-@c much they change and people who have old versions of
-@c this manual, but in case we want to reinstate an
-@c ISO8601 URL, a few are:
-@c http://www.saqqara.demon.co.uk/datefmt.htm
-@c http://www.cl.cam.ac.uk/~mgk25/iso-time.html
-@c Citing some other ISO8601 source is probably even
-@c worse :-).
-
-In addition to the dates allowed in Internet e-mail
-itself, @sc{cvs} also allows some of the fields to be
-omitted. For example:
-@c FIXME: Need to figure out better, and document,
-@c what we want to allow the user to omit.
-@c NOTE: "omit" does not imply "reorder".
-@c FIXME: Need to cite a web page describing how to get
-@c RFC's.
-
-@example
-24 Sep 1972 20:05
-24 Sep
-@end example
-
-The date is interpreted as being in the
-local timezone, unless a specific timezone is
-specified.
-
-These two date formats are preferred. However,
-@sc{cvs} currently accepts a wide variety of other date
-formats. They are intentionally not documented here in
-any detail, and future versions of @sc{cvs} might not
-accept all of them.
-@c We should document and testsuite "now" and
-@c "yesterday". "now" is mentioned in the FAQ and
-@c "yesterday" is mentioned in this document (and the
-@c message from "cvs import" suggesting a merge
-@c command). What else? Probably some/all of the "3
-@c weeks ago" family.
-@c
-@c Maybe at
-@c some point have CVS start give warnings on "unofficial"
-@c formats (many of which might be typos or user
-@c misunderstandings, and/or formats people never/rarely
-@c use to specify dates)?
-
-One such format is
-@code{@var{month}/@var{day}/@var{year}}. This may
-confuse people who are accustomed to having the month
-and day in the other order; @samp{1/4/96} is January 4,
-not April 1.
-
-Remember to quote the argument to the @samp{-D}
-flag so that your shell doesn't interpret spaces as
-argument separators. A command using the @samp{-D}
-flag can look like this:
-
-@example
-$ cvs diff -D "1 hour ago" cvs.texinfo
-@end example
-
-@cindex Forcing a tag match
-@item -f
-When you specify a particular date or tag to @sc{cvs} commands, they
-normally ignore files that do not contain the tag (or did not
-exist prior to the date) that you specified. Use the @samp{-f} option
-if you want files retrieved even when there is no match for the
-tag or date. (The most recent revision of the file
-will be used).
-
-Note that even with @samp{-f}, a tag that you specify
-must exist (that is, in some file, not necessary in
-every file). This is so that @sc{cvs} will continue to
-give an error if you mistype a tag name.
-
-@need 800
-@samp{-f} is available with these commands:
-@code{annotate}, @code{checkout}, @code{export},
-@code{rdiff}, @code{rtag}, and @code{update}.
-
-@strong{WARNING: The @code{commit} and @code{remove}
-commands also have a
-@samp{-f} option, but it has a different behavior for
-those commands. See @ref{commit options}, and
-@ref{Removing files}.}
-
-@item -k @var{kflag}
-Alter the default processing of keywords.
-See @ref{Keyword substitution}, for the meaning of
-@var{kflag}. Your @var{kflag} specification is
-@dfn{sticky} when you use it to create a private copy
-of a source file; that is, when you use this option
-with the @code{checkout} or @code{update} commands,
-@sc{cvs} associates your selected @var{kflag} with the
-file, and continues to use it with future update
-commands on the same file until you specify otherwise.
-
-The @samp{-k} option is available with the @code{add},
-@code{checkout}, @code{diff}, @code{rdiff}, @code{import} and
-@code{update} commands.
-
-@item -l
-Local; run only in current working directory, rather than
-recursing through subdirectories.
-
-Available with the following commands: @code{annotate}, @code{checkout},
-@code{commit}, @code{diff}, @code{edit}, @code{editors}, @code{export},
-@code{log}, @code{rdiff}, @code{remove}, @code{rtag},
-@code{status}, @code{tag}, @code{unedit}, @code{update}, @code{watch},
-and @code{watchers}.
-
-@cindex Editor, avoiding invocation of
-@cindex Avoiding editor invocation
-@item -m @var{message}
-Use @var{message} as log information, instead of
-invoking an editor.
-
-Available with the following commands: @code{add},
-@code{commit} and @code{import}.
-
-@item -n
-Do not run any tag program. (A program can be
-specified to run in the modules
-database (@pxref{modules}); this option bypasses it).
-
-@strong{This is not the same as the @samp{cvs -n}
-program option, which you can specify to the left of a cvs command!}
-
-Available with the @code{checkout}, @code{export},
-and @code{rtag} commands.
-
-@item -P
-Prune empty directories. See @ref{Removing directories}.
-
-@item -p
-Pipe the files retrieved from the repository to standard output,
-rather than writing them in the current directory. Available
-with the @code{checkout} and @code{update} commands.
-
-@item -R
-Process directories recursively. This is on by default.
-
-Available with the following commands: @code{annotate}, @code{checkout},
-@code{commit}, @code{diff}, @code{edit}, @code{editors}, @code{export},
-@code{rdiff}, @code{remove}, @code{rtag},
-@code{status}, @code{tag}, @code{unedit}, @code{update}, @code{watch},
-and @code{watchers}.
-
-@item -r @var{tag}
-@cindex HEAD, special tag
-@cindex BASE, special tag
-Use the revision specified by the @var{tag} argument instead of the
-default @dfn{head} revision. As well as arbitrary tags defined
-with the @code{tag} or @code{rtag} command, two special tags are
-always available: @samp{HEAD} refers to the most recent version
-available in the repository, and @samp{BASE} refers to the
-revision you last checked out into the current working directory.
-
-@c FIXME: What does HEAD really mean? I believe that
-@c the current answer is the head of the default branch
-@c for all cvs commands except diff. For diff, it
-@c seems to be (a) the head of the trunk (or the default
-@c branch?) if there is no sticky tag, (b) the head of the
-@c branch for the sticky tag, if there is a sticky tag.
-@c (b) is ugly as it differs
-@c from what HEAD means for other commands, but people
-@c and/or scripts are quite possibly used to it.
-@c See "head" tests in sanity.sh.
-@c Probably the best fix is to introduce two new
-@c special tags, ".thead" for the head of the trunk,
-@c and ".bhead" for the head of the current branch.
-@c Then deprecate HEAD. This has the advantage of
-@c not surprising people with a change to HEAD, and a
-@c side benefit of also phasing out the poorly-named
-@c HEAD (see discussion of reserved tag names in node
-@c "Tags"). Of course, .thead and .bhead should be
-@c carefully implemented (with the implementation the
-@c same for "diff" as for everyone else), test cases
-@c written (similar to the ones in "head"), new tests
-@c cases written for things like default branches, &c.
-
-The tag specification is sticky when you use this
-@c option
-with @code{checkout} or @code{update} to make your own
-copy of a file: @sc{cvs} remembers the tag and continues to use it on
-future update commands, until you specify otherwise (for more information
-on sticky tags/dates, @pxref{Sticky tags}).
-
-The tag can be either a symbolic or numeric tag, as
-described in @ref{Tags}, or the name of a branch, as
-described in @ref{Branching and merging}.
-When a command expects a specific revision,
-the name of a branch is interpreted as the most recent
-revision on that branch.
-
-Specifying the @samp{-q} global option along with the
-@samp{-r} command option is often useful, to suppress
-the warning messages when the @sc{rcs} file
-does not contain the specified tag.
-
-@strong{This is not the same as the overall @samp{cvs -r} option,
-which you can specify to the left of a @sc{cvs} command!}
-
-@samp{-r} is available with the @code{annotate}, @code{checkout},
-@code{commit}, @code{diff}, @code{history}, @code{export}, @code{rdiff},
-@code{rtag}, and @code{update} commands.
-
-@item -W
-Specify file names that should be filtered. You can
-use this option repeatedly. The spec can be a file
-name pattern of the same type that you can specify in
-the @file{.cvswrappers} file.
-Available with the following commands: @code{import},
-and @code{update}.
-
-@end table
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node add
-@appendixsec add---Add files and directories to the repository
-@cindex add (subcommand)
-
-@itemize @bullet
-@item
-Synopsis: add [-k rcs-kflag] [-m message] files...
-@item
-Requires: repository, working directory.
-@item
-Changes: repository, working directory.
-@end itemize
-
-The @code{add} command is used to present new files
-and directories for addition into the @sc{cvs}
-repository. When @code{add} is used on a directory,
-a new directory is created in the repository
-immediately. When used on a file, only the working
-directory is updated. Changes to the repository are
-not made until the @code{commit} command is used on
-the newly added file.
-
-The @code{add} command also resurrects files that
-have been previously removed. This can be done
-before or after the @code{commit} command is used
-to finalize the removal of files. Resurrected files
-are restored into the working directory at the time
-the @code{add} command is executed.
-
-@menu
-* add options:: add options
-* add examples:: add examples
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node add options
-@appendixsubsec add options
-
-These standard options are supported by @code{add}
-(@pxref{Common options}, for a complete description of
-them):
-
-@table @code
-@item -k @var{kflag}
-Process keywords according to @var{kflag}. See
-@ref{Keyword substitution}.
-This option is sticky; future updates of
-this file in this working directory will use the same
-@var{kflag}. The @code{status} command can be viewed
-to see the sticky options. For more information on
-the @code{status} command, @xref{Invoking CVS}.
-
-@item -m @var{message}
-Use @var{message} as the log message, instead of
-invoking an editor.
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node add examples
-@appendixsubsec add examples
-
-@appendixsubsubsec Adding a directory
-
-@example
-$ mkdir doc
-$ cvs add doc
-Directory /path/to/repository/doc added to the repository
-@end example
-
-@appendixsubsubsec Adding a file
-
-@example
-
-$ >TODO
-$ cvs add TODO
-cvs add: scheduling file `TODO' for addition
-cvs add: use 'cvs commit' to add this file permanently
-@end example
-
-@appendixsubsubsec Undoing a @code{remove} command
-
-@example
-$ rm -f makefile
-$ cvs remove makefile
-cvs remove: scheduling `makefile' for removal
-cvs remove: use 'cvs commit' to remove this file permanently
-$ cvs add makefile
-U makefile
-cvs add: makefile, version 1.2, resurrected
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node admin
-@appendixsec admin---Administration
-@cindex Admin (subcommand)
-
-@itemize @bullet
-@item
-Requires: repository, working directory.
-@item
-Changes: repository.
-@item
-Synonym: rcs
-@end itemize
-
-This is the @sc{cvs} interface to assorted
-administrative facilities. Some of them have
-questionable usefulness for @sc{cvs} but exist for
-historical purposes. Some of the questionable options
-are likely to disappear in the future. This command
-@emph{does} work recursively, so extreme care should be
-used.
-
-@cindex cvsadmin
-On unix, if there is a group named @code{cvsadmin},
-only members of that group can run @code{cvs admin}
-(except for the @code{cvs admin -k} command, which can
-be run by anybody). This group should exist on the
-server, or any system running the non-client/server
-@sc{cvs}. To disallow @code{cvs admin} for all users,
-create a group with no users in it. On NT, the
-@code{cvsadmin} feature does not exist and all users
-can run @code{cvs admin}.
-
-@menu
-* admin options:: admin options
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node admin options
-@appendixsubsec admin options
-
-Some of these options have questionable usefulness for
-@sc{cvs} but exist for historical purposes. Some even
-make it impossible to use @sc{cvs} until you undo the
-effect!
-
-@table @code
-@item -A@var{oldfile}
-Might not work together with @sc{cvs}. Append the
-access list of @var{oldfile} to the access list of the
-@sc{rcs} file.
-
-@item -a@var{logins}
-Might not work together with @sc{cvs}. Append the
-login names appearing in the comma-separated list
-@var{logins} to the access list of the @sc{rcs} file.
-
-@item -b[@var{rev}]
-Set the default branch to @var{rev}. In @sc{cvs}, you
-normally do not manipulate default branches; sticky
-tags (@pxref{Sticky tags}) are a better way to decide
-which branch you want to work on. There is one reason
-to run @code{cvs admin -b}: to revert to the vendor's
-version when using vendor branches (@pxref{Reverting
-local changes}).
-There can be no space between @samp{-b} and its argument.
-@c Hmm, we don't document the usage where rev is
-@c omitted. Maybe that usage can/should be deprecated
-@c (and replaced with -bHEAD or something?) (so we can toss
-@c the optional argument). Note that -bHEAD does not
-@c work, as of 17 Sep 1997, but probably will once "cvs
-@c admin" is internal to CVS.
-
-@cindex Comment leader
-@item -c@var{string}
-Sets the comment leader to @var{string}. The comment
-leader is not used by current versions of @sc{cvs} or
-@sc{rcs} 5.7. Therefore, you can almost surely not
-worry about it. See @ref{Keyword substitution}.
-
-@item -e[@var{logins}]
-Might not work together with @sc{cvs}. Erase the login
-names appearing in the comma-separated list
-@var{logins} from the access list of the RCS file. If
-@var{logins} is omitted, erase the entire access list.
-There can be no space between @samp{-e} and its argument.
-
-@item -I
-Run interactively, even if the standard input is not a
-terminal. This option does not work with the
-client/server @sc{cvs} and is likely to disappear in
-a future release of @sc{cvs}.
-
-@item -i
-Useless with @sc{cvs}. This creates and initializes a
-new @sc{rcs} file, without depositing a revision. With
-@sc{cvs}, add files with the @code{cvs add} command
-(@pxref{Adding files}).
-
-@item -k@var{subst}
-Set the default keyword
-substitution to @var{subst}. See @ref{Keyword
-substitution}. Giving an explicit @samp{-k} option to
-@code{cvs update}, @code{cvs export}, or @code{cvs
-checkout} overrides this default.
-
-@item -l[@var{rev}]
-Lock the revision with number @var{rev}. If a branch
-is given, lock the latest revision on that branch. If
-@var{rev} is omitted, lock the latest revision on the
-default branch. There can be no space between
-@samp{-l} and its argument.
-
-This can be used in conjunction with the
-@file{rcslock.pl} script in the @file{contrib}
-directory of the @sc{cvs} source distribution to
-provide reserved checkouts (where only one user can be
-editing a given file at a time). See the comments in
-that file for details (and see the @file{README} file
-in that directory for disclaimers about the unsupported
-nature of contrib). According to comments in that
-file, locking must set to strict (which is the default).
-
-@item -L
-Set locking to strict. Strict locking means that the
-owner of an RCS file is not exempt from locking for
-checkin. For use with @sc{cvs}, strict locking must be
-set; see the discussion under the @samp{-l} option above.
-
-@cindex Changing a log message
-@cindex Replacing a log message
-@cindex Correcting a log message
-@cindex Fixing a log message
-@cindex Log message, correcting
-@item -m@var{rev}:@var{msg}
-Replace the log message of revision @var{rev} with
-@var{msg}.
-
-@c The rcs -M option, to suppress sending mail, has never been
-@c documented as a cvs admin option.
-
-@item -N@var{name}[:[@var{rev}]]
-Act like @samp{-n}, except override any previous
-assignment of @var{name}. For use with magic branches,
-see @ref{Magic branch numbers}.
-
-@item -n@var{name}[:[@var{rev}]]
-Associate the symbolic name @var{name} with the branch
-or revision @var{rev}. It is normally better to use
-@samp{cvs tag} or @samp{cvs rtag} instead. Delete the
-symbolic name if both @samp{:} and @var{rev} are
-omitted; otherwise, print an error message if
-@var{name} is already associated with another number.
-If @var{rev} is symbolic, it is expanded before
-association. A @var{rev} consisting of a branch number
-followed by a @samp{.} stands for the current latest
-revision in the branch. A @samp{:} with an empty
-@var{rev} stands for the current latest revision on the
-default branch, normally the trunk. For example,
-@samp{cvs admin -n@var{name}:} associates @var{name} with the
-current latest revision of all the RCS files;
-this contrasts with @samp{cvs admin -n@var{name}:$} which
-associates @var{name} with the revision numbers
-extracted from keyword strings in the corresponding
-working files.
-
-@cindex Deleting revisions
-@cindex Outdating revisions
-@cindex Saving space
-@item -o@var{range}
-Deletes (@dfn{outdates}) the revisions given by
-@var{range}.
-
-Note that this command can be quite dangerous unless
-you know @emph{exactly} what you are doing (for example
-see the warnings below about how the
-@var{rev1}:@var{rev2} syntax is confusing).
-
-If you are short on disc this option might help you.
-But think twice before using it---there is no way short
-of restoring the latest backup to undo this command!
-If you delete different revisions than you planned,
-either due to carelessness or (heaven forbid) a @sc{cvs}
-bug, there is no opportunity to correct the error
-before the revisions are deleted. It probably would be
-a good idea to experiment on a copy of the repository
-first.
-
-Specify @var{range} in one of the following ways:
-
-@table @code
-@item @var{rev1}::@var{rev2}
-Collapse all revisions between rev1 and rev2, so that
-@sc{cvs} only stores the differences associated with going
-from rev1 to rev2, not intermediate steps. For
-example, after @samp{-o 1.3::1.5} one can retrieve
-revision 1.3, revision 1.5, or the differences to get
-from 1.3 to 1.5, but not the revision 1.4, or the
-differences between 1.3 and 1.4. Other examples:
-@samp{-o 1.3::1.4} and @samp{-o 1.3::1.3} have no
-effect, because there are no intermediate revisions to
-remove.
-
-@item ::@var{rev}
-Collapse revisions between the beginning of the branch
-containing @var{rev} and @var{rev} itself. The
-branchpoint and @var{rev} are left intact. For
-example, @samp{-o ::1.3.2.6} deletes revision 1.3.2.1,
-revision 1.3.2.5, and everything in between, but leaves
-1.3 and 1.3.2.6 intact.
-
-@item @var{rev}::
-Collapse revisions between @var{rev} and the end of the
-branch containing @var{rev}. Revision @var{rev} is
-left intact but the head revision is deleted.
-
-@item @var{rev}
-Delete the revision @var{rev}. For example, @samp{-o
-1.3} is equivalent to @samp{-o 1.2::1.4}.
-
-@item @var{rev1}:@var{rev2}
-Delete the revisions from @var{rev1} to @var{rev2},
-inclusive, on the same branch. One will not be able to
-retrieve @var{rev1} or @var{rev2} or any of the
-revisions in between. For example, the command
-@samp{cvs admin -oR_1_01:R_1_02 .} is rarely useful.
-It means to delete revisions up to, and including, the
-tag R_1_02. But beware! If there are files that have not
-changed between R_1_02 and R_1_03 the file will have
-@emph{the same} numerical revision number assigned to
-the tags R_1_02 and R_1_03. So not only will it be
-impossible to retrieve R_1_02; R_1_03 will also have to
-be restored from the tapes! In most cases you want to
-specify @var{rev1}::@var{rev2} instead.
-
-@item :@var{rev}
-Delete revisions from the beginning of the
-branch containing @var{rev} up to and including
-@var{rev}.
-
-@item @var{rev}:
-Delete revisions from revision @var{rev}, including
-@var{rev} itself, to the end of the branch containing
-@var{rev}.
-@end table
-
-None of the revisions to be deleted may have
-branches or locks.
-
-If any of the revisions to be deleted have symbolic
-names, and one specifies one of the @samp{::} syntaxes,
-then @sc{cvs} will give an error and not delete any
-revisions. If you really want to delete both the
-symbolic names and the revisions, first delete the
-symbolic names with @code{cvs tag -d}, then run
-@code{cvs admin -o}. If one specifies the
-non-@samp{::} syntaxes, then @sc{cvs} will delete the
-revisions but leave the symbolic names pointing to
-nonexistent revisions. This behavior is preserved for
-compatibility with previous versions of @sc{cvs}, but
-because it isn't very useful, in the future it may
-change to be like the @samp{::} case.
-
-Due to the way @sc{cvs} handles branches @var{rev}
-cannot be specified symbolically if it is a branch.
-See @ref{Magic branch numbers} for an explanation.
-@c FIXME: is this still true? I suspect not.
-
-Make sure that no-one has checked out a copy of the
-revision you outdate. Strange things will happen if he
-starts to edit it and tries to check it back in. For
-this reason, this option is not a good way to take back
-a bogus commit; commit a new revision undoing the bogus
-change instead (@pxref{Merging two revisions}).
-
-@item -q
-Run quietly; do not print diagnostics.
-
-@item -s@var{state}[:@var{rev}]
-Useful with @sc{cvs}. Set the state attribute of the
-revision @var{rev} to @var{state}. If @var{rev} is a
-branch number, assume the latest revision on that
-branch. If @var{rev} is omitted, assume the latest
-revision on the default branch. Any identifier is
-acceptable for @var{state}. A useful set of states is
-@samp{Exp} (for experimental), @samp{Stab} (for
-stable), and @samp{Rel} (for released). By default,
-the state of a new revision is set to @samp{Exp} when
-it is created. The state is visible in the output from
-@var{cvs log} (@pxref{log}), and in the
-@samp{$@splitrcskeyword{Log}$} and @samp{$@splitrcskeyword{State}$} keywords
-(@pxref{Keyword substitution}). Note that @sc{cvs}
-uses the @code{dead} state for its own purposes (@pxref{Attic}); to
-take a file to or from the @code{dead} state use
-commands like @code{cvs remove} and @code{cvs add}
-(@pxref{Adding and removing}), not @code{cvs admin -s}.
-
-@item -t[@var{file}]
-Useful with @sc{cvs}. Write descriptive text from the
-contents of the named @var{file} into the RCS file,
-deleting the existing text. The @var{file} pathname
-may not begin with @samp{-}. The descriptive text can be seen in the
-output from @samp{cvs log} (@pxref{log}).
-There can be no space between @samp{-t} and its argument.
-
-If @var{file} is omitted,
-obtain the text from standard input, terminated by
-end-of-file or by a line containing @samp{.} by itself.
-Prompt for the text if interaction is possible; see
-@samp{-I}.
-
-@item -t-@var{string}
-Similar to @samp{-t@var{file}}. Write descriptive text
-from the @var{string} into the @sc{rcs} file, deleting
-the existing text.
-There can be no space between @samp{-t} and its argument.
-
-@c The rcs -T option, do not update last-mod time for
-@c minor changes, has never been documented as a
-@c cvs admin option.
-
-@item -U
-Set locking to non-strict. Non-strict locking means
-that the owner of a file need not lock a revision for
-checkin. For use with @sc{cvs}, strict locking must be
-set; see the discussion under the @samp{-l} option
-above.
-
-@item -u[@var{rev}]
-See the option @samp{-l} above, for a discussion of
-using this option with @sc{cvs}. Unlock the revision
-with number @var{rev}. If a branch is given, unlock
-the latest revision on that branch. If @var{rev} is
-omitted, remove the latest lock held by the caller.
-Normally, only the locker of a revision may unlock it;
-somebody else unlocking a revision breaks the lock.
-This causes the original locker to be sent a @code{commit}
-notification (@pxref{Getting Notified}).
-There can be no space between @samp{-u} and its argument.
-
-@item -V@var{n}
-In previous versions of @sc{cvs}, this option meant to
-write an @sc{rcs} file which would be acceptable to
-@sc{rcs} version @var{n}, but it is now obsolete and
-specifying it will produce an error.
-@c Note that -V without an argument has never been
-@c documented as a cvs admin option.
-
-@item -x@var{suffixes}
-In previous versions of @sc{cvs}, this was documented
-as a way of specifying the names of the @sc{rcs}
-files. However, @sc{cvs} has always required that the
-@sc{rcs} files used by @sc{cvs} end in @samp{,v}, so
-this option has never done anything useful.
-
-@c The rcs -z option, to specify the timezone, has
-@c never been documented as a cvs admin option.
-@end table
-
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node annotate
-@appendixsec annotate---What revision modified each line of a file?
-@cindex annotate (subcommand)
-
-@itemize @bullet
-@item
-Synopsis: annotate [options] files@dots{}
-@item
-Requires: repository.
-@item
-Synonym: blame
-@item
-Changes: nothing.
-@end itemize
-
-For each file in @var{files}, print the head revision
-of the trunk, together with information on the last
-modification for each line.
-
-@menu
-* annotate options:: annotate options
-* annotate example:: annotate example
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node annotate options
-@appendixsubsec annotate options
-
-These standard options are supported by @code{annotate}
-(@pxref{Common options} for a complete description of
-them):
-
-@table @code
-@item -l
-Local directory only, no recursion.
-
-@item -R
-Process directories recursively.
-
-@item -f
-Use head revision if tag/date not found.
-
-@item -F
-Annotate binary files.
-
-@item -r @var{revision}
-Annotate file as of specified revision/tag.
-
-@item -D @var{date}
-Annotate file as of specified date.
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node annotate example
-@appendixsubsec annotate example
-
-For example:
-
-@example
-$ cvs annotate ssfile
-Annotations for ssfile
-***************
-1.1 (mary 27-Mar-96): ssfile line 1
-1.2 (joe 28-Mar-96): ssfile line 2
-@end example
-
-The file @file{ssfile} currently contains two lines.
-The @code{ssfile line 1} line was checked in by
-@code{mary} on March 27. Then, on March 28, @code{joe}
-added a line @code{ssfile line 2}, without modifying
-the @code{ssfile line 1} line. This report doesn't
-tell you anything about lines which have been deleted
-or replaced; you need to use @code{cvs diff} for that
-(@pxref{diff}).
-
-The options to @code{cvs annotate} are listed in
-@ref{Invoking CVS}, and can be used to select the files
-and revisions to annotate. The options are described
-in more detail there and in @ref{Common options}.
-
-@c FIXME: maybe an example using the options? Just
-@c what it means to select a revision might be worth a
-@c few words of explanation ("you want to see who
-@c changed this line *before* 1.4"...).
-
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node checkout
-@appendixsec checkout---Check out sources for editing
-@cindex checkout (subcommand)
-@cindex co (subcommand)
-
-@itemize @bullet
-@item
-Synopsis: checkout [options] modules@dots{}
-@item
-Requires: repository.
-@item
-Changes: working directory.
-@item
-Synonyms: co, get
-@end itemize
-
-Create or update a working directory containing copies of the
-source files specified by @var{modules}. You must execute
-@code{checkout} before using most of the other @sc{cvs}
-commands, since most of them operate on your working
-directory.
-
-The @var{modules} are either
-symbolic names for some
-collection of source directories and files, or paths to
-directories or files in the repository. The symbolic
-names are defined in the @samp{modules} file.
-See @ref{modules}.
-@c Needs an example, particularly of the non-"modules"
-@c case but probably of both.
-
-@c FIXME: this seems like a very odd place to introduce
-@c people to how CVS works. The bit about unreserved
-@c checkouts is also misleading as it depends on how
-@c things are set up.
-Depending on the modules you specify, @code{checkout} may
-recursively create directories and populate them with
-the appropriate source files. You can then edit these
-source files at any time (regardless of whether other
-software developers are editing their own copies of the
-sources); update them to include new changes applied by
-others to the source repository; or commit your work as
-a permanent change to the source repository.
-
-Note that @code{checkout} is used to create
-directories. The top-level directory created is always
-added to the directory where @code{checkout} is
-invoked, and usually has the same name as the specified
-module. In the case of a module alias, the created
-sub-directory may have a different name, but you can be
-sure that it will be a sub-directory, and that
-@code{checkout} will show the relative path leading to
-each file as it is extracted into your private work
-area (unless you specify the @samp{-Q} global option).
-
-The files created by @code{checkout} are created
-read-write, unless the @samp{-r} option to @sc{cvs}
-(@pxref{Global options}) is specified, the
-@code{CVSREAD} environment variable is specified
-(@pxref{Environment variables}), or a watch is in
-effect for that file (@pxref{Watches}).
-
-Note that running @code{checkout} on a directory that was already
-built by a prior @code{checkout} is also permitted.
-This is similar to specifying the @samp{-d} option
-to the @code{update} command in the sense that new
-directories that have been created in the repository
-will appear in your work area.
-However, @code{checkout} takes a module name whereas
-@code{update} takes a directory name. Also
-to use @code{checkout} this way it must be run from the
-top level directory (where you originally ran
-@code{checkout} from), so before you run
-@code{checkout} to update an existing directory, don't
-forget to change your directory to the top level
-directory.
-
-For the output produced by the @code{checkout} command,
-@xref{update output}.
-
-@menu
-* checkout options:: checkout options
-* checkout examples:: checkout examples
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node checkout options
-@appendixsubsec checkout options
-
-These standard options are supported by @code{checkout}
-(@pxref{Common options} for a complete description of
-them):
-
-@table @code
-@item -D @var{date}
-Use the most recent revision no later than @var{date}.
-This option is sticky, and implies @samp{-P}. See
-@ref{Sticky tags} for more information on sticky tags/dates.
-
-@item -f
-Only useful with the @samp{-D @var{date}} or @samp{-r
-@var{tag}} flags. If no matching revision is found,
-retrieve the most recent revision (instead of ignoring
-the file).
-
-@item -k @var{kflag}
-Process keywords according to @var{kflag}. See
-@ref{Keyword substitution}.
-This option is sticky; future updates of
-this file in this working directory will use the same
-@var{kflag}. The @code{status} command can be viewed
-to see the sticky options. See @ref{Invoking CVS} for
-more information on the @code{status} command.
-
-@item -l
-Local; run only in current working directory.
-
-@item -n
-Do not run any checkout program (as specified
-with the @samp{-o} option in the modules file;
-@pxref{modules}).
-
-@item -P
-Prune empty directories. See @ref{Moving directories}.
-
-@item -p
-Pipe files to the standard output.
-
-@item -R
-Checkout directories recursively. This option is on by default.
-
-@item -r @var{tag}
-Use revision @var{tag}. This option is sticky, and implies @samp{-P}.
-See @ref{Sticky tags}, for more information on sticky tags/dates.
-@end table
-
-In addition to those, you can use these special command
-options with @code{checkout}:
-
-@table @code
-@item -A
-Reset any sticky tags, dates, or @samp{-k} options.
-Does not reset sticky @samp{-k} options on modified files.
-See @ref{Sticky tags} for more information on sticky tags/dates.
-
-@item -c
-Copy the module file, sorted, to the standard output,
-instead of creating or modifying any files or
-directories in your working directory.
-
-@item -d @var{dir}
-Create a directory called @var{dir} for the working
-files, instead of using the module name. In general,
-using this flag is equivalent to using @samp{mkdir
-@var{dir}; cd @var{dir}} followed by the checkout
-command without the @samp{-d} flag.
-
-There is an important exception, however. It is very
-convenient when checking out a single item to have the
-output appear in a directory that doesn't contain empty
-intermediate directories. In this case @emph{only},
-@sc{cvs} tries to ``shorten'' pathnames to avoid those empty
-directories.
-
-For example, given a module @samp{foo} that contains
-the file @samp{bar.c}, the command @samp{cvs co -d dir
-foo} will create directory @samp{dir} and place
-@samp{bar.c} inside. Similarly, given a module
-@samp{bar} which has subdirectory @samp{baz} wherein
-there is a file @samp{quux.c}, the command @samp{cvs co
--d dir bar/baz} will create directory @samp{dir} and
-place @samp{quux.c} inside.
-
-Using the @samp{-N} flag will defeat this behavior.
-Given the same module definitions above, @samp{cvs co
--N -d dir foo} will create directories @samp{dir/foo}
-and place @samp{bar.c} inside, while @samp{cvs co -N -d
-dir bar/baz} will create directories @samp{dir/bar/baz}
-and place @samp{quux.c} inside.
-
-@item -j @var{tag}
-With two @samp{-j} options, merge changes from the
-revision specified with the first @samp{-j} option to
-the revision specified with the second @samp{j} option,
-into the working directory.
-
-With one @samp{-j} option, merge changes from the
-ancestor revision to the revision specified with the
-@samp{-j} option, into the working directory. The
-ancestor revision is the common ancestor of the
-revision which the working directory is based on, and
-the revision specified in the @samp{-j} option.
-
-In addition, each -j option can contain an optional
-date specification which, when used with branches, can
-limit the chosen revision to one within a specific
-date. An optional date is specified by adding a colon
-(:) to the tag:
-@samp{-j@var{Symbolic_Tag}:@var{Date_Specifier}}.
-
-See @ref{Branching and merging}.
-
-@item -N
-Only useful together with @samp{-d @var{dir}}. With
-this option, @sc{cvs} will not ``shorten'' module paths
-in your working directory when you check out a single
-module. See the @samp{-d} flag for examples and a
-discussion.
-
-@item -s
-Like @samp{-c}, but include the status of all modules,
-and sort it by the status string. See @ref{modules}, for
-info about the @samp{-s} option that is used inside the
-modules file to set the module status.
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node checkout examples
-@appendixsubsec checkout examples
-
-Get a copy of the module @samp{tc}:
-
-@example
-$ cvs checkout tc
-@end example
-
-Get a copy of the module @samp{tc} as it looked one day
-ago:
-
-@example
-$ cvs checkout -D yesterday tc
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node commit
-@appendixsec commit---Check files into the repository
-@cindex commit (subcommand)
-
-@itemize @bullet
-@item
-Synopsis: commit [-lRf] [-m 'log_message' |
--F file] [-r revision] [files@dots{}]
-@item
-Requires: working directory, repository.
-@item
-Changes: repository.
-@item
-Synonym: ci
-@end itemize
-
-Use @code{commit} when you want to incorporate changes
-from your working source files into the source
-repository.
-
-If you don't specify particular files to commit, all of
-the files in your working current directory are
-examined. @code{commit} is careful to change in the
-repository only those files that you have really
-changed. By default (or if you explicitly specify the
-@samp{-R} option), files in subdirectories are also
-examined and committed if they have changed; you can
-use the @samp{-l} option to limit @code{commit} to the
-current directory only.
-
-@code{commit} verifies that the selected files are up
-to date with the current revisions in the source
-repository; it will notify you, and exit without
-committing, if any of the specified files must be made
-current first with @code{update} (@pxref{update}).
-@code{commit} does not call the @code{update} command
-for you, but rather leaves that for you to do when the
-time is right.
-
-When all is well, an editor is invoked to allow you to
-enter a log message that will be written to one or more
-logging programs (@pxref{modules}, and @pxref{loginfo})
-and placed in the @sc{rcs} file inside the
-repository. This log message can be retrieved with the
-@code{log} command; @xref{log}. You can specify the
-log message on the command line with the @samp{-m
-@var{message}} option, and thus avoid the editor invocation,
-or use the @samp{-F @var{file}} option to specify
-that the argument file contains the log message.
-
-@menu
-* commit options:: commit options
-* commit examples:: commit examples
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node commit options
-@appendixsubsec commit options
-
-These standard options are supported by @code{commit}
-(@pxref{Common options} for a complete description of
-them):
-
-@table @code
-@item -l
-Local; run only in current working directory.
-
-@item -R
-Commit directories recursively. This is on by default.
-
-@item -r @var{revision}
-Commit to @var{revision}. @var{revision} must be
-either a branch, or a revision on the main trunk that
-is higher than any existing revision number
-(@pxref{Assigning revisions}). You
-cannot commit to a specific revision on a branch.
-@c FIXME: Need xref for branch case.
-@end table
-
-@code{commit} also supports these options:
-
-@table @code
-@item -F @var{file}
-Read the log message from @var{file}, instead
-of invoking an editor.
-
-@item -f
-Note that this is not the standard behavior of
-the @samp{-f} option as defined in @ref{Common options}.
-
-Force @sc{cvs} to commit a new revision even if you haven't
-made any changes to the file. If the current revision
-of @var{file} is 1.7, then the following two commands
-are equivalent:
-
-@example
-$ cvs commit -f @var{file}
-$ cvs commit -r 1.8 @var{file}
-@end example
-
-@c This is odd, but it's how CVS has worked for some
-@c time.
-The @samp{-f} option disables recursion (i.e., it
-implies @samp{-l}). To force @sc{cvs} to commit a new
-revision for all files in all subdirectories, you must
-use @samp{-f -R}.
-
-@item -m @var{message}
-Use @var{message} as the log message, instead of
-invoking an editor.
-@end table
-
-@need 2000
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node commit examples
-@appendixsubsec commit examples
-
-@c FIXME: this material wants to be somewhere
-@c in "Branching and merging".
-
-@appendixsubsubsec Committing to a branch
-
-You can commit to a branch revision (one that has an
-even number of dots) with the @samp{-r} option. To
-create a branch revision, use the @samp{-b} option
-of the @code{rtag} or @code{tag} commands
-(@pxref{Branching and merging}). Then, either @code{checkout} or
-@code{update} can be used to base your sources on the
-newly created branch. From that point on, all
-@code{commit} changes made within these working sources
-will be automatically added to a branch revision,
-thereby not disturbing main-line development in any
-way. For example, if you had to create a patch to the
-1.2 version of the product, even though the 2.0 version
-is already under development, you might do:
-
-@example
-$ cvs rtag -b -r FCS1_2 FCS1_2_Patch product_module
-$ cvs checkout -r FCS1_2_Patch product_module
-$ cd product_module
-[[ hack away ]]
-$ cvs commit
-@end example
-
-@noindent
-This works automatically since the @samp{-r} option is
-sticky.
-
-@appendixsubsubsec Creating the branch after editing
-
-Say you have been working on some extremely
-experimental software, based on whatever revision you
-happened to checkout last week. If others in your
-group would like to work on this software with you, but
-without disturbing main-line development, you could
-commit your change to a new branch. Others can then
-checkout your experimental stuff and utilize the full
-benefit of @sc{cvs} conflict resolution. The scenario might
-look like:
-
-@c FIXME: Should we be recommending tagging the branchpoint?
-@example
-[[ hacked sources are present ]]
-$ cvs tag -b EXPR1
-$ cvs update -r EXPR1
-$ cvs commit
-@end example
-
-The @code{update} command will make the @samp{-r
-EXPR1} option sticky on all files. Note that your
-changes to the files will never be removed by the
-@code{update} command. The @code{commit} will
-automatically commit to the correct branch, because the
-@samp{-r} is sticky. You could also do like this:
-
-@c FIXME: Should we be recommending tagging the branchpoint?
-@example
-[[ hacked sources are present ]]
-$ cvs tag -b EXPR1
-$ cvs commit -r EXPR1
-@end example
-
-@noindent
-but then, only those files that were changed by you
-will have the @samp{-r EXPR1} sticky flag. If you hack
-away, and commit without specifying the @samp{-r EXPR1}
-flag, some files may accidentally end up on the main
-trunk.
-
-To work with you on the experimental change, others
-would simply do
-
-@example
-$ cvs checkout -r EXPR1 whatever_module
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node diff
-@appendixsec diff---Show differences between revisions
-@cindex diff (subcommand)
-
-@itemize @bullet
-@item
-Synopsis: diff [-lR] [-k kflag] [format_options] [[-r rev1 | -D date1] [-r rev2 | -D date2]] [files@dots{}]
-@item
-Requires: working directory, repository.
-@item
-Changes: nothing.
-@end itemize
-
-The @code{diff} command is used to compare different
-revisions of files. The default action is to compare
-your working files with the revisions they were based
-on, and report any differences that are found.
-
-If any file names are given, only those files are
-compared. If any directories are given, all files
-under them will be compared.
-
-The exit status for diff is different than for other
-@sc{cvs} commands; for details @xref{Exit status}.
-
-@menu
-* diff options:: diff options
-* diff examples:: diff examples
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node diff options
-@appendixsubsec diff options
-
-These standard options are supported by @code{diff}
-(@pxref{Common options} for a complete description of
-them):
-
-@table @code
-@item -D @var{date}
-Use the most recent revision no later than @var{date}.
-See @samp{-r} for how this affects the comparison.
-
-@item -k @var{kflag}
-Process keywords according to @var{kflag}. See
-@ref{Keyword substitution}.
-
-@item -l
-Local; run only in current working directory.
-
-@item -R
-Examine directories recursively. This option is on by
-default.
-
-@item -r @var{tag}
-Compare with revision @var{tag}. Zero, one or two
-@samp{-r} options can be present. With no @samp{-r}
-option, the working file will be compared with the
-revision it was based on. With one @samp{-r}, that
-revision will be compared to your current working file.
-With two @samp{-r} options those two revisions will be
-compared (and your working file will not affect the
-outcome in any way).
-@c We should be a lot more explicit, with examples,
-@c about the difference between "cvs diff" and "cvs
-@c diff -r HEAD". This often confuses new users.
-
-One or both @samp{-r} options can be replaced by a
-@samp{-D @var{date}} option, described above.
-@end table
-
-@c Conceptually, this is a disaster. There are 3
-@c zillion diff formats that we support via the diff
-@c library. It is not obvious to me that we should
-@c document them all. Maybe just the most common ones
-@c like -c and -u, and think about phasing out the
-@c obscure ones.
-@c FIXCVS: also should be a way to specify an external
-@c diff program (which can be different for different
-@c file types) and pass through
-@c arbitrary options, so that the user can do
-@c "--pass=-Z --pass=foo" or something even if CVS
-@c doesn't know about the "-Z foo" option to diff.
-@c This would fit nicely with deprecating/eliminating
-@c the obscure options of the diff library, because it
-@c would let people specify an external GNU diff if
-@c they are into that sort of thing.
-The following options specify the format of the
-output. They have the same meaning as in GNU diff.
-Most options have two equivalent names, one of which is a single letter
-preceded by @samp{-}, and the other of which is a long name preceded by
-@samp{--}.
-
-@table @samp
-@item -@var{lines}
-Show @var{lines} (an integer) lines of context. This option does not
-specify an output format by itself; it has no effect unless it is
-combined with @samp{-c} or @samp{-u}. This option is obsolete. For proper
-operation, @code{patch} typically needs at least two lines of context.
-
-@item -a
-Treat all files as text and compare them line-by-line, even if they
-do not seem to be text.
-
-@item -b
-Ignore trailing white space and consider all other sequences of one or
-more white space characters to be equivalent.
-
-@item -B
-Ignore changes that just insert or delete blank lines.
-
-@item --binary
-Read and write data in binary mode.
-
-@item --brief
-Report only whether the files differ, not the details of the
-differences.
-
-@item -c
-Use the context output format.
-
-@item -C @var{lines}
-@itemx --context@r{[}=@var{lines}@r{]}
-Use the context output format, showing @var{lines} (an integer) lines of
-context, or three if @var{lines} is not given.
-For proper operation, @code{patch} typically needs at least two lines of
-context.
-
-@item --changed-group-format=@var{format}
-Use @var{format} to output a line group containing differing lines from
-both files in if-then-else format. See @ref{Line group formats}.
-
-@item -d
-Change the algorithm to perhaps find a smaller set of changes. This makes
-@code{diff} slower (sometimes much slower).
-
-@item -e
-@itemx --ed
-Make output that is a valid @code{ed} script.
-
-@item --expand-tabs
-Expand tabs to spaces in the output, to preserve the alignment of tabs
-in the input files.
-
-@item -f
-Make output that looks vaguely like an @code{ed} script but has changes
-in the order they appear in the file.
-
-@item -F @var{regexp}
-In context and unified format, for each hunk of differences, show some
-of the last preceding line that matches @var{regexp}.
-
-@item --forward-ed
-Make output that looks vaguely like an @code{ed} script but has changes
-in the order they appear in the file.
-
-@item -H
-Use heuristics to speed handling of large files that have numerous
-scattered small changes.
-
-@item --horizon-lines=@var{lines}
-Do not discard the last @var{lines} lines of the common prefix
-and the first @var{lines} lines of the common suffix.
-
-@item -i
-Ignore changes in case; consider upper- and lower-case letters
-equivalent.
-
-@item -I @var{regexp}
-Ignore changes that just insert or delete lines that match @var{regexp}.
-
-@item --ifdef=@var{name}
-Make merged if-then-else output using @var{name}.
-
-@item --ignore-all-space
-Ignore white space when comparing lines.
-
-@item --ignore-blank-lines
-Ignore changes that just insert or delete blank lines.
-
-@item --ignore-case
-Ignore changes in case; consider upper- and lower-case to be the same.
-
-@item --ignore-matching-lines=@var{regexp}
-Ignore changes that just insert or delete lines that match @var{regexp}.
-
-@item --ignore-space-change
-Ignore trailing white space and consider all other sequences of one or
-more white space characters to be equivalent.
-
-@item --initial-tab
-Output a tab rather than a space before the text of a line in normal or
-context format. This causes the alignment of tabs in the line to look
-normal.
-
-@item -L @var{label}
-Use @var{label} instead of the file name in the context format
-and unified format headers.
-
-@item --label=@var{label}
-Use @var{label} instead of the file name in the context format
-and unified format headers.
-
-@item --left-column
-Print only the left column of two common lines in side by side format.
-
-@item --line-format=@var{format}
-Use @var{format} to output all input lines in if-then-else format.
-See @ref{Line formats}.
-
-@item --minimal
-Change the algorithm to perhaps find a smaller set of changes. This
-makes @code{diff} slower (sometimes much slower).
-
-@item -n
-Output RCS-format diffs; like @samp{-f} except that each command
-specifies the number of lines affected.
-
-@item -N
-@itemx --new-file
-In directory comparison, if a file is found in only one directory,
-treat it as present but empty in the other directory.
-
-@item --new-group-format=@var{format}
-Use @var{format} to output a group of lines taken from just the second
-file in if-then-else format. See @ref{Line group formats}.
-
-@item --new-line-format=@var{format}
-Use @var{format} to output a line taken from just the second file in
-if-then-else format. See @ref{Line formats}.
-
-@item --old-group-format=@var{format}
-Use @var{format} to output a group of lines taken from just the first
-file in if-then-else format. See @ref{Line group formats}.
-
-@item --old-line-format=@var{format}
-Use @var{format} to output a line taken from just the first file in
-if-then-else format. See @ref{Line formats}.
-
-@item -p
-Show which C function each change is in.
-
-@item --rcs
-Output RCS-format diffs; like @samp{-f} except that each command
-specifies the number of lines affected.
-
-@item --report-identical-files
-@itemx -s
-Report when two files are the same.
-
-@item --show-c-function
-Show which C function each change is in.
-
-@item --show-function-line=@var{regexp}
-In context and unified format, for each hunk of differences, show some
-of the last preceding line that matches @var{regexp}.
-
-@item --side-by-side
-Use the side by side output format.
-
-@item --speed-large-files
-Use heuristics to speed handling of large files that have numerous
-scattered small changes.
-
-@item --suppress-common-lines
-Do not print common lines in side by side format.
-
-@item -t
-Expand tabs to spaces in the output, to preserve the alignment of tabs
-in the input files.
-
-@item -T
-Output a tab rather than a space before the text of a line in normal or
-context format. This causes the alignment of tabs in the line to look
-normal.
-
-@item --text
-Treat all files as text and compare them line-by-line, even if they
-do not appear to be text.
-
-@item -u
-Use the unified output format.
-
-@item --unchanged-group-format=@var{format}
-Use @var{format} to output a group of common lines taken from both files
-in if-then-else format. @xref{Line group formats}.
-
-@item --unchanged-line-format=@var{format}
-Use @var{format} to output a line common to both files in if-then-else
-format. @xref{Line formats}.
-
-@item -U @var{lines}
-@itemx --unified@r{[}=@var{lines}@r{]}
-Use the unified output format, showing @var{lines} (an integer) lines of
-context, or three if @var{lines} is not given.
-For proper operation, @code{patch} typically needs at least two lines of
-context.
-
-@item -w
-Ignore white space when comparing lines.
-
-@item -W @var{columns}
-@itemx --width=@var{columns}
-Use an output width of @var{columns} in side by side format.
-
-@item -y
-Use the side by side output format.
-@end table
-
-@menu
-* Line group formats:: Line group formats
-* Line formats:: Line formats
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node Line group formats
-@appendixsubsubsec Line group formats
-
-Line group formats let you specify formats suitable for many
-applications that allow if-then-else input, including programming
-languages and text formatting languages. A line group format specifies
-the output format for a contiguous group of similar lines.
-
-For example, the following command compares the TeX file @file{myfile}
-with the original version from the repository,
-and outputs a merged file in which old regions are
-surrounded by @samp{\begin@{em@}}-@samp{\end@{em@}} lines, and new
-regions are surrounded by @samp{\begin@{bf@}}-@samp{\end@{bf@}} lines.
-
-@example
-cvs diff \
- --old-group-format='\begin@{em@}
-%<\end@{em@}
-' \
- --new-group-format='\begin@{bf@}
-%>\end@{bf@}
-' \
- myfile
-@end example
-
-The following command is equivalent to the above example, but it is a
-little more verbose, because it spells out the default line group formats.
-
-@example
-cvs diff \
- --old-group-format='\begin@{em@}
-%<\end@{em@}
-' \
- --new-group-format='\begin@{bf@}
-%>\end@{bf@}
-' \
- --unchanged-group-format='%=' \
- --changed-group-format='\begin@{em@}
-%<\end@{em@}
-\begin@{bf@}
-%>\end@{bf@}
-' \
- myfile
-@end example
-
-Here is a more advanced example, which outputs a diff listing with
-headers containing line numbers in a ``plain English'' style.
-
-@example
-cvs diff \
- --unchanged-group-format='' \
- --old-group-format='-------- %dn line%(n=1?:s) deleted at %df:
-%<' \
- --new-group-format='-------- %dN line%(N=1?:s) added after %de:
-%>' \
- --changed-group-format='-------- %dn line%(n=1?:s) changed at %df:
-%<-------- to:
-%>' \
- myfile
-@end example
-
-To specify a line group format, use one of the options
-listed below. You can specify up to four line group formats, one for
-each kind of line group. You should quote @var{format}, because it
-typically contains shell metacharacters.
-
-@table @samp
-@item --old-group-format=@var{format}
-These line groups are hunks containing only lines from the first file.
-The default old group format is the same as the changed group format if
-it is specified; otherwise it is a format that outputs the line group as-is.
-
-@item --new-group-format=@var{format}
-These line groups are hunks containing only lines from the second
-file. The default new group format is same as the changed group
-format if it is specified; otherwise it is a format that outputs the
-line group as-is.
-
-@item --changed-group-format=@var{format}
-These line groups are hunks containing lines from both files. The
-default changed group format is the concatenation of the old and new
-group formats.
-
-@item --unchanged-group-format=@var{format}
-These line groups contain lines common to both files. The default
-unchanged group format is a format that outputs the line group as-is.
-@end table
-
-In a line group format, ordinary characters represent themselves;
-conversion specifications start with @samp{%} and have one of the
-following forms.
-
-@table @samp
-@item %<
-stands for the lines from the first file, including the trailing newline.
-Each line is formatted according to the old line format (@pxref{Line formats}).
-
-@item %>
-stands for the lines from the second file, including the trailing newline.
-Each line is formatted according to the new line format.
-
-@item %=
-stands for the lines common to both files, including the trailing newline.
-Each line is formatted according to the unchanged line format.
-
-@item %%
-stands for @samp{%}.
-
-@item %c'@var{C}'
-where @var{C} is a single character, stands for @var{C}.
-@var{C} may not be a backslash or an apostrophe.
-For example, @samp{%c':'} stands for a colon, even inside
-the then-part of an if-then-else format, which a colon would
-normally terminate.
-
-@item %c'\@var{O}'
-where @var{O} is a string of 1, 2, or 3 octal digits,
-stands for the character with octal code @var{O}.
-For example, @samp{%c'\0'} stands for a null character.
-
-@item @var{F}@var{n}
-where @var{F} is a @code{printf} conversion specification and @var{n} is one
-of the following letters, stands for @var{n}'s value formatted with @var{F}.
-
-@table @samp
-@item e
-The line number of the line just before the group in the old file.
-
-@item f
-The line number of the first line in the group in the old file;
-equals @var{e} + 1.
-
-@item l
-The line number of the last line in the group in the old file.
-
-@item m
-The line number of the line just after the group in the old file;
-equals @var{l} + 1.
-
-@item n
-The number of lines in the group in the old file; equals @var{l} - @var{f} + 1.
-
-@item E, F, L, M, N
-Likewise, for lines in the new file.
-
-@end table
-
-The @code{printf} conversion specification can be @samp{%d},
-@samp{%o}, @samp{%x}, or @samp{%X}, specifying decimal, octal,
-lower case hexadecimal, or upper case hexadecimal output
-respectively. After the @samp{%} the following options can appear in
-sequence: a @samp{-} specifying left-justification; an integer
-specifying the minimum field width; and a period followed by an
-optional integer specifying the minimum number of digits.
-For example, @samp{%5dN} prints the number of new lines in the group
-in a field of width 5 characters, using the @code{printf} format @code{"%5d"}.
-
-@item (@var{A}=@var{B}?@var{T}:@var{E})
-If @var{A} equals @var{B} then @var{T} else @var{E}.
-@var{A} and @var{B} are each either a decimal constant
-or a single letter interpreted as above.
-This format spec is equivalent to @var{T} if
-@var{A}'s value equals @var{B}'s; otherwise it is equivalent to @var{E}.
-
-For example, @samp{%(N=0?no:%dN) line%(N=1?:s)} is equivalent to
-@samp{no lines} if @var{N} (the number of lines in the group in the
-new file) is 0, to @samp{1 line} if @var{N} is 1, and to @samp{%dN lines}
-otherwise.
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node Line formats
-@appendixsubsubsec Line formats
-
-Line formats control how each line taken from an input file is
-output as part of a line group in if-then-else format.
-
-For example, the following command outputs text with a one-column
-change indicator to the left of the text. The first column of output
-is @samp{-} for deleted lines, @samp{|} for added lines, and a space
-for unchanged lines. The formats contain newline characters where
-newlines are desired on output.
-
-@example
-cvs diff \
- --old-line-format='-%l
-' \
- --new-line-format='|%l
-' \
- --unchanged-line-format=' %l
-' \
- myfile
-@end example
-
-To specify a line format, use one of the following options. You should
-quote @var{format}, since it often contains shell metacharacters.
-
-@table @samp
-@item --old-line-format=@var{format}
-formats lines just from the first file.
-
-@item --new-line-format=@var{format}
-formats lines just from the second file.
-
-@item --unchanged-line-format=@var{format}
-formats lines common to both files.
-
-@item --line-format=@var{format}
-formats all lines; in effect, it sets all three above options simultaneously.
-@end table
-
-In a line format, ordinary characters represent themselves;
-conversion specifications start with @samp{%} and have one of the
-following forms.
-
-@table @samp
-@item %l
-stands for the contents of the line, not counting its trailing
-newline (if any). This format ignores whether the line is incomplete.
-
-@item %L
-stands for the contents of the line, including its trailing newline
-(if any). If a line is incomplete, this format preserves its
-incompleteness.
-
-@item %%
-stands for @samp{%}.
-
-@item %c'@var{C}'
-where @var{C} is a single character, stands for @var{C}.
-@var{C} may not be a backslash or an apostrophe.
-For example, @samp{%c':'} stands for a colon.
-
-@item %c'\@var{O}'
-where @var{O} is a string of 1, 2, or 3 octal digits,
-stands for the character with octal code @var{O}.
-For example, @samp{%c'\0'} stands for a null character.
-
-@item @var{F}n
-where @var{F} is a @code{printf} conversion specification,
-stands for the line number formatted with @var{F}.
-For example, @samp{%.5dn} prints the line number using the
-@code{printf} format @code{"%.5d"}. @xref{Line group formats}, for
-more about printf conversion specifications.
-
-@end table
-
-The default line format is @samp{%l} followed by a newline character.
-
-If the input contains tab characters and it is important that they line
-up on output, you should ensure that @samp{%l} or @samp{%L} in a line
-format is just after a tab stop (e.g.@: by preceding @samp{%l} or
-@samp{%L} with a tab character), or you should use the @samp{-t} or
-@samp{--expand-tabs} option.
-
-Taken together, the line and line group formats let you specify many
-different formats. For example, the following command uses a format
-similar to @code{diff}'s normal format. You can tailor this command
-to get fine control over @code{diff}'s output.
-
-@example
-cvs diff \
- --old-line-format='< %l
-' \
- --new-line-format='> %l
-' \
- --old-group-format='%df%(f=l?:,%dl)d%dE
-%<' \
- --new-group-format='%dea%dF%(F=L?:,%dL)
-%>' \
- --changed-group-format='%df%(f=l?:,%dl)c%dF%(F=L?:,%dL)
-%<---
-%>' \
- --unchanged-group-format='' \
- myfile
-@end example
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node diff examples
-@appendixsubsec diff examples
-
-The following line produces a Unidiff (@samp{-u} flag)
-between revision 1.14 and 1.19 of
-@file{backend.c}. Due to the @samp{-kk} flag no
-keywords are substituted, so differences that only depend
-on keyword substitution are ignored.
-
-@example
-$ cvs diff -kk -u -r 1.14 -r 1.19 backend.c
-@end example
-
-Suppose the experimental branch EXPR1 was based on a
-set of files tagged RELEASE_1_0. To see what has
-happened on that branch, the following can be used:
-
-@example
-$ cvs diff -r RELEASE_1_0 -r EXPR1
-@end example
-
-A command like this can be used to produce a context
-diff between two releases:
-
-@example
-$ cvs diff -c -r RELEASE_1_0 -r RELEASE_1_1 > diffs
-@end example
-
-If you are maintaining ChangeLogs, a command like the following
-just before you commit your changes may help you write
-the ChangeLog entry. All local modifications that have
-not yet been committed will be printed.
-
-@example
-$ cvs diff -u | less
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node export
-@appendixsec export---Export sources from CVS, similar to checkout
-@cindex export (subcommand)
-
-@itemize @bullet
-@item
-Synopsis: export [-flNnR] [-r rev|-D date] [-k subst] [-d dir] module@dots{}
-@item
-Requires: repository.
-@item
-Changes: current directory.
-@end itemize
-
-This command is a variant of @code{checkout}; use it
-when you want a copy of the source for module without
-the @sc{cvs} administrative directories. For example, you
-might use @code{export} to prepare source for shipment
-off-site. This command requires that you specify a
-date or tag (with @samp{-D} or @samp{-r}), so that you
-can count on reproducing the source you ship to others
-(and thus it always prunes empty directories).
-
-One often would like to use @samp{-kv} with @code{cvs
-export}. This causes any keywords to be
-expanded such that an import done at some other site
-will not lose the keyword revision information. But be
-aware that doesn't handle an export containing binary
-files correctly. Also be aware that after having used
-@samp{-kv}, one can no longer use the @code{ident}
-command (which is part of the @sc{rcs} suite---see
-ident(1)) which looks for keyword strings. If
-you want to be able to use @code{ident} you must not
-use @samp{-kv}.
-
-@menu
-* export options:: export options
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node export options
-@appendixsubsec export options
-
-These standard options are supported by @code{export}
-(@pxref{Common options}, for a complete description of
-them):
-
-@table @code
-@item -D @var{date}
-Use the most recent revision no later than @var{date}.
-
-@item -f
-If no matching revision is found, retrieve the most
-recent revision (instead of ignoring the file).
-
-@item -l
-Local; run only in current working directory.
-
-@item -n
-Do not run any checkout program.
-
-@item -R
-Export directories recursively. This is on by default.
-
-@item -r @var{tag}
-Use revision @var{tag}.
-@end table
-
-In addition, these options (that are common to
-@code{checkout} and @code{export}) are also supported:
-
-@table @code
-@item -d @var{dir}
-Create a directory called @var{dir} for the working
-files, instead of using the module name.
-See @ref{checkout options} for complete details on how
-@sc{cvs} handles this flag.
-
-@item -k @var{subst}
-Set keyword expansion mode (@pxref{Substitution modes}).
-
-@item -N
-Only useful together with @samp{-d @var{dir}}.
-See @ref{checkout options} for complete details on how
-@sc{cvs} handles this flag.
-@end table
-
-@ignore
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@c @node export examples
-@appendixsubsec export examples
-
-Contributed examples are gratefully accepted.
-@c -- Examples here!!
-@end ignore
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node history
-@appendixsec history---Show status of files and users
-@cindex history (subcommand)
-
-@itemize @bullet
-@item
-Synopsis: history [-report] [-flags] [-options args] [files@dots{}]
-@item
-Requires: the file @file{$CVSROOT/CVSROOT/history}
-@item
-Changes: nothing.
-@end itemize
-
-@sc{cvs} can keep a history file that tracks each use of the
-@code{checkout}, @code{commit}, @code{rtag},
-@code{update}, and @code{release} commands. You can
-use @code{history} to display this information in
-various formats.
-
-Logging must be enabled by creating the file
-@file{$CVSROOT/CVSROOT/history}.
-
-@strong{@code{history} uses @samp{-f}, @samp{-l},
-@samp{-n}, and @samp{-p} in ways that conflict with the
-normal use inside @sc{cvs} (@pxref{Common options}).}
-
-@menu
-* history options:: history options
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node history options
-@appendixsubsec history options
-
-Several options (shown above as @samp{-report}) control what
-kind of report is generated:
-
-@table @code
-@item -c
-Report on each time commit was used (i.e., each time
-the repository was modified).
-
-@item -e
-Everything (all record types). Equivalent to
-specifying @samp{-x} with all record types. Of course,
-@samp{-e} will also include record types which are
-added in a future version of @sc{cvs}; if you are
-writing a script which can only handle certain record
-types, you'll want to specify @samp{-x}.
-
-@item -m @var{module}
-Report on a particular module. (You can meaningfully
-use @samp{-m} more than once on the command line.)
-
-@item -o
-Report on checked-out modules. This is the default report type.
-
-@item -T
-Report on all tags.
-
-@item -x @var{type}
-Extract a particular set of record types @var{type} from the @sc{cvs}
-history. The types are indicated by single letters,
-which you may specify in combination.
-
-Certain commands have a single record type:
-
-@table @code
-@item F
-release
-@item O
-checkout
-@item E
-export
-@item T
-rtag
-@end table
-
-@noindent
-One of five record types may result from an update:
-
-@table @code
-@item C
-A merge was necessary but collisions were
-detected (requiring manual merging).
-@item G
-A merge was necessary and it succeeded.
-@item U
-A working file was copied from the repository.
-@item P
-A working file was patched to match the repository.
-@item W
-The working copy of a file was deleted during
-update (because it was gone from the repository).
-@end table
-
-@noindent
-One of three record types results from commit:
-
-@table @code
-@item A
-A file was added for the first time.
-@item M
-A file was modified.
-@item R
-A file was removed.
-@end table
-@end table
-
-The options shown as @samp{-flags} constrain or expand
-the report without requiring option arguments:
-
-@table @code
-@item -a
-Show data for all users (the default is to show data
-only for the user executing @code{history}).
-
-@item -l
-Show last modification only.
-
-@item -w
-Show only the records for modifications done from the
-same working directory where @code{history} is
-executing.
-@end table
-
-The options shown as @samp{-options @var{args}} constrain the report
-based on an argument:
-
-@table @code
-@item -b @var{str}
-Show data back to a record containing the string
-@var{str} in either the module name, the file name, or
-the repository path.
-
-@item -D @var{date}
-Show data since @var{date}. This is slightly different
-from the normal use of @samp{-D @var{date}}, which
-selects the newest revision older than @var{date}.
-
-@item -f @var{file}
-Show data for a particular file
-(you can specify several @samp{-f} options on the same command line).
-This is equivalent to specifying the file on the command line.
-
-@item -n @var{module}
-Show data for a particular module
-(you can specify several @samp{-n} options on the same command line).
-
-@item -p @var{repository}
-Show data for a particular source repository (you
-can specify several @samp{-p} options on the same command
-line).
-
-@item -r @var{rev}
-Show records referring to revisions since the revision
-or tag named @var{rev} appears in individual @sc{rcs}
-files. Each @sc{rcs} file is searched for the revision or
-tag.
-
-@item -t @var{tag}
-Show records since tag @var{tag} was last added to the
-history file. This differs from the @samp{-r} flag
-above in that it reads only the history file, not the
-@sc{rcs} files, and is much faster.
-
-@item -u @var{name}
-Show records for user @var{name}.
-
-@item -z @var{timezone}
-Show times in the selected records using the specified
-time zone instead of UTC.
-@end table
-
-@ignore
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@c @node history examples
-@appendixsubsec history examples
-
-Contributed examples will gratefully be accepted.
-@c -- Examples here!
-@end ignore
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node import
-@appendixsec import---Import sources into CVS, using vendor branches
-@cindex import (subcommand)
-
-@c FIXME: This node is way too long for one which has subnodes.
-
-@itemize @bullet
-@item
-Synopsis: import [-options] repository vendortag releasetag@dots{}
-@item
-Requires: Repository, source distribution directory.
-@item
-Changes: repository.
-@end itemize
-
-Use @code{import} to incorporate an entire source
-distribution from an outside source (e.g., a source
-vendor) into your source repository directory. You can
-use this command both for initial creation of a
-repository, and for wholesale updates to the module
-from the outside source. See @ref{Tracking sources} for
-a discussion on this subject.
-
-The @var{repository} argument gives a directory name
-(or a path to a directory) under the @sc{cvs} root directory
-for repositories; if the directory did not exist,
-import creates it.
-
-When you use import for updates to source that has been
-modified in your source repository (since a prior
-import), it will notify you of any files that conflict
-in the two branches of development; use @samp{checkout
--j} to reconcile the differences, as import instructs
-you to do.
-
-If @sc{cvs} decides a file should be ignored
-(@pxref{cvsignore}), it does not import it and prints
-@samp{I } followed by the filename (@pxref{import output} for a
-complete description of the output).
-
-If the file @file{$CVSROOT/CVSROOT/cvswrappers} exists,
-any file whose names match the specifications in that
-file will be treated as packages and the appropriate
-filtering will be performed on the file/directory
-before being imported. See @ref{Wrappers}.
-
-The outside source is saved in a first-level
-branch, by default 1.1.1. Updates are leaves of this
-branch; for example, files from the first imported
-collection of source will be revision 1.1.1.1, then
-files from the first imported update will be revision
-1.1.1.2, and so on.
-
-At least three arguments are required.
-@var{repository} is needed to identify the collection
-of source. @var{vendortag} is a tag for the entire
-branch (e.g., for 1.1.1). You must also specify at
-least one @var{releasetag} to uniquely identify the files at
-the leaves created each time you execute @code{import}. The
-@var{releasetag} should be new, not previously existing in the
-repository file, and uniquely identify the imported release,
-
-@c I'm not completely sure this belongs here. But
-@c we need to say it _somewhere_ reasonably obvious; it
-@c is a common misconception among people first learning CVS
-Note that @code{import} does @emph{not} change the
-directory in which you invoke it. In particular, it
-does not set up that directory as a @sc{cvs} working
-directory; if you want to work with the sources import
-them first and then check them out into a different
-directory (@pxref{Getting the source}).
-
-@menu
-* import options:: import options
-* import output:: import output
-* import examples:: import examples
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node import options
-@appendixsubsec import options
-
-This standard option is supported by @code{import}
-(@pxref{Common options} for a complete description):
-
-@table @code
-@item -m @var{message}
-Use @var{message} as log information, instead of
-invoking an editor.
-@end table
-
-There are the following additional special options.
-
-@table @code
-@item -b @var{branch}
-See @ref{Multiple vendor branches}.
-
-@item -k @var{subst}
-Indicate the keyword expansion mode desired. This
-setting will apply to all files created during the
-import, but not to any files that previously existed in
-the repository. See @ref{Substitution modes} for a
-list of valid @samp{-k} settings.
-
-@item -I @var{name}
-Specify file names that should be ignored during
-import. You can use this option repeatedly. To avoid
-ignoring any files at all (even those ignored by
-default), specify `-I !'.
-
-@var{name} can be a file name pattern of the same type
-that you can specify in the @file{.cvsignore} file.
-See @ref{cvsignore}.
-@c -- Is this really true?
-
-@item -W @var{spec}
-Specify file names that should be filtered during
-import. You can use this option repeatedly.
-
-@var{spec} can be a file name pattern of the same type
-that you can specify in the @file{.cvswrappers}
-file. @xref{Wrappers}.
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node import output
-@appendixsubsec import output
-
-@code{import} keeps you informed of its progress by printing a line
-for each file, preceded by one character indicating the status of the file:
-
-@table @code
-@item U @var{file}
-The file already exists in the repository and has not been locally
-modified; a new revision has been created (if necessary).
-
-@item N @var{file}
-The file is a new file which has been added to the repository.
-
-@item C @var{file}
-The file already exists in the repository but has been locally modified;
-you will have to merge the changes.
-
-@item I @var{file}
-The file is being ignored (@pxref{cvsignore}).
-
-@cindex Symbolic link, importing
-@cindex Link, symbolic, importing
-@c FIXME: also (somewhere else) probably
-@c should be documenting what happens if you "cvs add"
-@c a symbolic link. Also maybe what happens if
-@c you manually create symbolic links within the
-@c repository (? - not sure why we'd want to suggest
-@c doing that).
-@item L @var{file}
-The file is a symbolic link; @code{cvs import} ignores symbolic links.
-People periodically suggest that this behavior should
-be changed, but if there is a consensus on what it
-should be changed to, it doesn't seem to be apparent.
-(Various options in the @file{modules} file can be used
-to recreate symbolic links on checkout, update, etc.;
-@pxref{modules}.)
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node import examples
-@appendixsubsec import examples
-
-See @ref{Tracking sources}, and @ref{From files}.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node log
-@appendixsec log---Print out log information for files
-@cindex log (subcommand)
-
-@itemize @bullet
-@item
-Synopsis: log [options] [files@dots{}]
-@item
-Requires: repository, working directory.
-@item
-Changes: nothing.
-@end itemize
-
-Display log information for files. @code{log} used to
-call the @sc{rcs} utility @code{rlog}. Although this
-is no longer true in the current sources, this history
-determines the format of the output and the options,
-which are not quite in the style of the other @sc{cvs}
-commands.
-
-@cindex Timezone, in output
-@cindex Zone, time, in output
-@c Kind of a funny place to document the timezone used
-@c in output from commands other than @code{log}.
-@c There is also more we need to say about this,
-@c including what happens in a client/server environment.
-The output includes the location of the @sc{rcs} file,
-the @dfn{head} revision (the latest revision on the
-trunk), all symbolic names (tags) and some other
-things. For each revision, the revision number, the
-author, the number of lines added/deleted and the log
-message are printed. All times are displayed in
-Coordinated Universal Time (UTC). (Other parts of
-@sc{cvs} print times in the local timezone).
-@c FIXCVS: need a better way to control the timezone
-@c used in output. Previous/current versions of CVS did/do
-@c sometimes support -z in RCSINIT, and/or an
-@c undocumented (except by reference to 'rlog') -z option
-@c to cvs log, but this has not been a consistent,
-@c documented feature. Perhaps a new global option,
-@c where LT means the client's timezone, which the
-@c client then communicates to the server, is the
-@c right solution.
-
-@strong{@code{log} uses @samp{-R} in a way that conflicts
-with the normal use inside @sc{cvs} (@pxref{Common options}).}
-
-@menu
-* log options:: log options
-* log examples:: log examples
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node log options
-@appendixsubsec log options
-
-By default, @code{log} prints all information that is
-available. All other options restrict the output. Note that the revision
-selection options (@code{-b}, @code{-d}, @code{-r}, @code{-s}, and @code{-w})
-have no
-effect, other than possibly causing a search for files in Attic directories,
-when used in conjunction with the options that restrict the output to only
-@code{log} header fields (@code{-h}, @code{-R}, and @code{-t})
-unless the @code{-S} option is also specified.
-
-@table @code
-@item -b
-Print information about the revisions on the default
-branch, normally the highest branch on the trunk.
-
-@item -d @var{dates}
-Print information about revisions with a checkin
-date/time in the range given by the
-semicolon-separated list of dates. The date formats
-accepted are those accepted by the @samp{-D} option to
-many other @sc{cvs} commands (@pxref{Common options}).
-Dates can be combined into ranges as follows:
-
-@c Should we be thinking about accepting ISO8601
-@c ranges? For example "1972-09-10/1972-09-12".
-@table @code
-@item @var{d1}<@var{d2}
-@itemx @var{d2}>@var{d1}
-Select the revisions that were deposited between
-@var{d1} and @var{d2}.
-
-@item <@var{d}
-@itemx @var{d}>
-Select all revisions dated @var{d} or earlier.
-
-@item @var{d}<
-@itemx >@var{d}
-Select all revisions dated @var{d} or later.
-
-@item @var{d}
-Select the single, latest revision dated @var{d} or
-earlier.
-@end table
-
-The @samp{>} or @samp{<} characters may be followed by
-@samp{=} to indicate an inclusive range rather than an
-exclusive one.
-
-Note that the separator is a semicolon (;).
-
-@item -h
-Print only the name of the @sc{rcs} file, name
-of the file in the working directory, head,
-default branch, access list, locks, symbolic names, and
-suffix.
-
-@item -l
-Local; run only in current working directory. (Default
-is to run recursively).
-
-@item -N
-Do not print the list of tags for this file. This
-option can be very useful when your site uses a lot of
-tags, so rather than "more"'ing over 3 pages of tag
-information, the log information is presented without
-tags at all.
-
-@item -n
-Print the list of tags for this file. This option can
-be very useful when your @file{.cvsrc} file has a
-@samp{log -N} entry as a way to get a full list of all
-of the tags.
-
-@item -R
-Print only the name of the @sc{rcs} file.
-
-@c Note that using a bare revision (in addition to not
-@c being explicitly documented here) is potentially
-@c confusing; it shows the log message to get from the
-@c previous revision to that revision. "-r1.3 -r1.6"
-@c (equivalent to "-r1.3,1.6") is even worse; it
-@c prints the messages to get from 1.2 to 1.3 and 1.5
-@c to 1.6. By analogy with "cvs diff", users might
-@c expect that it is more like specifying a range.
-@c It is not 100% clear to me how much of this should
-@c be documented (for example, multiple -r options
-@c perhaps could/should be deprecated given the false
-@c analogy with "cvs diff").
-@c In general, this section should be rewritten to talk
-@c about messages to get from revision rev1 to rev2,
-@c rather than messages for revision rev2 (that is, the
-@c messages are associated with a change not a static
-@c revision and failing to make this distinction causes
-@c much confusion).
-@item -r@var{revisions}
-Print information about revisions given in the
-comma-separated list @var{revisions} of revisions and
-ranges. The following table explains the available
-range formats:
-
-@table @code
-@item @var{rev1}:@var{rev2}
-Revisions @var{rev1} to @var{rev2} (which must be on
-the same branch).
-
-@item @var{rev1}::@var{rev2}
-The same, but excluding @var{rev1}.
-
-@item :@var{rev}
-@itemx ::@var{rev}
-Revisions from the beginning of the branch up to
-and including @var{rev}.
-
-@item @var{rev}:
-Revisions starting with @var{rev} to the end of the
-branch containing @var{rev}.
-
-@item @var{rev}::
-Revisions starting just after @var{rev} to the end of the
-branch containing @var{rev}.
-
-@item @var{branch}
-An argument that is a branch means all revisions on
-that branch.
-
-@item @var{branch1}:@var{branch2}
-@itemx @var{branch1}::@var{branch2}
-A range of branches means all revisions
-on the branches in that range.
-
-@item @var{branch}.
-The latest revision in @var{branch}.
-@end table
-
-A bare @samp{-r} with no revisions means the latest
-revision on the default branch, normally the trunk.
-There can be no space between the @samp{-r} option and
-its argument.
-
-@item -S
-Suppress the header if no revisions are selected.
-
-@item -s @var{states}
-Print information about revisions whose state
-attributes match one of the states given in the
-comma-separated list @var{states}. Individual states may
-be any text string, though @sc{cvs} commonly only uses two
-states, @samp{Exp} and @samp{dead}. See @ref{admin options}
-for more information.
-
-@item -t
-Print the same as @samp{-h}, plus the descriptive text.
-
-@item -w@var{logins}
-Print information about revisions checked in by users
-with login names appearing in the comma-separated list
-@var{logins}. If @var{logins} is omitted, the user's
-login is assumed. There can be no space between the
-@samp{-w} option and its argument.
-@end table
-
-@code{log} prints the intersection of the revisions
-selected with the options @samp{-d}, @samp{-s}, and
-@samp{-w}, intersected with the union of the revisions
-selected by @samp{-b} and @samp{-r}.
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node log examples
-@appendixsubsec log examples
-
-Contributed examples are gratefully accepted.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node rdiff
-@appendixsec rdiff---'patch' format diffs between releases
-@cindex rdiff (subcommand)
-
-@itemize @bullet
-@item
-rdiff [-flags] [-V vn] [-r t|-D d [-r t2|-D d2]] modules@dots{}
-@item
-Requires: repository.
-@item
-Changes: nothing.
-@item
-Synonym: patch
-@end itemize
-
-Builds a Larry Wall format patch(1) file between two
-releases, that can be fed directly into the @code{patch}
-program to bring an old release up-to-date with the new
-release. (This is one of the few @sc{cvs} commands that
-operates directly from the repository, and doesn't
-require a prior checkout.) The diff output is sent to
-the standard output device.
-
-You can specify (using the standard @samp{-r} and
-@samp{-D} options) any combination of one or two
-revisions or dates. If only one revision or date is
-specified, the patch file reflects differences between
-that revision or date and the current head revisions in
-the @sc{rcs} file.
-
-Note that if the software release affected is contained
-in more than one directory, then it may be necessary to
-specify the @samp{-p} option to the @code{patch} command when
-patching the old sources, so that @code{patch} is able to find
-the files that are located in other directories.
-
-@menu
-* rdiff options:: rdiff options
-* rdiff examples:: rdiff examples
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node rdiff options
-@appendixsubsec rdiff options
-
-These standard options are supported by @code{rdiff}
-(@pxref{Common options} for a complete description of
-them):
-
-@table @code
-@item -D @var{date}
-Use the most recent revision no later than @var{date}.
-
-@item -f
-If no matching revision is found, retrieve the most
-recent revision (instead of ignoring the file).
-
-@item -k @var{kflag}
-Process keywords according to @var{kflag}. See
-@ref{Keyword substitution}.
-
-@item -l
-Local; don't descend subdirectories.
-
-@item -R
-Examine directories recursively. This option is on by default.
-
-@item -r @var{tag}
-Use revision @var{tag}.
-@end table
-
-In addition to the above, these options are available:
-
-@table @code
-@item -c
-Use the context diff format. This is the default format.
-
-@item -s
-Create a summary change report instead of a patch. The
-summary includes information about files that were
-changed or added between the releases. It is sent to
-the standard output device. This is useful for finding
-out, for example, which files have changed between two
-dates or revisions.
-
-@item -t
-A diff of the top two revisions is sent to the standard
-output device. This is most useful for seeing what the
-last change to a file was.
-
-@item -u
-Use the unidiff format for the context diffs.
-Remember that old versions
-of the @code{patch} program can't handle the unidiff
-format, so if you plan to post this patch to the net
-you should probably not use @samp{-u}.
-
-@item -V @var{vn}
-Expand keywords according to the rules current in
-@sc{rcs} version @var{vn} (the expansion format changed with
-@sc{rcs} version 5). Note that this option is no
-longer accepted. @sc{cvs} will always expand keywords the
-way that @sc{rcs} version 5 does.
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node rdiff examples
-@appendixsubsec rdiff examples
-
-Suppose you receive mail from @t{foo@@example.net} asking for an
-update from release 1.2 to 1.4 of the tc compiler. You
-have no such patches on hand, but with @sc{cvs} that can
-easily be fixed with a command such as this:
-
-@example
-$ cvs rdiff -c -r FOO1_2 -r FOO1_4 tc | \
-> Mail -s 'The patches you asked for' foo@@example.net
-@end example
-
-Suppose you have made release 1.3, and forked a branch
-called @samp{R_1_3fix} for bug fixes. @samp{R_1_3_1}
-corresponds to release 1.3.1, which was made some time
-ago. Now, you want to see how much development has been
-done on the branch. This command can be used:
-
-@example
-$ cvs patch -s -r R_1_3_1 -r R_1_3fix module-name
-cvs rdiff: Diffing module-name
-File ChangeLog,v changed from revision 1.52.2.5 to 1.52.2.6
-File foo.c,v changed from revision 1.52.2.3 to 1.52.2.4
-File bar.h,v changed from revision 1.29.2.1 to 1.2
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node release
-@appendixsec release---Indicate that a Module is no longer in use
-@cindex release (subcommand)
-
-@itemize @bullet
-@item
-release [-d] directories@dots{}
-@item
-Requires: Working directory.
-@item
-Changes: Working directory, history log.
-@end itemize
-
-This command is meant to safely cancel the effect of
-@samp{cvs checkout}. Since @sc{cvs} doesn't lock files, it
-isn't strictly necessary to use this command. You can
-always simply delete your working directory, if you
-like; but you risk losing changes you may have
-forgotten, and you leave no trace in the @sc{cvs} history
-file (@pxref{history file}) that you've abandoned your
-checkout.
-
-Use @samp{cvs release} to avoid these problems. This
-command checks that no uncommitted changes are
-present; that you are executing it from immediately
-above a @sc{cvs} working directory; and that the repository
-recorded for your files is the same as the repository
-defined in the module database.
-
-If all these conditions are true, @samp{cvs release}
-leaves a record of its execution (attesting to your
-intentionally abandoning your checkout) in the @sc{cvs}
-history log.
-
-@menu
-* release options:: release options
-* release output:: release output
-* release examples:: release examples
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node release options
-@appendixsubsec release options
-
-The @code{release} command supports one command option:
-
-@table @code
-@item -d
-Delete your working copy of the file if the release
-succeeds. If this flag is not given your files will
-remain in your working directory.
-
-@strong{WARNING: The @code{release} command deletes
-all directories and files recursively. This
-has the very serious side-effect that any directory
-created inside checked-out sources, and not added to
-the repository (using the @code{add} command;
-@pxref{Adding files}) will be silently deleted---even
-if it is non-empty!}
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node release output
-@appendixsubsec release output
-
-Before @code{release} releases your sources it will
-print a one-line message for any file that is not
-up-to-date.
-
-@table @code
-@item U @var{file}
-@itemx P @var{file}
-There exists a newer revision of this file in the
-repository, and you have not modified your local copy
-of the file (@samp{U} and @samp{P} mean the same thing).
-
-@item A @var{file}
-The file has been added to your private copy of the
-sources, but has not yet been committed to the
-repository. If you delete your copy of the sources
-this file will be lost.
-
-@item R @var{file}
-The file has been removed from your private copy of the
-sources, but has not yet been removed from the
-repository, since you have not yet committed the
-removal. See @ref{commit}.
-
-@item M @var{file}
-The file is modified in your working directory. There
-might also be a newer revision inside the repository.
-
-@item ? @var{file}
-@var{file} is in your working directory, but does not
-correspond to anything in the source repository, and is
-not in the list of files for @sc{cvs} to ignore (see the
-description of the @samp{-I} option, and
-@pxref{cvsignore}). If you remove your working
-sources, this file will be lost.
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node release examples
-@appendixsubsec release examples
-
-Release the @file{tc} directory, and delete your local working copy
-of the files.
-
-@example
-$ cd .. # @r{You must stand immediately above the}
- # @r{sources when you issue @samp{cvs release}.}
-$ cvs release -d tc
-You have [0] altered files in this repository.
-Are you sure you want to release (and delete) directory `tc': y
-$
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node remove
-@appendixsec remove---Remove files from active use
-@cindex remove (subcommand)
-
-@itemize @bullet
-@item
-Synopsis: remove [-flR] [files...]
-@item
-Requires: repository, working directory.
-@item
-Changes: working directory.
-@end itemize
-
-The @code{remove} command is used to remove unwanted
-files from active use. The user normally deletes the
-files from the working directory prior to invocation
-of the @code{remove} command. Only the working
-directory is updated. Changes to the repository are
-not made until the @code{commit} command is run.
-
-The @code{remove} command does not delete files from
-from the repository. @sc{cvs} keeps all historical
-data in the repository so that it is possible to
-reconstruct previous states of the projects under
-revision control.
-
-To undo @sc{cvs} @code{remove} or to resurrect files
-that were previously removed, @xref{add}.
-
-@menu
-* remove options:: remove options
-* remove examples:: remove examples
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node remove options
-@appendixsubsec remove options
-
-These standard options are supported by @code{remove}
-(@pxref{Common options} for a complete description of
-them):
-
-@table @code
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -R
-Process directories recursively. See @ref{Recursive behavior}.
-
-@end table
-
-In addition, these options are also supported:
-
-@table @code
-@item -f
-Note that this is not the standard behavior of
-the @samp{-f} option as defined in @ref{Common options}.
-
-Delete files before removing them.
-
-Entire directory hierarchies are easily removed
-using @samp{-f}, but take note that it is not as
-easy to resurrect directory hierarchies as it is
-to remove them.
-
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node remove examples
-@appendixsubsec remove examples
-
-@appendixsubsubsec Removing a file
-
-@example
-$ cvs remove remove.me
-cvs remove: file `remove.me' still in working directory
-cvs remove: 1 file exists; remove it first
-$ rm -f remove.me
-$ cvs remove remove.me
-cvs remove: scheduling `remove.me' for removal
-cvs remove: use 'cvs commit' to remove this file permanently
-
-$ ls remove.it
-remove.it
-$ cvs remove -f remove.it
-cvs remove: scheduling `remove.it' for removal
-cvs remove: use 'cvs commit' to remove this file permanently
-@end example
-
-@appendixsubsubsec Removing entire directories
-@example
-$ tree -d a
-a
-|-- CVS
-`-- b
- `-- CVS
-
-3 directories
-$ cvs remove -f a
-cvs remove: Removing a
-cvs remove: Removing a/b
-cvs remove: scheduling `a/b/c' for removal
-cvs remove: use 'cvs commit' to remove this file permanently
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node update
-@appendixsec update---Bring work tree in sync with repository
-@cindex update (subcommand)
-
-@itemize @bullet
-@item
-update [-ACdflPpR] [-I name] [-j rev [-j rev]] [-k kflag] [-r tag|-D date] [-W spec] files@dots{}
-@item
-Requires: repository, working directory.
-@item
-Changes: working directory.
-@end itemize
-
-After you've run checkout to create your private copy
-of source from the common repository, other developers
-will continue changing the central source. From time
-to time, when it is convenient in your development
-process, you can use the @code{update} command from
-within your working directory to reconcile your work
-with any revisions applied to the source repository
-since your last checkout or update.
-
-@menu
-* update options:: update options
-* update output:: update output
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node update options
-@appendixsubsec update options
-
-These standard options are available with @code{update}
-(@pxref{Common options} for a complete description of
-them):
-
-@table @code
-@item -D date
-Use the most recent revision no later than @var{date}.
-This option is sticky, and implies @samp{-P}.
-See @ref{Sticky tags} for more information on sticky tags/dates.
-
-@item -f
-Only useful with the @samp{-D @var{date}} or @samp{-r
-@var{tag}} flags. If no matching revision is found,
-retrieve the most recent revision (instead of ignoring
-the file).
-
-@item -k @var{kflag}
-Process keywords according to @var{kflag}. See
-@ref{Keyword substitution}.
-This option is sticky; future updates of
-this file in this working directory will use the same
-@var{kflag}. The @code{status} command can be viewed
-to see the sticky options. See @ref{Invoking CVS} for
-more information on the @code{status} command.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -P
-Prune empty directories. See @ref{Moving directories}.
-
-@item -p
-Pipe files to the standard output.
-
-@item -R
-Update directories recursively (default). See @ref{Recursive
-behavior}.
-
-@item -r rev
-Retrieve revision/tag @var{rev}. This option is sticky,
-and implies @samp{-P}.
-See @ref{Sticky tags}, for more information on sticky tags/dates.
-@end table
-
-@need 800
-These special options are also available with
-@code{update}.
-
-@table @code
-@item -A
-Reset any sticky tags, dates, or @samp{-k} options.
-Does not reset sticky @samp{-k} options on modified files.
-See @ref{Sticky tags} for more information on sticky tags/dates.
-
-@item -C
-Overwrite locally modified files with clean copies from
-the repository (the modified file is saved in
-@file{.#@var{file}.@var{revision}}, however).
-
-@item -d
-Create any directories that exist in the repository if
-they're missing from the working directory. Normally,
-@code{update} acts only on directories and files that
-were already enrolled in your working directory.
-
-This is useful for updating directories that were
-created in the repository since the initial checkout;
-but it has an unfortunate side effect. If you
-deliberately avoided certain directories in the
-repository when you created your working directory
-(either through use of a module name or by listing
-explicitly the files and directories you wanted on the
-command line), then updating with @samp{-d} will create
-those directories, which may not be what you want.
-
-@item -I @var{name}
-Ignore files whose names match @var{name} (in your
-working directory) during the update. You can specify
-@samp{-I} more than once on the command line to specify
-several files to ignore. Use @samp{-I !} to avoid
-ignoring any files at all. See @ref{cvsignore} for other
-ways to make @sc{cvs} ignore some files.
-
-@item -W@var{spec}
-Specify file names that should be filtered during
-update. You can use this option repeatedly.
-
-@var{spec} can be a file name pattern of the same type
-that you can specify in the @file{.cvswrappers}
-file. See @ref{Wrappers}.
-
-@item -j@var{revision}
-With two @samp{-j} options, merge changes from the
-revision specified with the first @samp{-j} option to
-the revision specified with the second @samp{j} option,
-into the working directory.
-
-With one @samp{-j} option, merge changes from the
-ancestor revision to the revision specified with the
-@samp{-j} option, into the working directory. The
-ancestor revision is the common ancestor of the
-revision which the working directory is based on, and
-the revision specified in the @samp{-j} option.
-
-Note that using a single @samp{-j @var{tagname}} option rather than
-@samp{-j @var{branchname}} to merge changes from a branch will
-often not remove files which were removed on the branch.
-See @ref{Merging adds and removals} for more information.
-
-In addition, each @samp{-j} option can contain an optional
-date specification which, when used with branches, can
-limit the chosen revision to one within a specific
-date. An optional date is specified by adding a colon
-(:) to the tag:
-@samp{-j@var{Symbolic_Tag}:@var{Date_Specifier}}.
-
-See @ref{Branching and merging}.
-
-@end table
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node update output
-@appendixsubsec update output
-
-@code{update} and @code{checkout} keep you informed of
-their progress by printing a line for each file, preceded
-by one character indicating the status of the file:
-
-@table @code
-@item U @var{file}
-The file was brought up to date with respect to the
-repository. This is done for any file that exists in
-the repository but not in your working directory, and for files
-that you haven't changed but are not the most recent
-versions available in the repository.
-
-@item P @var{file}
-Like @samp{U}, but the @sc{cvs} server sends a patch instead of an entire
-file. This accomplishes the same thing as @samp{U} using less bandwidth.
-
-@item A @var{file}
-The file has been added to your private copy of the
-sources, and will be added to the source repository
-when you run @code{commit} on the file. This is a
-reminder to you that the file needs to be committed.
-
-@item R @var{file}
-The file has been removed from your private copy of the
-sources, and will be removed from the source repository
-when you run @code{commit} on the file. This is a
-reminder to you that the file needs to be committed.
-
-@item M @var{file}
-The file is modified in your working directory.
-
-@samp{M} can indicate one of two states for a file
-you're working on: either there were no modifications
-to the same file in the repository, so that your file
-remains as you last saw it; or there were modifications
-in the repository as well as in your copy, but they
-were merged successfully, without conflict, in your
-working directory.
-
-@sc{cvs} will print some messages if it merges your work,
-and a backup copy of your working file (as it looked
-before you ran @code{update}) will be made. The exact
-name of that file is printed while @code{update} runs.
-
-@item C @var{file}
-@cindex .# files
-@cindex __ files (VMS)
-A conflict was detected while trying to merge your
-changes to @var{file} with changes from the source
-repository. @var{file} (the copy in your working
-directory) is now the result of attempting to merge
-the two revisions; an unmodified copy of your file
-is also in your working directory, with the name
-@file{.#@var{file}.@var{revision}} where @var{revision}
-is the revision that your modified file started
-from. Resolve the conflict as described in
-@ref{Conflicts example}.
-@c "some systems" as in out-of-the-box OSes? Not as
-@c far as I know. We need to advise sysadmins as well
-@c as users how to set up this kind of purge, if that is
-@c what they want.
-@c We also might want to think about cleaner solutions,
-@c like having CVS remove the .# file once the conflict
-@c has been resolved or something like that.
-(Note that some systems automatically purge
-files that begin with @file{.#} if they have not been
-accessed for a few days. If you intend to keep a copy
-of your original file, it is a very good idea to rename
-it.) Under @sc{vms}, the file name starts with
-@file{__} rather than @file{.#}.
-
-@item ? @var{file}
-@var{file} is in your working directory, but does not
-correspond to anything in the source repository, and is
-not in the list of files for @sc{cvs} to ignore (see the
-description of the @samp{-I} option, and
-@pxref{cvsignore}).
-@end table
-
-@c ----- END MAN 1 -----
-@c ---------------------------------------------------------------------
-@node Invoking CVS
-@appendix Quick reference to CVS commands
-@cindex Command reference
-@cindex Reference, commands
-@cindex Invoking CVS
-
-This appendix describes how to invoke @sc{cvs}, with
-references to where each command or feature is
-described in detail. For other references run the
-@code{cvs --help} command, or see @ref{Index}.
-
-A @sc{cvs} command looks like:
-
-@example
-cvs [ @var{global_options} ] @var{command} [ @var{command_options} ] [ @var{command_args} ]
-@end example
-
-Global options:
-
-@table @code
-@item --allow-root=@var{rootdir}
-Specify legal @sc{cvsroot} directory (server only) (not
-in @sc{cvs} 1.9 and older). See @ref{Password
-authentication server}.
-
-@item -a
-Authenticate all communication (client only) (not in @sc{cvs}
-1.9 and older). See @ref{Global options}.
-
-@item -b
-Specify RCS location (@sc{cvs} 1.9 and older). See
-@ref{Global options}.
-
-@item -d @var{root}
-Specify the @sc{cvsroot}. See @ref{Repository}.
-
-@item -e @var{editor}
-Edit messages with @var{editor}. See @ref{Committing
-your changes}.
-
-@item -f
-Do not read the @file{~/.cvsrc} file. See @ref{Global
-options}.
-
-@item -H
-@itemx --help
-Print a help message. See @ref{Global options}.
-
-@item -n
-Do not change any files. See @ref{Global options}.
-
-@item -Q
-Be really quiet. See @ref{Global options}.
-
-@item -q
-Be somewhat quiet. See @ref{Global options}.
-
-@item -r
-Make new working files read-only. See @ref{Global options}.
-
-@item -s @var{variable}=@var{value}
-Set a user variable. See @ref{Variables}.
-
-@item -T @var{tempdir}
-Put temporary files in @var{tempdir}. See @ref{Global
-options}.
-
-@item -t
-Trace @sc{cvs} execution. See @ref{Global options}.
-
-@item -v
-@item --version
-Display version and copyright information for @sc{cvs}.
-
-@item -w
-Make new working files read-write. See @ref{Global
-options}.
-
-@item -x
-Encrypt all communication (client only).
-See @ref{Global options}.
-
-@item -z @var{gzip-level}
-@cindex Compression
-@cindex Gzip
-Set the compression level (client only).
-See @ref{Global options}.
-@end table
-
-Keyword expansion modes (@pxref{Substitution modes}):
-
-@example
--kkv $@splitrcskeyword{Id}: file1,v 1.1 1993/12/09 03:21:13 joe Exp $
--kkvl $@splitrcskeyword{Id}: file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
--kk $@splitrcskeyword{Id}$
--kv file1,v 1.1 1993/12/09 03:21:13 joe Exp
--ko @i{no expansion}
--kb @i{no expansion, file is binary}
-@end example
-
-Keywords (@pxref{Keyword list}):
-
-@example
-$@splitrcskeyword{Author}: joe $
-$@splitrcskeyword{Date}: 1993/12/09 03:21:13 $
-$@splitrcskeyword{Header}: /home/files/file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
-$@splitrcskeyword{Id}: file1,v 1.1 1993/12/09 03:21:13 joe Exp harry $
-$@splitrcskeyword{Locker}: harry $
-$@splitrcskeyword{Name}: snapshot_1_14 $
-$@splitrcskeyword{RCSfile}: file1,v $
-$@splitrcskeyword{Revision}: 1.1 $
-$@splitrcskeyword{Source}: /home/files/file1,v $
-$@splitrcskeyword{State}: Exp $
-$@splitrcskeyword{Log}: file1,v $
-Revision 1.1 1993/12/09 03:30:17 joe
-Initial revision
-
-@end example
-
-@c The idea behind this table is that we want each item
-@c to be a sentence or two at most. Preferably a
-@c single line.
-@c
-@c In some cases refs to "foo options" are just to get
-@c this thing written quickly, not because the "foo
-@c options" node is really the best place to point.
-Commands, command options, and command arguments:
-
-@table @code
-@c ------------------------------------------------------------
-@item add [@var{options}] [@var{files}@dots{}]
-Add a new file/directory. See @ref{Adding files}.
-
-@table @code
-@item -k @var{kflag}
-Set keyword expansion.
-
-@item -m @var{msg}
-Set file description.
-@end table
-
-@c ------------------------------------------------------------
-@item admin [@var{options}] [@var{files}@dots{}]
-Administration of history files in the repository. See
-@ref{admin}.
-@c This list omits those options which are not
-@c documented as being useful with CVS. That might be
-@c a mistake...
-
-@table @code
-@item -b[@var{rev}]
-Set default branch. See @ref{Reverting local changes}.
-
-@item -c@var{string}
-Set comment leader.
-
-@item -k@var{subst}
-Set keyword substitution. See @ref{Keyword
-substitution}.
-
-@item -l[@var{rev}]
-Lock revision @var{rev}, or latest revision.
-
-@item -m@var{rev}:@var{msg}
-Replace the log message of revision @var{rev} with
-@var{msg}.
-
-@item -o@var{range}
-Delete revisions from the repository. See
-@ref{admin options}.
-
-@item -q
-Run quietly; do not print diagnostics.
-
-@item -s@var{state}[:@var{rev}]
-Set the state. See @ref{admin options} for more information on possible
-states.
-
-@c Does not work for client/server CVS
-@item -t
-Set file description from standard input.
-
-@item -t@var{file}
-Set file description from @var{file}.
-
-@item -t-@var{string}
-Set file description to @var{string}.
-
-@item -u[@var{rev}]
-Unlock revision @var{rev}, or latest revision.
-@end table
-
-@c ------------------------------------------------------------
-@item annotate [@var{options}] [@var{files}@dots{}]
-Show last revision where each line was modified. See
-@ref{annotate}.
-
-@table @code
-@item -D @var{date}
-Annotate the most recent revision no later than
-@var{date}. See @ref{Common options}.
-
-@item -F
-Force annotation of binary files. (Without this option,
-binary files are skipped with a message.)
-
-@item -f
-Use head revision if tag/date not found. See
-@ref{Common options}.
-
-@item -l
-Local; run only in current working directory. @xref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-
-@item -r @var{tag}
-Annotate revision @var{tag}. See @ref{Common options}.
-@end table
-
-@c ------------------------------------------------------------
-@item checkout [@var{options}] @var{modules}@dots{}
-Get a copy of the sources. See @ref{checkout}.
-
-@table @code
-@item -A
-Reset any sticky tags/date/options. See @ref{Sticky
-tags} and @ref{Keyword substitution}.
-
-@item -c
-Output the module database. See @ref{checkout options}.
-
-@item -D @var{date}
-Check out revisions as of @var{date} (is sticky). See
-@ref{Common options}.
-
-@item -d @var{dir}
-Check out into @var{dir}. See @ref{checkout options}.
-
-@item -f
-Use head revision if tag/date not found. See
-@ref{Common options}.
-
-@c Probably want to use rev1/rev2 style like for diff
-@c -r. Here and in on-line help.
-@item -j @var{rev}
-Merge in changes. See @ref{checkout options}.
-
-@item -k @var{kflag}
-Use @var{kflag} keyword expansion. See
-@ref{Substitution modes}.
-
-@item -l
-Local; run only in current working directory. @xref{Recursive behavior}.
-
-@item -N
-Don't ``shorten'' module paths if -d specified. See
-@ref{checkout options}.
-
-@item -n
-Do not run module program (if any). See @ref{checkout options}.
-
-@item -P
-Prune empty directories. See @ref{Moving directories}.
-
-@item -p
-Check out files to standard output (avoids
-stickiness). See @ref{checkout options}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-
-@item -r @var{tag}
-Checkout revision @var{tag} (is sticky). See @ref{Common options}.
-
-@item -s
-Like -c, but include module status. See @ref{checkout options}.
-@end table
-
-@c ------------------------------------------------------------
-@item commit [@var{options}] [@var{files}@dots{}]
-Check changes into the repository. See @ref{commit}.
-
-@table @code
-@item -F @var{file}
-Read log message from @var{file}. See @ref{commit options}.
-
-@item -f
-@c What is this "disables recursion"? It is from the
-@c on-line help; is it documented in this manual?
-Force the file to be committed; disables recursion.
-See @ref{commit options}.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -m @var{msg}
-Use @var{msg} as log message. See @ref{commit options}.
-
-@item -n
-Do not run module program (if any). See @ref{commit options}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-
-@item -r @var{rev}
-Commit to @var{rev}. See @ref{commit options}.
-@c FIXME: should be dragging over text from
-@c commit options, especially if it can be cleaned up
-@c and made concise enough.
-@end table
-
-@c ------------------------------------------------------------
-@item diff [@var{options}] [@var{files}@dots{}]
-Show differences between revisions. See @ref{diff}.
-In addition to the options shown below, accepts a wide
-variety of options to control output style, for example
-@samp{-c} for context diffs.
-
-@table @code
-@item -D @var{date1}
-Diff revision for date against working file. See
-@ref{diff options}.
-
-@item -D @var{date2}
-Diff @var{rev1}/@var{date1} against @var{date2}. See
-@ref{diff options}.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -N
-Include diffs for added and removed files. See
-@ref{diff options}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-
-@item -r @var{rev1}
-Diff revision for @var{rev1} against working file. See
-@ref{diff options}.
-
-@item -r @var{rev2}
-Diff @var{rev1}/@var{date1} against @var{rev2}. See @ref{diff options}.
-@end table
-
-@c ------------------------------------------------------------
-@item edit [@var{options}] [@var{files}@dots{}]
-Get ready to edit a watched file. See @ref{Editing files}.
-
-@table @code
-@item -a @var{actions}
-Specify actions for temporary watch, where
-@var{actions} is @code{edit}, @code{unedit},
-@code{commit}, @code{all}, or @code{none}. See
-@ref{Editing files}.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-@end table
-
-@c ------------------------------------------------------------
-@item editors [@var{options}] [@var{files}@dots{}]
-See who is editing a watched file. See @ref{Watch information}.
-
-@table @code
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-@end table
-
-@c ------------------------------------------------------------
-@item export [@var{options}] @var{modules}@dots{}
-Export files from @sc{cvs}. See @ref{export}.
-
-@table @code
-@item -D @var{date}
-Check out revisions as of @var{date}. See
-@ref{Common options}.
-
-@item -d @var{dir}
-Check out into @var{dir}. See @ref{export options}.
-
-@item -f
-Use head revision if tag/date not found. See
-@ref{Common options}.
-
-@item -k @var{kflag}
-Use @var{kflag} keyword expansion. See
-@ref{Substitution modes}.
-
-@item -l
-Local; run only in current working directory. @xref{Recursive behavior}.
-
-@item -N
-Don't ``shorten'' module paths if -d specified. See
-@ref{export options}.
-
-@item -n
-Do not run module program (if any). See @ref{export options}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-
-@item -r @var{tag}
-Checkout revision @var{tag}. See @ref{Common options}.
-@end table
-
-@c ------------------------------------------------------------
-@item history [@var{options}] [@var{files}@dots{}]
-Show repository access history. See @ref{history}.
-
-@table @code
-@item -a
-All users (default is self). See @ref{history options}.
-
-@item -b @var{str}
-Back to record with @var{str} in module/file/repos
-field. See @ref{history options}.
-
-@item -c
-Report on committed (modified) files. See @ref{history options}.
-
-@item -D @var{date}
-Since @var{date}. See @ref{history options}.
-
-@item -e
-Report on all record types. See @ref{history options}.
-
-@item -l
-Last modified (committed or modified report). See @ref{history options}.
-
-@item -m @var{module}
-Report on @var{module} (repeatable). See @ref{history options}.
-
-@item -n @var{module}
-In @var{module}. See @ref{history options}.
-
-@item -o
-Report on checked out modules. See @ref{history options}.
-
-@item -p @var{repository}
-In @var{repository}. See @ref{history options}.
-
-@item -r @var{rev}
-Since revision @var{rev}. See @ref{history options}.
-
-@item -T
-@c What the @#$@# is a TAG? Same as a tag? This
-@c wording is also in the online-line help.
-Produce report on all TAGs. See @ref{history options}.
-
-@item -t @var{tag}
-Since tag record placed in history file (by anyone).
-See @ref{history options}.
-
-@item -u @var{user}
-For user @var{user} (repeatable). See @ref{history options}.
-
-@item -w
-Working directory must match. See @ref{history options}.
-
-@item -x @var{types}
-Report on @var{types}, one or more of
-@code{TOEFWUPCGMAR}. See @ref{history options}.
-
-@item -z @var{zone}
-Output for time zone @var{zone}. See @ref{history options}.
-@end table
-
-@c ------------------------------------------------------------
-@item import [@var{options}] @var{repository} @var{vendor-tag} @var{release-tags}@dots{}
-Import files into @sc{cvs}, using vendor branches. See
-@ref{import}.
-
-@table @code
-@item -b @var{bra}
-Import to vendor branch @var{bra}. See
-@ref{Multiple vendor branches}.
-
-@item -d
-Use the file's modification time as the time of
-import. See @ref{import options}.
-
-@item -k @var{kflag}
-Set default keyword substitution mode. See
-@ref{import options}.
-
-@item -m @var{msg}
-Use @var{msg} for log message. See
-@ref{import options}.
-
-@item -I @var{ign}
-More files to ignore (! to reset). See
-@ref{import options}.
-
-@item -W @var{spec}
-More wrappers. See @ref{import options}.
-@end table
-
-@c ------------------------------------------------------------
-@item init
-Create a @sc{cvs} repository if it doesn't exist. See
-@ref{Creating a repository}.
-
-@c ------------------------------------------------------------
-@item kserver
-Kerberos authenticated server.
-See @ref{Kerberos authenticated}.
-
-@c ------------------------------------------------------------
-@item log [@var{options}] [@var{files}@dots{}]
-Print out history information for files. See @ref{log}.
-
-@table @code
-@item -b
-Only list revisions on the default branch. See @ref{log options}.
-
-@item -d @var{dates}
-Specify dates (@var{d1}<@var{d2} for range, @var{d} for
-latest before). See @ref{log options}.
-
-@item -h
-Only print header. See @ref{log options}.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -N
-Do not list tags. See @ref{log options}.
-
-@item -R
-Only print name of RCS file. See @ref{log options}.
-
-@item -r@var{revs}
-Only list revisions @var{revs}. See @ref{log options}.
-
-@item -s @var{states}
-Only list revisions with specified states. See @ref{log options}.
-
-@item -t
-Only print header and descriptive text. See @ref{log
-options}.
-
-@item -w@var{logins}
-Only list revisions checked in by specified logins. See @ref{log options}.
-@end table
-
-@c ------------------------------------------------------------
-@item login
-Prompt for password for authenticating server. See
-@ref{Password authentication client}.
-
-@c ------------------------------------------------------------
-@item logout
-Remove stored password for authenticating server. See
-@ref{Password authentication client}.
-
-@c ------------------------------------------------------------
-@item pserver
-Password authenticated server.
-See @ref{Password authentication server}.
-
-@c ------------------------------------------------------------
-@item rannotate [@var{options}] [@var{modules}@dots{}]
-Show last revision where each line was modified. See
-@ref{annotate}.
-
-@table @code
-@item -D @var{date}
-Annotate the most recent revision no later than
-@var{date}. See @ref{Common options}.
-
-@item -F
-Force annotation of binary files. (Without this option,
-binary files are skipped with a message.)
-
-@item -f
-Use head revision if tag/date not found. See
-@ref{Common options}.
-
-@item -l
-Local; run only in current working directory. @xref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive behavior}.
-
-@item -r @var{tag}
-Annotate revision @var{tag}. See @ref{Common options}.
-@end table
-
-@c ------------------------------------------------------------
-@item rdiff [@var{options}] @var{modules}@dots{}
-Show differences between releases. See @ref{rdiff}.
-
-@table @code
-@item -c
-Context diff output format (default). See @ref{rdiff options}.
-
-@item -D @var{date}
-Select revisions based on @var{date}. See @ref{Common options}.
-
-@item -f
-Use head revision if tag/date not found. See
-@ref{Common options}.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-
-@item -r @var{rev}
-Select revisions based on @var{rev}. See @ref{Common options}.
-
-@item -s
-Short patch - one liner per file. See @ref{rdiff options}.
-
-@item -t
-Top two diffs - last change made to the file. See
-@ref{diff options}.
-
-@item -u
-Unidiff output format. See @ref{rdiff options}.
-
-@item -V @var{vers}
-Use RCS Version @var{vers} for keyword expansion (obsolete). See
-@ref{rdiff options}.
-@end table
-
-@c ------------------------------------------------------------
-@item release [@var{options}] @var{directory}
-Indicate that a directory is no longer in use. See
-@ref{release}.
-
-@table @code
-@item -d
-Delete the given directory. See @ref{release options}.
-@end table
-
-@c ------------------------------------------------------------
-@item remove [@var{options}] [@var{files}@dots{}]
-Remove an entry from the repository. See @ref{Removing files}.
-
-@table @code
-@item -f
-Delete the file before removing it. See @ref{Removing files}.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-@end table
-
-@c ------------------------------------------------------------
-@item rlog [@var{options}] [@var{files}@dots{}]
-Print out history information for modules. See @ref{log}.
-
-@table @code
-@item -b
-Only list revisions on the default branch. See @ref{log options}.
-
-@item -d @var{dates}
-Specify dates (@var{d1}<@var{d2} for range, @var{d} for
-latest before). See @ref{log options}.
-
-@item -h
-Only print header. See @ref{log options}.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -N
-Do not list tags. See @ref{log options}.
-
-@item -R
-Only print name of RCS file. See @ref{log options}.
-
-@item -r@var{revs}
-Only list revisions @var{revs}. See @ref{log options}.
-
-@item -s @var{states}
-Only list revisions with specified states. See @ref{log options}.
-
-@item -t
-Only print header and descriptive text. See @ref{log options}.
-
-@item -w@var{logins}
-Only list revisions checked in by specified logins. See @ref{log options}.
-@end table
-
-@c ------------------------------------------------------------
-@item rtag [@var{options}] @var{tag} @var{modules}@dots{}
-Add a symbolic tag to a module.
-See @ref{Revisions} and @ref{Branching and merging}.
-
-@table @code
-@item -a
-Clear tag from removed files that would not otherwise
-be tagged. See @ref{Tagging add/remove}.
-
-@item -b
-Create a branch named @var{tag}. See @ref{Branching and merging}.
-
-@item -B
-Used in conjunction with -F or -d, enables movement and deletion of
-branch tags. Use with extreme caution.
-
-@item -D @var{date}
-Tag revisions as of @var{date}. See @ref{Tagging by date/tag}.
-
-@item -d
-Delete @var{tag}. See @ref{Modifying tags}.
-
-@item -F
-Move @var{tag} if it already exists. See @ref{Modifying tags}.
-
-@item -f
-Force a head revision match if tag/date not found.
-See @ref{Tagging by date/tag}.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -n
-No execution of tag program. See @ref{Common options}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-
-@item -r @var{rev}
-Tag existing tag @var{rev}. See @ref{Tagging by date/tag}.
-@end table
-
-@c ------------------------------------------------------------
-@item server
-Rsh server. See @ref{Connecting via rsh}.
-
-@c ------------------------------------------------------------
-@item status [@var{options}] @var{files}@dots{}
-Display status information in a working directory. See
-@ref{File status}.
-
-@table @code
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-
-@item -v
-Include tag information for file. See @ref{Tags}.
-@end table
-
-@c ------------------------------------------------------------
-@item tag [@var{options}] @var{tag} [@var{files}@dots{}]
-Add a symbolic tag to checked out version of files.
-See @ref{Revisions} and @ref{Branching and merging}.
-
-@table @code
-@item -b
-Create a branch named @var{tag}. See @ref{Branching and merging}.
-
-@item -c
-Check that working files are unmodified. See
-@ref{Tagging the working directory}.
-
-@item -D @var{date}
-Tag revisions as of @var{date}. See @ref{Tagging by date/tag}.
-
-@item -d
-Delete @var{tag}. See @ref{Modifying tags}.
-
-@item -F
-Move @var{tag} if it already exists. See @ref{Modifying tags}.
-
-@item -f
-Force a head revision match if tag/date not found.
-See @ref{Tagging by date/tag}.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-
-@item -r @var{rev}
-Tag existing tag @var{rev}. See @ref{Tagging by date/tag}.
-@end table
-
-@c ------------------------------------------------------------
-@item unedit [@var{options}] [@var{files}@dots{}]
-Undo an edit command. See @ref{Editing files}.
-
-@table @code
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive behavior}.
-@end table
-
-@c ------------------------------------------------------------
-@item update [@var{options}] [@var{files}@dots{}]
-Bring work tree in sync with repository. See
-@ref{update}.
-
-@table @code
-@item -A
-Reset any sticky tags/date/options. See @ref{Sticky
-tags} and @ref{Keyword substitution}.
-
-@item -C
-Overwrite locally modified files with clean copies from
-the repository (the modified file is saved in
-@file{.#@var{file}.@var{revision}}, however).
-
-@item -D @var{date}
-Check out revisions as of @var{date} (is sticky). See
-@ref{Common options}.
-
-@item -d
-Create directories. See @ref{update options}.
-
-@item -f
-Use head revision if tag/date not found. See
-@ref{Common options}.
-
-@item -I @var{ign}
-More files to ignore (! to reset). See
-@ref{import options}.
-
-@c Probably want to use rev1/rev2 style like for diff
-@c -r. Here and in on-line help.
-@item -j @var{rev}
-Merge in changes. See @ref{update options}.
-
-@item -k @var{kflag}
-Use @var{kflag} keyword expansion. See
-@ref{Substitution modes}.
-
-@item -l
-Local; run only in current working directory. @xref{Recursive behavior}.
-
-@item -P
-Prune empty directories. See @ref{Moving directories}.
-
-@item -p
-Check out files to standard output (avoids
-stickiness). See @ref{update options}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-
-@item -r @var{tag}
-Checkout revision @var{tag} (is sticky). See @ref{Common options}.
-
-@item -W @var{spec}
-More wrappers. See @ref{import options}.
-@end table
-
-@c ------------------------------------------------------------
-@item version
-@cindex version (subcommand)
-
-Display the version of @sc{cvs} being used. If the repository
-is remote, display both the client and server versions.
-
-@c ------------------------------------------------------------
-@item watch [on|off|add|remove] [@var{options}] [@var{files}@dots{}]
-
-on/off: turn on/off read-only checkouts of files. See
-@ref{Setting a watch}.
-
-add/remove: add or remove notification on actions. See
-@ref{Getting Notified}.
-
-@table @code
-@item -a @var{actions}
-Specify actions for temporary watch, where
-@var{actions} is @code{edit}, @code{unedit},
-@code{commit}, @code{all}, or @code{none}. See
-@ref{Editing files}.
-
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-@end table
-
-@c ------------------------------------------------------------
-@item watchers [@var{options}] [@var{files}@dots{}]
-See who is watching a file. See @ref{Watch information}.
-
-@table @code
-@item -l
-Local; run only in current working directory. See @ref{Recursive behavior}.
-
-@item -R
-Operate recursively (default). @xref{Recursive
-behavior}.
-@end table
-
-@end table
-
-@c ---------------------------------------------------------------------
-@node Administrative files
-@appendix Reference manual for Administrative files
-@cindex Administrative files (reference)
-@cindex Files, reference manual
-@cindex Reference manual (files)
-@cindex CVSROOT (file)
-
-@c FIXME? Somewhere there needs to be a more "how-to"
-@c guide to writing these. I think the triggers
-@c (commitinfo, loginfo, taginfo, &c) are perhaps a
-@c different case than files like modules. One
-@c particular issue that people sometimes are
-@c (unnecessarily?) worried about is performance, and
-@c the impact of writing in perl or sh or ____.
-Inside the repository, in the directory
-@file{$CVSROOT/CVSROOT}, there are a number of
-supportive files for @sc{cvs}. You can use @sc{cvs} in a limited
-fashion without any of them, but if they are set up
-properly they can help make life easier. For a
-discussion of how to edit them, see @ref{Intro
-administrative files}.
-
-The most important of these files is the @file{modules}
-file, which defines the modules inside the repository.
-
-@menu
-* modules:: Defining modules
-* Wrappers:: Specify binary-ness based on file name
-* Trigger Scripts:: Some notes on the commit support files and
- taginfo, referenced below.
-* commit files:: The commit support files (commitinfo,
- verifymsg, editinfo, loginfo)
-* taginfo:: Verifying/Logging tags
-* rcsinfo:: Templates for the log messages
-* cvsignore:: Ignoring files via cvsignore
-* checkoutlist:: Adding your own administrative files
-* history file:: History information
-* Variables:: Various variables are expanded
-* config:: Miscellaneous CVS configuration
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node modules
-@appendixsec The modules file
-@cindex Modules (admin file)
-@cindex Defining modules (reference manual)
-
-The @file{modules} file records your definitions of
-names for collections of source code. @sc{cvs} will
-use these definitions if you use @sc{cvs} to update the
-modules file (use normal commands like @code{add},
-@code{commit}, etc).
-
-The @file{modules} file may contain blank lines and
-comments (lines beginning with @samp{#}) as well as
-module definitions. Long lines can be continued on the
-next line by specifying a backslash (@samp{\}) as the
-last character on the line.
-
-There are three basic types of modules: alias modules,
-regular modules, and ampersand modules. The difference
-between them is the way that they map files in the
-repository to files in the working directory. In all
-of the following examples, the top-level repository
-contains a directory called @file{first-dir}, which
-contains two files, @file{file1} and @file{file2}, and a
-directory @file{sdir}. @file{first-dir/sdir} contains
-a file @file{sfile}.
-
-@c FIXME: should test all the examples in this section.
-
-@menu
-* Alias modules:: The simplest kind of module
-* Regular modules::
-* Ampersand modules::
-* Excluding directories:: Excluding directories from a module
-* Module options:: Regular and ampersand modules can take options
-* Module program options:: How the modules ``program options'' programs
- are run.
-@end menu
-
-@node Alias modules
-@appendixsubsec Alias modules
-@cindex Alias modules
-@cindex -a, in modules file
-
-Alias modules are the simplest kind of module:
-
-@table @code
-@item @var{mname} -a @var{aliases}@dots{}
-This represents the simplest way of defining a module
-@var{mname}. The @samp{-a} flags the definition as a
-simple alias: @sc{cvs} will treat any use of @var{mname} (as
-a command argument) as if the list of names
-@var{aliases} had been specified instead.
-@var{aliases} may contain either other module names or
-paths. When you use paths in aliases, @code{checkout}
-creates all intermediate directories in the working
-directory, just as if the path had been specified
-explicitly in the @sc{cvs} arguments.
-@end table
-
-For example, if the modules file contains:
-
-@example
-amodule -a first-dir
-@end example
-
-@noindent
-then the following two commands are equivalent:
-
-@example
-$ cvs co amodule
-$ cvs co first-dir
-@end example
-
-@noindent
-and they each would provide output such as:
-
-@example
-cvs checkout: Updating first-dir
-U first-dir/file1
-U first-dir/file2
-cvs checkout: Updating first-dir/sdir
-U first-dir/sdir/sfile
-@end example
-
-@node Regular modules
-@appendixsubsec Regular modules
-@cindex Regular modules
-
-@table @code
-@item @var{mname} [ options ] @var{dir} [ @var{files}@dots{} ]
-In the simplest case, this form of module definition
-reduces to @samp{@var{mname} @var{dir}}. This defines
-all the files in directory @var{dir} as module mname.
-@var{dir} is a relative path (from @code{$CVSROOT}) to a
-directory of source in the source repository. In this
-case, on checkout, a single directory called
-@var{mname} is created as a working directory; no
-intermediate directory levels are used by default, even
-if @var{dir} was a path involving several directory
-levels.
-@end table
-
-For example, if a module is defined by:
-
-@example
-regmodule first-dir
-@end example
-
-@noindent
-then regmodule will contain the files from first-dir:
-
-@example
-$ cvs co regmodule
-cvs checkout: Updating regmodule
-U regmodule/file1
-U regmodule/file2
-cvs checkout: Updating regmodule/sdir
-U regmodule/sdir/sfile
-$
-@end example
-
-By explicitly specifying files in the module definition
-after @var{dir}, you can select particular files from
-directory @var{dir}. Here is
-an example:
-
-@example
-regfiles first-dir/sdir sfile
-@end example
-
-@noindent
-With this definition, getting the regfiles module
-will create a single working directory
-@file{regfiles} containing the file listed, which
-comes from a directory deeper
-in the @sc{cvs} source repository:
-
-@example
-$ cvs co regfiles
-U regfiles/sfile
-$
-@end example
-
-@node Ampersand modules
-@appendixsubsec Ampersand modules
-@cindex Ampersand modules
-@cindex &, in modules file
-
-A module definition can refer to other modules by
-including @samp{&@var{module}} in its definition.
-@example
-@var{mname} [ options ] @var{&module}@dots{}
-@end example
-
-Then getting the module creates a subdirectory for each such
-module, in the directory containing the module. For
-example, if modules contains
-
-@example
-ampermod &first-dir
-@end example
-
-@noindent
-then a checkout will create an @code{ampermod} directory
-which contains a directory called @code{first-dir},
-which in turns contains all the directories and files
-which live there. For example, the command
-
-@example
-$ cvs co ampermod
-@end example
-
-@noindent
-will create the following files:
-
-@example
-ampermod/first-dir/file1
-ampermod/first-dir/file2
-ampermod/first-dir/sdir/sfile
-@end example
-
-There is one quirk/bug: the messages that @sc{cvs}
-prints omit the @file{ampermod}, and thus do not
-correctly display the location to which it is checking
-out the files:
-
-@example
-$ cvs co ampermod
-cvs checkout: Updating first-dir
-U first-dir/file1
-U first-dir/file2
-cvs checkout: Updating first-dir/sdir
-U first-dir/sdir/sfile
-$
-@end example
-
-Do not rely on this buggy behavior; it may get fixed in
-a future release of @sc{cvs}.
-
-@c FIXCVS: What happens if regular and & modules are
-@c combined, as in "ampermodule first-dir &second-dir"?
-@c When I tried it, it seemed to just ignore the
-@c "first-dir". I think perhaps it should be an error
-@c (but this needs further investigation).
-@c In addition to discussing what each one does, we
-@c should put in a few words about why you would use one or
-@c the other in various situations.
-
-@node Excluding directories
-@appendixsubsec Excluding directories
-@cindex Excluding directories, in modules file
-@cindex !, in modules file
-
-An alias module may exclude particular directories from
-other modules by using an exclamation mark (@samp{!})
-before the name of each directory to be excluded.
-
-For example, if the modules file contains:
-
-@example
-exmodule -a !first-dir/sdir first-dir
-@end example
-
-@noindent
-then checking out the module @samp{exmodule} will check
-out everything in @samp{first-dir} except any files in
-the subdirectory @samp{first-dir/sdir}.
-@c Note that the "!first-dir/sdir" sometimes must be listed
-@c before "first-dir". That seems like a probable bug, in which
-@c case perhaps it should be fixed (to allow either
-@c order) rather than documented. See modules4 in testsuite.
-
-@node Module options
-@appendixsubsec Module options
-@cindex Options, in modules file
-
-Either regular modules or ampersand modules can contain
-options, which supply additional information concerning
-the module.
-
-@table @code
-@cindex -d, in modules file
-@item -d @var{name}
-Name the working directory something other than the
-module name.
-@c FIXME: Needs a bunch of examples, analogous to the
-@c examples for alias, regular, and ampersand modules
-@c which show where the files go without -d.
-
-@cindex Export program
-@cindex -e, in modules file
-@item -e @var{prog}
-Specify a program @var{prog} to run whenever files in a
-module are exported. @var{prog} runs with a single
-argument, the module name.
-@c FIXME: Is it run on server? client?
-
-@cindex Checkout program
-@cindex -o, in modules file
-@item -o @var{prog}
-Specify a program @var{prog} to run whenever files in a
-module are checked out. @var{prog} runs with a single
-argument, the module name. See @ref{Module program options} for
-information on how @var{prog} is called.
-@c FIXME: Is it run on server? client?
-
-@cindex Status of a module
-@cindex Module status
-@cindex -s, in modules file
-@item -s @var{status}
-Assign a status to the module. When the module file is
-printed with @samp{cvs checkout -s} the modules are
-sorted according to primarily module status, and
-secondarily according to the module name. This option
-has no other meaning. You can use this option for
-several things besides status: for instance, list the
-person that is responsible for this module.
-
-@cindex Tag program
-@cindex -t, in modules file
-@item -t @var{prog}
-Specify a program @var{prog} to run whenever files in a
-module are tagged with @code{rtag}. @var{prog} runs
-with two arguments: the module name and the symbolic
-tag specified to @code{rtag}. It is not run
-when @code{tag} is executed. Generally you will find
-that the @file{taginfo} file is a better solution (@pxref{taginfo}).
-@c FIXME: Is it run on server? client?
-@c Problems with -t include:
-@c * It is run after the tag not before
-@c * It doesn't get passed all the information that
-@c taginfo does ("mov", &c).
-@c * It only is run for rtag, not tag.
-@end table
-
-You should also see @pxref{Module program options} about how the
-``program options'' programs are run.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-@node Module program options
-@appendixsubsec How the modules file ``program options'' programs are run
-@cindex Modules file program options
-@cindex -t, in modules file
-@cindex -o, in modules file
-@cindex -e, in modules file
-
-@noindent
-For checkout, rtag, and export, the program is server-based, and as such the
-following applies:-
-
-If using remote access methods (pserver, ext, etc.),
-@sc{cvs} will execute this program on the server from a temporary
-directory. The path is searched for this program.
-
-If using ``local access'' (on a local or remote NFS file system, i.e.,
-repository set just to a path),
-the program will be executed from the newly checked-out tree, if
-found there, or alternatively searched for in the path if not.
-
-The programs are all run after the operation has effectively
-completed.
-
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node Wrappers
-@appendixsec The cvswrappers file
-@cindex cvswrappers (admin file)
-@cindex CVSWRAPPERS, environment variable
-@cindex Wrappers
-
-@c FIXME: need some better way of separating this out
-@c by functionality. -m is
-@c one feature, and -k is a another. And this discussion
-@c should be better motivated (e.g. start with the
-@c problems, then explain how the feature solves it).
-
-Wrappers refers to a @sc{cvs} feature which lets you
-control certain settings based on the name of the file
-which is being operated on. The settings are @samp{-k}
-for binary files, and @samp{-m} for nonmergeable text
-files.
-
-The @samp{-m} option
-specifies the merge methodology that should be used when
-a non-binary file is updated. @code{MERGE} means the usual
-@sc{cvs} behavior: try to merge the files. @code{COPY}
-means that @code{cvs update} will refuse to merge
-files, as it also does for files specified as binary
-with @samp{-kb} (but if the file is specified as
-binary, there is no need to specify @samp{-m 'COPY'}).
-@sc{cvs} will provide the user with the
-two versions of the files, and require the user using
-mechanisms outside @sc{cvs}, to insert any necessary
-changes.
-
-@strong{WARNING: Do not use @code{COPY} with
-@sc{cvs} 1.9 or earlier - such versions of @sc{cvs} will
-copy one version of your file over the other, wiping
-out the previous contents.}
-@c Ordinarily we don't document the behavior of old
-@c versions. But this one is so dangerous, I think we
-@c must. I almost renamed it to -m 'NOMERGE' so we
-@c could say "never use -m 'COPY'".
-The @samp{-m} wrapper option only affects behavior when
-merging is done on update; it does not affect how files
-are stored. See @ref{Binary files}, for more on
-binary files.
-
-The basic format of the file @file{cvswrappers} is:
-
-@c FIXME: @example is all wrong for this. Use @deffn or
-@c something more sensible.
-@example
-wildcard [option value][option value]...
-
-where option is one of
--m update methodology value: MERGE or COPY
--k keyword expansion value: expansion mode
-
-and value is a single-quote delimited value.
-@end example
-
-@ignore
-@example
-*.nib -f 'unwrap %s' -t 'wrap %s %s' -m 'COPY'
-*.c -t 'indent %s %s'
-@end example
-@c When does the filter need to be an absolute pathname
-@c and when will something like the above work? I
-@c suspect it relates to the PATH of the server (which
-@c in turn depends on all kinds of stuff, e.g. inetd
-@c for pserver). I'm not sure whether/where to discuss
-@c this.
-@c FIXME: What do the %s's stand for?
-
-@noindent
-The above example of a @file{cvswrappers} file
-states that all files/directories that end with a @code{.nib}
-should be filtered with the @file{wrap} program before
-checking the file into the repository. The file should
-be filtered though the @file{unwrap} program when the
-file is checked out of the repository. The
-@file{cvswrappers} file also states that a @code{COPY}
-methodology should be used when updating the files in
-the repository (that is, no merging should be performed).
-
-@c What pitfalls arise when using indent this way? Is
-@c it a winning thing to do? Would be nice to at least
-@c hint at those issues; we want our examples to tell
-@c how to solve problems, not just to say that cvs can
-@c do certain things.
-The last example line says that all files that end with
-@code{.c} should be filtered with @file{indent}
-before being checked into the repository. Unlike the previous
-example, no filtering of the @code{.c} file is done when
-it is checked out of the repository.
-@noindent
-The @code{-t} filter is called with two arguments,
-the first is the name of the file/directory to filter
-and the second is the pathname to where the resulting
-filtered file should be placed.
-
-@noindent
-The @code{-f} filter is called with one argument,
-which is the name of the file to filter from. The end
-result of this filter will be a file in the users directory
-that they can work on as they normally would.
-
-Note that the @samp{-t}/@samp{-f} features do not
-conveniently handle one portion of @sc{cvs}'s operation:
-determining when files are modified. @sc{cvs} will still
-want a file (or directory) to exist, and it will use
-its modification time to determine whether a file is
-modified. If @sc{cvs} erroneously thinks a file is
-unmodified (for example, a directory is unchanged but
-one of the files within it is changed), you can force
-it to check in the file anyway by specifying the
-@samp{-f} option to @code{cvs commit} (@pxref{commit
-options}).
-@c This is, of course, a serious design flaw in -t/-f.
-@c Probably the whole functionality needs to be
-@c redesigned (starting from requirements) to fix this.
-@end ignore
-
-@c FIXME: We don't document -W or point to where it is
-@c documented. Or .cvswrappers.
-For example, the following command imports a
-directory, treating files whose name ends in
-@samp{.exe} as binary:
-
-@example
-cvs import -I ! -W "*.exe -k 'b'" first-dir vendortag reltag
-@end example
-
-@c Another good example, would be storing files
-@c (e.g. binary files) compressed in the repository.
-@c ::::::::::::::::::
-@c cvswrappers
-@c ::::::::::::::::::
-@c *.t12 -m 'COPY'
-@c *.t[0-9][0-9] -f 'gunzipcp %s' -t 'gzipcp %s %s' -m 'COPY'
-@c
-@c ::::::::::::::::::
-@c gunzipcp
-@c ::::::::::::::::::
-@c :
-@c [ -f $1 ] || exit 1
-@c zcat $1 > /tmp/.#$1.$$
-@c mv /tmp/.#$1.$$ $1
-@c
-@c ::::::::::::::::::
-@c gzipcp
-@c ::::::::::::::::::
-@c :
-@c DIRNAME=`echo $1 | sed -e "s|/.*/||g"`
-@c if [ ! -d $DIRNAME ] ; then
-@c DIRNAME=`echo $1 | sed -e "s|.*/||g"`
-@c fi
-@c gzip -c $DIRNAME > $2
-@c One catch--"cvs diff" will not invoke the wrappers
-@c (probably a CVS bug, although I haven't thought it out).
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node Trigger Scripts
-@appendixsec The Trigger Scripts
-@cindex Info files
-@cindex Trigger scripts
-
-Several of the administrative files support triggers, or the launching external
-scripts or programs at specific times before or after particular events. The
-individual files are discussed in the later sections, @ref{commit files} and
-@ref{taginfo}, but some of the common elements are discussed here.
-
-All the trigger scripts are launched in a copy of the user sandbox being
-committed, on the server, in client-server mode. In local mode, the scripts
-are actually launched directly from the user sandbox directory being committed.
-For most intents and purposes, the same scripts can be run in both locations
-without alteration.
-
-@menu
-* syntax:: The common syntax
-* Trigger Script Security:: Trigger script security
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node syntax
-@appendixsubsec The common syntax
-@cindex Info files (syntax)
-@cindex Syntax of info files
-@cindex Common syntax of info files
-
-@c FIXME: having this so totally separate from the
-@c Variables node is rather bogus.
-
-The administrative files such as @file{commitinfo},
-@file{loginfo}, @file{rcsinfo}, @file{verifymsg}, etc.,
-all have a common format. The purpose of the files are
-described later on. The common syntax is described
-here.
-
-@cindex Regular expression syntax
-Each line contains the following:
-@itemize @bullet
-@item
-@c Say anything about DEFAULT and ALL? Right now we
-@c leave that to the description of each file (and in fact
-@c the practice is inconsistent which is really annoying).
-A regular expression. This is a basic regular
-expression in the syntax used by GNU emacs.
-@c FIXME: What we probably should be saying is "POSIX Basic
-@c Regular Expression with the following extensions (`\('
-@c `\|' '+' etc)"
-@c rather than define it with reference to emacs.
-@c The reference to emacs is not strictly speaking
-@c true, as we don't support \=, \s, or \S. Also it isn't
-@c clear we should document and/or promise to continue to
-@c support all the obscure emacs extensions like \<.
-@c Also need to better cite (or include) full
-@c documentation for the syntax.
-@c Also see comment in configure.in about what happens to the
-@c syntax if we pick up a system-supplied regexp matcher.
-
-@item
-A whitespace separator---one or more spaces and/or tabs.
-
-@item
-A file name or command-line template.
-@end itemize
-
-@noindent
-Blank lines are ignored. Lines that start with the
-character @samp{#} are treated as comments. Long lines
-unfortunately can @emph{not} be broken in two parts in
-any way.
-
-The first regular expression that matches the current
-directory name in the repository is used. The rest of the line
-is used as a file name or command-line as appropriate.
-
-@c FIXME: need an example. In particular, show what
-@c the regular expression is matched against (one
-@c ordinarily clueful person got confused about whether it
-@c includes the filename--"directory name" above should be
-@c unambiguous but there is nothing like an example to
-@c confirm people's understanding of this sort of thing).
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node Trigger Script Security
-@appendixsubsec Security and the Trigger Scripts
-@cindex Info files, security
-@cindex Trigger scripts, security
-
-Security is a huge subject, and implementing a secure system is a non-trivial
-task. This section will barely touch on all the issues involved, but it is
-well to note that, as with any script you will be allowing an untrusted
-user to run on your server, there are measures you can take to help prevent
-your trigger scripts from being abused.
-
-For instance, since the CVS trigger scripts all run in a copy of the user's
-sandbox on the server, a naively coded Perl trigger script which attempts to
-use a Perl module that is not installed on the system can be hijacked by any
-user with commit access who is checking in a file with the correct name. Other
-scripting languages may be vulnerable to similar hacks.
-
-One way to make a script more secure, at least with Perl, is to use scripts
-which invoke the @code{-T}, or "taint-check" switch on their @code{#!} line.
-In the most basic terms, this causes Perl to avoid running code that may have
-come from an external source. Please run the @code{perldoc perlsec} command
-for more on Perl security. Again, other languages may implement other security
-verification hooks which look more or less like Perl's "taint-check" mechanism.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node commit files
-@appendixsec The commit support files
-@cindex Committing, administrative support files
-
-There are three kinds of trigger scripts (@pxref{Trigger Scripts}) that can be
-run at various times during a commit. They are specified in files in the
-repository, as described below. The following table summarizes the
-file names and the purpose of the corresponding programs.
-
-@table @file
-@item commitinfo
-The program is responsible for checking that the commit
-is allowed. If it exits with a non-zero exit status
-the commit will be aborted.
-
-@item verifymsg
-The specified program is used to evaluate the log message,
-and possibly verify that it contains all required
-fields. This is most useful in combination with the
-@file{rcsinfo} file, which can hold a log message
-template (@pxref{rcsinfo}).
-
-@item editinfo
-The specified program is used to edit the log message,
-and possibly verify that it contains all required
-fields. This is most useful in combination with the
-@file{rcsinfo} file, which can hold a log message
-template (@pxref{rcsinfo}). (obsolete)
-
-@item loginfo
-The specified program is called when the commit is
-complete. It receives the log message and some
-additional information and can store the log message in
-a file, or mail it to appropriate persons, or maybe
-post it to a local newsgroup, or@dots{} Your
-imagination is the limit!
-@end table
-
-@menu
-* commitinfo:: Pre-commit checking
-* verifymsg:: How are log messages evaluated?
-* editinfo:: Specifying how log messages are created
- (obsolete)
-* loginfo:: Where should log messages be sent?
-@end menu
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node commitinfo
-@appendixsubsec Commitinfo
-@cindex @file{commitinfo}
-@cindex Commits, precommit verification of
-@cindex Precommit checking
-
-The @file{commitinfo} file defines programs to execute
-whenever @samp{cvs commit} is about to execute. These
-programs are used for pre-commit checking to verify
-that the modified, added and removed files are really
-ready to be committed. This could be used, for
-instance, to verify that the changed files conform to
-to your site's standards for coding practice.
-
-As mentioned earlier, each line in the
-@file{commitinfo} file consists of a regular expression
-and a command-line template. The template can include
-a program name and any number of arguments you wish to
-supply to it. The full path to the current source
-repository is appended to the template, followed by the
-file names of any files involved in the commit (added,
-removed, and modified files).
-
-@cindex Exit status, of commitinfo
-The first line with a regular expression matching the
-directory within the repository will be used. If the
-command returns a non-zero exit status the commit will
-be aborted.
-@c FIXME: need example(s) of what "directory within the
-@c repository" means.
-
-@cindex DEFAULT in commitinfo
-If the repository name does not match any of the
-regular expressions in this file, the @samp{DEFAULT}
-line is used, if it is specified.
-
-@cindex ALL in commitinfo
-All occurrences of the name @samp{ALL} appearing as a
-regular expression are used in addition to the first
-matching regular expression or the name @samp{DEFAULT}.
-
-@cindex @file{commitinfo}, working directory
-@cindex @file{commitinfo}, command environment
-The command will be run in the root of the workspace
-containing the new versions of any files the user would like
-to modify (commit), @emph{or in a copy of the workspace on
-the server (@pxref{Remote repositories})}. If a file is
-being removed, there will be no copy of the file under the
-current directory. If a file is being added, there will be
-no corresponding archive file in the repository unless the
-file is being resurrected.
-
-Note that both the repository directory and the corresponding
-Attic (@pxref{Attic}) directory may need to be checked to
-locate the archive file corresponding to any given file being
-committed. Much of the information about the specific commit
-request being made, including the destination branch, commit
-message, and command line options specified, is not available
-to the command.
-
-@c FIXME: should discuss using commitinfo to control
-@c who has checkin access to what (e.g. Joe can check into
-@c directories a, b, and c, and Mary can check into
-@c directories b, c, and d--note this case cannot be
-@c conveniently handled with unix groups). Of course,
-@c adding a new set of features to CVS might be a more
-@c natural way to fix this problem than telling people to
-@c use commitinfo.
-@c FIXME: Should make some reference, especially in
-@c the context of controlling who has access, to the fact
-@c that commitinfo can be circumvented. Perhaps
-@c mention SETXID (but has it been carefully examined
-@c for holes?). This fits in with the discussion of
-@c general CVS security in "Password authentication
-@c security" (the bit which is not pserver-specific).
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node verifymsg
-@appendixsubsec Verifying log messages
-@cindex @file{verifymsg} (admin file)
-@cindex Log message, verifying
-
-Once you have entered a log message, you can evaluate
-that message to check for specific content, such as
-a bug ID. Use the @file{verifymsg} file to
-specify a program that is used to verify the log message.
-This program could be a simple script that checks
-that the entered message contains the required fields.
-
-The @file{verifymsg} file is often most useful together
-with the @file{rcsinfo} file, which can be used to
-specify a log message template.
-
-Each line in the @file{verifymsg} file consists of a
-regular expression and a command-line template. The
-template must include a program name, and can include
-any number of arguments. The full path to the current
-log message template file is appended to the template.
-
-One thing that should be noted is that the @samp{ALL}
-keyword is not supported. If more than one matching
-line is found, the first one is used. This can be
-useful for specifying a default verification script in a
-directory, and then overriding it in a subdirectory.
-
-@cindex DEFAULT in @file{verifymsg}
-If the repository name does not match any of the
-regular expressions in this file, the @samp{DEFAULT}
-line is used, if it is specified.
-
-@cindex Exit status, of @file{verifymsg}
-If the verification script exits with a non-zero exit status,
-the commit is aborted.
-
-@cindex @file{verifymsg}, changing the log message
-In the default configuration, CVS allows the
-verification script to change the log message. This is
-controlled via the RereadLogAfterVerify CVSROOT/config
-option.
-
-When @samp{RereadLogAfterVerify=always} or
-@samp{RereadLogAfterVerify=stat}, the log message will
-either always be reread after the verification script
-is run or reread only if the log message file status
-has changed.
-
-@xref{config}, for more on CVSROOT/config options.
-
-It is NOT a good idea for a @file{verifymsg} script to
-interact directly with the user in the various
-client/server methods. For the @code{pserver} method,
-there is no protocol support for communicating between
-@file{verifymsg} and the client on the remote end. For the
-@code{ext} and @code{server} methods, it is possible
-for CVS to become confused by the characters going
-along the same channel as the CVS protocol
-messages. See @ref{Remote repositories}, for more
-information on client/server setups. In addition, at the time
-the @file{verifymsg} script runs, the CVS
-server has locks in place in the repository. If control is
-returned to the user here then other users may be stuck waiting
-for access to the repository.
-
-This option can be useful if you find yourself using an
-rcstemplate that needs to be modified to remove empty
-elements or to fill in default values. It can also be
-useful if the rcstemplate has changed in the repository
-and the CVS/Template was not updated, but is able to be
-adapted to the new format by the verification script
-that is run by @file{verifymsg}.
-
-An example of an update might be to change all
-occurrences of 'BugId:' to be 'DefectId:' (which can be
-useful if the rcstemplate has recently been changed and
-there are still checked-out user trees with cached
-copies in the CVS/Template file of the older version).
-
-Another example of an update might be to delete a line
-that contains 'BugID: none' from the log message after
-validation of that value as being allowed is made.
-
-The following is a little silly example of a
-@file{verifymsg} file, together with the corresponding
-@file{rcsinfo} file, the log message template and an
-verification script. We begin with the log message template.
-We want to always record a bug-id number on the first
-line of the log message. The rest of log message is
-free text. The following template is found in the file
-@file{/usr/cvssupport/tc.template}.
-
-@example
-BugId:
-@end example
-
-The script @file{/usr/cvssupport/bugid.verify} is used to
-evaluate the log message.
-
-@example
-#!/bin/sh
-#
-# bugid.verify filename
-#
-# Verify that the log message contains a valid bugid
-# on the first line.
-#
-if sed 1q < $1 | grep '^BugId:[ ]*[0-9][0-9]*$' > /dev/null; then
- exit 0
-elif sed 1q < $1 | grep '^BugId:[ ]*none$' > /dev/null; then
- # It is okay to allow commits with 'BugId: none',
- # but do not put that text into the real log message.
- grep -v '^BugId:[ ]*none$' > $1.rewrite
- mv $1.rewrite $1
- exit 0
-else
- echo "No BugId found."
- exit 1
-fi
-@end example
-
-The @file{verifymsg} file contains this line:
-
-@example
-^tc /usr/cvssupport/bugid.verify
-@end example
-
-The @file{rcsinfo} file contains this line:
-
-@example
-^tc /usr/cvssupport/tc.template
-@end example
-
-The @file{config} file contains this line:
-
-@example
-RereadLogAfterVerify=always
-@end example
-
-
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node editinfo
-@appendixsubsec Editinfo
-@cindex editinfo (admin file)
-@cindex Editor, specifying per module
-@cindex Per-module editor
-@cindex Log messages, editing
-
-@strong{The @file{editinfo} feature has been
-rendered obsolete. To set a default editor for log
-messages use the @code{CVSEDITOR}, @code{EDITOR} environment variables
-(@pxref{Environment variables}) or the @samp{-e} global
-option (@pxref{Global options}). See @ref{verifymsg},
-for information on the use of the @file{verifymsg}
-feature for evaluating log messages.}
-
-If you want to make sure that all log messages look the
-same way, you can use the @file{editinfo} file to
-specify a program that is used to edit the log message.
-This program could be a custom-made editor that always
-enforces a certain style of the log message, or maybe a
-simple shell script that calls an editor, and checks
-that the entered message contains the required fields.
-
-If no matching line is found in the @file{editinfo}
-file, the editor specified in the environment variable
-@code{$CVSEDITOR} is used instead. If that variable is
-not set, then the environment variable @code{$EDITOR}
-is used instead. If that variable is not
-set a default will be used. See @ref{Committing your changes}.
-
-The @file{editinfo} file is often most useful together
-with the @file{rcsinfo} file, which can be used to
-specify a log message template.
-
-Each line in the @file{editinfo} file consists of a
-regular expression and a command-line template. The
-template must include a program name, and can include
-any number of arguments. The full path to the current
-log message template file is appended to the template.
-
-One thing that should be noted is that the @samp{ALL}
-keyword is not supported. If more than one matching
-line is found, the first one is used. This can be
-useful for specifying a default edit script in a
-module, and then overriding it in a subdirectory.
-
-@cindex DEFAULT in editinfo
-If the repository name does not match any of the
-regular expressions in this file, the @samp{DEFAULT}
-line is used, if it is specified.
-
-If the edit script exits with a non-zero exit status,
-the commit is aborted.
-
-Note: when @sc{cvs} is accessing a remote repository,
-or when the @samp{-m} or @samp{-F} options to @code{cvs
-commit} are used, @file{editinfo} will not be consulted.
-There is no good workaround for this; use
-@file{verifymsg} instead.
-
-@menu
-* editinfo example:: Editinfo example
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node editinfo example
-@appendixsubsubsec Editinfo example
-
-The following is a little silly example of a
-@file{editinfo} file, together with the corresponding
-@file{rcsinfo} file, the log message template and an
-editor script. We begin with the log message template.
-We want to always record a bug-id number on the first
-line of the log message. The rest of log message is
-free text. The following template is found in the file
-@file{/usr/cvssupport/tc.template}.
-
-@example
-BugId:
-@end example
-
-The script @file{/usr/cvssupport/bugid.edit} is used to
-edit the log message.
-
-@example
-#!/bin/sh
-#
-# bugid.edit filename
-#
-# Call $EDITOR on FILENAME, and verify that the
-# resulting file contains a valid bugid on the first
-# line.
-if [ "x$EDITOR" = "x" ]; then EDITOR=vi; fi
-if [ "x$CVSEDITOR" = "x" ]; then CVSEDITOR=$EDITOR; fi
-$CVSEDITOR $1
-until head -1|grep '^BugId:[ ]*[0-9][0-9]*$' < $1
-do echo -n "No BugId found. Edit again? ([y]/n)"
- read ans
- case $@{ans@} in
- n*) exit 1;;
- esac
- $CVSEDITOR $1
-done
-@end example
-
-The @file{editinfo} file contains this line:
-
-@example
-^tc /usr/cvssupport/bugid.edit
-@end example
-
-The @file{rcsinfo} file contains this line:
-
-@example
-^tc /usr/cvssupport/tc.template
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node loginfo
-@appendixsubsec Loginfo
-@cindex loginfo (admin file)
-@cindex Storing log messages
-@cindex Mailing log messages
-@cindex Distributing log messages
-@cindex Log messages
-
-@c "cvs commit" is not quite right. What we
-@c mean is "when the repository gets changed" which
-@c also includes "cvs import" and "cvs add" on a directory.
-The @file{loginfo} file is used to control where
-@samp{cvs commit} log information is sent. The first
-entry on a line is a regular expression which is tested
-against the directory that the change is being made to,
-relative to the @code{$CVSROOT}. If a match is found, then
-the remainder of the line is a filter program that
-should expect log information on its standard input.
-Note that the filter program @strong{must} read @strong{all}
-of the log information or @sc{cvs} may fail with a broken pipe signal.
-
-If the repository name does not match any of the
-regular expressions in this file, the @samp{DEFAULT}
-line is used, if it is specified.
-
-All occurrences of the name @samp{ALL} appearing as a
-regular expression are used in addition to the first
-matching regular expression or @samp{DEFAULT}.
-
-The first matching regular expression is used.
-
-@xref{commit files}, for a description of the syntax of
-the @file{loginfo} file.
-
-The user may specify a format string as
-part of the filter. The string is composed of a
-@samp{%} followed by a space, or followed by a single
-format character, or followed by a set of format
-characters surrounded by @samp{@{} and @samp{@}} as
-separators. The format characters are:
-
-@table @t
-@item s
-file name
-@item V
-old version number (pre-checkin)
-@item v
-new version number (post-checkin)
-@end table
-
-All other characters that appear in a format string
-expand to an empty field (commas separating fields are
-still provided).
-
-For example, some valid format strings are @samp{%},
-@samp{%s}, @samp{%@{s@}}, and @samp{%@{sVv@}}.
-
-The output will be a space separated string of tokens enclosed in
-quotation marks (@t{"}).
-Any embedded dollar signs (@t{$}), backticks (@t{`}),
-backslashes (@t{\}), or quotation marks will be preceded
-by a backslash (this allows the shell to correctly parse it
-as a single string, reguardless of the characters it contains).
-For backwards compatibility, the first
-token will be the repository subdirectory. The rest of the
-tokens will be comma-delimited lists of the information
-requested in the format string. For example, if
-@samp{/u/src/master/yoyodyne/tc} is the repository, @samp{%@{sVv@}}
-is the format string, and three files (@t{ChangeLog},
-@t{Makefile}, @t{foo.c}) were modified, the output
-might be:
-
-@example
-"yoyodyne/tc ChangeLog,1.1,1.2 Makefile,1.3,1.4 foo.c,1.12,1.13"
-@end example
-
-As another example, @samp{%@{@}} means that only the
-name of the repository will be generated.
-
-Note: when @sc{cvs} is accessing a remote repository,
-@file{loginfo} will be run on the @emph{remote}
-(i.e., server) side, not the client side (@pxref{Remote
-repositories}).
-
-@menu
-* loginfo example:: Loginfo example
-* Keeping a checked out copy:: Updating a tree on every checkin
-@end menu
-
-@c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
-@node loginfo example
-@appendixsubsubsec Loginfo example
-
-The following @file{loginfo} file, together with the
-tiny shell-script below, appends all log messages
-to the file @file{$CVSROOT/CVSROOT/commitlog},
-and any commits to the administrative files (inside
-the @file{CVSROOT} directory) are also logged in
-@file{/usr/adm/cvsroot-log}.
-Commits to the @file{prog1} directory are mailed to @t{ceder}.
-
-@c FIXME: is it a CVS feature or bug that only the
-@c first matching line is used? It is documented
-@c above, but is it useful? For example, if we wanted
-@c to run both "cvs-log" and "Mail" for the CVSROOT
-@c directory, it is kind of awkward if
-@c only the first matching line is used.
-@example
-ALL /usr/local/bin/cvs-log $CVSROOT/CVSROOT/commitlog $USER
-^CVSROOT /usr/local/bin/cvs-log /usr/adm/cvsroot-log
-^prog1 Mail -s %s ceder
-@end example
-
-The shell-script @file{/usr/local/bin/cvs-log} looks
-like this:
-
-@example
-#!/bin/sh
-(echo "------------------------------------------------------";
- echo -n $2" ";
- date;
- echo;
- cat) >> $1
-@end example
-
-@node Keeping a checked out copy
-@appendixsubsubsec Keeping a checked out copy
-
-@c What other index entries? It seems like
-@c people might want to use a lot of different
-@c words for this functionality.
-@cindex Keeping a checked out copy
-@cindex Checked out copy, keeping
-@cindex Web pages, maintaining with CVS
-
-It is often useful to maintain a directory tree which
-contains files which correspond to the latest version
-in the repository. For example, other developers might
-want to refer to the latest sources without having to
-check them out, or you might be maintaining a web site
-with @sc{cvs} and want every checkin to cause the files
-used by the web server to be updated.
-@c Can we offer more details on the web example? Or
-@c point the user at how to figure it out? This text
-@c strikes me as sufficient for someone who already has
-@c some idea of what we mean but not enough for the naive
-@c user/sysadmin to understand it and set it up.
-
-The way to do this is by having loginfo invoke
-@code{cvs update}. Doing so in the naive way will
-cause a problem with locks, so the @code{cvs update}
-must be run in the background.
-@c Should we try to describe the problem with locks?
-@c It seems like a digression for someone who just
-@c wants to know how to make it work.
-@c Another choice which might work for a single file
-@c is to use "cvs -n update -p" which doesn't take
-@c out locks (I think) but I don't see many advantages
-@c of that and we might as well document something which
-@c works for multiple files.
-Here is an example for unix (this should all be on one line):
-
-@example
-^cyclic-pages (date; cat; (sleep 2; cd /u/www/local-docs;
- cvs -q update -d) &) >> $CVSROOT/CVSROOT/updatelog 2>&1
-@end example
-
-This will cause checkins to repository directories
-starting with @code{cyclic-pages} to update the checked
-out tree in @file{/u/www/local-docs}.
-@c More info on some of the details? The "sleep 2" is
-@c so if we are lucky the lock will be gone by the time
-@c we start and we can wait 2 seconds instead of 30.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node rcsinfo
-@appendixsec Rcsinfo
-@cindex rcsinfo (admin file)
-@cindex Form for log message
-@cindex Log message template
-@cindex Template for log message
-
-The @file{rcsinfo} file can be used to specify a form to
-edit when filling out the commit log. The
-@file{rcsinfo} file has a syntax similar to the
-@file{verifymsg}, @file{commitinfo} and @file{loginfo}
-files. @xref{syntax}. Unlike the other files the second
-part is @emph{not} a command-line template. Instead,
-the part after the regular expression should be a full pathname to
-a file containing the log message template.
-
-If the repository name does not match any of the
-regular expressions in this file, the @samp{DEFAULT}
-line is used, if it is specified.
-
-All occurrences of the name @samp{ALL} appearing as a
-regular expression are used in addition to the first
-matching regular expression or @samp{DEFAULT}.
-
-@c FIXME: should be offering advice, somewhere around
-@c here, about where to put the template file. The
-@c verifymsg example uses /usr/cvssupport but doesn't
-@c say anything about what that directory is for or
-@c whether it is hardwired into CVS or who creates
-@c it or anything. In particular we should say
-@c how to version control the template file. A
-@c probably better answer than the /usr/cvssupport
-@c stuff is to use checkoutlist (with xref to the
-@c checkoutlist doc).
-@c Also I am starting to see a connection between
-@c this and the Keeping a checked out copy node.
-@c Probably want to say something about that.
-The log message template will be used as a default log
-message. If you specify a log message with @samp{cvs
-commit -m @var{message}} or @samp{cvs commit -f
-@var{file}} that log message will override the
-template.
-
-@xref{verifymsg}, for an example @file{rcsinfo}
-file.
-
-When @sc{cvs} is accessing a remote repository,
-the contents of @file{rcsinfo} at the time a directory
-is first checked out will specify a template which does
-not then change. If you edit @file{rcsinfo} or its
-templates, you may need to check out a new working
-directory.
-@c Would be nice to fix CVS so this isn't needed. For
-@c example, a mechanism analogous to CVS/Entries, where
-@c the client keeps track of what version of the template
-@c it has.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node taginfo
-@appendixsec Taginfo
-@cindex taginfo (admin file)
-@cindex Tags, logging
-@cindex Tags, verifying
-The @file{taginfo} file defines programs to execute
-when someone executes a @code{tag} or @code{rtag}
-command. The @file{taginfo} file has the standard form
-for trigger scripts (@pxref{Trigger Scripts}),
-where each line is a regular expression
-followed by a command to execute (@pxref{syntax}). The arguments passed
-to the command are, in order, the @var{tagname},
-@var{operation} (@code{add} for @code{tag},
-@code{mov} for @code{tag -F}, and @code{del} for
-@code{tag -d}), @var{repository}, and any remaining are
-pairs of @var{filename} @var{revision}. A non-zero
-exit of the filter program will cause the tag to be
-aborted.
-
-Here is an example of using the @file{taginfo} file
-to log @code{tag} and @code{rtag}
-commands. In the @file{taginfo} file put:
-
-@example
-ALL /usr/local/cvsroot/CVSROOT/loggit
-@end example
-
-@noindent
-Where @file{/usr/local/cvsroot/CVSROOT/loggit} contains the
-following script:
-
-@example
-#!/bin/sh
-echo "$@@" >>/home/kingdon/cvsroot/CVSROOT/taglog
-@end example
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node cvsignore
-@appendixsec Ignoring files via cvsignore
-@cindex cvsignore (admin file), global
-@cindex Global cvsignore
-@cindex Ignoring files
-@c -- This chapter should maybe be moved to the
-@c tutorial part of the manual?
-
-There are certain file names that frequently occur
-inside your working copy, but that you don't want to
-put under @sc{cvs} control. Examples are all the object
-files that you get while you compile your sources.
-Normally, when you run @samp{cvs update}, it prints a
-line for each file it encounters that it doesn't know
-about (@pxref{update output}).
-
-@sc{cvs} has a list of files (or sh(1) file name patterns)
-that it should ignore while running @code{update},
-@code{import} and @code{release}.
-@c -- Are those the only three commands affected?
-This list is constructed in the following way.
-
-@itemize @bullet
-@item
-The list is initialized to include certain file name
-patterns: names associated with @sc{cvs}
-administration, or with other common source control
-systems; common names for patch files, object files,
-archive files, and editor backup files; and other names
-that are usually artifacts of assorted utilities.
-Currently, the default list of ignored file name
-patterns is:
-
-@cindex Ignored files
-@cindex Automatically ignored files
-@example
- RCS SCCS CVS CVS.adm
- RCSLOG cvslog.*
- tags TAGS
- .make.state .nse_depinfo
- *~ #* .#* ,* _$* *$
- *.old *.bak *.BAK *.orig *.rej .del-*
- *.a *.olb *.o *.obj *.so *.exe
- *.Z *.elc *.ln
- core
-@end example
-
-@item
-The per-repository list in
-@file{$CVSROOT/CVSROOT/cvsignore} is appended to
-the list, if that file exists.
-
-@item
-The per-user list in @file{.cvsignore} in your home
-directory is appended to the list, if it exists.
-
-@item
-Any entries in the environment variable
-@code{$CVSIGNORE} is appended to the list.
-
-@item
-Any @samp{-I} options given to @sc{cvs} is appended.
-
-@item
-As @sc{cvs} traverses through your directories, the contents
-of any @file{.cvsignore} will be appended to the list.
-The patterns found in @file{.cvsignore} are only valid
-for the directory that contains them, not for
-any sub-directories.
-@end itemize
-
-In any of the 5 places listed above, a single
-exclamation mark (@samp{!}) clears the ignore list.
-This can be used if you want to store any file which
-normally is ignored by @sc{cvs}.
-
-Specifying @samp{-I !} to @code{cvs import} will import
-everything, which is generally what you want to do if
-you are importing files from a pristine distribution or
-any other source which is known to not contain any
-extraneous files. However, looking at the rules above
-you will see there is a fly in the ointment; if the
-distribution contains any @file{.cvsignore} files, then
-the patterns from those files will be processed even if
-@samp{-I !} is specified. The only workaround is to
-remove the @file{.cvsignore} files in order to do the
-import. Because this is awkward, in the future
-@samp{-I !} might be modified to override
-@file{.cvsignore} files in each directory.
-
-Note that the syntax of the ignore files consists of a
-series of lines, each of which contains a space
-separated list of filenames. This offers no clean way
-to specify filenames which contain spaces, but you can
-use a workaround like @file{foo?bar} to match a file
-named @file{foo bar} (it also matches @file{fooxbar}
-and the like). Also note that there is currently no
-way to specify comments.
-@c FIXCVS? I don't _like_ this syntax at all, but
-@c changing it raises all the usual compatibility
-@c issues and I'm also not sure what to change it to.
-
-@node checkoutlist
-@appendixsec The checkoutlist file
-@cindex checkoutlist
-
-It may be helpful to use @sc{cvs} to maintain your own
-files in the @file{CVSROOT} directory. For example,
-suppose that you have a script @file{logcommit.pl}
-which you run by including the following line in the
-@file{commitinfo} administrative file:
-
-@example
-ALL $CVSROOT/CVSROOT/logcommit.pl
-@end example
-
-To maintain @file{logcommit.pl} with @sc{cvs} you would
-add the following line to the @file{checkoutlist}
-administrative file:
-
-@example
-logcommit.pl
-@end example
-
-The format of @file{checkoutlist} is one line for each
-file that you want to maintain using @sc{cvs}, giving
-the name of the file, followed optionally by more whitespace
-and any error message that should print if the file cannot be
-checked out into CVSROOT after a commit:
-
-@example
-logcommit.pl Could not update CVSROOT/logcommit.pl.
-@end example
-
-After setting up @file{checkoutlist} in this fashion,
-the files listed there will function just like
-@sc{cvs}'s built-in administrative files. For example,
-when checking in one of the files you should get a
-message such as:
-
-@example
-cvs commit: Rebuilding administrative file database
-@end example
-
-@noindent
-and the checked out copy in the @file{CVSROOT}
-directory should be updated.
-
-Note that listing @file{passwd} (@pxref{Password
-authentication server}) in @file{checkoutlist} is not
-recommended for security reasons.
-
-For information about keeping a checkout out copy in a
-more general context than the one provided by
-@file{checkoutlist}, see @ref{Keeping a checked out
-copy}.
-
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@node history file
-@appendixsec The history file
-@cindex History file
-@cindex Log information, saving
-
-The file @file{$CVSROOT/CVSROOT/history} is used
-to log information for the @code{history} command
-(@pxref{history}). This file must be created to turn
-on logging. This is done automatically if the
-@code{cvs init} command is used to set up the
-repository (@pxref{Creating a repository}).
-
-The file format of the @file{history} file is
-documented only in comments in the @sc{cvs} source
-code, but generally programs should use the @code{cvs
-history} command to access it anyway, in case the
-format changes with future releases of @sc{cvs}.
-
-@node Variables
-@appendixsec Expansions in administrative files
-@cindex Internal variables
-@cindex Variables
-
-Sometimes in writing an administrative file, you might
-want the file to be able to know various things based
-on environment @sc{cvs} is running in. There are
-several mechanisms to do that.
-
-To find the home directory of the user running @sc{cvs}
-(from the @code{HOME} environment variable), use
-@samp{~} followed by @samp{/} or the end of the line.
-Likewise for the home directory of @var{user}, use
-@samp{~@var{user}}. These variables are expanded on
-the server machine, and don't get any reasonable
-expansion if pserver (@pxref{Password authenticated})
-is in use; therefore user variables (see below) may be
-a better choice to customize behavior based on the user
-running @sc{cvs}.
-@c Based on these limitations, should we deprecate ~?
-@c What is it good for? Are people using it?
-
-One may want to know about various pieces of
-information internal to @sc{cvs}. A @sc{cvs} internal
-variable has the syntax @code{$@{@var{variable}@}},
-where @var{variable} starts with a letter and consists
-of alphanumeric characters and @samp{_}. If the
-character following @var{variable} is a
-non-alphanumeric character other than @samp{_}, the
-@samp{@{} and @samp{@}} can be omitted. The @sc{cvs}
-internal variables are:
-
-@table @code
-@item CVSROOT
-@cindex CVSROOT, internal variable
-This is the absolute path to the current @sc{cvs} root directory.
-@xref{Repository}, for a description of the various
-ways to specify this, but note that the internal
-variable contains just the directory and not any
-of the access method information.
-
-@item RCSBIN
-@cindex RCSBIN, internal variable
-In @sc{cvs} 1.9.18 and older, this specified the
-directory where @sc{cvs} was looking for @sc{rcs}
-programs. Because @sc{cvs} no longer runs @sc{rcs}
-programs, specifying this internal variable is now an
-error.
-
-@item CVSEDITOR
-@cindex CVSEDITOR, internal variable
-@itemx EDITOR
-@cindex EDITOR, internal variable
-@itemx VISUAL
-@cindex VISUAL, internal variable
-These all expand to the same value, which is the editor
-that @sc{cvs} is using. @xref{Global options}, for how
-to specify this.
-
-@item USER
-@cindex USER, internal variable
-Username of the user running @sc{cvs} (on the @sc{cvs}
-server machine).
-When using pserver, this is the user specified in the repository
-specification which need not be the same as the username the
-server is running as (@pxref{Password authentication server}).
-Do not confuse this with the environment variable of the same name.
-@end table
-
-If you want to pass a value to the administrative files
-which the user who is running @sc{cvs} can specify,
-use a user variable.
-@cindex User variables
-To expand a user variable, the
-administrative file contains
-@code{$@{=@var{variable}@}}. To set a user variable,
-specify the global option @samp{-s} to @sc{cvs}, with
-argument @code{@var{variable}=@var{value}}. It may be
-particularly useful to specify this option via
-@file{.cvsrc} (@pxref{~/.cvsrc}).
-
-For example, if you want the administrative file to
-refer to a test directory you might create a user
-variable @code{TESTDIR}. Then if @sc{cvs} is invoked
-as
-
-@example
-cvs -s TESTDIR=/work/local/tests
-@end example
-
-@noindent
-and the
-administrative file contains @code{sh
-$@{=TESTDIR@}/runtests}, then that string is expanded
-to @code{sh /work/local/tests/runtests}.
-
-All other strings containing @samp{$} are reserved;
-there is no way to quote a @samp{$} character so that
-@samp{$} represents itself.
-
-Environment variables passed to administrative files are:
-
-@table @code
-@cindex environment variables, passed to administrative files
-
-@item CVS_USER
-@cindex CVS_USER, environment variable
-The @sc{cvs}-specific username provided by the user, if it
-can be provided (currently just for the pserver access
-method), and to the empty string otherwise. (@code{CVS_USER}
-and @code{USER} may differ when @file{$CVSROOT/CVSROOT/passwd}
-is used to map @sc{cvs} usernames to system usernames.)
-
-@item LOGNAME
-@cindex LOGNAME, environment variable
-The username of the system user.
-
-@item USER
-@cindex USER, environment variable
-Same as @code{LOGNAME}.
-Do not confuse this with the internal variable of the same name.
-@end table
-
-@node config
-@appendixsec The CVSROOT/config configuration file
-
-@cindex config, in CVSROOT
-@cindex CVSROOT/config
-
-The administrative file @file{config} contains various
-miscellaneous settings which affect the behavior of
-@sc{cvs}. The syntax is slightly different from the
-other administrative files. Variables are not
-expanded. Lines which start with @samp{#} are
-considered comments.
-@c FIXME: where do we define comments for the other
-@c administrative files.
-Other lines consist of a keyword, @samp{=}, and a
-value. Note that this syntax is very strict.
-Extraneous spaces or tabs are not permitted.
-@c See comments in parseinfo.c:parse_config for more
-@c discussion of this strictness.
-
-Currently defined keywords are:
-
-@table @code
-@cindex RCSBIN, in CVSROOT/config
-@item RCSBIN=@var{bindir}
-For @sc{cvs} 1.9.12 through 1.9.18, this setting told
-@sc{cvs} to look for @sc{rcs} programs in the
-@var{bindir} directory. Current versions of @sc{cvs}
-do not run @sc{rcs} programs; for compatibility this
-setting is accepted, but it does nothing.
-
-@cindex SystemAuth, in CVSROOT/config
-@item SystemAuth=@var{value}
-If @var{value} is @samp{yes}, then pserver should check
-for users in the system's user database if not found in
-@file{CVSROOT/passwd}. If it is @samp{no}, then all
-pserver users must exist in @file{CVSROOT/passwd}.
-The default is @samp{yes}. For more on pserver, see
-@ref{Password authenticated}.
-
-@ignore
-@cindex PreservePermissions, in CVSROOT/config
-@item PreservePermissions=@var{value}
-Enable support for saving special device files,
-symbolic links, file permissions and ownerships in the
-repository. The default value is @samp{no}.
-@xref{Special Files}, for the full implications of using
-this keyword.
-@end ignore
-
-@cindex TopLevelAdmin, in CVSROOT/config
-@item TopLevelAdmin=@var{value}
-Modify the @samp{checkout} command to create a
-@samp{CVS} directory at the top level of the new
-working directory, in addition to @samp{CVS}
-directories created within checked-out directories.
-The default value is @samp{no}.
-
-This option is useful if you find yourself performing
-many commands at the top level of your working
-directory, rather than in one of the checked out
-subdirectories. The @file{CVS} directory created there
-will mean you don't have to specify @code{CVSROOT} for
-each command. It also provides a place for the
-@file{CVS/Template} file (@pxref{Working directory
-storage}).
-
-@cindex LockDir, in CVSROOT/config
-@item LockDir=@var{directory}
-Put @sc{cvs} lock files in @var{directory} rather than
-directly in the repository. This is useful if you want
-to let users read from the repository while giving them
-write access only to @var{directory}, not to the
-repository.
-It can also be used to put the locks on a very fast
-in-memory file system to speed up locking and unlocking
-the repository.
-You need to create @var{directory}, but
-@sc{cvs} will create subdirectories of @var{directory} as it
-needs them. For information on @sc{cvs} locks, see
-@ref{Concurrency}.
-
-@c Mention this in Compatibility section?
-Before enabling the LockDir option, make sure that you
-have tracked down and removed any copies of @sc{cvs} 1.9 or
-older. Such versions neither support LockDir, nor will
-give an error indicating that they don't support it.
-The result, if this is allowed to happen, is that some
-@sc{cvs} users will put the locks one place, and others will
-put them another place, and therefore the repository
-could become corrupted. @sc{cvs} 1.10 does not support
-LockDir but it will print a warning if run on a
-repository with LockDir enabled.
-
-@cindex LogHistory, in CVSROOT/config
-@item LogHistory=@var{value}
-Control what is logged to the @file{CVSROOT/history} file (@pxref{history}).
-Default of @samp{TOEFWUPCGMAR} (or simply @samp{all}) will log
-all transactions. Any subset of the default is
-legal. (For example, to only log transactions that modify the
-@file{*,v} files, use @samp{LogHistory=TMAR}.)
-
-@cindex RereadLogAfterVerify, in CVSROOT/config
-@cindex @file{verifymsg}, changing the log message
-@item RereadLogAfterVerify=@var{value}
-Modify the @samp{commit} command such that CVS will reread the
-log message after running the program specified by @file{verifymsg}.
-@var{value} may be one of @samp{yes} or @samp{always}, indicating that
-the log message should always be reread; @samp{no}
-or @samp{never}, indicating that it should never be
-reread; or @var{value} may be @samp{stat}, indicating
-that the file should be checked with the file system
-@samp{stat()} function to see if it has changed (see warning below)
-before rereading. The default value is @samp{always}.
-
-@strong{The `stat' mode can cause CVS to pause for up to
-one extra second per directory committed. This can be less IO and
-CPU intensive but is not recommended for use with large repositories}
-
-@xref{verifymsg}, for more information on how verifymsg
-may be used.
-
-@cindex IgnoreUnknownConfigKeys, in CVSROOT/config
-@item IgnoreUnknownConfigKeys=@var{value}
-If @var{value} is @samp{yes}, then @sc{cvs} should
-ignore any keywords in @file{CVSROOT/config} which it
-does not recognize. This option is intended primarily
-for transitions between versions of @sc{cvs} which
-support more configuration options in an environment
-where a read-only mirror of the current @sc{cvs} server
-may be maintained by someone else who is not yet ready
-to upgrade to the same version. It is recommended that
-this option be used only for a short time so that
-problems with the @file{CVSROOT/config} file will be
-found quickly. The default is @samp{no}.
-@end table
-
-@c ---------------------------------------------------------------------
-@node Environment variables
-@appendix All environment variables which affect CVS
-@cindex Environment variables
-@cindex Reference manual for variables
-
-This is a complete list of all environment variables
-that affect @sc{cvs}.
-
-@table @code
-@cindex CVSIGNORE, environment variable
-@item $CVSIGNORE
-A whitespace-separated list of file name patterns that
-@sc{cvs} should ignore. @xref{cvsignore}.
-
-@cindex CVSWRAPPERS, environment variable
-@item $CVSWRAPPERS
-A whitespace-separated list of file name patterns that
-@sc{cvs} should treat as wrappers. @xref{Wrappers}.
-
-@cindex CVSREAD, environment variable
-@cindex Read-only files, and CVSREAD
-@item $CVSREAD
-If this is set, @code{checkout} and @code{update} will
-try hard to make the files in your working directory
-read-only. When this is not set, the default behavior
-is to permit modification of your working files.
-
-@item $CVSUMASK
-Controls permissions of files in the repository. See
-@ref{File permissions}.
-
-@item $CVSROOT
-Should contain the full pathname to the root of the @sc{cvs}
-source repository (where the @sc{rcs} files are
-kept). This information must be available to @sc{cvs} for
-most commands to execute; if @code{$CVSROOT} is not set,
-or if you wish to override it for one invocation, you
-can supply it on the command line: @samp{cvs -d cvsroot
-cvs_command@dots{}} Once you have checked out a working
-directory, @sc{cvs} stores the appropriate root (in
-the file @file{CVS/Root}), so normally you only need to
-worry about this when initially checking out a working
-directory.
-
-@item $CVSEDITOR
-@cindex CVSEDITOR, environment variable
-@itemx $EDITOR
-@cindex EDITOR, environment variable
-@itemx $VISUAL
-@cindex VISUAL, environment variable
-Specifies the program to use for recording log messages
-during commit. @code{$CVSEDITOR} overrides
-@code{$EDITOR}, which overrides @code{$VISUAL}.
-See @ref{Committing your changes} for more or
-@ref{Global options} for alternative ways of specifying a
-log editor.
-
-@cindex PATH, environment variable
-@item $PATH
-If @code{$RCSBIN} is not set, and no path is compiled
-into @sc{cvs}, it will use @code{$PATH} to try to find all
-programs it uses.
-
-@cindex HOME, environment variable
-@item $HOME
-@cindex HOMEPATH, environment variable
-@item $HOMEPATH
-@cindex HOMEDRIVE, environment variable
-@item $HOMEDRIVE
-Used to locate the directory where the @file{.cvsrc}
-file, and other such files, are searched. On Unix, @sc{cvs}
-just checks for @code{HOME}. On Windows NT, the system will
-set @code{HOMEDRIVE}, for example to @samp{d:} and @code{HOMEPATH},
-for example to @file{\joe}. On Windows 95, you'll
-probably need to set @code{HOMEDRIVE} and @code{HOMEPATH} yourself.
-@c We are being vague about whether HOME works on
-@c Windows; see long comment in windows-NT/filesubr.c.
-
-@cindex CVS_RSH, environment variable
-@item $CVS_RSH
-Specifies the external program which @sc{cvs} connects with,
-when @code{:ext:} access method is specified.
-@pxref{Connecting via rsh}.
-
-@cindex CVS_SSH, environment variable
-@item $CVS_SSH
-Specifies the external program which @sc{cvs} connects with,
-when @code{:extssh:} access method is specified.
-@pxref{Connecting via rsh}.
-
-@item $CVS_SERVER
-Used in client-server mode when accessing a remote
-repository using @sc{rsh}. It specifies the name of
-the program to start on the server side (and any
-necessary arguments) when accessing a remote repository
-using the @code{:ext:}, @code{:fork:}, or @code{:server:} access methods.
-The default value for @code{:ext:} and @code{:server:} is @code{cvs};
-the default value for @code{:fork:} is the name used to run the client.
-@pxref{Connecting via rsh}
-
-@item $CVS_PASSFILE
-Used in client-server mode when accessing the @code{cvs
-login server}. Default value is @file{$HOME/.cvspass}.
-@pxref{Password authentication client}
-
-@item $CVS_CLIENT_PORT
-Used in client-server mode to set the port to use when accessing the server
-via Kerberos, GSSAPI, or @sc{cvs}'s password authentication protocol
-if the port is not specified in the CVSROOT.
-@pxref{Remote repositories}
-
-@cindex CVS_RCMD_PORT, environment variable
-@item $CVS_RCMD_PORT
-Used in client-server mode. If set, specifies the port
-number to be used when accessing the @sc{rcmd} demon on
-the server side. (Currently not used for Unix clients).
-
-@cindex CVS_CLIENT_LOG, environment variable
-@item $CVS_CLIENT_LOG
-Used for debugging only in client-server
-mode. If set, everything sent to the server is logged
-into @file{@code{$CVS_CLIENT_LOG}.in} and everything
-sent from the server is logged into
-@file{@code{$CVS_CLIENT_LOG}.out}.
-
-@cindex CVS_SERVER_SLEEP, environment variable
-@item $CVS_SERVER_SLEEP
-Used only for debugging the server side in
-client-server mode. If set, delays the start of the
-server child process the specified amount of
-seconds so that you can attach to it with a debugger.
-
-@cindex CVS_IGNORE_REMOTE_ROOT, environment variable
-@item $CVS_IGNORE_REMOTE_ROOT
-For @sc{cvs} 1.10 and older, setting this variable
-prevents @sc{cvs} from overwriting the @file{CVS/Root}
-file when the @samp{-d} global option is specified.
-Later versions of @sc{cvs} do not rewrite
-@file{CVS/Root}, so @code{CVS_IGNORE_REMOTE_ROOT} has no
-effect.
-
-@cindex COMSPEC, environment variable
-@item $COMSPEC
-Used under OS/2 only. It specifies the name of the
-command interpreter and defaults to @sc{cmd.exe}.
-
-@cindex TMPDIR, environment variable
-@item $TMPDIR
-@cindex TMP, environment variable
-@itemx $TMP
-@cindex TEMP, environment variable
-@itemx $TEMP
-@cindex Temporary files, location of
-@c This is quite nuts. We don't talk about tempnam
-@c or mkstemp which we sometimes use. The discussion
-@c of "Global options" is semi-incoherent.
-@c I'm not even sure those are the only inaccuracies.
-@c Furthermore, the conventions are
-@c pretty crazy and they should be simplified.
-Directory in which temporary files are located.
-The @sc{cvs} server uses
-@code{TMPDIR}. @xref{Global options}, for a
-description of how to specify this.
-Some parts of @sc{cvs} will always use @file{/tmp} (via
-the @code{tmpnam} function provided by the system).
-
-On Windows NT, @code{TMP} is used (via the @code{_tempnam}
-function provided by the system).
-
-The @code{patch} program which is used by the @sc{cvs}
-client uses @code{TMPDIR}, and if it is not set, uses
-@file{/tmp} (at least with GNU patch 2.1). Note that
-if your server and client are both running @sc{cvs}
-1.9.10 or later, @sc{cvs} will not invoke an external
-@code{patch} program.
-@end table
-
-@node Compatibility
-@appendix Compatibility between CVS Versions
-
-@cindex CVS, versions of
-@cindex Versions, of CVS
-@cindex Compatibility, between CVS versions
-@c We don't mention versions older than CVS 1.3
-@c on the theory that it would clutter it up for the vast
-@c majority of people, who don't have anything that old.
-@c
-The repository format is compatible going back to
-@sc{cvs} 1.3. But see @ref{Watches Compatibility}, if
-you have copies of @sc{cvs} 1.6 or older and you want
-to use the optional developer communication features.
-@c If you "cvs rm" and commit using 1.3, then you'll
-@c want to run "rcs -sdead <file,v>" on each of the
-@c files in the Attic if you then want 1.5 and
-@c later to recognize those files as dead (I think the
-@c symptom if this is not done is that files reappear
-@c in joins). (Wait: the above will work but really to
-@c be strictly correct we should suggest checking
-@c in a new revision rather than just changing the
-@c state of the head revision, shouldn't we?).
-@c The old convert.sh script was for this, but it never
-@c did get updated to reflect use of the RCS "dead"
-@c state.
-@c Note: this is tricky to document without confusing
-@c people--need to carefully say what CVS version we
-@c are talking about and keep in mind the distinction
-@c between a
-@c repository created with 1.3 and on which one now
-@c uses 1.5+, and a repository on which one wants to
-@c use both versions side by side (e.g. during a
-@c transition period).
-@c Wait, can't CVS just detect the case in which a file
-@c is in the Attic but the head revision is not dead?
-@c Not sure whether this should produce a warning or
-@c something, and probably needs further thought, but
-@c it would appear that the situation can be detected.
-@c
-@c We might want to separate out the 1.3 compatibility
-@c section (for repository & working directory) from the
-@c rest--that might help avoid confusing people who
-@c are upgrading (for example) from 1.6 to 1.8.
-@c
-@c A minor incompatibility is if a current version of CVS
-@c puts "Nfoo" into CVS/Tag, then CVS 1.9 or older will
-@c see this as if there is no tag. Seems to me this is
-@c too obscure to mention.
-
-The working directory format is compatible going back
-to @sc{cvs} 1.5. It did change between @sc{cvs} 1.3
-and @sc{cvs} 1.5. If you run @sc{cvs} 1.5 or newer on
-a working directory checked out with @sc{cvs} 1.3,
-@sc{cvs} will convert it, but to go back to @sc{cvs}
-1.3 you need to check out a new working directory with
-@sc{cvs} 1.3.
-
-The remote protocol is interoperable going back to @sc{cvs} 1.5, but no
-further (1.5 was the first official release with the remote protocol,
-but some older versions might still be floating around). In many
-cases you need to upgrade both the client and the server to take
-advantage of new features and bug fixes, however.
-
-@c Perhaps should be saying something here about the
-@c "D" lines in Entries (written by CVS 1.9; 1.8 and
-@c older don't use them). These are supposed to be
-@c compatible in both directions, but I'm not sure
-@c they quite are 100%. One common gripe is if you
-@c "rm -r" a directory and 1.9 gets confused, as it
-@c still sees it in Entries. That one is fixed in
-@c (say) 1.9.6. Someone else reported problems with
-@c starting with a directory which was checked out with
-@c an old version, and then using a new version, and
-@c some "D" lines appeared, but not for every
-@c directory, causing some directories to be skipped.
-@c They weren't sure how to reproduce this, though.
-
-@c ---------------------------------------------------------------------
-@node Troubleshooting
-@appendix Troubleshooting
-
-If you are having trouble with @sc{cvs}, this appendix
-may help. If there is a particular error message which
-you are seeing, then you can look up the message
-alphabetically. If not, you can look through the
-section on other problems to see if your problem is
-mentioned there.
-
-@menu
-* Error messages:: Partial list of CVS errors
-* Connection:: Trouble making a connection to a CVS server
-* Other problems:: Problems not readily listed by error message
-@end menu
-
-@ignore
-@c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-@c @node Bad administrative files
-@appendixsec Bad administrative files
-
-@c -- Give hints on how to fix them
-@end ignore
-
-@node Error messages
-@appendixsec Partial list of error messages
-
-Here is a partial list of error messages that you may
-see from @sc{cvs}. It is not a complete list---@sc{cvs}
-is capable of printing many, many error messages, often
-with parts of them supplied by the operating system,
-but the intention is to list the common and/or
-potentially confusing error messages.
-
-The messages are alphabetical, but introductory text
-such as @samp{cvs update: } is not considered in
-ordering them.
-
-In some cases the list includes messages printed by old
-versions of @sc{cvs} (partly because users may not be
-sure which version of @sc{cvs} they are using at any
-particular moment).
-@c If we want to start retiring messages, perhaps we
-@c should pick a cutoff version (for example, no more
-@c messages which are specific to versions before 1.9)
-@c and then move the old messages to an "old messages"
-@c node rather than deleting them completely.
-
-@table @code
-@c FIXME: What is the correct way to format a multiline
-@c error message here? Maybe @table is the wrong
-@c choice? Texinfo gurus?
-@item @var{file}:@var{line}: Assertion '@var{text}' failed
-The exact format of this message may vary depending on
-your system. It indicates a bug in @sc{cvs}, which can
-be handled as described in @ref{BUGS}.
-
-@item cvs @var{command}: authorization failed: server @var{host} rejected access
-This is a generic response when trying to connect to a
-pserver server which chooses not to provide a
-specific reason for denying authorization. Check that
-the username and password specified are correct and
-that the @code{CVSROOT} specified is allowed by @samp{--allow-root}
-in @file{inetd.conf}. See @ref{Password authenticated}.
-
-@item cvs @var{command}: conflict: removed @var{file} was modified by second party
-This message indicates that you removed a file, and
-someone else modified it. To resolve the conflict,
-first run @samp{cvs add @var{file}}. If desired, look
-at the other party's modification to decide whether you
-still want to remove it. If you don't want to remove
-it, stop here. If you do want to remove it, proceed
-with @samp{cvs remove @var{file}} and commit your
-removal.
-@c Tests conflicts2-142b* in sanity.sh test for this.
-
-@item cannot change permissions on temporary directory
-@example
-Operation not permitted
-@end example
-This message has been happening in a non-reproducible,
-occasional way when we run the client/server testsuite,
-both on Red Hat Linux 3.0.3 and 4.1. We haven't been
-able to figure out what causes it, nor is it known
-whether it is specific to Linux (or even to this
-particular machine!). If the problem does occur on
-other unices, @samp{Operation not permitted} would be
-likely to read @samp{Not owner} or whatever the system
-in question uses for the unix @code{EPERM} error. If
-you have any information to add, please let us know as
-described in @ref{BUGS}. If you experience this error
-while using @sc{cvs}, retrying the operation which
-produced it should work fine.
-@c This has been seen in a variety of tests, including
-@c multibranch-2, multibranch-5, and basic1-24-rm-rm,
-@c so it doesn't seem particularly specific to any one
-@c test.
-
-@item cvs [server aborted]: Cannot check out files into the repository itself
-The obvious cause for this message (especially for
-non-client/server @sc{cvs}) is that the @sc{cvs} root
-is, for example, @file{/usr/local/cvsroot} and you try
-to check out files when you are in a subdirectory, such
-as @file{/usr/local/cvsroot/test}. However, there is a
-more subtle cause, which is that the temporary
-directory on the server is set to a subdirectory of the
-root (which is also not allowed). If this is the
-problem, set the temporary directory to somewhere else,
-for example @file{/var/tmp}; see @code{TMPDIR} in
-@ref{Environment variables}, for how to set the
-temporary directory.
-
-@item cannot commit files as 'root'
-See @samp{'root' is not allowed to commit files}.
-
-@c For one example see basica-1a10 in the testsuite
-@c For another example, "cvs co ." on NT; see comment
-@c at windows-NT/filesubr.c (expand_wild).
-@c For another example, "cvs co foo/bar" where foo exists.
-@item cannot open CVS/Entries for reading: No such file or directory
-This generally indicates a @sc{cvs} internal error, and
-can be handled as with other @sc{cvs} bugs
-(@pxref{BUGS}). Usually there is a workaround---the
-exact nature of which would depend on the situation but
-which hopefully could be figured out.
-
-@c This is more obscure than it might sound; it only
-@c happens if you run "cvs init" from a directory which
-@c contains a CVS/Root file at the start.
-@item cvs [init aborted]: cannot open CVS/Root: No such file or directory
-This message is harmless. Provided it is not
-accompanied by other errors, the operation has
-completed successfully. This message should not occur
-with current versions of @sc{cvs}, but it is documented
-here for the benefit of @sc{cvs} 1.9 and older.
-
-@item cvs server: cannot open /root/.cvsignore: Permission denied
-@itemx cvs [server aborted]: can't chdir(/root): Permission denied
-See @ref{Connection}.
-
-@item cvs [checkout aborted]: cannot rename file @var{file} to CVS/,,@var{file}: Invalid argument
-This message has been reported as intermittently
-happening with @sc{cvs} 1.9 on Solaris 2.5. The cause is
-unknown; if you know more about what causes it, let us
-know as described in @ref{BUGS}.
-
-@item cvs [@var{command} aborted]: cannot start server via rcmd
-This, unfortunately, is a rather nonspecific error
-message which @sc{cvs} 1.9 will print if you are
-running the @sc{cvs} client and it is having trouble
-connecting to the server. Current versions of @sc{cvs}
-should print a much more specific error message. If
-you get this message when you didn't mean to run the
-client at all, you probably forgot to specify
-@code{:local:}, as described in @ref{Repository}.
-
-@item ci: @var{file},v: bad diff output line: Binary files - and /tmp/T2a22651 differ
-@sc{cvs} 1.9 and older will print this message
-when trying to check in a binary file if
-@sc{rcs} is not correctly installed. Re-read the
-instructions that came with your @sc{rcs} distribution
-and the @sc{install} file in the @sc{cvs}
-distribution. Alternately, upgrade to a current
-version of @sc{cvs}, which checks in files itself
-rather than via @sc{rcs}.
-
-@item cvs checkout: could not check out @var{file}
-With @sc{cvs} 1.9, this can mean that the @code{co} program
-(part of @sc{rcs}) returned a failure. It should be
-preceded by another error message, however it has been
-observed without another error message and the cause is
-not well-understood. With the current version of @sc{cvs},
-which does not run @code{co}, if this message occurs
-without another error message, it is definitely a @sc{cvs}
-bug (@pxref{BUGS}).
-@c My current suspicion is that the RCS in the rcs (not
-@c cvs/winnt/rcs57nt.zip) directory on the _Practical_
-@c CD is bad (remains to be confirmed).
-@c There is also a report of something which looks
-@c very similar on SGI, Irix 5.2, so I dunno.
-
-@item cvs [login aborted]: could not find out home directory
-This means that you need to set the environment
-variables that @sc{cvs} uses to locate your home directory.
-See the discussion of @code{HOME}, @code{HOMEDRIVE}, and @code{HOMEPATH} in
-@ref{Environment variables}.
-
-@item cvs update: could not merge revision @var{rev} of @var{file}: No such file or directory
-@sc{cvs} 1.9 and older will print this message if there was
-a problem finding the @code{rcsmerge} program. Make
-sure that it is in your @code{PATH}, or upgrade to a
-current version of @sc{cvs}, which does not require
-an external @code{rcsmerge} program.
-
-@item cvs [update aborted]: could not patch @var{file}: No such file or directory
-This means that there was a problem finding the
-@code{patch} program. Make sure that it is in your
-@code{PATH}. Note that despite appearances the message
-is @emph{not} referring to whether it can find @var{file}.
-If both the client and the server are running a current
-version of @sc{cvs}, then there is no need for an
-external patch program and you should not see this
-message. But if either client or server is running
-@sc{cvs} 1.9, then you need @code{patch}.
-
-@item cvs update: could not patch @var{file}; will refetch
-This means that for whatever reason the client was
-unable to apply a patch that the server sent. The
-message is nothing to be concerned about, because
-inability to apply the patch only slows things down and
-has no effect on what @sc{cvs} does.
-@c xref to update output. Or File status?
-@c Or some place else that
-@c explains this whole "patch"/P/Needs Patch thing?
-
-@item dying gasps from @var{server} unexpected
-There is a known bug in the server for @sc{cvs} 1.9.18
-and older which can cause this. For me, this was
-reproducible if I used the @samp{-t} global option. It
-was fixed by Andy Piper's 14 Nov 1997 change to
-src/filesubr.c, if anyone is curious.
-If you see the message,
-you probably can just retry the operation which failed,
-or if you have discovered information concerning its
-cause, please let us know as described in @ref{BUGS}.
-
-@item end of file from server (consult above messages if any)
-The most common cause for this message is if you are
-using an external @code{rsh} or @code{ssh} program and it exited with
-an error. In this case the @code{rsh} program should
-have printed a message, which will appear before the
-above message. For more information on setting up a
-@sc{cvs} client and server, see @ref{Remote repositories}.
-
-@item cvs [update aborted]: EOF in key in RCS file @var{file},v
-@itemx cvs [checkout aborted]: EOF while looking for end of string in RCS file @var{file},v
-This means that there is a syntax error in the given
-@sc{rcs} file. Note that this might be true even if @sc{rcs} can
-read the file OK; @sc{cvs} does more error checking of
-errors in the RCS file. That is why you may see this
-message when upgrading from @sc{cvs} 1.9 to @sc{cvs}
-1.10. The likely cause for the original corruption is
-hardware, the operating system, or the like. Of
-course, if you find a case in which @sc{cvs} seems to
-corrupting the file, by all means report it,
-(@pxref{BUGS}).
-There are quite a few variations of this error message,
-depending on exactly where in the @sc{rcs} file @sc{cvs}
-finds the syntax error.
-
-@cindex mkmodules
-@item cvs commit: Executing 'mkmodules'
-This means that your repository is set up for a version
-of @sc{cvs} prior to @sc{cvs} 1.8. When using @sc{cvs}
-1.8 or later, the above message will be preceded by
-
-@example
-cvs commit: Rebuilding administrative file database
-@end example
-
-If you see both messages, the database is being rebuilt
-twice, which is unnecessary but harmless. If you wish
-to avoid the duplication, and you have no versions of
-@sc{cvs} 1.7 or earlier in use, remove @code{-i mkmodules}
-every place it appears in your @code{modules}
-file. For more information on the @code{modules} file,
-see @ref{modules}.
-
-@c This message comes from "co", and I believe is
-@c possible only with older versions of CVS which call
-@c co. The problem with being able to create the bogus
-@c RCS file still exists, though (and I think maybe
-@c there is a different symptom(s) now).
-@c FIXME: Would be nice to have a more exact wording
-@c for this message.
-@item missing author
-Typically this can happen if you created an RCS file
-with your username set to empty. @sc{cvs} will, bogusly,
-create an illegal RCS file with no value for the author
-field. The solution is to make sure your username is
-set to a non-empty value and re-create the RCS file.
-@c "make sure your username is set" is complicated in
-@c and of itself, as there are the environment
-@c variables the system login name, &c, and it depends
-@c on the version of CVS.
-
-@item cvs [checkout aborted]: no such tag @var{tag}
-This message means that @sc{cvs} isn't familiar with
-the tag @var{tag}. Usually this means that you have
-mistyped a tag name; however there are (relatively
-obscure) cases in which @sc{cvs} will require you to
-@c Search sanity.sh for "no such tag" to see some of
-@c the relatively obscure cases.
-try a few other @sc{cvs} commands involving that tag,
-before you find one which will cause @sc{cvs} to update
-@cindex CVSROOT/val-tags file, forcing tags into
-@cindex val-tags file, forcing tags into
-the @file{val-tags} file; see discussion of val-tags in
-@ref{File permissions}. You only need to worry about
-this once for a given tag; when a tag is listed in
-@file{val-tags}, it stays there. Note that using
-@samp{-f} to not require tag matches does not override
-this check; see @ref{Common options}.
-
-@item *PANIC* administration files missing
-This typically means that there is a directory named
-@sc{cvs} but it does not contain the administrative files
-which @sc{cvs} puts in a CVS directory. If the problem is
-that you created a CVS directory via some mechanism
-other than @sc{cvs}, then the answer is simple, use a name
-other than @sc{cvs}. If not, it indicates a @sc{cvs} bug
-(@pxref{BUGS}).
-
-@item rcs error: Unknown option: -x,v/
-This message will be followed by a usage message for
-@sc{rcs}. It means that you have an old version of
-@sc{rcs} (probably supplied with your operating
-system), as well as an old version of @sc{cvs}.
-@sc{cvs} 1.9.18 and earlier only work with @sc{rcs} version 5 and
-later; current versions of @sc{cvs} do not run @sc{rcs} programs.
-@c For more information on installing @sc{cvs}, see
-@c (FIXME: where? it depends on whether you are
-@c getting binaries or sources or what).
-@c The message can also say "ci error" or something
-@c instead of "rcs error", I suspect.
-
-@item cvs [server aborted]: received broken pipe signal
-This message can be caused by a loginfo program that fails to
-read all of the log information from its standard input.
-If you find it happening in any other circumstances,
-please let us know as described in @ref{BUGS}.
-
-@item 'root' is not allowed to commit files
-When committing a permanent change, @sc{cvs} makes a log entry of
-who committed the change. If you are committing the change logged
-in as "root" (not under "su" or other root-priv giving program),
-@sc{cvs} cannot determine who is actually making the change.
-As such, by default, @sc{cvs} disallows changes to be committed by users
-logged in as "root". (You can disable this option by passing the
-@code{--enable-rootcommit} option to @file{configure} and recompiling @sc{cvs}.
-On some systems this means editing the appropriate @file{config.h} file
-before building @sc{cvs}.)
-
-@item Terminated with fatal signal 11
-This message usually indicates that @sc{cvs} (the server, if you're
-using client/server mode) has run out of (virtual) memory.
-Although @sc{cvs} tries to catch the error and issue a more meaningful
-message, there are many circumstances where that is not possible.
-If you appear to have lots of memory available to the system,
-the problem is most likely that you're running into a system-wide
-limit on the amount of memory a single process can use or a
-similar process-specific limit.
-The mechanisms for displaying and setting such limits vary from
-system to system, so you'll have to consult an expert for your
-particular system if you don't know how to do that.
-
-@item Too many arguments!
-This message is typically printed by the @file{log.pl}
-script which is in the @file{contrib} directory in the
-@sc{cvs} source distribution. In some versions of
-@sc{cvs}, @file{log.pl} has been part of the default
-@sc{cvs} installation. The @file{log.pl} script gets
-called from the @file{loginfo} administrative file.
-Check that the arguments passed in @file{loginfo} match
-what your version of @file{log.pl} expects. In
-particular, the @file{log.pl} from @sc{cvs} 1.3 and
-older expects the log file as an argument whereas the
-@file{log.pl} from @sc{cvs} 1.5 and newer expects the
-log file to be specified with a @samp{-f} option. Of
-course, if you don't need @file{log.pl} you can just
-comment it out of @file{loginfo}.
-
-@item cvs [update aborted]: unexpected EOF reading @var{file},v
-See @samp{EOF in key in RCS file}.
-
-@item cvs [login aborted]: unrecognized auth response from @var{server}
-This message typically means that the server is not set
-up properly. For example, if @file{inetd.conf} points
-to a nonexistent cvs executable. To debug it further,
-find the log file which inetd writes
-(@file{/var/log/messages} or whatever inetd uses on
-your system). For details, see @ref{Connection}, and
-@ref{Password authentication server}.
-
-@item cvs commit: Up-to-date check failed for `@var{file}'
-This means that someone else has committed a change to
-that file since the last time that you did a @code{cvs
-update}. So before proceeding with your @code{cvs
-commit} you need to @code{cvs update}. @sc{cvs} will merge
-the changes that you made and the changes that the
-other person made. If it does not detect any conflicts
-it will report @samp{M @var{file}} and you are ready
-to @code{cvs commit}. If it detects conflicts it will
-print a message saying so, will report @samp{C @var{file}},
-and you need to manually resolve the
-conflict. For more details on this process see
-@ref{Conflicts example}.
-
-@item Usage: diff3 [-exEX3 [-i | -m] [-L label1 -L label3]] file1 file2 file3
-@example
-Only one of [exEX3] allowed
-@end example
-This indicates a problem with the installation of
-@code{diff3} and @code{rcsmerge}. Specifically
-@code{rcsmerge} was compiled to look for GNU diff3, but
-it is finding unix diff3 instead. The exact text of
-the message will vary depending on the system. The
-simplest solution is to upgrade to a current version of
-@sc{cvs}, which does not rely on external
-@code{rcsmerge} or @code{diff3} programs.
-
-@item warning: unrecognized response `@var{text}' from cvs server
-If @var{text} contains a valid response (such as
-@samp{ok}) followed by an extra carriage return
-character (on many systems this will cause the second
-part of the message to overwrite the first part), then
-it probably means that you are using the @samp{:ext:}
-access method with a version of rsh, such as most
-non-unix rsh versions, which does not by default
-provide a transparent data stream. In such cases you
-probably want to try @samp{:server:} instead of
-@samp{:ext:}. If @var{text} is something else, this
-may signify a problem with your @sc{cvs} server.
-Double-check your installation against the instructions
-for setting up the @sc{cvs} server.
-@c FIXCVS: should be printing CR as \r or \015 or some
-@c such, probably.
-
-@item cvs commit: [@var{time}] waiting for @var{user}'s lock in @var{directory}
-This is a normal message, not an error. See
-@ref{Concurrency}, for more details.
-
-@item cvs commit: warning: editor session failed
-@cindex Exit status, of editor
-This means that the editor which @sc{cvs} is using exits with a nonzero
-exit status. Some versions of vi will do this even when there was not
-a problem editing the file. If so, point the
-@code{CVSEDITOR} environment variable to a small script
-such as:
-
-@example
-#!/bin/sh
-vi $*
-exit 0
-@end example
-
-@item cvs update: warning: @var{file} was lost
-This means that the working copy of @var{file} has been deleted
-but it has not been removed from @sc{cvs}.
-This is nothing to be concerned about,
-the update will just recreate the local file from the repository.
-(This is a convenient way to discard local changes to a file:
-just delete it and then run @code{cvs update}.)
-
-@item cvs update: warning: @var{file} is not (any longer) pertinent
-This means that the working copy of @var{file} has been deleted,
-it has not been removed from @sc{cvs} in the current working directory,
-but it has been removed from @sc{cvs} in some other working directory.
-This is nothing to be concerned about,
-the update would have removed the local file anyway.
-
-@end table
-
-@node Connection
-@appendixsec Trouble making a connection to a CVS server
-
-This section concerns what to do if you are having
-trouble making a connection to a @sc{cvs} server. If
-you are running the @sc{cvs} command line client
-running on Windows, first upgrade the client to
-@sc{cvs} 1.9.12 or later. The error reporting in
-earlier versions provided much less information about
-what the problem was. If the client is non-Windows,
-@sc{cvs} 1.9 should be fine.
-
-If the error messages are not sufficient to track down
-the problem, the next steps depend largely on which
-access method you are using.
-
-@table @code
-@cindex :ext:, troubleshooting
-@item :ext:
-Try running the rsh program from the command line. For
-example: "rsh servername cvs -v" should print @sc{cvs}
-version information. If this doesn't work, you need to
-fix it before you can worry about @sc{cvs} problems.
-
-@cindex :server:, troubleshooting
-@item :server:
-You don't need a command line rsh program to use this
-access method, but if you have an rsh program around,
-it may be useful as a debugging tool. Follow the
-directions given for :ext:.
-
-@cindex :pserver:, troubleshooting
-@item :pserver:
-Errors along the lines of "connection refused" typically indicate
-that inetd isn't even listening for connections on port 2401
-whereas errors like "connection reset by peer",
-"received broken pipe signal", "recv() from server: EOF",
-or "end of file from server"
-typically indicate that inetd is listening for
-connections but is unable to start @sc{cvs} (this is frequently
-caused by having an incorrect path in @file{inetd.conf}
-or by firewall software rejecting the connection).
-"unrecognized auth response" errors are caused by a bad command
-line in @file{inetd.conf}, typically an invalid option or forgetting
-to put the @samp{pserver} command at the end of the line.
-Another less common problem is invisible control characters that
-your editor "helpfully" added without you noticing.
-
-One good debugging tool is to "telnet servername
-2401". After connecting, send any text (for example
-"foo" followed by return). If @sc{cvs} is working
-correctly, it will respond with
-
-@example
-cvs [pserver aborted]: bad auth protocol start: foo
-@end example
-
-If instead you get:
-
-@example
-Usage: cvs [cvs-options] command [command-options-and-arguments]
-...
-@end example
-
-@noindent
-then you're missing the @samp{pserver} command at the end of the
-line in @file{inetd.conf}; check to make sure that the entire command
-is on one line and that it's complete.
-
-Likewise, if you get something like:
-
-@example
-Unknown command: `pserved'
-
-CVS commands are:
- add Add a new file/directory to the repository
-...
-@end example
-
-@noindent
-then you've misspelled @samp{pserver} in some way. If it isn't
-obvious, check for invisible control characters (particularly
-carriage returns) in @file{inetd.conf}.
-
-If it fails to work at all, then make sure inetd is working
-right. Change the invocation in @file{inetd.conf} to run the
-echo program instead of cvs. For example:
-
-@example
-2401 stream tcp nowait root /bin/echo echo hello
-@end example
-
-After making that change and instructing inetd to
-re-read its configuration file, "telnet servername
-2401" should show you the text hello and then the
-server should close the connection. If this doesn't
-work, you need to fix it before you can worry about
-@sc{cvs} problems.
-
-On AIX systems, the system will often have its own
-program trying to use port 2401. This is AIX's problem
-in the sense that port 2401 is registered for use with
-@sc{cvs}. I hear that there is an AIX patch available
-to address this problem.
-
-Another good debugging tool is the @samp{-d}
-(debugging) option to inetd. Consult your system
-documentation for more information.
-
-If you seem to be connecting but get errors like:
-
-@example
-cvs server: cannot open /root/.cvsignore: Permission denied
-cvs [server aborted]: can't chdir(/root): Permission denied
-@end example
-
-@noindent
-then you probably haven't specified @samp{-f} in @file{inetd.conf}.
-(In releases prior to @sc{cvs} 1.11.1, this problem can be caused by
-your system setting the @code{$HOME} environment variable
-for programs being run by inetd. In this case, you can either
-have inetd run a shell script that unsets @code{$HOME} and then runs
-@sc{cvs}, or you can use @code{env} to run @sc{cvs} with a pristine
-environment.)
-
-If you can connect successfully for a while but then can't,
-you've probably hit inetd's rate limit.
-(If inetd receives too many requests for the same service
-in a short period of time, it assumes that something is wrong
-and temporarily disables the service.)
-Check your inetd documentation to find out how to adjust the
-rate limit (some versions of inetd have a single rate limit,
-others allow you to set the limit for each service separately.)
-@end table
-
-@node Other problems
-@appendixsec Other common problems
-
-Here is a list of problems which do not fit into the
-above categories. They are in no particular order.
-
-@itemize @bullet
-@item
-On Windows, if there is a 30 second or so delay when
-you run a @sc{cvs} command, it may mean that you have
-your home directory set to @file{C:/}, for example (see
-@code{HOMEDRIVE} and @code{HOMEPATH} in
-@ref{Environment variables}). @sc{cvs} expects the home
-directory to not end in a slash, for example @file{C:}
-or @file{C:\cvs}.
-@c FIXCVS: CVS should at least detect this and print an
-@c error, presumably.
-
-@item
-If you are running @sc{cvs} 1.9.18 or older, and
-@code{cvs update} finds a conflict and tries to
-merge, as described in @ref{Conflicts example}, but
-doesn't tell you there were conflicts, then you may
-have an old version of @sc{rcs}. The easiest solution
-probably is to upgrade to a current version of
-@sc{cvs}, which does not rely on external @sc{rcs}
-programs.
-@end itemize
-
-@c ---------------------------------------------------------------------
-@node Credits
-@appendix Credits
-
-@cindex Contributors (manual)
-@cindex Credits (manual)
-Roland Pesch, then of Cygnus Support <@t{roland@@wrs.com}>
-wrote the manual pages which were distributed with
-@sc{cvs} 1.3. Much of their text was copied into this
-manual. He also read an early draft
-of this manual and contributed many ideas and
-corrections.
-
-The mailing-list @code{info-cvs} is sometimes
-informative. I have included information from postings
-made by the following persons:
-David G. Grubbs <@t{dgg@@think.com}>.
-
-Some text has been extracted from the man pages for
-@sc{rcs}.
-
-The @sc{cvs} @sc{faq} by David G. Grubbs has provided
-useful material. The @sc{faq} is no longer maintained,
-however, and this manual is about the closest thing there
-is to a successor (with respect to documenting how to
-use @sc{cvs}, at least).
-
-In addition, the following persons have helped by
-telling me about mistakes I've made:
-
-@display
-Roxanne Brunskill <@t{rbrunski@@datap.ca}>,
-Kathy Dyer <@t{dyer@@phoenix.ocf.llnl.gov}>,
-Karl Pingle <@t{pingle@@acuson.com}>,
-Thomas A Peterson <@t{tap@@src.honeywell.com}>,
-Inge Wallin <@t{ingwa@@signum.se}>,
-Dirk Koschuetzki <@t{koschuet@@fmi.uni-passau.de}>
-and Michael Brown <@t{brown@@wi.extrel.com}>.
-@end display
-
-The list of contributors here is not comprehensive; for a more
-complete list of who has contributed to this manual see
-the file @file{doc/ChangeLog} in the @sc{cvs} source
-distribution.
-
-@c ---------------------------------------------------------------------
-@node BUGS
-@appendix Dealing with bugs in CVS or this manual
-
-@cindex Bugs in this manual or CVS
-Neither @sc{cvs} nor this manual is perfect, and they
-probably never will be. If you are having trouble
-using @sc{cvs}, or think you have found a bug, there
-are a number of things you can do about it. Note that
-if the manual is unclear, that can be considered a bug
-in the manual, so these problems are often worth doing
-something about as well as problems with @sc{cvs} itself.
-
-@cindex Reporting bugs
-@cindex Bugs, reporting
-@cindex Errors, reporting
-@itemize @bullet
-@item
-If you want someone to help you and fix bugs that you
-report, there are companies which will do that for a
-fee. One such company is:
-
-@cindex Ximbiot
-@cindex Support, getting CVS support
-@example
-Ximbiot LLC
-Suite 230
-200 Diversion St.
-Rochester Hills, MI 48307-6636
-USA
-Email: info@@ximbiot.com
-Phone: (248) 835-1260
-Fax: (248) 835-1263
-@url{http://ximbiot.com/}
-
-@end example
-
-@item
-If you got @sc{cvs} through a distributor, such as an
-operating system vendor or a vendor of freeware
-@sc{cd-rom}s, you may wish to see whether the
-distributor provides support. Often, they will provide
-no support or minimal support, but this may vary from
-distributor to distributor.
-
-@item
-If you have the skills and time to do so, you may wish
-to fix the bug yourself. If you wish to submit your
-fix for inclusion in future releases of @sc{cvs}, see
-the file @sc{hacking} in the @sc{cvs} source
-distribution. It contains much more information on the
-process of submitting fixes.
-
-@item
-There may be resources on the net which can help. A
-good place to start is:
-
-@example
-@url{http://cvs.nongnu.org/}
-@end example
-
-If you are so inspired, increasing the information
-available on the net is likely to be appreciated. For
-example, before the standard @sc{cvs} distribution
-worked on Windows 95, there was a web page with some
-explanation and patches for running @sc{cvs} on Windows
-95, and various people helped out by mentioning this
-page on mailing lists or newsgroups when the subject
-came up.
-
-@item
-It is also possible to report bugs to @email{bug-cvs@@nongnu.org}.
-Note that someone may or may not want to do anything
-with your bug report---if you need a solution consider
-one of the options mentioned above. People probably do
-want to hear about bugs which are particularly severe
-in consequences and/or easy to fix, however. You can
-also increase your odds by being as clear as possible
-about the exact nature of the bug and any other
-relevant information. The way to report bugs is to
-send email to @email{bug-cvs@@nongnu.org}. Note
-that submissions to @email{bug-cvs@@nongnu.org} may be distributed
-under the terms of the @sc{gnu} Public License, so if
-you don't like this, don't submit them. There is
-usually no justification for sending mail directly to
-one of the @sc{cvs} maintainers rather than to
-@email{bug-cvs@@nongnu.org}; those maintainers who want to hear
-about such bug reports read @email{bug-cvs@@nongnu.org}. Also note
-that sending a bug report to other mailing lists or
-newsgroups is @emph{not} a substitute for sending it to
-@email{bug-cvs@@nongnu.org}. It is fine to discuss @sc{cvs} bugs on
-whatever forum you prefer, but there are not
-necessarily any maintainers reading bug reports sent
-anywhere except @email{bug-cvs@@nongnu.org}.
-@end itemize
-
-@cindex Known bugs in this manual or CVS
-People often ask if there is a list of known bugs or
-whether a particular bug is a known one. The file
-@sc{bugs} in the @sc{cvs} source distribution is one
-list of known bugs, but it doesn't necessarily try to
-be comprehensive. Perhaps there will never be a
-comprehensive, detailed list of known bugs.
-
-@c ---------------------------------------------------------------------
-@node Index
-@unnumbered Index
-@cindex Index
-
-@printindex cp
-
-@bye
-
-Local Variables:
-fill-column: 55
-End:
OpenPOWER on IntegriCloud