@c This is part of the Emacs manual.
@c Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
@c See file emacs.texi for copying conditions.
@c
@c This file is included either in vc-xtra.texi (when producing the
@c printed version) or in the main Emacs manual (for the on-line version).
@node Remote Repositories
@subsection Remote Repositories
@cindex remote repositories (CVS)

  A common way of using CVS is to set up a central CVS repository on
some Internet host, then have each developer check out a personal
working copy of the files on his local machine.  Committing changes to
the repository, and picking up changes from other users into one's own
working area, then works by direct interactions with the CVS server.

  One difficulty is that access to the CVS server is often slow, and
that developers might need to work off-line as well.  VC is designed
to reduce the amount of network interaction necessary.

@menu
* Version Backups::        Keeping local copies of repository versions.
* Local Version Control::  Using another version system for local editing.
@end menu

@node Version Backups
@subsubsection Version Backups
@cindex version backups

@cindex automatic version backups
  When VC sees that the CVS repository for a file is on a remote
machine, it automatically makes local backups of unmodified versions
of the file---@dfn{automatic version backups}.  This means that you
can compare the file to the repository version (@kbd{C-x v =}), or
revert to that version (@kbd{C-x v u}), without any network
interactions.

  The local copy of the unmodified file is called a @dfn{version
backup} to indicate that it corresponds exactly to a version that is
stored in the repository.  Note that version backups are not the same
as ordinary Emacs backup files
@iftex
(@pxref{Backup,,,emacs, the Emacs Manual}).
@end iftex
@ifnottex
(@pxref{Backup}).
@end ifnottex
But they follow a similar naming convention.

  For a file that comes from a remote CVS repository, VC makes a
version backup whenever you save the first changes to the file, and
removes it after you have committed your modified version to the
repository. You can disable the making of automatic version backups by
setting @code{vc-cvs-stay-local} to @code{nil} (@pxref{CVS Options}).

@cindex manual version backups
  The name of the automatic version backup for version @var{version}
of file @var{file} is @code{@var{file}.~@var{version}.~}.  This is
almost the same as the name used by @kbd{C-x v ~}
@iftex
(@pxref{Old Versions,,,emacs, the Emacs Manual}),
@end iftex
@ifnottex
(@pxref{Old Versions}),
@end ifnottex
the only difference being the additional dot (@samp{.})  after the
version number.  This similarity is intentional, because both kinds of
files store the same kind of information.  The file made by @kbd{C-x v
~} acts as a @dfn{manual version backup}.

  All the VC commands that operate on old versions of a file can use
both kinds of version backups.  For instance, @kbd{C-x v ~} uses
either an automatic or a manual version backup, if possible, to get
the contents of the version you request.  Likewise, @kbd{C-x v =} and
@kbd{C-x v u} use either an automatic or a manual version backup, if
one of them exists, to get the contents of a version to compare or
revert to.  If you changed a file outside of Emacs, so that no
automatic version backup was created for the previous text, you can
create a manual backup of that version using @kbd{C-x v ~}, and thus
obtain the benefit of the local copy for Emacs commands.

  The only difference in Emacs's handling of manual and automatic
version backups, once they exist, is that Emacs deletes automatic
version backups when you commit to the repository.  By contrast,
manual version backups remain until you delete them.

@node Local Version Control
@subsubsection Local Version Control
@cindex local version control
@cindex local back end (version control)

When you make many changes to a file that comes from a remote
repository, it can be convenient to have version control on your local
machine as well.  You can then record intermediate versions, revert to
a previous state, etc., before you actually commit your changes to the
remote server.

VC lets you do this by putting a file under a second, local version
control system, so that the file is effectively registered in two
systems at the same time.  For the description here, we will assume
that the remote system is CVS, and you use RCS locally, although the
mechanism works with any combination of version control systems
(@dfn{back ends}).

To make it work with other back ends, you must make sure that the
``more local'' back end comes before the ``more remote'' back end in
the setting of @code{vc-handled-backends} (@pxref{Customizing VC}).  By
default, this variable is set up so that you can use remote CVS and
local RCS as described here.

