Mercurial > emacs
changeset 29349:8857bdc4f765
New file.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Thu, 01 Jun 2000 03:34:57 +0000 |
parents | 7334585a13ca |
children | 9ec9be532ad2 |
files | man/pcl-cvs.texi |
diffstat | 1 files changed, 1424 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/pcl-cvs.texi Thu Jun 01 03:34:57 2000 +0000 @@ -0,0 +1,1424 @@ +\input texinfo @c -*-texinfo-*- + +@c "@(#)$Name: $:$Id: pcl-cvs.texi,v 1.16 2000/05/30 19:45:50 monnier Exp $" + +@c Documentation for the GNU Emacs CVS mode. +@c Copyright (C) 1991-2000 Free Software Foundation, Inc. + +@c This file is part of GNU Emacs + +@c GNU Emacs is free software; you can redistribute it and/or modify +@c it under the terms of the GNU General Public License as published by +@c the Free Software Foundation; either version 2 of the License, +@c or (at your option) any later version. + +@c GNU Emacs is distributed in the hope that it will be useful, +@c but WITHOUT ANY WARRANTY; without even the implied warranty of +@c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +@c GNU General Public License for more details. + +@c You should have received a copy of the GNU General Public License +@c along with pcl-cvs; see the file COPYING. If not, write to +@c the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +@c %**start of header +@setfilename ../info/pcl-cvs +@settitle PCL-CVS - Emacs Front-End to CVS +@c %**end of header + +@c @dircategory Editors +@direntry +* PCL-CVS: (pcl-cvs). Emacs front-end to CVS +@end direntry +@setchapternewpage on + +@ifinfo +Copyright @copyright{} 1991-2000 Free Software Foundation, Inc. + +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. + +@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 copy and distribute modified versions of this +manual under the conditions for verbatim copying, provided also that the +section entitled ``GNU General Public License'' is included exactly as +in the original, and provided 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 the section entitled ``GNU General Public License'' and +this permission notice may be included in translations approved by the +Free Software Foundation instead of in the original English. +@end ifinfo + +@synindex vr fn +@c The titlepage section does not appear in the Info file. +@titlepage +@sp 4 +@c The title is printed in a large font. +@center @titlefont{User's Guide} +@sp +@center @titlefont{to} +@sp +@center @titlefont{PCL-CVS - The Emacs Front-End to CVS} +@sp 2 +@center release 2.9 +@c -release- +@sp 3 +@center Per Cederqvist +@center Stefan Monnier +@c -date- + +@c The following two commands start the copyright page +@c for the printed manual. This will not appear in the Info file. +@page +@vskip 0pt plus 1filll +Copyright @copyright{} 1991-2000 Free Software Foundation, Inc. + +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 +section entitled ``GNU General Public License'' is included exactly as +in the original, and provided 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 the section entitled ``GNU General Public License'' and +this permission notice may be included in translations approved by the +Free Software Foundation instead of in the original English. +@end titlepage + +@c ================================================================ +@c The real text starts here +@c ================================================================ + +@node Top, About PCL-CVS, (dir), (dir) +@ifinfo +@top PCL-CVS + +This info manual describes PCL-CVS, the GNU Emacs front-end to CVS. +This manual is updated to release 2.5 of PCL-CVS. +@end ifinfo + +@menu +* About PCL-CVS:: Installation, credits, history, ... + +* Getting started:: An introduction with a walk-through example. +* Buffer contents:: An explanation of the buffer contents. +* Selected files:: To which files are commands applied. +* Commands:: All commands, grouped by type. + +* Log Edit Mode:: Major mode to edit log messages. +* Log View Mode:: Major mode to browse log changes. +* CVS Status Mode:: Major mode to view CVS' status output. +* Customization:: How you can tailor PCL-CVS to suit your needs. +* Bugs:: Bugs (known and unknown). + +* Function and Variable Index:: List of functions and variables. +* Concept Index:: List of concepts. +* Key Index:: List of keystrokes. + +@detailmenu + --- The Detailed Node Listing --- + +About PCL-CVS + +* Contributors:: Contributors to PCL-CVS. +* Installation:: + +Commands + +* Entering PCL-CVS:: Commands to invoke PCL-CVS +* Setting flags:: Setting flags for CVS commands +* Updating the buffer:: +* Movement commands:: How to move up and down in the buffer +* Marking files:: How to mark files that other commands + will later operate on. +* Committing changes:: Checking in your modifications to the + CVS repository. +* Editing files:: Loading files into Emacs. +* Getting info about files:: Display the log and status of files. +* Adding and removing files:: Adding and removing files +* Undoing changes:: Undoing changes +* Removing handled entries:: Uninteresting lines can easily be removed. +* Ignoring files:: Telling CVS to ignore generated files. +* Viewing differences:: Commands to @samp{diff} different versions. +* Invoking Ediff:: Running @samp{ediff} from @samp{*cvs*} buffer. +* Updating files:: Updating files that Need-update. +* Tagging files:: Tagging files. +* Miscellaneous commands:: Miscellaneous commands. + +Customization + +* Customizing Faces:: + +@end detailmenu +@end menu + +@node About PCL-CVS, Getting started, Top, Top +@chapter About PCL-CVS +@cindex About PCL-CVS + +PCL-CVS is a front-end to CVS versions 1.9 and later. +It concisely shows the present status of a checked out module in an +Emacs buffer and provides single-key access to the most frequently used CVS +commands. +For Emacs users accustomed to VC, PCL-CVS can be thought of as a replacement +for VC-dired (@pxref{(emacs)VC Dired Mode}) specifically designed for CVS. + +PCL-CVS was originally written many years ago by Per Cederqvist who +proudly maintained it until January 1996, at which point he released the +beta version 2.0b2 and passed on the maintainership to Greg A Woods. +Development stayed mostly dormant for a few years during which the +version 2.0 never seemed to be able to leave the ``beta'' stage while a +separate XEmacs version was slowly splitting away. In late 1999, +Stefan Monnier picked up development again, adding some major new +functionality and taking over maintenance. + +As of Emacs-21, PCL-CVS is part of the standard Emacs distribution. + +@menu +* Contributors:: Contributors to PCL-CVS. +* Installation:: +@end menu + +@node Contributors, Installation, About PCL-CVS, About PCL-CVS +@section Contributors to PCL-CVS +@cindex Contributors +@cindex Authors + +Contributions to the package are welcome. I have limited time to work +on this project, but I will gladly add any code that you contribute to +me to this package (@pxref{Bugs}). + +The following persons have made contributions to PCL-CVS. + +@itemize @bullet +@item +Brian Berliner wrote CVS, together with some other contributors. +Without his work on CVS this package would be useless@dots{} + +@item +Per Cederqvist wrote most of the otherwise unattributed functions in +PCL-CVS as well as all documentation. + +@item +Inge Wallin (@samp{inge@@lysator.liu.se}) wrote the skeleton to +@file{pcl-cvs.texi}, and gave useful comments on it. He also wrote +the files @file{elib-node.el} and @file{compile-all.el}. The file +@file{cookie.el} was inspired by Inge.@refill + +@item +Linus Tolke (@samp{linus@@lysator.liu.se}) contributed useful comments +on both the functionality and the documentation.@refill + +@item +Jamie Zawinski (@samp{jwz@@jwz.com}) contributed +@file{pcl-cvs-lucid.el}, which was later renamed to +@file{pcl-cvs-xemacs.el}.@refill + +@item +Leif Lonnblad contributed RCVS support. (Since superceded by the new +remote CVS support.) + +@item +Jim Blandy (@samp{jimb@@cyclic.com}) contributed hooks to automatically +guess CVS log entries from ChangeLog contents; and initial support of +the new Cygnus / Cyclic remote CVS; as well as various sundry bug fixes +and cleanups. + +@item +Jim Kingdon (@samp{kingdon@@cyclic.com}) contributed lots of fixes to +the build and install procedure. + +@item +Greg A. Woods (@samp{woods@@weird.com}) contributed code to implement +the use of per-file diff buffers; and vendor join diffs with emerge and +ediff; as well as various and sundry bug fixes and cleanups. + +@item +Greg Klanderman (@samp{greg.klanderman@@alum.mit.edu}) implemented +toggling of marked files; setting of CVS command flags via prefix +arguments; updated the XEmacs support; updated the manual; and fixed +numerous bugs. + +@item +Stefan Monnier (@samp{monnier@@cs.yale.edu}) added a slew of other +features and introduced even more new bugs. If there's any bug left, +you can be sure it's his. + +@item +Masatake YAMATO (@samp{masata-y@@is.aist-nara.ac.jp}) graciously +contributed the cvstree code to display a tree of tags which was later +superseded by the new cvs-status-mode. + +@end itemize + +Apart from these, a lot of people have sent us suggestions, ideas, +requests, bug reports and encouragement. Thanks a lot! Without you +there would be no new releases of PCL-CVS. + + +@node Installation, , Contributors, About PCL-CVS +@section Installation +@cindex Installation + +As mentioned above, PCL-CVS comes preinstalled since Emacs-21. +If you're using Emacs 20, you can download an older version of PCL-CVS +from @url{ftp://flint.cs.yale.edu/pub/monnier/pcl-cvs}. That version +also works on XEmacs. + +If you are running XEmacs 21.0 or later, PCL-CVS is available in +pre-compiled package form. Please refer to the XEmacs manual for +instructions regarding package selection and installation. Currently, +that PCL-CVS package also requires you to have installed the xemacs-base, +elib, and dired packages. + +If you have @TeX{} installed at your site, you can make a typeset manual +from @file{pcl-cvs.texi}. + +@enumerate +@item +Run @TeX{} by typing @samp{texi2dvi pcl-cvs.texi}. +@item +Convert the resulting device independent file @file{pcl-cvs.dvi} to a +form which your printer can output and print it. If you have a +postscript printer there is a program, @code{dvi2ps}, which does. There +is also a program which comes together with @TeX{}, @code{dvips}, which +you can use. +@end enumerate + + +@node Getting started, Buffer contents, About PCL-CVS, Top +@chapter Getting started +@cindex Introduction +@cindex Example run + +This document assumes that you know what CVS is, and that you at least +know the fundamental concepts of CVS. If that is not the case you +should read the man page for CVS. + +PCL-CVS is only useful once you have checked out a module. So before +you invoke it you must have a copy of a module somewhere in the file +system. + +You can invoke PCL-CVS by typing @kbd{M-x cvs-examine RET}. +You can also invoke it via the menubar, under Tools. +Or if you prefer, you can also invoke PCL-CVS by simply visiting the +CVS administrative subdirectory of your module, with a prefix argument. +F.ex. @kbd{C-u C-x 5 f ~/my/project/CVS RET}. + +The function @code{cvs-examine} will ask for a directory. The command +@samp{cvs -n update} will be run in that directory. (It should contain +files that have been checked out from a CVS archive.) The output from +@code{cvs} will be parsed and presented in a table in a buffer called +@samp{*cvs*}. It might look something like this: + +@example +Repository : /usr/CVSroot +Module : test +Working dir: /users/ceder/FOO/test + + +In directory .: + Need-Update bar + Need-Update file.txt + Modified namechange + Need-Update newer +In directory sub: + Modified ChangeLog + +--------------------- End --------------------- +-- last cmd: cvs -f -z6 -n update -d -P -- +@end example + +In this example, your repository is in @file{/usr/CVSroot} and CVS has +been run in the directory @file{/users/ceder/FOO/test}. The three files +(@file{bar}, @file{file.txt} and +@file{newer}) that are marked with @samp{Need-Update} have been changed +by someone else in the CVS repository. Two files (@file{namechange} +and @file{sub/ChangeLog}) have been modified locally, and need to be +checked in. + +You can move the cursor up and down in the buffer with @kbd{C-n} and +@kbd{C-p} or @kbd{n} and @kbd{p}. If you press @kbd{c} on one of the +@samp{Modified} files that file will be checked in to the CVS +repository. @xref{Committing changes}. You can also press @kbd{O} to +update any of the files that are marked @samp{Need-Update}. You can +also run @kbd{M-x cvs-update RET} (bound to @kbd{M-u} in the +@samp{*cvs*} buffer) to update all the files.@refill + +You can then press @kbd{=} to easily get a @samp{diff} between your +modified file and the base version that you started from or you can +press @kbd{l} to get the output from @samp{cvs log}. Many more such +commands are available simply by pressing a key (@pxref{Getting info +about files}). + +@node Buffer contents, Selected files, Getting started, Top +@chapter Buffer contents +@cindex Buffer contents + +The display contains several columns, some of which are optional. +They contain, from left to right: + +@itemize @bullet + +@item +Optionally, the head revision of the file. This is the latest version +found in the repository. It might also contain (instead of the head +revision) a sub status which typically gives further information about +how we got to the current state, for example @samp{patched}, +@samp{merged}, ... + +@item +An asterisk when the file is @dfn{marked} (@pxref{Selected +files}).@refill + +@item +The actual status of the file wrt to the repository. @xref{Buffer +contents}, for more information.@refill + +@item +Optionally, the base revision of the file. This is the version +which the copy in your working directory is based upon. + +@item +The file name. + +@end itemize + +The @samp{file status} field can have the following values: + +@table @samp + +@item Modified +The file is modified in your working directory, and there was no +modification to the same file in the repository. This status can have +the following substatus: + +@table @samp + +@item merged +The file was modified in your working directory, and there were +modifications in the repository as well, but they were merged +successfully, without conflict, in your working directory.@refill + +@end table + +@item Conflict +A conflict was detected while trying to merge your changes to @var{file} +with changes from the repository. @var{file} (the copy in your +working directory) is now the output of the @samp{rcsmerge} command on +the two versions; an unmodified copy of your file is also in your +working directory, with the name @file{.#@var{file}.@var{version}}, +where @var{version} is the RCS revision that your modified file started +from. @xref{Viewing differences}, for more details.@refill + +A conflict can also come from a disagreement on the existence of the file +rather than on its content. This case is indicated by the following +possible substatus: + +@table @samp + +@item removed +The file is locally removed but a new revision has been committed to +the repository by someone else. + +@item added +The file is locally added and has also been added to the repository +by someone else. + +@item modified +The file is locally modified but someone else has removed it from the +repository. + +@end table + +@item Added +The file has been added by you, but it still needs to be checked in to +the repository.@refill + +@item Removed +The file has been removed by you, but it still needs to be checked in to +the repository. You can resurrect it by typing @kbd{a} (@pxref{Adding +and removing files}).@refill + +@item Unknown +A file that was detected in your directory, but that neither appears in +the repository, nor is present on the list of files that CVS should +ignore.@refill + +@item Up-to-date +The file is up to date with respect to the version in the repository. +This status can have a substatus of: + +@table @samp + +@item added +You have just added the file to the repository.@refill + +@item updated +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 source, +and for files that you haven't changed but are not the most recent +versions available in the repository.@refill + +@item patched +The file was brought up to date with respect to the remote repository by +way of fetching and applying a patch to the file in your source. This +is equivalent to @samp{updated} except that CVS decided to use a hopefully +more efficient method.@refill + +@item committed +You just committed the file.@refill + +@end table + +@item Need-Update +Either a newer version than the one in your source is available in the +repository and you have not modified your checked out version, or the +file exists in the repository but not in your source. Use +@samp{cvs-mode-update} bound to @kbd{O} to update the file.@refill + +@item Need-Merge +You have modified the checked out version of the file, and a newer +version is available in the repository. A merge will take place when +you run a @samp{cvs-update}. + +@item Missing +The file has been unexpectedly removed from your working directory +although it has not been @samp{cvs remove}d. + +@end table + +@node Selected files, Commands, Buffer contents, Top +@chapter Selected files +@cindex Selected files +@cindex Marked files +@cindex File selection +@cindex Active files +@cindex Applicable + +Many of the commands work on the current set of @dfn{selected} files +which can be either the set of marked files (if any file is marked and +marks are no ignored) or whichever file or directory the cursor is on. + +If a directory is selected but the command cannot be applied to a +directory, then it will be applied to the set of files under this +directory which are in the @samp{*cvs*} buffer. + +Furthermore, each command only operates on a subset of the selected +files, depending on whether or not the command is @dfn{applicable} to +each file (based on the file's status). For example, +@code{cvs-mode-commit} is not applicable to a file whose status is +@samp{Need-Update}. If it should happen that PCL-CVS guesses the +applicability wrong, you can override it with the special prefix +@code{cvs-mode-force-command} normally bound to @kbd{M-f} (and file a +bug report). The applicability rule can be slightly changed with +@code{cvs-allow-dir-commit} and @code{cvs-force-dir-tag}. + +By default, marks are always in effect (you may change this, however, by +setting the variable @code{cvs-default-ignore-marks}) except for the +commands that @samp{tag} or @samp{diff} a file (which can be changed +with the variable @code{cvs-invert-ignore-marks}). + +In addition, you may use the special prefix @code{cvs-mode-toggle-marks} +normally bound to @key{T} to toggle the use of marks for the following +command. + +This scheme might seem a little complicated, but once one gets used to +it, it is quite powerful. + +For commands to mark and unmark files, see @xref{Marking files}. + +@node Commands, Log Edit Mode, Selected files, Top +@chapter Commands + +@iftex +This chapter describes all the commands that you can use in PCL-CVS. +@end iftex +@ifinfo +The nodes in this menu contains explanations about all the commands that +you can use in PCL-CVS. They are grouped together by type. +@end ifinfo + +@menu +* Entering PCL-CVS:: Commands to invoke PCL-CVS +* Setting flags:: Setting flags for CVS commands +* Updating the buffer:: +* Movement commands:: How to move up and down in the buffer +* Marking files:: How to mark files that other commands + will later operate on. +* Committing changes:: Checking in your modifications to the + CVS repository. +* Editing files:: Loading files into Emacs. +* Getting info about files:: Display the log and status of files. +* Adding and removing files:: Adding and removing files +* Undoing changes:: Undoing changes +* Removing handled entries:: Uninteresting lines can easily be removed. +* Ignoring files:: Telling CVS to ignore generated files. +* Viewing differences:: Commands to @samp{diff} different versions. +* Invoking Ediff:: Running @samp{ediff} from @samp{*cvs*} buffer. +* Updating files:: Updating files that Need-update. +* Tagging files:: Tagging files. +* Miscellaneous commands:: Miscellaneous commands. +@end menu + + +@node Entering PCL-CVS, Setting flags, Commands, Commands +@section Entering PCL-CVS +@findex cvs-update +@findex cvs-examine +@findex cvs-status +@findex cvs-checkout +@findex cvs-mode-delete-lock +@cindex Getting the *cvs* buffer + +Most commands in PCL-CVS require that you have a @samp{*cvs*} +buffer. The commands that you use to get one are listed below. +For each, a @samp{cvs} process will be run, the output will be parsed by +PCL-CVS, and the result will be printed in the @samp{*cvs*} buffer (see +@pxref{Buffer contents} for a description of the contents).@refill + +@table @kbd + +@item M-x cvs-update +Run a @samp{cvs update} command. You will be asked for the directory +in which the @samp{cvs update} will be run.@refill + +@item M-x cvs-examine +Run a @samp{cvs -n update} command. This is identical to the previous +command, except that it will only check what needs to be done but will +not change anything. You will be asked for the directory in +which the @samp{cvs -n update} will be run.@refill + +@item M-x cvs-status +Run a @samp{cvs status} command. You will be asked for the directory +in which the @samp{cvs status} will be run.@refill + +@item M-x cvs-checkout +Run a @samp{cvs checkout} command. You will be asked for the directory +in which the @samp{cvs update} will be run and the module to be checked +out.@refill + +@item M-x cvs-quickdir +Populate the @samp{*cvs*} buffer by just looking at the @file{CVS/Entries} +files. This is very much like @code{cvs-examine} except that it does +not access the CVS repository which is a major advantage when the +repository is far away. But of course, it will not be able to detect +when a file needs to be updated or merged. + +@end table + +The first four of those commands are also reachable from the menubar +under @samp{Tools->PCL-CVS}. Finally an alternative way is to visit +with the CVS administrative subdirectory in your work area with a simple +prefix argument. For example @kbd{C-u C-x C-f ~/my/work/CVS RET}. This +will by default run @code{cvs-examine} but the specific behavior can be +changed with @code{cvs-dired-action} and @code{cvs-dired-use-hook}. + +By default, the commands above will descend recursively into +subdirectories. You can avoid that behavior by including @samp{-l} in +the flags for the command. These flags can be set by giving a prefix +argument to the command (e.g., by typing +@kbd{C-u M-x cvs-update RET -l RET}). +@refill + + +@node Setting flags, Updating the buffer, Entering PCL-CVS, Commands +@section Setting flags for CVS commands +@cindex Special prefix + +This section describes the convention used by nearly all PCL-CVS +commands for setting optional flags sent to CVS. A single @kbd{C-u} +prefix argument is used to cause the command to prompt for flags to be +used for the current invocation of the command only. Two @kbd{C-u} prefix +arguments are used to prompt for flags which will be set permanently, for the +current invocation and all that follow, until the flags are changed, or +unless temporary flags are set which override them. + +Perhaps an example or two is in order. Say you are about to add a +binary file to the repository, and want to specify the flags @samp{-kb} +to @samp{cvs add}. You can type @kbd{C-u a -kb RET}, enter the +description, and the file will be added. Subsequent adds will use the +previously prevailing flags. + +As a second example, say you are about to perform a diff and want to see +the result in unified diff format, i.e. you'd like to pass the flag +@samp{-u} to both @samp{cvs diff} and @samp{diff}. You'd also like all +subsequent diffs to use this flag. You can type @kbd{C-u C-u = -u RET} +and the diff will be performed, and the default flags will be set to +@code{("-u")}. You can of course override this flag for a single diff +by using a single @kbd{C-u} prefix argument. + +Additionally to this, some commands can take @dfn{special prefix} arguments. +These work as follows: when called with a @kbd{C-u} prefix, the user is +prompted for a new value of the special prefix and the special prefix is +activated for the next command. When called without the @kbd{C-u} +prefix, the special prefix is re-activated (with the same value as last +time) for the next command. Calling the prefix command again when it's +already activated deactivates it. Calling it with the @kbd{C-u C-u} +prefix activates it for all subsequent commands until you deactivate it +explicitly. The special prefixes are: + +@table @kbd + +@item T +Toggles whether or not marks will be active in the next command.@refill + +@item b +Provide the next command with a branch (can be any version +specifier) to work on.@refill + +@item B +Secondary branch argument. Only meaningful if `b' is also used. +It can be used to provide a second branch argument to +@code{cvs-mode-diff} or to @code{cvs-mode-update}. + +@item M-f +Forces the next command to apply to every selected file rather than only +to the ones PCL-CVS thinks are relevant. + +@end table + +@node Updating the buffer, Movement commands, Setting flags, Commands +@section Updating the @samp{*cvs*} buffer +@findex cvs-update +@findex cvs-examine +@findex cvs-status +@findex cvs-mode-update +@findex cvs-mode-examine +@findex cvs-mode-status + +The following commands can be used from within the @samp{*cvs*} buffer +to update the display: + +@table @kbd + +@item M-u +This runs the command @samp{cvs-update}.@refill + +@item M-e +This runs the command @samp{cvs-examine}.@refill + +@item M-s +This runs the command @samp{cvs-status}.@refill + +@end table + +Additionally to the above commands which operate on the whole module, +you can run the equivalent CVS command on just a subset of the +files/directories with + +@table @kbd + +@item O +Runs @code{cvs-mode-update} on the selected files. When run on the +top level directory, this is equivalent to @kbd{M-u}.@refill + +@item e +Runs @code{cvs-mode-examine} on the selected files. When run on the +top level directory, this is equivalent to @kbd{M-e}.@refill + +@item s +Runs @code{cvs-mode-status} on the selected files. When run on the +top level directory, this is equivalent to @kbd{M-s} except that +CVS output will be shown in a @samp{*cvs-info*} buffer that will be +put in @samp{cvs-status-mode}.@refill + +@end table + + +@node Movement commands, Marking files, Updating the buffer, Commands +@section Movement Commands +@cindex Movement Commands +@findex cvs-mode-next-line +@findex cvs-mode-previous-line +@kindex SPC - Move down one file +@kindex n - Move down one file +@kindex p - Move up one file + +You can use most normal Emacs commands to move forward and backward in +the buffer. Some keys are rebound to functions that take advantage of +the fact that the buffer is a PCL-CVS buffer: + + +@table @kbd +@item SPC +@itemx n +These keys move the cursor one file forward, towards the end of the +buffer (@code{cvs-mode-next-line}).@refill + +@itemx p +This key move one file backward, towards the beginning of the buffer +(@code{cvs-mode-previous-line}). +@end table + + +@node Marking files, Committing changes, Movement commands, Commands +@section Marking files +@cindex Selecting files (commands to mark files) +@cindex Marking files +@kindex m - marking a file +@kindex M - marking all files +@kindex u - unmark a file +@kindex ESC DEL - unmark all files +@kindex DEL - unmark previous file +@kindex % - mark files matching regexp +@kindex T - toggle marks +@findex cvs-mode-mark +@findex cvs-mode-unmark +@findex cvs-mode-mark-all-files +@findex cvs-mode-unmark-all-files +@findex cvs-mode-unmark-up +@findex cvs-mode-mark-matching-files +@findex cvs-mode-toggle-marks + +PCL-CVS works on a set of @dfn{selected files} (@pxref{Selected files}). +You can mark and unmark files with these commands: + +@table @kbd +@item m +This marks the file that the cursor is positioned on. If the cursor is +positioned on a directory all files in that directory will be marked. +(@code{cvs-mode-mark}).@refill + +@item u +Unmark the file that the cursor is positioned on. If the cursor is on a +directory, all files in that directory will be unmarked. +(@code{cvs-mode-unmark}).@refill + +@item M +Mark @emph{all} files in the buffer (@code{cvs-mode-mark-all-files}). + +@item M-@key{DEL} +Unmark @emph{all} files (@code{cvs-mode-unmark-all-files}). + +@item @key{DEL} +Unmark the file on the previous line, and move point to that line +(@code{cvs-mode-unmark-up}). + +@item @key{%} +Mark all files matching a regular expression +(@code{cvs-mode-mark-matching-files}). + +@item @key{T} +Toggle use of marks for the next command (@code{cvs-mode-toggle-marks}). +@end table + + +@node Committing changes, Editing files, Marking files, Commands +@section Committing changes +@cindex Committing changes +@cindex Ci +@findex cvs-mode-commit +@findex cvs-mode-commit-setup +@kindex c - commit files +@kindex C - commit files with ChangeLog message +@vindex cvs-auto-revert (variable) +@cindex Commit buffer +@cindex Edit buffer +@cindex Erasing commit message +@cindex Reverting buffers after commit + +Committing changes basically works as follows: + +@enumerate +@item +After having selected the files you want to commit, you type either +@kbd{c} or @kbd{C} which brings up a special buffer +@samp{*cvs-commit*}.@refill + +@item +You type in the log message describing the changes you're about to +commit (@pxref{Log Edit Mode}).@refill + +@item +When you're happy with it, you type @kbd{C-c C-c} to do the actual +commit.@refill + +@end enumerate + +There's no hidden state, so you can abort the process or pick it up +again at any time. + +The set of files actually committed is really decided only during the +very last step, which is mixed blessing. It allows you to go back and +change your mind about which files to commit, but it also means that you +might inadvertently change the set of selected files. To reduce the +risk of error, @kbd{C-c C-c} will ask for confirmation if the set of +selected files has changed between the first step and the last. You can +change this last detail with @code{log-edit-confirm}. + +As for the difference between @kbd{c} (i.e. @code{cvs-mode-commit}) and +@kbd{C} (i.e. @code{cvs-mode-commit-setup}) is that the first gets you +straight to @samp{*cvs-commit*} without erasing it or changing anything +to its content, while the second will first erase @samp{*cvs-commit*} +and try to initialize it with a sane default (it will do that by either +using a template provided by the CVS administrator or by extracting a +relevant log message from a ChangeLog file). + +If you are editing the files in your Emacs an automatic +@samp{revert-buffer} will be performed. (If the file contains +@samp{$@asis{Id}$} keywords @samp{cvs commit} will write a new file with +the new values substituted. The auto-revert makes sure that you get +them into your buffer). The revert will not occur if you have modified +your buffer, or if @samp{cvs-auto-revert} is set to +@samp{nil}. + + +@node Editing files, Getting info about files, Committing changes, Commands +@section Editing files +@cindex Editing files +@cindex Finding files +@cindex Loading files +@cindex Dired +@cindex Invoking dired +@findex cvs-mode-find-file +@findex cvs-mode-find-file-other-window +@findex cvs-mode-add-change-log-entry-other-window +@kindex f - find file or directory +@kindex o - find file in other window +@kindex A - add ChangeLog entry + +There are currently three commands that can be used to find a file (that +is, load it into a buffer and start editing it there). These commands +work on the line that the cursor is situated at. They always ignore any marked +files. + +@table @kbd +@item f +Find the file that the cursor points to. Run @samp{dired} +@ifinfo +(@pxref{Dired,,,Emacs}) +@end ifinfo +if the cursor points to a directory (@code{cvs-mode-find-file}).@refill + +@item o +Like @kbd{f}, but use another window +(@code{cvs-mode-find-file-other-window}).@refill + +@item A +Invoke @samp{add-change-log-entry-other-window} to edit a +@samp{ChangeLog} file. The @samp{ChangeLog} will be found in the +directory or a parent of the directory of the file the cursor points to. +(@code{cvs-mode-add-change-log-entry-other-window}).@refill +@end table + + +@node Getting info about files, Adding and removing files, Editing files, Commands +@section Getting info about files +@cindex Status (cvs command) +@cindex Log (RCS/cvs command) +@cindex Getting status +@kindex l - run @samp{cvs log} +@kindex s - run @samp{cvs status} +@findex cvs-mode-log +@findex cvs-mode-status + +@table @kbd +@item l +Call the command @code{cvs-mode-log} which runs @samp{cvs log} on all +selected files, and show the result in a temporary @samp{*cvs-info*} +buffer (@pxref{Log View Mode}). + +@item s +Call the command @code{cvs-mode-status} which runs @samp{cvs status} on +all selected files, and show the result in a temporary @samp{*cvs-info*} +buffer (@pxref{CVS Status Mode}). +@end table + + +@node Adding and removing files, Undoing changes, Getting info about files, Commands +@section Adding and removing files +@cindex Adding files +@cindex Removing files +@cindex Resurrecting files +@cindex Deleting files +@cindex Putting files under CVS control +@kindex a - add a file +@kindex r - remove a file +@findex cvs-mode-add +@findex cvs-mode-remove-file + +The following commands are available to make it easy to add and remove +files from the CVS repository. + +@table @kbd +@item a +Add all selected files. This command can be used on @samp{Unknown} +files (@pxref{Buffer contents}). The status of the file will change to +@samp{Added}, and you will have to use @kbd{c} (@samp{cvs-mode-commit}, +@pxref{Committing changes}) to really add the file to the +repository.@refill + +This command can also be used on @samp{Removed} files (before you commit +them) to resurrect them. + +The command that is run is @code{cvs-mode-add}. + +@item r +This command removes the selected files (after prompting for +confirmation). The files are @samp{rm}ed from your directory and +(unless the status was @samp{Unknown}; @pxref{Buffer contents}) they will +also be @samp{cvs remove}d. If the files were @samp{Unknown} they will +disappear from the buffer. Otherwise their status will change to +@samp{Removed}, and you must use @kbd{c} (@samp{cvs-mode-commit}, +@pxref{Committing changes}) to commit the removal.@refill + +The command that is run is @code{cvs-mode-remove-file}. +@end table + + +@node Undoing changes, Removing handled entries, Adding and removing files, Commands +@section Undoing changes +@cindex Undo changes +@cindex Flush changes +@kindex U - undo changes +@findex cvs-mode-undo-local-changes + +@table @kbd +@item U +If you have modified a file, and for some reason decide that you don't +want to keep the changes, you can undo them with this command. It works +by removing your working copy of the file and then getting the latest +version from the repository (@code{cvs-mode-undo-local-changes}. +@end table + + +@node Removing handled entries, Ignoring files, Undoing changes, Commands +@section Removing handled entries +@cindex Expunging uninteresting entries +@cindex Uninteresting entries, getting rid of them +@cindex Getting rid of uninteresting lines +@cindex Removing uninteresting (processed) lines +@cindex Handled lines, removing them +@kindex x - remove processed entries +@kindex C-k - remove selected entries +@findex cvs-mode-remove-handled +@findex cvs-mode-acknowledge +@findex cvs-mode-ignore + +@table @kbd +@item x +This command allows you to remove all entries that you have processed. +More specifically, the lines for @samp{Up-to-date} files (@pxref{Buffer +contents} are removed from the buffer. If a directory becomes empty the heading +for that directory is also removed. This makes it easier to get an +overview of what needs to be done. + +The command is called @code{cvs-mode-remove-handled}. If +@samp{cvs-auto-remove-handled} is set to non-@code{nil} this will +automatically be performed after every commit.@refill + +@item C-k +This command can be used for lines that @samp{cvs-mode-remove-handled} would +not delete, but that you want to delete (@code{cvs-mode-acknowledge}). +@end table + + +@node Ignoring files, Viewing differences, Removing handled entries, Commands +@section Ignoring files +@kindex i - ignoring files +@findex cvs-mode-ignore + +@table @kbd +@item i +Arrange so that CVS will ignore the selected files. The file names are +added to the @file{.cvsignore} file in the corresponding directory. If +the @file{.cvsignore} doesn't exist it will be created. + +The @file{.cvsignore} file should normally be added to the repository, +but you could ignore it also if you like it better that way. + +This runs @code{cvs-mode-ignore}. +@end table + +@node Viewing differences, Invoking Ediff, Ignoring files, Commands +@section Viewing differences +@cindex Diff +@cindex Invoking ediff +@cindex Conflicts, how to resolve them +@cindex Viewing differences +@kindex d= - run @samp{cvs diff} +@kindex = - run @samp{cvs diff} +@kindex dh - diff against head of repository +@kindex dv - diff against vendor branch +@findex cvs-mode-diff +@findex cvs-mode-diff-backup +@findex cvs-mode-diff-head +@findex cvs-mode-diff-vendor +@vindex cvs-invert-ignore-marks + +@table @kbd +@item = +@itemx d = +Display a @samp{cvs diff} between the selected files and the version +that they are based on. (@code{cvs-mode-diff}).@refill + +@item d b +If CVS finds a conflict while merging two versions of a file (during a +@samp{cvs update}, @pxref{Updating the buffer}) it will save the +original file in a file called @file{.#@var{FILE}.@var{VERSION}} where +@var{FILE} is the name of the file, and @var{VERSION} is the revision +number that your file was based on.@refill + +With the @kbd{b} command you can run a @samp{diff} on the files +@file{.#@var{FILE}.@var{VERSION}} and @file{@var{FILE}}.@refill + +@item d h +Display a @samp{cvs diff} between the selected files and the head +revision in the repository (the most recent version on the current +branch). (@code{cvs-mode-diff-head}).@refill + +@item d v +Display a @samp{cvs diff} between the selected files and the head +revision of the vendor branch in the repository. +(@code{cvs-mode-diff-vendor}).@refill + +@end table + +By default, @samp{diff} commands ignore the marks. This can be changed +with @code{cvs-invert-ignore-marks}. + +@node Invoking Ediff, Updating files, Viewing differences, Commands +@section Running ediff +@cindex Ediff +@cindex Invoking ediff +@cindex Viewing differences +@cindex Conflicts, resolving +@cindex Resolving conflicts +@kindex e - invoke @samp{ediff} +@findex cvs-mode-idiff +@findex cvs-mode-imerge + +@table @kbd +@item d e +This command uses ediff (or emerge depending on +@samp{cvs-idiff-imerge-handlers}) to allow you to view diffs. +If a prefix argument is given, PCL-CVS will prompt for a revision against +which the diff should be made, else the default will be to use the BASE +revision. + +@item d E +This command use ediff (or emerge, see above) to allow you to do an +interactive 3-way merge. + +@strong{Note:} When the file status is @samp{Conflict}, +CVS has already performed a merge. The resulting file is not used in +any way if you use this command. If you use the @kbd{q} command inside +@samp{ediff} (to successfully terminate a merge) the file that CVS +created will be overwritten.@refill + +@end table + +@node Updating files, Tagging files, Invoking Ediff, Commands +@section Updating files +@findex cvs-mode-update +@cindex Updating files +@kindex O - update files + +@table @kbd +@item O +Update all selected files with status @samp{Need-update} by running +@samp{cvs update} on them. (@code{cvs-mode-update}). +@end table + + +@node Tagging files, Miscellaneous commands, Updating files, Commands +@section Tagging files +@findex cvs-mode-tag +@findex cvs-mode-untag +@findex cvs-rtag +@cindex Tagging files +@kindex M-t - repository tag files +@kindex t - tag files +@vindex cvs-invert-ignore-marks +@vindex cvs-force-dir-tag + +@table @kbd +@item t +Tag all selected files by running @samp{cvs tag} on +them. (@code{cvs-mode-tag}). It's usually preferable to tag directories +at a time. Rather than selecting all files (which too often doesn't +select all files but only the few that are displayed), clear the +selection with @kbd{M-DEL} (@code{cvs-mode-unmark-all-files}), position +the cursor on the directory you want to tag and hit @kbd{t}. + +@end table + +By default, @samp{tag} commands ignore the marks. This can be changed +with @code{cvs-invert-ignore-marks}. Also by default @samp{tag} can +only be applied to directories, see @code{cvs-force-dir-tag} if you want +to change this behavior. + + +@node Miscellaneous commands, , Tagging files, Commands +@section Miscellaneous commands +@findex cvs-mode-byte-compile-files +@cindex Recompiling elisp files +@cindex Byte compilation +@findex cvs-mode-delete-lock +@cindex Getting rid of lock files +@cindex Lock files +@kindex q - quit PCL-CVS +@findex cvs-mode-quit +@cindex Quitting +@kindex h - help +@kindex ? - help +@findex cvs-help +@cindex Help + +@table @kbd +@item M-x cvs-mode-byte-compile-files +Byte compile all selected files that end in .el. + +@item M-x cvs-mode-delete-lock +This command deletes the lock files that +the *cvs* buffer informs you about. You should normally never have to +use this command since CVS tries very carefully to always remove the +lock files itself. + +You can only use this command when a message in the *cvs* buffer tells +you so. You should wait a while before using this command in case +someone else is running a cvs command. + +Also note that this only works if the repository is local. + +@item ? +@itemx h +Show a summary of common command key bindings in the echo +area. (@code{cvs-help}). + +@item q +Quit PCL-CVS, killing the @samp{*cvs*} buffer. (@code{cvs-mode-quit}). + +@end table + +@node Log Edit Mode, Log View Mode, Commands, Top +@chapter Editing a Log Message + +@node Log View Mode, CVS Status Mode, Log Edit Mode, Top +@chapter Browsing a Log of Changes + +@node CVS Status Mode, Customization, Log View Mode, Top +@chapter Viewing CVS' Status output + +@node Customization, Bugs, CVS Status Mode, Top +@chapter Customization +@vindex log-edit-changelog-full-paragraphs (variable) +@vindex cvs-auto-remove-handled (variable) +@vindex cvs-auto-remove-directories (variable) +@vindex cvs-update-prog-output-skip-regexp (variable) +@vindex cvs-cvsroot (variable) +@vindex cvs-auto-revert (variable) +@vindex log-edit-require-final-newline (variable) +@vindex cvs-sort-ignore-file (variable) +@cindex Customization +@cindex Variables, list of all +@cindex Erasing the input buffer +@cindex Context diff, how to get +@cindex Unidiff, how to get +@cindex Automatically remove handled files +@cindex -u option in modules file +@cindex Modules file (-u option) +@cindex Update program (-u option in modules file) +@cindex Reverting buffers after commit +@cindex Require final newline +@cindex Automatically inserting newline +@cindex Commit message, inserting newline +@cindex Sorting the .cvsignore file +@cindex .cvsignore file, sorting +@cindex Automatically sorting .cvsignore + +If you have an idea about any customization that would be handy but +isn't present in this list, please tell me! +For info on how to reach me, see @xref{Bugs}.@refill + +@table @samp +@item cvs-auto-remove-handled +If this variable is set to any non-@code{nil} value +@samp{cvs-mode-remove-handled} will be called every time you check in +files, after the check-in is ready. @xref{Removing handled +entries}.@refill + +@item cvs-auto-remove-directories +If this variable is set to any non-@code{nil} value, directories that do +not contain any files to be checked in will not be listed in the +@samp{*cvs*} buffer.@refill + +@item cvs-auto-revert +If this variable is set to any non-@samp{nil} value any buffers you have +that visit a file that is committed will be automatically reverted. +This variable defaults to @samp{t}. @xref{Committing changes}.@refill + +@item cvs-update-prog-output-skip-regexp +The @samp{-u} flag in the @file{modules} file can be used to run a command +whenever a @samp{cvs update} is performed (see cvs(5)). This regexp +is used to search for the last line in that output. It is normally set +to @samp{"$"}. That setting is only correct if the command outputs +nothing. Note that PCL-CVS will get very confused if the command +outputs @emph{anything} to @samp{stderr}. + +@item cvs-cvsroot +This variable can be set to override @samp{CVSROOT}. It should be a +string. If it is set then every time a cvs command is run it will be +called as @samp{cvs -d @var{cvs-cvsroot}@dots{}} This can be useful if +your site has several repositories. + +@item log-edit-require-final-newline +When you enter a log message in the @samp{*cvs-commit-message*} buffer +PCL-CVS will normally automatically insert a trailing newline, unless +there already is one. This behavior can be controlled via +@samp{cvs-commit-buffer-require-final-newline}. If it is @samp{t} (the +default behavior), a newline will always be appended. If it is +@samp{nil}, newlines will never be appended. Any other value causes +PCL-CVS to ask the user whenever there is no trailing newline in the +commit message buffer. + +@item log-edit-changelog-full-paragraphs +If this variable is non-@code{nil}, include full ChangeLog paragraphs in +the CVS log created by @samp{cvs-mode-changelog-commit}. +This may be set in the local variables section of a ChangeLog, to +indicate the policy for that ChangeLog. + +A ChangeLog paragraph is a bunch of log text containing no blank lines; +a paragraph usually describes a set of changes with a single purpose, +but perhaps spanning several functions in several files. Changes in +different paragraphs are unrelated. + +You could argue that the CVS log entry for a file should contain the +full ChangeLog paragraph mentioning the change to the file, even though +it may mention other files, because that gives you the full context you +need to understand the change. This is the behavior you get when this +variable is set to t, the default. + +On the other hand, you could argue that the CVS log entry for a change +should contain only the text for the changes which occurred in that +file, because the CVS log is per-file. This is the behavior you get +when this variable is set to nil. + +@item cvs-sort-ignore-file +If this variable is set to any non-@samp{nil} value the +@file{.cvsignore} will always be sorted whenever you use +@samp{cvs-mode-ignore} to add a file to it. This option is on by +default. + +@end table + + +@menu +* Customizing Faces:: +@end menu + +@node Customizing Faces, , Customization, Customization +@section Customizing Faces +@vindex cvs-header-face (face) +@vindex cvs-filename-face (face) +@vindex cvs-unknown-face (face) +@vindex cvs-handled-face (face) +@vindex cvs-need-action-face (face) +@vindex cvs-marked-face (face) + +The Emacs lisp file @file{pcl-cvs-xemacs.el} included with PCL-CVS adds +a few extra features for XEmacs, including menus, mouse bindings, and +fontification the the @samp{*cvs*} buffer. The faces defined for +fontification are listed below: + +@table @samp + +@item cvs-header-face +This face is used to highlight directory changes. + +@item cvs-filename-face +This face is used to highlight file names. + +@item cvs-unknown-face +This face is used to highlight the status of files which are UNKNOWN. + +@item cvs-handled-face +This face is used to highlight the status of files which are handled and +need no further action. + +@item cvs-need-action-face +This face is used to highlight the status of files which still need action. + +@item cvs-marked-face +This face is used to highlight the marked file indicator (@samp{*}). + +@end table + + +@node Bugs, Function and Variable Index, Customization, Top +@chapter Bugs (known and unknown) +@cindex Reporting bugs and ideas +@cindex Bugs, how to report them +@cindex Author, how to reach +@cindex Email to the author +@cindex Known bugs +@cindex Bugs, known +@cindex FAQ +@cindex Problems, list of common + +If you find a bug or misfeature, don't hesitate to tell us! Send email +to @samp{bugs-gnu-emacs@@gnu.org} which gatewayed to the newsgroup +@samp{gnu.emacs.bugs}. Feature requests should also be sent there. We +prefer discussing one thing at a time. If you find several unrelated +bugs, please report them separately. If you are running PCL-CVS under +XEmacs, you should also send a copy of bug reports to +@samp{xemacs-beta@@xemacs.org}. + +If you have problems using PCL-CVS or other questions, +@samp{help-gnu-emacs@@gnu.org} also gatewayed to @samp{gnu.emacs.help} +is a good place to get help as well as @samp{cvs-info@@gnu.org} +yet again gatewayed to @samp{gnu.cvs.help}. + +If you have ideas for improvements, or if you have written some +extensions to this package, we would like to hear from you. We hope that +you find this package useful! + +Below is a partial list of currently known problems with PCL-CVS version +2.0. + +@table @asis +@item Unexpected output from CVS +Unexpected output from CVS may confuse PCL-CVS. It will create +warning messages in the *cvs* buffer alerting you to any parse errors. +If you get these messages, please send a bug report to the email +addresses listed above. Include the contents of the *cvs* buffer, the +output of the CVS process (which should be found in the *cvs-tmp* Emacs +buffer), and the versions of Emacs, PCL-CVS and CVS you are using. + +@end table + +@node Function and Variable Index, Concept Index, Bugs, Top +@unnumbered Function and Variable Index + +@printindex fn + +@node Concept Index, Key Index, Function and Variable Index, Top +@unnumbered Concept Index + +@printindex cp + +@node Key Index, , Concept Index, Top +@unnumbered Key Index + +@printindex ky + +@setchapternewpage odd +@summarycontents +@contents +@bye