To start using local RCS for a file that comes from a remote CVS
server, you must @emph{register the file in RCS}, by typing @kbd{C-u
C-x v v rcs @key{RET}}.  (In other words, use @code{vc-next-action} with a
prefix argument, and specify RCS as the back end.)

You can do this at any time; it does not matter whether you have
already modified the file with respect to the version in the CVS
repository.  If possible, VC tries to make the RCS master start with
the unmodified repository version, then checks in any local changes
as a new version.  This works if you have not made any changes yet, or
if the unmodified repository version exists locally as a version
backup (@pxref{Version Backups}).  If the unmodified version is not
available locally, the RCS master starts with the modified version;
the only drawback to this is that you cannot compare your changes
locally to what is stored in the repository.

The version number of the RCS master is derived from the current CVS
version, starting a branch from it.  For example, if the current CVS
version is 1.23, the local RCS branch will be 1.23.1.  Version 1.23 in
the RCS master will be identical to version 1.23 under CVS; your first
changes are checked in as 1.23.1.1.  (If the unmodified file is not
available locally, VC will check in the modified file twice, both as
1.23 and 1.23.1.1, to make the revision numbers consistent.)

If you do not use locking under CVS (the default), locking is also
disabled for RCS, so that editing under RCS works exactly as under
CVS.

When you are done with local editing, you can commit the final version
back to the CVS repository by typing @kbd{C-u C-x v v cvs @key{RET}}.
This initializes the log entry buffer
@iftex
(@pxref{Log Buffer,,,emacs, the Emacs Manual})
@end iftex
@ifnottex
(@pxref{Log Buffer})
@end ifnottex
to contain all the log entries you have recorded in the RCS master;
you can edit them as you wish, and then commit in CVS by typing
@kbd{C-c C-c}.  If the commit is successful, VC removes the RCS
master, so that the file is once again registered under CVS only.
(The RCS master is not actually deleted, just renamed by appending
@samp{~} to the name, so that you can refer to it later if you wish.)

While using local RCS, you can pick up recent changes from the CVS
repository into your local file, or commit some of your changes back
to CVS, without terminating local RCS version control.  To do this,
switch to the CVS back end temporarily, with the @kbd{C-x v b} command:

@table @kbd
@item C-x v b
Switch to another back end that the current file is registered
under (@code{vc-switch-backend}).

@item C-u C-x v b @var{backend} @key{RET}
Switch to @var{backend} for the current file.
@end table

@kindex C-x v b
@findex vc-switch-backend
@kbd{C-x v b} does not change the buffer contents, or any files; it
only changes VC's perspective on how to handle the file.  Any
subsequent VC commands for that file will operate on the back end that
is currently selected.

If the current file is registered in more than one back end, typing
@kbd{C-x v b} ``cycles'' through all of these back ends.  With a
prefix argument, it asks for the back end to use in the minibuffer.

Thus, if you are using local RCS, and you want to pick up some recent
changes in the file from remote CVS, first visit the file, then type
@kbd{C-x v b} to switch to CVS, and finally use @kbd{C-x v m
@key{RET}} to merge the news
@iftex
(@pxref{Merging,,,emacs, the Emacs Manual}).
@end iftex
@ifnottex
(@pxref{Merging}).
@end ifnottex
You can then switch back to RCS by typing @kbd{C-x v b} again, and
continue to edit locally.

But if you do this, the revision numbers in the RCS master no longer
correspond to those of CVS.  Technically, this is not a problem, but
it can become difficult to keep track of what is in the CVS repository
and what is not.  So we suggest that you return from time to time to
CVS-only operation, by committing your local changes back to the
repository using @kbd{C-u C-x v v cvs @key{RET}}.

@node Snapshots
@subsection Snapshots
@cindex snapshots and version control

  A @dfn{snapshot} is a named set of file versions (one for each
registered file) that you can treat as a unit.  One important kind of
snapshot is a @dfn{release}, a (theoretically) stable version of the
system that is ready for distribution to users.

@menu
* Making Snapshots::		The snapshot facilities.
* Snapshot Caveats::		Things to be careful of when using snapshots.
@end menu

@node Making Snapshots
@subsubsection Making and Using Snapshots

  There are two basic commands for snapshots; one makes a
snapshot with a given name, the other retrieves a named snapshot.

@table @code
@kindex C-x v s
@findex vc-create-snapshot
@item C-x v s @var{name} @key{RET}
Define the last saved versions of every registered file in or under the
current directory as a snapshot named @var{name}
(@code{vc-create-snapshot}).

@kindex C-x v r
@findex vc-retrieve-snapshot
@item C-x v r @var{name} @key{RET}
For all registered files at or below the current directory level, select
whatever versions correspond to the snapshot @var{name}
(@code{vc-retrieve-snapshot}).

This command reports an error if any files are locked at or below the
current directory, without changing anything; this is to avoid
overwriting work in progress.
@end table

  A snapshot uses a very small amount of resources---just enough to record
the list of file names and which version belongs to the snapshot.  Thus,
you need not hesitate to create snapshots whenever they are useful.

  You can give a snapshot name as an argument to @kbd{C-x v =} or
@kbd{C-x v ~}
@iftex
(@pxref{Old Versions,,,emacs, the Emacs Manual}).
@end iftex
@ifnottex
(@pxref{Old Versions}).
@end ifnottex
Thus, you can use it to compare a snapshot against the current files,
or two snapshots against each other, or a snapshot against a named
version.

@node Snapshot Caveats
@subsubsection Snapshot Caveats

@cindex named configurations (RCS)
  VC's snapshot facilities are modeled on RCS's named-configuration
support.  They use RCS's native facilities for this, so
snapshots made using RCS through VC are visible even when you bypass VC.

  With CVS, Meta-CVS, and Subversion, VC also uses the native
mechanism provided by that back end to make snapshots and retrieve them
(@dfn{tags} for CVS and Meta-CVS, @dfn{copies} for Subversion).

@c worded verbosely to avoid overfull hbox.
  For SCCS, VC implements snapshots itself.  The files it uses contain
name/file/version-number triples.  These snapshots are visible only
through VC.

  There is no support for VC snapshots using GNU Arch yet.

  A snapshot is a set of checked-in versions.  So make sure that all the
files are checked in and not locked when you make a snapshot.

  File renaming and deletion can create some difficulties with snapshots.
This is not a VC-specific problem, but a general design issue in version
control systems that no one has solved very well yet.

  If you rename a registered file, you need to rename its master along
with it (the command @code{vc-rename-file} does this automatically).  If
you are using SCCS, you must also update the records of the snapshot, to
mention the file by its new name (@code{vc-rename-file} does this,
too).  An old snapshot that refers to a master file that no longer
exists under the recorded name is invalid; VC can no longer retrieve
it.  It would be beyond the scope of this manual to explain enough about
RCS and SCCS to explain how to update the snapshots by hand.

  Using @code{vc-rename-file} makes the snapshot remain valid for
retrieval, but it does not solve all problems.  For example, some of the
files in your program probably refer to others by name.  At the very
least, the makefile probably mentions the file that you renamed.  If you
retrieve an old snapshot, the renamed file is retrieved under its new
name, which is not the name that the makefile expects.  So the program
won't really work as retrieved.

@node Miscellaneous VC
@subsection Miscellaneous Commands and Features of VC

  This section explains the less-frequently-used features of VC.

@menu
* Change Logs and VC::  Generating a change log file from log entries.
* Renaming and VC::     A command to rename both the source and master
                          file correctly.
* Version Headers::     Inserting version control headers into working files.
@end menu

@node Change Logs and VC
@subsubsection Change Logs and VC

  If you use RCS or CVS for a program and also maintain a change log
file for it
@iftex
(@pxref{Change Log,,,emacs, the Emacs Manual}),
@end iftex
@ifnottex
(@pxref{Change Log}),
@end ifnottex
you can generate change log entries automatically from the version
control log entries:

@table @kbd
@item C-x v a
@kindex C-x v a
@findex vc-update-change-log
Visit the current directory's change log file and, for registered files
in that directory, create new entries for versions checked in since the
most recent entry in the change log file.
(@code{vc-update-change-log}).

This command works with RCS or CVS only, not with any of the other
back ends.

@item C-u C-x v a
As above, but only find entries for the current buffer's file.

@item M-1 C-x v a
As above, but find entries for all the currently visited files that are
maintained with version control.  This works only with RCS, and it puts
all entries in the log for the default directory, which may not be
appropriate.
@end table

  For example, suppose the first line of @file{ChangeLog} is dated
1999-04-10, and that the only check-in since then was by Nathaniel
Bowditch to @file{rcs2log} on 1999-05-22 with log text @samp{Ignore log
messages that start with `#'.}.  Then @kbd{C-x v a} visits
@file{ChangeLog} and inserts text like this:

@iftex
@medbreak
@end iftex
@smallexample
@group
1999-05-22  Nathaniel Bowditch  <nat@@apn.org>

        * rcs2log: Ignore log messages that start with `#'.
@end group
@end smallexample
@iftex
@medbreak
@end iftex

@noindent
You can then edit the new change log entry further as you wish.

  Some of the new change log entries may duplicate what's already in
ChangeLog.  You will have to remove these duplicates by hand.

  Normally, the log entry for file @file{foo} is displayed as @samp{*
foo: @var{text of log entry}}.  The @samp{:} after @file{foo} is omitted
if the text of the log entry starts with @w{@samp{(@var{functionname}):
}}.  For example, if the log entry for @file{vc.el} is
@samp{(vc-do-command): Check call-process status.}, then the text in
@file{ChangeLog} looks like this:

@iftex
@medbreak
@end iftex
@smallexample
@group
1999-05-06  Nathaniel Bowditch  <nat@@apn.org>

        * vc.el (vc-do-command): Check call-process status.
@end group
@end smallexample
@iftex
@medbreak
@end iftex

  When @kbd{C-x v a} adds several change log entries at once, it groups
related log entries together if they all are checked in by the same
author at nearly the same time.  If the log entries for several such
files all have the same text, it coalesces them into a single entry.
For example, suppose the most recent check-ins have the following log
entries:

@flushleft
@bullet{} For @file{vc.texinfo}: @samp{Fix expansion typos.}
@bullet{} For @file{vc.el}: @samp{Don't call expand-file-name.}
@bullet{} For @file{vc-hooks.el}: @samp{Don't call expand-file-name.}
@end flushleft

@noindent
They appear like this in @file{ChangeLog}:

@iftex
@medbreak
@end iftex
@smallexample
@group
1999-04-01  Nathaniel Bowditch  <nat@@apn.org>

        * vc.texinfo: Fix expansion typos.

        * vc.el, vc-hooks.el: Don't call expand-file-name.
@end group
@end smallexample
@iftex
@medbreak
@end iftex

  Normally, @kbd{C-x v a} separates log entries by a blank line, but you
can mark several related log entries to be clumped together (without an
intervening blank line) by starting the text of each related log entry
with a label of the form @w{@samp{@{@var{clumpname}@} }}.  The label
itself is not copied to @file{ChangeLog}.  For example, suppose the log
entries are:

@flushleft
@bullet{} For @file{vc.texinfo}: @samp{@{expand@} Fix expansion typos.}
@bullet{} For @file{vc.el}: @samp{@{expand@} Don't call expand-file-name.}
@bullet{} For @file{vc-hooks.el}: @samp{@{expand@} Don't call expand-file-name.}
@end flushleft

@noindent
Then the text in @file{ChangeLog} looks like this:

@iftex
@medbreak
@end iftex
@smallexample
@group
1999-04-01  Nathaniel Bowditch  <nat@@apn.org>

        * vc.texinfo: Fix expansion typos.
        * vc.el, vc-hooks.el: Don't call expand-file-name.
@end group
@end smallexample
@iftex
@medbreak
@end iftex

  A log entry whose text begins with @samp{#} is not copied to
@file{ChangeLog}.  For example, if you merely fix some misspellings in
comments, you can log the change with an entry beginning with @samp{#}
to avoid putting such trivia into @file{ChangeLog}.

@node Renaming and VC
@subsubsection Renaming VC Work Files and Master Files

@findex vc-rename-file
  When you rename a registered file, you must also rename its master
file correspondingly to get proper results.  Use @code{vc-rename-file}
to rename the source file as you specify, and rename its master file
accordingly.  It also updates any snapshots (@pxref{Snapshots}) that
mention the file, so that they use the new name; despite this, the
snapshot thus modified may not completely work (@pxref{Snapshot
Caveats}).

  Some back ends do not provide an explicit rename operation to their
repositories.  After issuing @code{vc-rename-file}, use @kbd{C-x v v}
on the original and renamed buffers and provide the necessary edit
log.

  You cannot use @code{vc-rename-file} on a file that is locked by
someone else.

@node Version Headers
@subsubsection Inserting Version Control Headers

   Sometimes it is convenient to put version identification strings
directly into working files.  Certain special strings called
@dfn{version headers} are replaced in each successive version by the
number of that version, the name of the user who created it, and other
relevant information.  All of the back ends that VC supports have such
a mechanism, except GNU Arch.

  VC does not normally use the information contained in these headers.
The exception is RCS---with RCS, version headers are sometimes more
reliable than the master file to determine which version of the file
you are editing.  Note that in a multi-branch environment, version
headers are necessary to make VC behave correctly
@iftex
(@pxref{Multi-User Branching,,,emacs, the Emacs Manual}).
@end iftex
@ifnottex
(@pxref{Multi-User Branching}).
@end ifnottex

  Searching for RCS version headers is controlled by the variable
@code{vc-consult-headers}.  If it is non-@code{nil} (the default),
Emacs searches for headers to determine the version number you are
editing.  Setting it to @code{nil} disables this feature.

  Note that although CVS uses the same kind of version headers as RCS
does, VC never searches for these headers if you are using CVS,
regardless of the above setting.

@kindex C-x v h
@findex vc-insert-headers
  You can use the @kbd{C-x v h} command (@code{vc-insert-headers}) to
insert a suitable header string.

@table @kbd
@item C-x v h
Insert headers in a file for use with your version-control system.
@end table

@vindex vc-@var{backend}-header
  The default header string is @samp{@w{$}Id$} for RCS and
@samp{@w{%}W%} for SCCS.  You can specify other headers to insert by
setting the variables @code{vc-@var{backend}-header} where
@var{backend} is @code{rcs} or @code{sccs}.

  Instead of a single string, you can specify a list of strings; then
each string in the list is inserted as a separate header on a line of
its own.

  It may be necessary to use apparently-superfluous backslashes when
writing the strings that you put in this variable.  For instance, you
might write @code{"$Id\$"} rather than @code{"$Id@w{$}"}.  The extra
backslash prevents the string constant from being interpreted as a
header, if the Emacs Lisp file containing it is maintained with
version control.

@vindex vc-comment-alist
  Each header is inserted surrounded by tabs, inside comment delimiters,
on a new line at point.  Normally the ordinary comment
start and comment end strings of the current mode are used, but for
certain modes, there are special comment delimiters for this purpose;
the variable @code{vc-comment-alist} specifies them.  Each element of
this list has the form @code{(@var{mode} @var{starter} @var{ender})}.

@vindex vc-static-header-alist
  The variable @code{vc-static-header-alist} specifies further strings
to add based on the name of the buffer.  Its value should be a list of
elements of the form @code{(@var{regexp} . @var{format})}.  Whenever
@var{regexp} matches the buffer name, @var{format} is inserted as part
of the header.  A header line is inserted for each element that matches
the buffer name, and for each string specified by
@code{vc-@var{backend}-header}.  The header line is made by processing the
string from @code{vc-@var{backend}-header} with the format taken from the
element.  The default value for @code{vc-static-header-alist} is as follows:

@example
@group
(("\\.c$" .
  "\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n\
#endif /* lint */\n"))
@end group
@end example

@noindent
It specifies insertion of text of this form:

@example
@group

#ifndef lint
static char vcid[] = "@var{string}";
#endif /* lint */
@end group
@end example

@noindent
Note that the text above starts with a blank line.

  If you use more than one version header in a file, put them close
together in the file.  The mechanism in @code{revert-buffer} that
preserves markers may not handle markers positioned between two version
headers.

@node Customizing VC
@subsection Customizing VC

@vindex vc-handled-backends
The variable @code{vc-handled-backends} determines which version
control systems VC should handle.  The default value is @code{(RCS CVS
SVN SCCS Arch MCVS)}, so it contains all six version systems that are
currently supported.  If you want VC to ignore one or more of these
systems, exclude its name from the list.  To disable VC entirely, set
this variable to @code{nil}.

The order of systems in the list is significant: when you visit a file
registered in more than one system (@pxref{Local Version Control}), VC
uses the system that comes first in @code{vc-handled-backends} by
default.  The order is also significant when you register a file for
the first time, see
@iftex
@ref{Registering,,,emacs, the Emacs Manual},
@end iftex
@ifnottex
@ref{Registering},
@end ifnottex
for details.

@menu
* General VC Options::  Options that apply to multiple back ends.
* RCS and SCCS::        Options for RCS and SCCS.
* CVS Options::         Options for CVS.
@end menu

@node General VC Options
@subsubsection General Options

@vindex vc-make-backup-files
  Emacs normally does not save backup files for source files that are
maintained with version control.  If you want to make backup files even
for files that use version control, set the variable
@code{vc-make-backup-files} to a non-@code{nil} value.

@vindex vc-keep-workfiles
  Normally the work file exists all the time, whether it is locked or
not.  If you set @code{vc-keep-workfiles} to @code{nil}, then checking
in a new version with @kbd{C-x v v} deletes the work file; but any
attempt to visit the file with Emacs creates it again.  (With CVS, work
files are always kept.)

@vindex vc-follow-symlinks
  Editing a version-controlled file through a symbolic link can be
dangerous.  It bypasses the version control system---you can edit the
file without locking it, and fail to check your changes in.  Also,
your changes might overwrite those of another user.  To protect against
this, VC checks each symbolic link that you visit, to see if it points
to a file under version control.

  The variable @code{vc-follow-symlinks} controls what to do when a
symbolic link points to a version-controlled file.  If it is @code{nil},
VC only displays a warning message.  If it is @code{t}, VC automatically
follows the link, and visits the real file instead, telling you about
this in the echo area.  If the value is @code{ask} (the default), VC
asks you each time whether to follow the link.

@vindex vc-suppress-confirm
  If @code{vc-suppress-confirm} is non-@code{nil}, then @kbd{C-x v v}
and @kbd{C-x v i} can save the current buffer without asking, and
@kbd{C-x v u} also operates without asking for confirmation.  (This
variable does not affect @kbd{C-x v c}; that operation is so drastic
that it should always ask for confirmation.)

@vindex vc-command-messages
  VC mode does much of its work by running the shell commands for RCS,
CVS and SCCS.  If @code{vc-command-messages} is non-@code{nil}, VC
displays messages to indicate which shell commands it runs, and
additional messages when the commands finish.

@vindex vc-path
  You can specify additional directories to search for version control
programs by setting the variable @code{vc-path}.  These directories
are searched before the usual search path.  It is rarely necessary to
set this variable, because VC normally finds the proper files
automatically.

@node RCS and SCCS
@subsubsection Options for RCS and SCCS

@cindex non-strict locking (RCS)
@cindex locking, non-strict (RCS)
  By default, RCS uses locking to coordinate the activities of several
users, but there is a mode called @dfn{non-strict locking} in which
you can check-in changes without locking the file first.  Use
@samp{rcs -U} to switch to non-strict locking for a particular file,
see the @code{rcs} manual page for details.

  When deducing the version control state of an RCS file, VC first
looks for an RCS version header string in the file (@pxref{Version
Headers}).  If there is no header string, VC normally looks at the
file permissions of the work file; this is fast.  But there might be
situations when the file permissions cannot be trusted.  In this case
the master file has to be consulted, which is rather expensive.  Also
the master file can only tell you @emph{if} there's any lock on the
file, but not whether your work file really contains that locked
version.

@vindex vc-consult-headers
  You can tell VC not to use version headers to determine the file
status by setting @code{vc-consult-headers} to @code{nil}.  VC then
always uses the file permissions (if it is supposed to trust them), or
else checks the master file.

@vindex vc-mistrust-permissions
  You can specify the criterion for whether to trust the file
permissions by setting the variable @code{vc-mistrust-permissions}.
Its value can be @code{t} (always mistrust the file permissions and
check the master file), @code{nil} (always trust the file
permissions), or a function of one argument which makes the decision.
The argument is the directory name of the @file{RCS} subdirectory.  A
non-@code{nil} value from the function says to mistrust the file
permissions.  If you find that the file permissions of work files are
changed erroneously, set @code{vc-mistrust-permissions} to @code{t}.
Then VC always checks the master file to determine the file's status.

  VC determines the version control state of files under SCCS much as
with RCS.  It does not consider SCCS version headers, though.  Thus,
the variable @code{vc-mistrust-permissions} affects SCCS use, but
@code{vc-consult-headers} does not.

@node CVS Options
@subsubsection Options specific for CVS

@cindex locking (CVS)
  By default, CVS does not use locking to coordinate the activities of
several users; anyone can change a work file at any time.  However,
there are ways to restrict this, resulting in behavior that resembles
locking.

@cindex CVSREAD environment variable (CVS)
  For one thing, you can set the @env{CVSREAD} environment variable
(the value you use makes no difference).  If this variable is defined,
CVS makes your work files read-only by default.  In Emacs, you must
type @kbd{C-x v v} to make the file writable, so that editing works
in fact similar as if locking was used.  Note however, that no actual
locking is performed, so several users can make their files writable
at the same time.  When setting @env{CVSREAD} for the first time, make
sure to check out all your modules anew, so that the file protections
are set correctly.

@cindex cvs watch feature
@cindex watching files (CVS)
  Another way to achieve something similar to locking is to use the
@dfn{watch} feature of CVS.  If a file is being watched, CVS makes it
read-only by default, and you must also use @kbd{C-x v v} in Emacs to
make it writable.  VC calls @code{cvs edit} to make the file writable,
and CVS takes care to notify other developers of the fact that you
intend to change the file.  See the CVS documentation for details on
using the watch feature.

@vindex vc-stay-local
@vindex vc-cvs-stay-local
@cindex remote repositories (CVS)
  When a file's repository is on a remote machine, VC tries to keep
network interactions to a minimum.  This is controlled by the variable
@code{vc-cvs-stay-local}.  There is another variable,
@code{vc-stay-local}, which enables the feature also for other back
ends that support it, including CVS.  In the following, we will talk
only about @code{vc-cvs-stay-local}, but everything applies to
@code{vc-stay-local} as well.

If @code{vc-cvs-stay-local} is @code{t} (the default), then VC uses
only the entry in the local CVS subdirectory to determine the file's
state (and possibly information returned by previous CVS commands).
One consequence of this is that when you have modified a file, and
somebody else has already checked in other changes to the file, you
are not notified of it until you actually try to commit.  (But you can
try to pick up any recent changes from the repository first, using
@kbd{C-x v m @key{RET}},
@iftex
@pxref{Merging,,,emacs, the Emacs Manual}).
@end iftex
@ifnottex
@pxref{Merging}).
@end ifnottex

  When @code{vc-cvs-stay-local} is @code{t}, VC also makes local
version backups, so that simple diff and revert operations are
completely local (@pxref{Version Backups}).

  On the other hand, if you set @code{vc-cvs-stay-local} to @code{nil},
then VC queries the remote repository @emph{before} it decides what to
do in @code{vc-next-action} (@kbd{C-x v v}), just as it does for local
repositories.  It also does not make any version backups.

  You can also set @code{vc-cvs-stay-local} to a regular expression
that is matched against the repository host name; VC then stays local
only for repositories from hosts that match the pattern.

@vindex vc-cvs-global-switches
  You can specify additional command line options to pass to all CVS
operations in the variable @code{vc-cvs-global-switches}.  These
switches are inserted immediately after the @code{cvs} command, before
the name of the operation to invoke.

@ignore
   arch-tag: 140b8629-4339-4b5e-9e50-72453e51615e
@end ignore
