summaryrefslogtreecommitdiff
path: root/doc/cvsclient.info
diff options
context:
space:
mode:
Diffstat (limited to 'doc/cvsclient.info')
-rw-r--r--doc/cvsclient.info2118
1 files changed, 2118 insertions, 0 deletions
diff --git a/doc/cvsclient.info b/doc/cvsclient.info
new file mode 100644
index 0000000..93ed7a3
--- /dev/null
+++ b/doc/cvsclient.info
@@ -0,0 +1,2118 @@
+This is cvsclient.info, produced by makeinfo version 4.8 from
+cvsclient.texi.
+
+INFO-DIR-SECTION Programming
+START-INFO-DIR-ENTRY
+* cvsclient: (cvsclient). The CVS client/server protocol.
+END-INFO-DIR-ENTRY
+
+
+File: cvsclient.info, Node: Top, Next: Introduction, Up: (dir)
+
+CVS Client/Server
+*****************
+
+This document describes the client/server protocol used by CVS. It does
+not describe how to use or administer client/server CVS; see the regular
+CVS manual for that. This is version 1.12.13 of the protocol
+specification--*Note Introduction::, for more on what this version
+number means.
+
+* Menu:
+
+* Introduction:: What is CVS and what is the client/server protocol for?
+* Goals:: Basic design decisions, requirements, scope, etc.
+* Connection and Authentication:: Various ways to connect to the server
+* Password scrambling:: Scrambling used by pserver
+* Protocol:: Complete description of the protocol
+* Protocol Notes:: Possible enhancements, limitations, etc. of the protocol
+
+
+File: cvsclient.info, Node: Introduction, Next: Goals, Prev: Top, Up: Top
+
+1 Introduction
+**************
+
+CVS is a version control system (with some additional configuration
+management functionality). It maintains a central "repository" which
+stores files (often source code), including past versions, information
+about who modified them and when, and so on. People who wish to look
+at or modify those files, known as "developers", use CVS to "check out"
+a "working directory" from the repository, to "check in" new versions
+of files to the repository, and other operations such as viewing the
+modification history of a file. If developers are connected to the
+repository by a network, particularly a slow or flaky one, the most
+efficient way to use the network is with the CVS-specific protocol
+described in this document.
+
+ Developers, using the machine on which they store their working
+directory, run the CVS "client" program. To perform operations which
+cannot be done locally, it connects to the CVS "server" program, which
+maintains the repository. For more information on how to connect see
+*Note Connection and Authentication::.
+
+ This document describes the CVS protocol. Unfortunately, it does not
+yet completely document one aspect of the protocol--the detailed
+operation of each CVS command and option--and one must look at the CVS
+user documentation, `cvs.texinfo', for that information. The protocol
+is non-proprietary (anyone who wants to is encouraged to implement it)
+and an implementation, known as CVS, is available under the GNU Public
+License. The CVS distribution, containing this implementation,
+`cvs.texinfo', and a copy (possibly more or less up to date than what
+you are reading now) of this document, `cvsclient.texi', can be found
+at the usual GNU FTP sites, with a filename such as
+`cvs-VERSION.tar.gz'.
+
+ This is version 1.12.13 of the protocol specification. This version
+number is intended only to aid in distinguishing different versions of
+this specification. Although the specification is currently maintained
+in conjunction with the CVS implementation, and carries the same
+version number, it also intends to document what is involved with
+interoperating with other implementations (such as other versions of
+CVS); see *Note Requirements::. This version number should not be used
+by clients or servers to determine what variant of the protocol to
+speak; they should instead use the `valid-requests' and
+`Valid-responses' mechanism (*note Protocol::), which is more flexible.
+
+
+File: cvsclient.info, Node: Goals, Next: Connection and Authentication, Prev: Introduction, Up: Top
+
+2 Goals
+*******
+
+ * Do not assume any access to the repository other than via this
+ protocol. It does not depend on NFS, rdist, etc.
+
+ * Providing a reliable transport is outside this protocol. The
+ protocol expects a reliable transport that is transparent (that
+ is, there is no translation of characters, including characters
+ such as linefeeds or carriage returns), and can transmit all 256
+ octets (for example for proper handling of binary files,
+ compression, and encryption). The encoding of characters
+ specified by the protocol (the names of requests and so on) is the
+ invariant ISO 646 character set (a subset of most popular
+ character sets including ASCII and others). For more details on
+ running the protocol over the TCP reliable transport, see *Note
+ Connection and Authentication::.
+
+ * Security and authentication are handled outside this protocol (but
+ see below about `cvs kserver' and `cvs pserver').
+
+ * The protocol makes it possible for updates to be atomic with
+ respect to checkins; that is if someone commits changes to several
+ files in one cvs command, then an update by someone else would
+ either get all the changes, or none of them. The current CVS
+ server can't do this, but that isn't the protocol's fault.
+
+ * The protocol is, with a few exceptions, transaction-based. That
+ is, the client sends all its requests (without waiting for server
+ responses), and then waits for the server to send back all
+ responses (without waiting for further client requests). This has
+ the advantage of minimizing network turnarounds and the
+ disadvantage of sometimes transferring more data than would be
+ necessary if there were a richer interaction. Another, more
+ subtle, advantage is that there is no need for the protocol to
+ provide locking for features such as making checkins atomic with
+ respect to updates. Any such locking can be handled entirely by
+ the server. A good server implementation (such as the current CVS
+ server) will make sure that it does not have any such locks in
+ place whenever it is waiting for communication with the client;
+ this prevents one client on a slow or flaky network from
+ interfering with the work of others.
+
+ * It is a general design goal to provide only one way to do a given
+ operation (where possible). For example, implementations have no
+ choice about whether to terminate lines with linefeeds or some
+ other character(s), and request and response names are
+ case-sensitive. This is to enhance interoperability. If a
+ protocol allows more than one way to do something, it is all too
+ easy for some implementations to support only some of them
+ (perhaps accidentally).
+
+
+File: cvsclient.info, Node: Connection and Authentication, Next: Password scrambling, Prev: Goals, Up: Top
+
+3 How to Connect to and Authenticate Oneself to the CVS server
+**************************************************************
+
+Connection and authentication occurs before the CVS protocol itself is
+started. There are several ways to connect.
+
+server
+ If the client has a way to execute commands on the server, and
+ provide input to the commands and output from them, then it can
+ connect that way. This could be the usual rsh (port 514)
+ protocol, Kerberos rsh, SSH, or any similar mechanism. The client
+ may allow the user to specify the name of the server program; the
+ default is `cvs'. It is invoked with one argument, `server'.
+ Once it invokes the server, the client proceeds to start the cvs
+ protocol.
+
+kserver
+ The kerberized server listens on a port (in the current
+ implementation, by having inetd call "cvs kserver") which defaults
+ to 1999. The client connects, sends the usual kerberos
+ authentication information, and then starts the cvs protocol.
+ Note: port 1999 is officially registered for another use, and in
+ any event one cannot register more than one port for CVS, so
+ GSS-API (see below) is recommended instead of kserver as a way to
+ support kerberos.
+
+pserver
+ The name "pserver" is somewhat confusing. It refers to both a
+ generic framework which allows the CVS protocol to support several
+ authentication mechanisms, and a name for a specific mechanism
+ which transfers a username and a cleartext password. Servers need
+ not support all mechanisms, and in fact servers will typically
+ want to support only those mechanisms which meet the relevant
+ security needs.
+
+ The pserver server listens on a port (in the current
+ implementation, by having inetd call "cvs pserver") which defaults
+ to 2401 (this port is officially registered). The client
+ connects, and sends the following:
+
+ * the string `BEGIN AUTH REQUEST', a linefeed,
+
+ * the cvs root, a linefeed,
+
+ * the username, a linefeed,
+
+ * the password trivially encoded (see *Note Password
+ scrambling::), a linefeed,
+
+ * the string `END AUTH REQUEST', and a linefeed.
+
+ The client must send the identical string for cvs root both here
+ and later in the `Root' request of the cvs protocol itself.
+ Servers are encouraged to enforce this restriction. The possible
+ server responses (each of which is followed by a linefeed) are the
+ following. Note that although there is a small similarity between
+ this authentication protocol and the cvs protocol, they are
+ separate.
+
+ `I LOVE YOU'
+ The authentication is successful. The client proceeds with
+ the cvs protocol itself.
+
+ `I HATE YOU'
+ The authentication fails. After sending this response, the
+ server may close the connection. It is up to the server to
+ decide whether to give this response, which is generic, or a
+ more specific response using `E' and/or `error'.
+
+ `E TEXT'
+ Provide a message for the user. After this reponse, the
+ authentication protocol continues with another response.
+ Typically the server will provide a series of `E' responses
+ followed by `error'. Compatibility note: CVS 1.9.10 and
+ older clients will print `unrecognized auth response' and
+ TEXT, and then exit, upon receiving this response.
+
+ `error CODE TEXT'
+ The authentication fails. After sending this response, the
+ server may close the connection. The CODE is a code
+ describing why it failed, intended for computer consumption.
+ The only code currently defined is `0' which is nonspecific,
+ but clients must silently treat any unrecognized codes as
+ nonspecific. The TEXT should be supplied to the user.
+ Compatibility note: CVS 1.9.10 and older clients will print
+ `unrecognized auth response' and TEXT, and then exit, upon
+ receiving this response. Note that TEXT for this response,
+ or the TEXT in an `E' response, is not designed for machine
+ parsing. More vigorous use of CODE, or future extensions,
+ will be needed to prove a cleaner machine-parseable
+ indication of what the error was.
+
+ If the client wishes to merely authenticate without starting the
+ cvs protocol, the procedure is the same, except BEGIN AUTH REQUEST
+ is replaced with BEGIN VERIFICATION REQUEST, END AUTH REQUEST is
+ replaced with END VERIFICATION REQUEST, and upon receipt of I LOVE
+ YOU the connection is closed rather than continuing.
+
+ Another mechanism is GSSAPI authentication. GSSAPI is a generic
+ interface to security services such as kerberos. GSSAPI is
+ specified in RFC2078 (GSSAPI version 2) and RFC1508 (GSSAPI
+ version 1); we are not aware of differences between the two which
+ affect the protocol in incompatible ways, so we make no attempt to
+ specify one version or the other. The procedure here is to start
+ with `BEGIN GSSAPI REQUEST'. GSSAPI authentication information is
+ then exchanged between the client and the server. Each packet of
+ information consists of a two byte big endian length, followed by
+ that many bytes of data. After the GSSAPI authentication is
+ complete, the server continues with the responses described above
+ (`I LOVE YOU', etc.).
+
+future possibilities
+ There are a nearly unlimited number of ways to connect and
+ authenticate. One might want to allow access based on IP address
+ (similar to the usual rsh protocol but with different/no
+ restrictions on ports < 1024), to adopt mechanisms such as
+ Pluggable Authentication Modules (PAM), to allow users to run
+ their own servers under their own usernames without root access,
+ or any number of other possibilities. The way to add future
+ mechanisms, for the most part, should be to continue to use port
+ 2401, but to use different strings in place of `BEGIN AUTH
+ REQUEST'.
+
+
+File: cvsclient.info, Node: Password scrambling, Next: Protocol, Prev: Connection and Authentication, Up: Top
+
+4 Password scrambling algorithm
+*******************************
+
+The pserver authentication protocol, as described in *Note Connection
+and Authentication::, trivially encodes the passwords. This is only to
+prevent inadvertent compromise; it provides no protection against even a
+relatively unsophisticated attacker. For comparison, HTTP Basic
+Authentication (as described in RFC2068) uses BASE64 for a similar
+purpose. CVS uses its own algorithm, described here.
+
+ The scrambled password starts with `A', which serves to identify the
+scrambling algorithm in use. After that follows a single octet for
+each character in the password, according to a fixed encoding. The
+values are shown here, with the encoded values in decimal. Control
+characters, space, and characters outside the invariant ISO 646
+character set are not shown; such characters are not recommended for use
+in passwords. There is a long discussion of character set issues in
+*Note Protocol Notes::.
+
+ 0 111 P 125 p 58
+ ! 120 1 52 A 57 Q 55 a 121 q 113
+ " 53 2 75 B 83 R 54 b 117 r 32
+ 3 119 C 43 S 66 c 104 s 90
+ 4 49 D 46 T 124 d 101 t 44
+ % 109 5 34 E 102 U 126 e 100 u 98
+ & 72 6 82 F 40 V 59 f 69 v 60
+ ' 108 7 81 G 89 W 47 g 73 w 51
+ ( 70 8 95 H 38 X 92 h 99 x 33
+ ) 64 9 65 I 103 Y 71 i 63 y 97
+ * 76 : 112 J 45 Z 115 j 94 z 62
+ + 67 ; 86 K 50 k 93
+ , 116 < 118 L 42 l 39
+ - 74 = 110 M 123 m 37
+ . 68 > 122 N 91 n 61
+ / 87 ? 105 O 35 _ 56 o 48
+
+
+File: cvsclient.info, Node: Protocol, Next: Protocol Notes, Prev: Password scrambling, Up: Top
+
+5 The CVS client/server protocol
+********************************
+
+In the following, `\n' refers to a linefeed and `\t' refers to a
+horizontal tab; "requests" are what the client sends and "responses"
+are what the server sends. In general, the connection is governed by
+the client--the server does not send responses without first receiving
+requests to do so; see *Note Response intro:: for more details of this
+convention.
+
+ It is typical, early in the connection, for the client to transmit a
+`Valid-responses' request, containing all the responses it supports,
+followed by a `valid-requests' request, which elicits from the server a
+`Valid-requests' response containing all the requests it understands.
+In this way, the client and server each find out what the other
+supports before exchanging large amounts of data (such as file
+contents).
+
+* Menu:
+
+
+General protocol conventions:
+
+* Entries Lines:: Transmitting RCS data
+* File Modes:: Read, write, execute, and possibly more...
+* Filenames:: Conventions regarding filenames
+* File transmissions:: How file contents are transmitted
+* Strings:: Strings in various requests and responses
+* Dates:: Times and dates
+
+The protocol itself:
+
+* Request intro:: General conventions relating to requests
+* Requests:: List of requests
+* Response intro:: General conventions relating to responses
+* Response pathnames:: The "pathname" in responses
+* Responses:: List of responses
+* Text tags:: More details about the MT response
+
+An example session, and some further observations:
+
+* Example:: A conversation between client and server
+* Requirements:: Things not to omit from an implementation
+* Obsolete:: Former protocol features
+
+
+File: cvsclient.info, Node: Entries Lines, Next: File Modes, Up: Protocol
+
+5.1 Entries Lines
+=================
+
+Entries lines are transmitted as:
+
+ / NAME / VERSION / CONFLICT / OPTIONS / TAG_OR_DATE
+
+ TAG_OR_DATE is either `T' TAG or `D' DATE or empty. If it is
+followed by a slash, anything after the slash shall be silently ignored.
+
+ VERSION can be empty, or start with `0' or `-', for no user file,
+new user file, or user file to be removed, respectively.
+
+ CONFLICT, if it starts with `+', indicates that the file had
+conflicts in it. The rest of CONFLICT is `=' if the timestamp matches
+the file, or anything else if it doesn't. If CONFLICT does not start
+with a `+', it is silently ignored.
+
+ OPTIONS signifies the keyword expansion options (for example `-ko').
+In an `Entry' request, this indicates the options that were specified
+with the file from the previous file updating response (*note Response
+intro::, for a list of file updating responses); if the client is
+specifying the `-k' or `-A' option to `update', then it is the server
+which figures out what overrides what.
+
+
+File: cvsclient.info, Node: File Modes, Next: Filenames, Prev: Entries Lines, Up: Protocol
+
+5.2 File Modes
+==============
+
+A mode is any number of repetitions of
+
+ MODE-TYPE = DATA
+
+ separated by `,'.
+
+ MODE-TYPE is an identifier composed of alphanumeric characters.
+Currently specified: `u' for user, `g' for group, `o' for other (see
+below for discussion of whether these have their POSIX meaning or are
+more loose). Unrecognized values of MODE-TYPE are silently ignored.
+
+ DATA consists of any data not containing `,', `\0' or `\n'. For
+`u', `g', and `o' mode types, data consists of alphanumeric characters,
+where `r' means read, `w' means write, `x' means execute, and
+unrecognized letters are silently ignored.
+
+ The two most obvious ways in which the mode matters are: (1) is it
+writeable? This is used by the developer communication features, and
+is implemented even on OS/2 (and could be implemented on DOS), whose
+notion of mode is limited to a readonly bit. (2) is it executable?
+Unix CVS users need CVS to store this setting (for shell scripts and
+the like). The current CVS implementation on unix does a little bit
+more than just maintain these two settings, but it doesn't really have
+a nice general facility to store or version control the mode, even on
+unix, much less across operating systems with diverse protection
+features. So all the ins and outs of what the mode means across
+operating systems haven't really been worked out (e.g. should the VMS
+port use ACLs to get POSIX semantics for groups?).
+
+
+File: cvsclient.info, Node: Filenames, Next: File transmissions, Prev: File Modes, Up: Protocol
+
+5.3 Conventions regarding transmission of file names
+====================================================
+
+In most contexts, `/' is used to separate directory and file names in
+filenames, and any use of other conventions (for example, that the user
+might type on the command line) is converted to that form. The only
+exceptions might be a few cases in which the server provides a magic
+cookie which the client then repeats verbatim, but as the server has
+not yet been ported beyond unix, the two rules provide the same answer
+(and what to do if future server ports are operating on a repository
+like e:/foo or CVS_ROOT:[FOO.BAR] has not been carefully thought out).
+
+ Characters outside the invariant ISO 646 character set should be
+avoided in filenames. This restriction may need to be relaxed to allow
+for characters such as `[' and `]' (see above about non-unix servers);
+this has not been carefully considered (and currently implementations
+probably use whatever character sets that the operating systems they
+are running on allow, and/or that users specify). Of course the most
+portable practice is to restrict oneself further, to the POSIX portable
+filename character set as specified in POSIX.1.
+
+
+File: cvsclient.info, Node: File transmissions, Next: Strings, Prev: Filenames, Up: Protocol
+
+5.4 File transmissions
+======================
+
+File contents (noted below as FILE TRANSMISSION) can be sent in one of
+two forms. The simpler form is a number of bytes, followed by a
+linefeed, followed by the specified number of bytes of file contents.
+These are the entire contents of the specified file. Second, if both
+client and server support `gzip-file-contents', a `z' may precede the
+length, and the `file contents' sent are actually compressed with
+`gzip' (RFC1952/1951) compression. The length specified is that of the
+compressed version of the file.
+
+ In neither case are the file content followed by any additional data.
+The transmission of a file will end with a linefeed iff that file (or
+its compressed form) ends with a linefeed.
+
+ The encoding of file contents depends on the value for the `-k'
+option. If the file is binary (as specified by the `-kb' option in the
+appropriate place), then it is just a certain number of octets, and the
+protocol contributes nothing towards determining the encoding (using
+the file name is one widespread, if not universally popular, mechanism).
+If the file is text (not binary), then the file is sent as a series of
+lines, separated by linefeeds. If the keyword expansion is set to
+something other than `-ko', then it is expected that the file conform
+to the RCS expectations regarding keyword expansion--in particular,
+that it is in a character set such as ASCII in which 0x24 is a dollar
+sign (`$').
+
+
+File: cvsclient.info, Node: Strings, Next: Dates, Prev: File transmissions, Up: Protocol
+
+5.5 Strings
+===========
+
+In various contexts, for example the `Argument' request and the `M'
+response, one transmits what is essentially an arbitrary string. Often
+this will have been supplied by the user (for example, the `-m' option
+to the `ci' request). The protocol has no mechanism to specify the
+character set of such strings; it would be fairly safe to stick to the
+invariant ISO 646 character set but the existing practice is probably
+to just transmit whatever the user specifies, and hope that everyone
+involved agrees which character set is in use, or sticks to a common
+subset.
+
+
+File: cvsclient.info, Node: Dates, Next: Request intro, Prev: Strings, Up: Protocol
+
+5.6 Dates
+=========
+
+The protocol contains times and dates in various places.
+
+ For the `-D' option to the `annotate', `co', `diff', `export',
+`history', `rannotate', `rdiff', `rtag', `tag', and `update' requests,
+the server should support two formats:
+
+ 26 May 1997 13:01:40 -0000 ; RFC 822 as modified by RFC 1123
+ 5/26/1997 13:01:40 GMT ; traditional
+
+ The former format is preferred; the latter however is sent by the CVS
+command line client (versions 1.5 through at least 1.9).
+
+ For the `-d' option to the `log' and `rlog' requests, servers should
+at least support RFC 822/1123 format. Clients are encouraged to use
+this format too (the command line CVS client, version 1.10 and older,
+just passed along the date format specified by the user, however).
+
+ The `Mod-time' response and `Checkin-time' request use RFC 822/1123
+format (see the descriptions of that response and request for details).
+
+ For `Notify', see the description of that request.
+
+
+File: cvsclient.info, Node: Request intro, Next: Requests, Prev: Dates, Up: Protocol
+
+5.7 Request intro
+=================
+
+By convention, requests which begin with a capital letter do not elicit
+a response from the server, while all others do - save one. The
+exception is `gzip-file-contents'. Unrecognized requests will always
+elicit a response from the server, even if that request begins with a
+capital letter.
+
+ The term "command" means a request which expects a response (except
+`valid-requests'). The general model is that the client transmits a
+great number of requests, but nothing happens until the very end when
+the client transmits a command. Although the intention is that
+transmitting several commands in one connection should be legal,
+existing servers probably have some bugs with some combinations of more
+than one command, and so clients may find it necessary to make several
+connections in some cases. This should be thought of as a workaround
+rather than a desired attribute of the protocol.
+
+
+File: cvsclient.info, Node: Requests, Next: Response intro, Prev: Request intro, Up: Protocol
+
+5.8 Requests
+============
+
+Here are the requests:
+
+`Root PATHNAME \n'
+ Response expected: no. Tell the server which `CVSROOT' to use.
+ Note that PATHNAME is a local directory and _not_ a fully
+ qualified `CVSROOT' variable. PATHNAME must already exist; if
+ creating a new root, use the `init' request, not `Root'. PATHNAME
+ does not include the hostname of the server, how to access the
+ server, etc.; by the time the CVS protocol is in use, connection,
+ authentication, etc., are already taken care of.
+
+ The `Root' request must be sent only once, and it must be sent
+ before any requests other than `Valid-responses',
+ `valid-requests', `UseUnchanged', `Set', `Global_option', `init',
+ `noop', or `version'.
+
+`Valid-responses REQUEST-LIST \n'
+ Response expected: no. Tell the server what responses the client
+ will accept. request-list is a space separated list of tokens.
+ The `Root' request need not have been previously sent.
+
+`valid-requests \n'
+ Response expected: yes. Ask the server to send back a
+ `Valid-requests' response. The `Root' request need not have been
+ previously sent.
+
+`Command-prep COMMAND \n'
+ Response expected: yes. Notify the server of the command that we
+ are leading up to. Intended to allow the server to send a
+ redirect for write operations. Requires either an `ok' or
+ `Redirect' respnose.
+
+`Referrer CVSROOT \n'
+ Response expected: no. Notify a primary server of a server which
+ referred us. Intended to allow a primary (write) server to update
+ the read-only mirror a client is using for reads to minimize races
+ on any subsequent updates from the client.
+
+`Directory LOCAL-DIRECTORY \n'
+`Relative-directory LOCAL-DIRECTORY \n'
+ Additional data: REPOSITORY \n. Response expected: no. Tell the
+ server what directory to use.
+
+ The REPOSITORY should be a directory name from a previous server
+ response and may be specified either relative to the PATHNAME
+ provided with the `Root' request or absolute. Relative or
+ absolute, it must specify a path within PATHNAME.
+
+ Prior to CVS version *FIXME - release number 1.12.10?*, REPOSITORY
+ had to be absolute and `Relative-directory' was not a valid
+ request. The `Relative-directory' request is synonymous with
+ `Directory' and is provided to alert modern clients that a relative
+ REPOSITORY is acceptable.
+
+ Note that this both gives a default for `Entry' and `Modified' and
+ also for `ci' and the other commands; normal usage is to send
+ `Directory' for each directory in which there will be an `Entry'
+ or `Modified', and then a final `Directory' for the original
+ directory, then the command. The LOCAL-DIRECTORY is relative to
+ the top level at which the command is occurring (i.e. the last
+ `Directory' which is sent before the command); to indicate that
+ top level, `.' should be sent for LOCAL-DIRECTORY.
+
+ Here is an example of where a client gets REPOSITORY and
+ LOCAL-DIRECTORY. Suppose that there is a module defined by
+
+ moddir 1dir
+
+ That is, one can check out `moddir' and it will take `1dir' in the
+ repository and check it out to `moddir' in the working directory.
+ Then an initial check out could proceed like this:
+
+ C: Root /home/kingdon/zwork/cvsroot
+ . . .
+ C: Argument moddir
+ C: Directory .
+ C: .
+ C: co
+ S: Clear-sticky moddir/
+ S: 1dir/
+ . . .
+ S: ok
+
+ In this example the response shown is `Clear-sticky', but it could
+ be another response instead. Note that it returns two pathnames.
+ The first one, `moddir/', indicates the working directory to check
+ out into. The second one, ending in `1dir/', indicates the
+ directory to pass back to the server in a subsequent `Directory'
+ request. For example, a subsequent `update' request might look
+ like:
+
+ C: Directory moddir
+ C: 1dir
+ . . .
+ C: update
+
+ For a given LOCAL-DIRECTORY, the repository will be the same for
+ each of the responses, so one can use the repository from whichever
+ response is most convenient. Typically a client will store the
+ repository along with the sources for each LOCAL-DIRECTORY, use
+ that same setting whenever operating on that LOCAL-DIRECTORY, and
+ not update the setting as long as the LOCAL-DIRECTORY exists.
+
+ A client is free to rename a LOCAL-DIRECTORY at any time (for
+ example, in response to an explicit user request). While it is
+ true that the server supplies a LOCAL-DIRECTORY to the client, as
+ noted above, this is only the default place to put the directory.
+ Of course, the various `Directory' requests for a single command
+ (for example, `update' or `ci' request) should name a particular
+ directory with the same LOCAL-DIRECTORY.
+
+ Each `Directory' request specifies a brand-new LOCAL-DIRECTORY and
+ REPOSITORY; that is, LOCAL-DIRECTORY and REPOSITORY are never
+ relative to paths specified in any previous `Directory' request.
+
+ Here's a more complex example, in which we request an update of a
+ working directory which has been checked out from multiple places
+ in the repository.
+
+ C: Argument dir1
+ C: Directory dir1
+ C: mod1
+ . . .
+ C: Argument dir2
+ C: Directory dir2
+ C: mod2
+ . . .
+ C: Argument dir3
+ C: Directory dir3/subdir3
+ C: mod3
+ . . .
+ C: update
+
+ While directories `dir1' and `dir2' will be handled in similar
+ fashion to the other examples given above, `dir3' is slightly
+ different from the server's standpoint. Notice that module `mod3'
+ is actually checked out into `dir3/subdir3', meaning that directory
+ `dir3' is either empty or does not contain data checked out from
+ this repository.
+
+ The above example will work correctly in CVS 1.10.1 and later. The
+ server will descend the tree starting from all directories
+ mentioned in `Argument' requests and update those directories
+ specifically mentioned in `Directory' requests.
+
+ Previous versions of CVS (1.10 and earlier) do not behave the same
+ way. While the descent of the tree begins at all directories
+ mentioned in `Argument' requests, descent into subdirectories only
+ occurs if a directory has been mentioned in a `Directory' request.
+ Therefore, the above example would succeed in updating `dir1' and
+ `dir2', but would skip `dir3' because that directory was not
+ specifically mentioned in a `Directory' request. A functional
+ version of the above that would run on a 1.10 or earlier server is
+ as follows:
+
+ C: Argument dir1
+ C: Directory dir1
+ C: mod1
+ . . .
+ C: Argument dir2
+ C: Directory dir2
+ C: mod2
+ . . .
+ C: Argument dir3
+ C: Directory dir3
+ C: .
+ . . .
+ C: Directory dir3/subdir3
+ C: mod3
+ . . .
+ C: update
+
+ Note the extra `Directory dir3' request. It might be better to use
+ `Emptydir' as the repository for the `dir3' directory, but the
+ above will certainly work.
+
+ One more peculiarity of the 1.10 and earlier protocol is the
+ ordering of `Directory' arguments. In order for a subdirectory to
+ be registered correctly for descent by the recursion processor,
+ its parent must be sent first. For example, the following would
+ not work to update `dir3/subdir3':
+
+ . . .
+ C: Argument dir3
+ C: Directory dir3/subdir3
+ C: mod3
+ . . .
+ C: Directory dir3
+ C: .
+ . . .
+ C: update
+
+ The implementation of the server in 1.10 and earlier writes the
+ administration files for a given directory at the time of the
+ `Directory' request. It also tries to register the directory with
+ its parent to mark it for recursion. In the above example, at the
+ time `dir3/subdir3' is created, the physical directory for `dir3'
+ will be created on disk, but the administration files will not
+ have been created. Therefore, when the server tries to register
+ `dir3/subdir3' for recursion, the operation will silently fail
+ because the administration files do not yet exist for `dir3'.
+
+`Max-dotdot LEVEL \n'
+ Response expected: no. Tell the server that LEVEL levels of
+ directories above the directory which `Directory' requests are
+ relative to will be needed. For example, if the client is
+ planning to use a `Directory' request for `../../foo', it must
+ send a `Max-dotdot' request with a LEVEL of at least 2.
+ `Max-dotdot' must be sent before the first `Directory' request.
+
+`Static-directory \n'
+ Response expected: no. Tell the server that the directory most
+ recently specified with `Directory' should not have additional
+ files checked out unless explicitly requested. The client sends
+ this if the `Entries.Static' flag is set, which is controlled by
+ the `Set-static-directory' and `Clear-static-directory' responses.
+
+`Sticky TAGSPEC \n'
+ Response expected: no. Tell the server that the directory most
+ recently specified with `Directory' has a sticky tag or date
+ TAGSPEC. The first character of TAGSPEC is `T' for a tag, `D' for
+ a date, or some other character supplied by a Set-sticky response
+ from a previous request to the server. The remainder of TAGSPEC
+ contains the actual tag or date, again as supplied by Set-sticky.
+
+ The server should remember `Static-directory' and `Sticky'
+ requests for a particular directory; the client need not resend
+ them each time it sends a `Directory' request for a given
+ directory. However, the server is not obliged to remember them
+ beyond the context of a single command.
+
+`Checkin-prog PROGRAM \n'
+ Response expected: no. Tell the server that the directory most
+ recently specified with `Directory' has a checkin program PROGRAM.
+ Such a program would have been previously set with the
+ `Set-checkin-prog' response.
+
+`Update-prog PROGRAM \n'
+ Response expected: no. Tell the server that the directory most
+ recently specified with `Directory' has an update program PROGRAM.
+ Such a program would have been previously set with the
+ `Set-update-prog' response.
+
+`Entry ENTRY-LINE \n'
+ Response expected: no. Tell the server what version of a file is
+ on the local machine. The name in ENTRY-LINE is a name relative
+ to the directory most recently specified with `Directory'. If the
+ user is operating on only some files in a directory, `Entry'
+ requests for only those files need be included. If an `Entry'
+ request is sent without `Modified', `Is-modified', or `Unchanged',
+ it means the file is lost (does not exist in the working
+ directory). If both `Entry' and one of `Modified', `Is-modified',
+ or `Unchanged' are sent for the same file, `Entry' must be sent
+ first. For a given file, one can send `Modified', `Is-modified',
+ or `Unchanged', but not more than one of these three.
+
+`Kopt OPTION \n'
+ This indicates to the server which keyword expansion options to
+ use for the file specified by the next `Modified' or `Is-modified'
+ request (for example `-kb' for a binary file). This is similar to
+ `Entry', but is used for a file for which there is no entries line.
+ Typically this will be a file being added via an `add' or `import'
+ request. The client may not send both `Kopt' and `Entry' for the
+ same file.
+
+`Checkin-time TIME \n'
+ For the file specified by the next `Modified' request, use TIME as
+ the time of the checkin. The TIME is in the format specified by
+ RFC822 as modified by RFC1123. The client may specify any
+ timezone it chooses; servers will want to convert that to their own
+ timezone as appropriate. An example of this format is:
+
+ 26 May 1997 13:01:40 -0400
+
+ There is no requirement that the client and server clocks be
+ synchronized. The client just sends its recommendation for a
+ timestamp (based on file timestamps or whatever), and the server
+ should just believe it (this means that the time might be in the
+ future, for example).
+
+ Note that this is not a general-purpose way to tell the server
+ about the timestamp of a file; that would be a separate request
+ (if there are servers which can maintain timestamp and time of
+ checkin separately).
+
+ This request should affect the `import' request, and may optionally
+ affect the `ci' request or other relevant requests if any.
+
+`Modified FILENAME \n'
+ Response expected: no. Additional data: mode, \n, file
+ transmission. Send the server a copy of one locally modified
+ file. FILENAME is a file within the most recent directory sent
+ with `Directory'; it must not contain `/'. If the user is
+ operating on only some files in a directory, only those files need
+ to be included. This can also be sent without `Entry', if there
+ is no entry for the file.
+
+`Is-modified FILENAME \n'
+ Response expected: no. Additional data: none. Like `Modified',
+ but used if the server only needs to know whether the file is
+ modified, not the contents.
+
+ The commands which can take `Is-modified' instead of `Modified'
+ with no known change in behavior are: `admin', `diff' (if and only
+ if two `-r' or `-D' options are specified), `watch-on',
+ `watch-off', `watch-add', `watch-remove', `watchers', `editors',
+ `log', and `annotate'.
+
+ For the `status' command, one can send `Is-modified' but if the
+ client is using imperfect mechanisms such as timestamps to
+ determine whether to consider a file modified, then the behavior
+ will be different. That is, if one sends `Modified', then the
+ server will actually compare the contents of the file sent and the
+ one it derives from to determine whether the file is genuinely
+ modified. But if one sends `Is-modified', then the server takes
+ the client's word for it. A similar situation exists for `tag',
+ if the `-c' option is specified.
+
+ Commands for which `Modified' is necessary are `co', `ci',
+ `update', and `import'.
+
+ Commands which do not need to inform the server about a working
+ directory, and thus should not be sending either `Modified' or
+ `Is-modified': `rdiff', `rtag', `history', `init', and `release'.
+
+ Commands for which further investigation is warranted are:
+ `remove', `add', and `export'. Pending such investigation, the
+ more conservative course of action is to stick to `Modified'.
+
+`Unchanged FILENAME \n'
+ Response expected: no. Tell the server that FILENAME has not been
+ modified in the checked out directory. The FILENAME is a file
+ within the most recent directory sent with `Directory'; it must
+ not contain `/'.
+
+`UseUnchanged \n'
+ Response expected: no. To specify the version of the protocol
+ described in this document, servers must support this request
+ (although it need not do anything) and clients must issue it. The
+ `Root' request need not have been previously sent.
+
+`Notify FILENAME \n'
+ Response expected: no. Tell the server that an `edit' or `unedit'
+ command has taken place. The server needs to send a `Notified'
+ response, but such response is deferred until the next time that
+ the server is sending responses. The FILENAME is a file within
+ the most recent directory sent with `Directory'; it must not
+ contain `/'. Additional data:
+ NOTIFICATION-TYPE \t TIME \t CLIENTHOST \t
+ WORKING-DIR \t WATCHES \n
+ where NOTIFICATION-TYPE is `E' for edit, `U' for unedit, undefined
+ behavior if `C', and all other letters should be silently ignored
+ for future expansion. TIME is the time at which the edit or
+ unedit took place, in a user-readable format of the client's
+ choice (the server should treat the time as an opaque string
+ rather than interpreting it). CLIENTHOST is the name of the host
+ on which the edit or unedit took place, and WORKING-DIR is the
+ pathname of the working directory where the edit or unedit took
+ place. WATCHES are the temporary watches, zero or more of the
+ following characters in the following order: `E' for edit, `U' for
+ unedit, `C' for commit, and all other letters should be silently
+ ignored for future expansion. If NOTIFICATION-TYPE is `E' the
+ temporary watches are set; if it is `U' they are cleared. If
+ WATCHES is followed by \t then the \t and the rest of the line
+ should be ignored, for future expansion.
+
+ The TIME, CLIENTHOST, and WORKING-DIR fields may not contain the
+ characters `+', `,', `>', `;', or `='.
+
+ Note that a client may be capable of performing an `edit' or
+ `unedit' operation without connecting to the server at that time,
+ and instead connecting to the server when it is convenient (for
+ example, when a laptop is on the net again) to send the `Notify'
+ requests. Even if a client is capable of deferring notifications,
+ it should attempt to send them immediately (one can send `Notify'
+ requests together with a `noop' request, for example), unless
+ perhaps if it can know that a connection would be impossible.
+
+`Questionable FILENAME \n'
+ Response expected: no. Additional data: no. Tell the server to
+ check whether FILENAME should be ignored, and if not, next time the
+ server sends responses, send (in a `M' response) `?' followed by
+ the directory and filename. FILENAME must not contain `/'; it
+ needs to be a file in the directory named by the most recent
+ `Directory' request.
+
+`Case \n'
+ Response expected: no. Tell the server that filenames should be
+ matched in a case-insensitive fashion. Note that this is not the
+ primary mechanism for achieving case-insensitivity; for the most
+ part the client keeps track of the case which the server wants to
+ use and takes care to always use that case regardless of what the
+ user specifies. For example the filenames given in `Entry' and
+ `Modified' requests for the same file must match in case
+ regardless of whether the `Case' request is sent. The latter
+ mechanism is more general (it could also be used for 8.3
+ filenames, VMS filenames with more than one `.', and any other
+ situation in which there is a predictable mapping between
+ filenames in the working directory and filenames in the protocol),
+ but there are some situations it cannot handle (ignore patterns, or
+ situations where the user specifies a filename and the client does
+ not know about that file).
+
+ Though this request will be supported into the forseeable future,
+ it has been the source of numerous bug reports in the past due to
+ the complexity of testing this functionality via the test suite
+ and client developers are encouraged not to use it. Instead,
+ please consider munging conflicting names and maintaining a map
+ for communicating with the server. For example, suppose the
+ server sends files `case', `CASE', and `CaSe'. The client could
+ write all three files to names such as, `case',
+ `case_prefix_case', and `case_prefix_2_case' and maintain a
+ mapping between the file names in, for instance a new `CVS/Map'
+ file.
+
+`Argument TEXT \n'
+ Response expected: no. Save argument for use in a subsequent
+ command. Arguments accumulate until an argument-using command is
+ given, at which point they are forgotten.
+
+`Argumentx TEXT \n'
+ Response expected: no. Append \n followed by text to the current
+ argument being saved.
+
+`Global_option OPTION \n'
+ Response expected: no. Transmit one of the global options `-q',
+ `-Q', `-l', `-t', `-r', or `-n'. OPTION must be one of those
+ strings, no variations (such as combining of options) are allowed.
+ For graceful handling of `valid-requests', it is probably better
+ to make new global options separate requests, rather than trying
+ to add them to this request. The `Root' request need not have
+ been previously sent.
+
+`Gzip-stream LEVEL \n'
+ Response expected: no. Use zlib (RFC 1950/1951) compression to
+ compress all further communication between the client and the
+ server. As of CVS 1.12.13, this request needs to be sent as the
+ first non-rootless request if the server is configured with
+ compression level restrictions and LEVEL is outside the restricted
+ range. After this request is sent, all further communication must
+ be compressed. All further data received from the server will
+ also be compressed. The LEVEL argument suggests to the server the
+ level of compression that it should apply; it should be an integer
+ between 0 and 9, inclusive, where `0' means no compression and
+ higher numbers indicate more compression.
+
+`Kerberos-encrypt \n'
+ Response expected: no. Use Kerberos encryption to encrypt all
+ further communication between the client and the server. This
+ will only work if the connection was made over Kerberos in the
+ first place. If both the `Gzip-stream' and the `Kerberos-encrypt'
+ requests are used, the `Kerberos-encrypt' request should be used
+ first. This will make the client and server encrypt the
+ compressed data, as opposed to compressing the encrypted data.
+ Encrypted data is generally incompressible.
+
+ Note that this request does not fully prevent an attacker from
+ hijacking the connection, in the sense that it does not prevent
+ hijacking the connection between the initial authentication and the
+ `Kerberos-encrypt' request.
+
+`Gssapi-encrypt \n'
+ Response expected: no. Use GSSAPI encryption to encrypt all
+ further communication between the client and the server. This
+ will only work if the connection was made over GSSAPI in the first
+ place. See `Kerberos-encrypt', above, for the relation between
+ `Gssapi-encrypt' and `Gzip-stream'.
+
+ Note that this request does not fully prevent an attacker from
+ hijacking the connection, in the sense that it does not prevent
+ hijacking the connection between the initial authentication and the
+ `Gssapi-encrypt' request.
+
+`Gssapi-authenticate \n'
+ Response expected: no. Use GSSAPI authentication to authenticate
+ all further communication between the client and the server. This
+ will only work if the connection was made over GSSAPI in the first
+ place. Encrypted data is automatically authenticated, so using
+ both `Gssapi-authenticate' and `Gssapi-encrypt' has no effect
+ beyond that of `Gssapi-encrypt'. Unlike encrypted data, it is
+ reasonable to compress authenticated data.
+
+ Note that this request does not fully prevent an attacker from
+ hijacking the connection, in the sense that it does not prevent
+ hijacking the connection between the initial authentication and the
+ `Gssapi-authenticate' request.
+
+`Set VARIABLE=VALUE \n'
+ Response expected: no. Set a user variable VARIABLE to VALUE.
+ The `Root' request need not have been previously sent.
+
+`Hostname HOSTNAME \n'
+ Response expected: no. Set the client hostname for an upcoming
+ `edit' request.
+
+`LocalDir HOSTNAME \n'
+ Response expected: no. Set the local client directory name for an
+ upcoming `edit' request.
+
+`expand-modules \n'
+ Response expected: yes. Expand the modules which are specified in
+ the arguments. Returns the data in `Module-expansion' responses.
+ Note that the server can assume that this is checkout or export,
+ not rtag or rdiff; the latter do not access the working directory
+ and thus have no need to expand modules on the client side.
+
+ Expand may not be the best word for what this request does. It
+ does not necessarily tell you all the files contained in a module,
+ for example. Basically it is a way of telling you which working
+ directories the server needs to know about in order to handle a
+ checkout of the specified modules.
+
+ For example, suppose that the server has a module defined by
+
+ aliasmodule -a 1dir
+
+ That is, one can check out `aliasmodule' and it will take `1dir'
+ in the repository and check it out to `1dir' in the working
+ directory. Now suppose the client already has this module checked
+ out and is planning on using the `co' request to update it.
+ Without using `expand-modules', the client would have two bad
+ choices: it could either send information about _all_ working
+ directories under the current directory, which could be
+ unnecessarily slow, or it could be ignorant of the fact that
+ `aliasmodule' stands for `1dir', and neglect to send information
+ for `1dir', which would lead to incorrect operation.
+
+ With `expand-modules', the client would first ask for the module to
+ be expanded:
+
+ C: Root /home/kingdon/zwork/cvsroot
+ . . .
+ C: Argument aliasmodule
+ C: Directory .
+ C: .
+ C: expand-modules
+ S: Module-expansion 1dir
+ S: ok
+
+ and then it knows to check the `1dir' directory and send requests
+ such as `Entry' and `Modified' for the files in that directory.
+
+`ci \n'
+`diff \n'
+`list \n'
+`tag \n'
+`status \n'
+`admin \n'
+`history \n'
+`watchers \n'
+`editors \n'
+`annotate \n'
+ Response expected: yes. Actually do a cvs command. This uses any
+ previous `Argument', `Directory', `Entry', or `Modified' requests,
+ if they have been sent. The last `Directory' sent specifies the
+ working directory at the time of the operation. No provision is
+ made for any input from the user. This means that `ci' must use a
+ `-m' argument if it wants to specify a log message.
+
+`log \n'
+ Response expected: yes. Show information for past revisions.
+ This uses any previous `Directory', `Entry', or `Modified'
+ requests, if they have been sent. The last `Directory' sent
+ specifies the working directory at the time of the operation.
+ Also uses previous `Argument''s of which the canonical forms are
+ the following (CVS 1.10 and older clients sent what the user
+ specified, but clients are encouraged to use the canonical forms
+ and other forms are deprecated):
+
+ `-b, -h, -l, -N, -R, -t'
+ These options go by themselves, one option per `Argument'
+ request.
+
+ `-d DATE1<DATE2'
+ Select revisions between DATE1 and DATE2. Either date may be
+ omitted in which case there is no date limit at that end of
+ the range (clients may specify dates such as 1 Jan 1970 or 1
+ Jan 2038 for similar purposes but this is problematic as it
+ makes assumptions about what dates the server supports).
+ Dates are in RFC822/1123 format. The `-d' is one `Argument'
+ request and the date range is a second one.
+
+ `-d DATE1<=DATE2'
+ Likewise but compare dates for equality.
+
+ `-d SINGLEDATE'
+ Select the single, latest revision dated SINGLEDATE or
+ earlier.
+
+ To include several date ranges and/or singledates, repeat the
+ `-d' option as many times as necessary.
+
+ `-rREV1:REV2'
+ `-rBRANCH'
+ `-rBRANCH.'
+ `-r'
+ Specify revisions (note that REV1 or REV2 can be omitted, or
+ can refer to branches). Send both the `-r' and the revision
+ information in a single `Argument' request. To include
+ several revision selections, repeat the `-r' option.
+
+ `-s STATE'
+ `-w'
+ `-wLOGIN'
+ Select on states or users. To include more than one state or
+ user, repeat the option. Send the `-s' option as a separate
+ argument from the state being selected. Send the `-w' option
+ as part of the same argument as the user being selected.
+
+`co \n'
+ Response expected: yes. Get files from the repository. This uses
+ any previous `Argument', `Directory', `Entry', or `Modified'
+ requests, if they have been sent. Arguments to this command are
+ module names; the client cannot know what directories they
+ correspond to except by (1) just sending the `co' request, and then
+ seeing what directory names the server sends back in its
+ responses, and (2) the `expand-modules' request.
+
+`export \n'
+ Response expected: yes. Get files from the repository. This uses
+ any previous `Argument', `Directory', `Entry', or `Modified'
+ requests, if they have been sent. Arguments to this command are
+ module names, as described for the `co' request. The intention
+ behind this command is that a client can get sources from a server
+ without storing CVS information about those sources. That is, a
+ client probably should not count on being able to take the entries
+ line returned in the `Created' response from an `export' request
+ and send it in a future `Entry' request. Note that the entries
+ line in the `Created' response must indicate whether the file is
+ binary or text, so the client can create it correctly.
+
+`ls \n'
+`rannotate \n'
+`rdiff \n'
+`rlist \n'
+`rlog \n'
+`rtag \n'
+ Response expected: yes. Actually do a cvs command. This uses any
+ previous `Argument' requests, if they have been sent. The client
+ should not send `Directory', `Entry', or `Modified' requests for
+ these commands; they are not used. Arguments to these commands
+ are module names, as described for `co'. `ls' is a synonym for
+ `rlist', for compatibility with CVSNT.
+
+`init ROOT-NAME \n'
+ Response expected: yes. If it doesn't already exist, create a CVS
+ repository ROOT-NAME. Note that ROOT-NAME is a local directory
+ and _not_ a fully qualified `CVSROOT' variable. The `Root'
+ request need not have been previously sent.
+
+`update \n'
+ Response expected: yes. Actually do a `cvs update' command. This
+ uses any previous `Argument', `Directory', `Entry', or `Modified'
+ requests, if they have been sent. The last `Directory' sent
+ specifies the working directory at the time of the operation. The
+ `-I' option is not used-files which the client can decide whether
+ to ignore are not mentioned and the client sends the
+ `Questionable' request for others.
+
+`import \n'
+ Response expected: yes. Actually do a `cvs import' command. This
+ uses any previous `Argument', `Directory', `Entry', or `Modified'
+ requests, if they have been sent. The last `Directory' sent
+ specifies the working directory at the time of the operation -
+ unlike most commands, the repository field of each `Directory'
+ request is ignored (it merely must point somewhere within the
+ root). The files to be imported are sent in `Modified' requests
+ (files which the client knows should be ignored are not sent; the
+ server must still process the CVSROOT/cvsignore file unless -I ! is
+ sent). A log message must have been specified with a `-m'
+ argument.
+
+`add \n'
+ Response expected: yes. Add a file or directory. This uses any
+ previous `Argument', `Directory', `Entry', or `Modified' requests,
+ if they have been sent. The last `Directory' sent specifies the
+ working directory at the time of the operation.
+
+ To add a directory, send the directory to be added using
+ `Directory' and `Argument' requests. For example:
+
+ C: Root /u/cvsroot
+ . . .
+ C: Argument nsdir
+ C: Directory nsdir
+ C: 1dir/nsdir
+ C: Directory .
+ C: 1dir
+ C: add
+ S: M Directory /u/cvsroot/1dir/nsdir added to the repository
+ S: ok
+
+ You will notice that the server does not signal to the client in
+ any particular way that the directory has been successfully added.
+ The client is supposed to just assume that the directory has been
+ added and update its records accordingly. Note also that adding a
+ directory is immediate; it does not wait until a `ci' request as
+ files do.
+
+ To add a file, send the file to be added using a `Modified'
+ request. For example:
+
+ C: Argument nfile
+ C: Directory .
+ C: 1dir
+ C: Modified nfile
+ C: u=rw,g=r,o=r
+ C: 6
+ C: hello
+ C: add
+ S: E cvs server: scheduling file `nfile' for addition
+ S: Mode u=rw,g=r,o=r
+ S: Checked-in ./
+ S: /u/cvsroot/1dir/nfile
+ S: /nfile/0///
+ S: E cvs server: use 'cvs commit' to add this file permanently
+ S: ok
+
+ Note that the file has not been added to the repository; the only
+ effect of a successful `add' request, for a file, is to supply the
+ client with a new entries line containing `0' to indicate an added
+ file. In fact, the client probably could perform this operation
+ without contacting the server, although using `add' does cause the
+ server to perform a few more checks.
+
+ The client sends a subsequent `ci' to actually add the file to the
+ repository.
+
+ Another quirk of the `add' request is that with CVS 1.9 and older,
+ a pathname specified in an `Argument' request cannot contain `/'.
+ There is no good reason for this restriction, and in fact more
+ recent CVS servers don't have it. But the way to interoperate
+ with the older servers is to ensure that all `Directory' requests
+ for `add' (except those used to add directories, as described
+ above), use `.' for LOCAL-DIRECTORY. Specifying another string for
+ LOCAL-DIRECTORY may not get an error, but it will get you strange
+ `Checked-in' responses from the buggy servers.
+
+`remove \n'
+ Response expected: yes. Remove a file. This uses any previous
+ `Argument', `Directory', `Entry', or `Modified' requests, if they
+ have been sent. The last `Directory' sent specifies the working
+ directory at the time of the operation.
+
+ Note that this request does not actually do anything to the
+ repository; the only effect of a successful `remove' request is to
+ supply the client with a new entries line containing `-' to
+ indicate a removed file. In fact, the client probably could
+ perform this operation without contacting the server, although
+ using `remove' may cause the server to perform a few more checks.
+
+ The client sends a subsequent `ci' request to actually record the
+ removal in the repository.
+
+`edit \n'
+ Response expected: yes. Actually do the `cvs edit' command. This
+ uses any previous `Argument', `Directory', `Entry', `LocalDir', or
+ `Hostname' requests, if they have been sent. Unless the user has
+ requested that edits not be granted unless no one else is editing
+ a file, a local edit followed by an attempt to send `Notify'
+ requests to the server is preferred.
+
+`watch-on \n'
+`watch-off \n'
+`watch-add \n'
+`watch-remove \n'
+ Response expected: yes. Actually do the `cvs watch on', `cvs
+ watch off', `cvs watch add', and `cvs watch remove' commands,
+ respectively. This uses any previous `Argument', `Directory',
+ `Entry', or `Modified' requests, if they have been sent. The last
+ `Directory' sent specifies the working directory at the time of
+ the operation.
+
+`release \n'
+ Response expected: yes. Note that a `cvs release' command has
+ taken place and update the history file accordingly.
+
+`global-list-quiet \n'
+ Response expected: yes. This request is a synonym for noop, but
+ its existance notifies the client that a `-q' option to `list' and
+ `rlist' will be rejected. This, in a reverse-logic sort of way,
+ is here so that when it _isn't_ received, as for instance from
+ CVSNT, the client will know that the quiet option has to be sent
+ as a command option rather than a global option.
+
+`noop \n'
+ Response expected: yes. This request is a null command in the
+ sense that it doesn't do anything, but merely (as with any other
+ requests expecting a response) sends back any responses pertaining
+ to pending errors, pending `Notified' responses, etc. The `Root'
+ request need not have been previously sent.
+
+`update-patches \n'
+ Response expected: yes. This request does not actually do
+ anything. It is used as a signal that the server is able to
+ generate patches when given an `update' request. The client must
+ issue the `-u' argument to `update' in order to receive patches.
+
+`gzip-file-contents LEVEL \n'
+ Response expected: no. Note that this request does not follow the
+ response convention stated above. `Gzip-stream' is suggested
+ instead of `gzip-file-contents' as it gives better compression; the
+ only reason to implement the latter is to provide compression with
+ CVS 1.8 and earlier. The `gzip-file-contents' request asks the
+ server to compress files it sends to the client using `gzip'
+ (RFC1952/1951) compression, using the specified level of
+ compression. If this request is not made, the server must not
+ compress files.
+
+ This is only a hint to the server. It may still decide (for
+ example, in the case of very small files, or files that already
+ appear to be compressed) not to do the compression. Compression
+ is indicated by a `z' preceding the file length.
+
+ Availability of this request in the server indicates to the client
+ that it may compress files sent to the server, regardless of
+ whether the client actually uses this request.
+
+`wrapper-sendme-rcsOptions \n'
+ Response expected: yes. Request that the server transmit mappings
+ from filenames to keyword expansion modes in `Wrapper-rcsOption'
+ responses.
+
+`version \n'
+ Response expected: yes. Request that the server transmit its
+ version message. The `Root' request need not have been previously
+ sent.
+
+`OTHER-REQUEST TEXT \n'
+ Response expected: yes. Any unrecognized request expects a
+ response, and does not contain any additional data. The response
+ will normally be something like `error unrecognized request', but
+ it could be a different error if a previous request which doesn't
+ expect a response produced an error.
+
+ When the client is done, it drops the connection.
+
+
+File: cvsclient.info, Node: Response intro, Next: Response pathnames, Prev: Requests, Up: Protocol
+
+5.9 Introduction to Responses
+=============================
+
+After a command which expects a response, the server sends however many
+of the following responses are appropriate. The server should not send
+data at other times (the current implementation may violate this
+principle in a few minor places, where the server is printing an error
+message and exiting--this should be investigated further).
+
+ Any set of responses always ends with `error' or `ok'. This
+indicates that the response is over.
+
+ The responses `Checked-in', `New-entry', `Updated', `Created',
+`Update-existing', `Merged', and `Patched' are refered to as "file
+updating" responses, because they change the status of a file in the
+working directory in some way. The responses `Mode', `Mod-time', and
+`Checksum' are referred to as "file update modifying" responses because
+they modify the next file updating response. In no case shall a file
+update modifying response apply to a file updating response other than
+the next one. Nor can the same file update modifying response occur
+twice for a given file updating response (if servers diagnose this
+problem, it may aid in detecting the case where clients send an update
+modifying response without following it by a file updating response).
+
+
+File: cvsclient.info, Node: Response pathnames, Next: Responses, Prev: Response intro, Up: Protocol
+
+5.10 The "pathname" in responses
+================================
+
+Many of the responses contain something called PATHNAME. The name is
+somewhat misleading; it actually indicates a pair of pathnames. First,
+a local directory name relative to the directory in which the command
+was given (i.e. the last `Directory' before the command). Then a
+linefeed and a repository name. Then a slash and the filename (without
+a `,v' ending).
+
+ The repository name may be absolute or relative to the PATHNAME sent
+with the `Root' request. If absolute, the repository name must begin
+with the PATHNAME sent with the `Root' request. Relative or absolute,
+the repository name must specify a path underneath the `Root' PATHNAME.
+
+ For example, for a file `i386.mh' which is in the local directory
+`gas.clean/config' and for which the repository name is
+`devo/gas/config':
+
+ gas.clean/config/
+ devo/gas/config/i386.mh
+
+ If the server wants to tell the client to create a directory, then it
+merely uses the directory in any response, as described above, and the
+client should create the directory if it does not exist. Note that this
+should only be done one directory at a time, in order to permit the
+client to correctly store the repository for each directory. Servers
+can use requests such as `Clear-sticky', `Clear-static-directory', or
+any other requests, to create directories.
+
+ Some server implementations may poorly distinguish between a
+directory which should not exist and a directory which contains no
+files; in order to refrain from creating empty directories a client
+should both send the `-P' option to `update' or `co', and should also
+detect the case in which the server asks to create a directory but not
+any files within it (in that case the client should remove the
+directory or refrain from creating it in the first place). Note that
+servers could clean this up greatly by only telling the client to
+create directories if the directory in question should exist, but until
+servers do this, clients will need to offer the `-P' behavior described
+above.
+
+
+File: cvsclient.info, Node: Responses, Next: Text tags, Prev: Response pathnames, Up: Protocol
+
+5.11 Responses
+==============
+
+Here are the responses:
+
+`Valid-requests REQUEST-LIST \n'
+ Indicate what requests the server will accept. REQUEST-LIST is a
+ space separated list of tokens. If the server supports sending
+ patches, it will include `update-patches' in this list. The
+ `update-patches' request does not actually do anything.
+
+`Force-gzip \n'
+ Response expected: no. Indicates that the server requires
+ compression. The client must send a `Gzip-stream' request, though
+ the requested LEVEL may be `0'.
+
+`Referrer CVSROOT'
+ Request that the client store CVSROOT as the name of this server
+ and that this name be passed via a `Referrer' _request_ to any
+ subsequent servers contacted as a result of a `Redirect' response.
+ This can be useful to allow the secondary administrator to
+ configure the `CVSROOT' the primary should use to update the
+ secondary in case the client uses a non-standard name or even a
+ name that is unique to the client for some reason.
+
+`Redirect CVSROOT'
+ Request that the client redirect its connection to CVSROOT and
+ begin again. This response is only valid in response to a
+ `Command-prep' request. If a client receives this response, it is
+ expected to notify the write server it subsequently contacts of
+ the CVSROOT of the server which redirected it using the `Referrer'
+ request. This information makes it possible for primary servers
+ to update the client's mirror first, hopefully minimizing race
+ conditions on subsequent updates from the same client.
+
+`Checked-in PATHNAME \n'
+ Additional data: New Entries line, \n. This means a file PATHNAME
+ has been successfully operated on (checked in, added, etc.). name
+ in the Entries line is the same as the last component of PATHNAME.
+
+`New-entry PATHNAME \n'
+ Additional data: New Entries line, \n. Like `Checked-in', but the
+ file is not up to date.
+
+`Updated PATHNAME \n'
+ Additional data: New Entries line, \n, mode, \n, file
+ transmission. A new copy of the file is enclosed. This is used
+ for a new revision of an existing file, or for a new file, or for
+ any other case in which the local (client-side) copy of the file
+ needs to be updated, and after being updated it will be up to
+ date. If any directory in pathname does not exist, create it.
+ This response is not used if `Created' and `Update-existing' are
+ supported.
+
+`Created PATHNAME \n'
+ This is just like `Updated' and takes the same additional data, but
+ is used only if no `Entry', `Modified', or `Unchanged' request has
+ been sent for the file in question. The distinction between
+ `Created' and `Update-existing' is so that the client can give an
+ error message in several cases: (1) there is a file in the working
+ directory, but not one for which `Entry', `Modified', or
+ `Unchanged' was sent (for example, a file which was ignored, or a
+ file for which `Questionable' was sent), (2) there is a file in
+ the working directory whose name differs from the one mentioned in
+ `Created' in ways that the client is unable to use to distinguish
+ files. For example, the client is case-insensitive and the names
+ differ only in case.
+
+`Update-existing PATHNAME \n'
+ This is just like `Updated' and takes the same additional data, but
+ is used only if a `Entry', `Modified', or `Unchanged' request has
+ been sent for the file in question.
+
+ This response, or `Merged', indicates that the server has
+ determined that it is OK to overwrite the previous contents of the
+ file specified by PATHNAME. Provided that the client has correctly
+ sent `Modified' or `Is-modified' requests for a modified file, and
+ the file was not modified while CVS was running, the server can
+ ensure that a user's modifications are not lost.
+
+`Merged PATHNAME \n'
+ This is just like `Updated' and takes the same additional data,
+ with the one difference that after the new copy of the file is
+ enclosed, it will still not be up to date. Used for the results
+ of a merge, with or without conflicts.
+
+ It is useful to preserve an copy of what the file looked like
+ before the merge. This is basically handled by the server; before
+ sending `Merged' it will send a `Copy-file' response. For
+ example, if the file is `aa' and it derives from revision 1.3, the
+ `Copy-file' response will tell the client to copy `aa' to
+ `.#aa.1.3'. It is up to the client to decide how long to keep this
+ file around; traditionally clients have left it around forever,
+ thus letting the user clean it up as desired. But another answer,
+ such as until the next commit, might be preferable.
+
+`Rcs-diff PATHNAME \n'
+ This is just like `Updated' and takes the same additional data,
+ with the one difference that instead of sending a new copy of the
+ file, the server sends an RCS change text. This change text is
+ produced by `diff -n' (the GNU diff `-a' option may also be used).
+ The client must apply this change text to the existing file.
+ This will only be used when the client has an exact copy of an
+ earlier revision of a file. This response is only used if the
+ `update' command is given the `-u' argument.
+
+`Patched PATHNAME \n'
+ This is just like `Rcs-diff' and takes the same additional data,
+ except that it sends a standard patch rather than an RCS change
+ text. The patch is produced by `diff -c' for CVS 1.6 and later
+ (see POSIX.2 for a description of this format), or `diff -u' for
+ previous versions of CVS; clients are encouraged to accept either
+ format. Like `Rcs-diff', this response is only used if the
+ `update' command is given the `-u' argument.
+
+ The `Patched' response is deprecated in favor of the `Rcs-diff'
+ response. However, older clients (CVS 1.9 and earlier) only
+ support `Patched'.
+
+`Edit-file PATHNAME \n'
+ Do the client-side portion of editing a file.
+
+`Mode MODE \n'
+ This MODE applies to the next file mentioned in `Checked-in'.
+ `Mode' is a file update modifying response as described in *Note
+ Response intro::.
+
+`Mod-time TIME \n'
+ Set the modification time of the next file sent to TIME.
+ `Mod-time' is a file update modifying response as described in
+ *Note Response intro::. The TIME is in the format specified by
+ RFC822 as modified by RFC1123. The server may specify any
+ timezone it chooses; clients will want to convert that to their
+ own timezone as appropriate. An example of this format is:
+
+ 26 May 1997 13:01:40 -0400
+
+ There is no requirement that the client and server clocks be
+ synchronized. The server just sends its recommendation for a
+ timestamp (based on its own clock, presumably), and the client
+ should just believe it (this means that the time might be in the
+ future, for example).
+
+ If the server does not send `Mod-time' for a given file, the client
+ should pick a modification time in the usual way (usually, just
+ let the operating system set the modification time to the time
+ that the CVS command is running).
+
+`Checksum CHECKSUM\n'
+ The CHECKSUM applies to the next file sent (that is, `Checksum' is
+ a file update modifying response as described in *Note Response
+ intro::). In the case of `Patched', the checksum applies to the
+ file after being patched, not to the patch itself. The client
+ should compute the checksum itself, after receiving the file or
+ patch, and signal an error if the checksums do not match. The
+ checksum is the 128 bit MD5 checksum represented as 32 hex digits
+ (MD5 is described in RFC1321). This response is optional, and is
+ only used if the client supports it (as judged by the
+ `Valid-responses' request).
+
+`Copy-file PATHNAME \n'
+ Additional data: NEWNAME \n. Copy file PATHNAME to NEWNAME in the
+ same directory where it already is. This does not affect
+ `CVS/Entries'.
+
+ This can optionally be implemented as a rename instead of a copy.
+ The only use for it which currently has been identified is prior
+ to a `Merged' response as described under `Merged'. Clients can
+ probably assume that is how it is being used, if they want to worry
+ about things like how long to keep the NEWNAME file around.
+
+`Removed PATHNAME \n'
+ The file has been removed from the repository (this is the case
+ where cvs prints `file foobar.c is no longer pertinent').
+
+`Remove-entry PATHNAME \n'
+ The file needs its entry removed from `CVS/Entries', but the file
+ itself is already gone (this happens in response to a `ci' request
+ which involves committing the removal of a file).
+
+`Set-static-directory PATHNAME \n'
+ This instructs the client to set the `Entries.Static' flag, which
+ it should then send back to the server in a `Static-directory'
+ request whenever the directory is operated on. PATHNAME ends in a
+ slash; its purpose is to specify a directory, not a file within a
+ directory.
+
+`Clear-static-directory PATHNAME \n'
+ Like `Set-static-directory', but clear, not set, the flag.
+
+`Set-sticky PATHNAME \n'
+ Additional data: TAGSPEC \n. Tell the client to set a sticky tag
+ or date, which should be supplied with the `Sticky' request for
+ future operations. PATHNAME ends in a slash; its purpose is to
+ specify a directory, not a file within a directory. The client
+ should store TAGSPEC and pass it back to the server as-is, to
+ allow for future expansion. The first character of TAGSPEC is `T'
+ for a tag, `D' for a date, or something else for future expansion.
+ The remainder of TAGSPEC contains the actual tag or date.
+
+`Clear-sticky PATHNAME \n'
+ Clear any sticky tag or date set by `Set-sticky'.
+
+`Template PATHNAME \n'
+ Additional data: file transmission (note: compressed file
+ transmissions are not supported). PATHNAME ends in a slash; its
+ purpose is to specify a directory, not a file within a directory.
+ Tell the client to store the file transmission as the template log
+ message, and then use that template in the future when prompting
+ the user for a log message.
+
+`Set-checkin-prog DIR \n'
+ Additional data: PROG \n. Tell the client to set a checkin
+ program, which should be supplied with the `Checkin-prog' request
+ for future operations.
+
+`Set-update-prog DIR \n'
+ Additional data: PROG \n. Tell the client to set an update
+ program, which should be supplied with the `Update-prog' request
+ for future operations.
+
+`Notified PATHNAME \n'
+ Indicate to the client that the notification for PATHNAME has been
+ done. There should be one such response for every `Notify'
+ request; if there are several `Notify' requests for a single file,
+ the requests should be processed in order; the first `Notified'
+ response pertains to the first `Notify' request, etc.
+
+`Module-expansion PATHNAME \n'
+ Return a file or directory which is included in a particular
+ module. PATHNAME is relative to cvsroot, unlike most pathnames in
+ responses. PATHNAME should be used to look and see whether some
+ or all of the module exists on the client side; it is not
+ necessarily suitable for passing as an argument to a `co' request
+ (for example, if the modules file contains the `-d' option, it
+ will be the directory specified with `-d', not the name of the
+ module).
+
+`Wrapper-rcsOption PATTERN -k 'OPTION' \n'
+ Transmit to the client a filename pattern which implies a certain
+ keyword expansion mode. The PATTERN is a wildcard pattern (for
+ example, `*.exe'. The OPTION is `b' for binary, and so on. Note
+ that although the syntax happens to resemble the syntax in certain
+ CVS configuration files, it is more constrained; there must be
+ exactly one space between PATTERN and `-k' and exactly one space
+ between `-k' and `'', and no string is permitted in place of `-k'
+ (extensions should be done with new responses, not by extending
+ this one, for graceful handling of `Valid-responses').
+
+`M TEXT \n'
+ A one-line message for the user. Note that the format of TEXT is
+ not designed for machine parsing. Although sometimes scripts and
+ clients will have little choice, the exact text which is output is
+ subject to vary at the discretion of the server and the example
+ output given in this document is just that, example output.
+ Servers are encouraged to use the `MT' response, and future
+ versions of this document will hopefully standardize more of the
+ `MT' tags; see *Note Text tags::.
+
+`Mbinary \n'
+ Additional data: file transmission (note: compressed file
+ transmissions are not supported). This is like `M', except the
+ contents of the file transmission are binary and should be copied
+ to standard output without translation to local text file
+ conventions. To transmit a text file to standard output, servers
+ should use a series of `M' requests.
+
+`E TEXT \n'
+ Same as `M' but send to stderr not stdout.
+
+`F \n'
+ Flush stderr. That is, make it possible for the user to see what
+ has been written to stderr (it is up to the implementation to
+ decide exactly how far it should go to ensure this).
+
+`MT TAGNAME DATA \n'
+ This response provides for tagged text. It is similar to
+ SGML/HTML/XML in that the data is structured and a naive
+ application can also make some sense of it without understanding
+ the structure. The syntax is not SGML-like, however, in order to
+ fit into the CVS protocol better and (more importantly) to make it
+ easier to parse, especially in a language like perl or awk.
+
+ The TAGNAME can have several forms. If it starts with `a' to `z'
+ or `A' to `Z', then it represents tagged text. If the
+ implementation recognizes TAGNAME, then it may interpret DATA in
+ some particular fashion. If the implementation does not recognize
+ TAGNAME, then it should simply treat DATA as text to be sent to
+ the user (similar to an `M' response). There are two tags which
+ are general purpose. The `text' tag is similar to an unrecognized
+ tag in that it provides text which will ordinarily be sent to the
+ user. The `newline' tag is used without DATA and indicates that a
+ newline will ordinarily be sent to the user (there is no provision
+ for embedding newlines in the DATA of other tagged text responses).
+
+ If TAGNAME starts with `+' it indicates a start tag and if it
+ starts with `-' it indicates an end tag. The remainder of TAGNAME
+ should be the same for matching start and end tags, and tags
+ should be nested (for example one could have tags in the following
+ order `+bold' `+italic' `text' `-italic' `-bold' but not `+bold'
+ `+italic' `text' `-bold' `-italic'). A particular start and end
+ tag may be documented to constrain the tagged text responses which
+ are valid between them.
+
+ Note that if DATA is present there will always be exactly one
+ space between TAGNAME and DATA; if there is more than one space,
+ then the spaces beyond the first are part of DATA.
+
+ Here is an example of some tagged text responses. Note that there
+ is a trailing space after `Checking in' and `initial revision:'
+ and there are two trailing spaces after `<--'. Such trailing
+ spaces are, of course, part of DATA.
+
+ MT +checking-in
+ MT text Checking in
+ MT fname gz.tst
+ MT text ;
+ MT newline
+ MT rcsfile /home/kingdon/zwork/cvsroot/foo/gz.tst,v
+ MT text <--
+ MT fname gz.tst
+ MT newline
+ MT text initial revision:
+ MT init-rev 1.1
+ MT newline
+ MT text done
+ MT newline
+ MT -checking-in
+
+ If the client does not support the `MT' response, the same
+ responses might be sent as:
+
+ M Checking in gz.tst;
+ M /home/kingdon/zwork/cvsroot/foo/gz.tst,v <-- gz.tst
+ M initial revision: 1.1
+ M done
+
+ For a list of specific tags, see *Note Text tags::.
+
+`error ERRNO-CODE ` ' TEXT \n'
+ The command completed with an error. ERRNO-CODE is a symbolic
+ error code (e.g. `ENOENT'); if the server doesn't support this
+ feature, or if it's not appropriate for this particular message,
+ it just omits the errno-code (in that case there are two spaces
+ after `error'). Text is an error message such as that provided by
+ strerror(), or any other message the server wants to use. The
+ TEXT is like the `M' response, in the sense that it is not
+ particularly intended to be machine-parsed; servers may wish to
+ print an error message with `MT' responses, and then issue a
+ `error' response without TEXT (although it should be noted that
+ `MT' currently has no way of flagging the output as intended for
+ standard error, the way that the `E' response does).
+
+`ok \n'
+ The command completed successfully.
+
+
+File: cvsclient.info, Node: Text tags, Next: Example, Prev: Responses, Up: Protocol
+
+5.12 Tags for the MT tagged text response
+=========================================
+
+The `MT' response, as described in *Note Responses::, offers a way for
+the server to send tagged text to the client. This section describes
+specific tags. The intention is to update this section as servers add
+new tags.
+
+ In the following descriptions, `text' and `newline' tags are
+omitted. Such tags contain information which is intended for users (or
+to be discarded), and are subject to change at the whim of the server.
+To avoid being vulnerable to such whim, clients should look for the tags
+listed here, not `text', `newline', or other tags.
+
+ The following tag means to indicate to the user that a file has been
+updated. It is more or less redundant with the `Created' and
+`Update-existing' responses, but we don't try to specify here whether
+it occurs in exactly the same circumstances as `Created' and
+`Update-existing'. The NAME is the pathname of the file being updated
+relative to the directory in which the command is occurring (that is,
+the last `Directory' request which is sent before the command).
+
+ MT +updated
+ MT fname NAME
+ MT -updated
+
+ The `importmergecmd' tag is used when doing an import which has
+conflicts, or when doing an import with the `-X' flag. The client can
+use it to report how to merge in the newly imported changes. The COUNT
+is the number of conflicts, or the string `No' if no conflicts
+occurred. (The latter will only be sent for imports run with the `-X'
+flag.) The newly imported changes can be merged by running the
+following command:
+ cvs checkout -j TAG1 -j TAG2 REPOSITORY
+
+ MT +importmergecmd
+ MT conflicts COUNT
+ MT mergetag1 TAG1
+ MT mergetag2 TAG2
+ MT repository REPOSITORY
+ MT -importmergecmd
+
+
+File: cvsclient.info, Node: Example, Next: Requirements, Prev: Text tags, Up: Protocol
+
+5.13 Example
+============
+
+Here is an example; lines are prefixed by `C: ' to indicate the client
+sends them or `S: ' to indicate the server sends them.
+
+ The client starts by connecting, sending the root, and completing the
+protocol negotiation. In actual practice the lists of valid responses
+and requests would be longer.
+
+ C: Root /u/cvsroot
+ C: Valid-responses ok error Checked-in M E
+ C: valid-requests
+ S: Valid-requests Root Directory Entry Modified Argument Argumentx ci co
+ S: ok
+ C: UseUnchanged
+
+ The client wants to check out the `supermunger' module into a fresh
+working directory. Therefore it first expands the `supermunger'
+module; this step would be omitted if the client was operating on a
+directory rather than a module.
+
+ C: Argument supermunger
+ C: Directory .
+ C: .
+ C: expand-modules
+
+ The server replies that the `supermunger' module expands to the
+directory `supermunger' (the simplest case):
+
+ S: Module-expansion supermunger
+ S: ok
+
+ The client then proceeds to check out the directory. The fact that
+it sends only a single `Directory' request which specifies `.' for the
+working directory means that there is not already a `supermunger'
+directory on the client.
+
+ C: Argument -N
+ C: Argument supermunger
+ C: Directory .
+ C: .
+ C: co
+
+ The server replies with the requested files. In this example, there
+is only one file, `mungeall.c'. The `Clear-sticky' and
+`Clear-static-directory' requests are sent by the current
+implementation but they have no effect because the default is for those
+settings to be clear when a directory is newly created.
+
+ S: Clear-sticky supermunger/
+ S: /u/cvsroot/supermunger/
+ S: Clear-static-directory supermunger/
+ S: /u/cvsroot/supermunger/
+ S: E cvs server: Updating supermunger
+ S: M U supermunger/mungeall.c
+ S: Created supermunger/
+ S: /u/cvsroot/supermunger/mungeall.c
+ S: /mungeall.c/1.1///
+ S: u=rw,g=r,o=r
+ S: 26
+ S: int mein () { abort (); }
+ S: ok
+
+ The current client implementation would break the connection here
+and make a new connection for the next command. However, the protocol
+allows it to keep the connection open and continue, which is what we
+show here.
+
+ After the user modifies the file and instructs the client to check it
+back in. The client sends arguments to specify the log message and file
+to check in:
+
+ C: Argument -m
+ C: Argument Well, you see, it took me hours and hours to find
+ C: Argumentx this typo and I searched and searched and eventually
+ C: Argumentx had to ask John for help.
+ C: Argument mungeall.c
+
+ It also sends information about the contents of the working
+directory, including the new contents of the modified file. Note that
+the user has changed into the `supermunger' directory before executing
+this command; the top level directory is a user-visible concept because
+the server should print filenames in `M' and `E' responses relative to
+that directory.
+
+ C: Directory .
+ C: supermunger
+ C: Entry /mungeall.c/1.1///
+ C: Modified mungeall.c
+ C: u=rw,g=r,o=r
+ C: 26
+ C: int main () { abort (); }
+
+ And finally, the client issues the checkin command (which makes use
+of the data just sent):
+
+ C: ci
+
+ And the server tells the client that the checkin succeeded:
+
+ S: M Checking in mungeall.c;
+ S: E /u/cvsroot/supermunger/mungeall.c,v <-- mungeall.c
+ S: E new revision: 1.2; previous revision: 1.1
+ S: E done
+ S: Mode u=rw,g=r,o=r
+ S: Checked-in ./
+ S: /u/cvsroot/supermunger/mungeall.c
+ S: /mungeall.c/1.2///
+ S: ok
+
+
+File: cvsclient.info, Node: Requirements, Next: Obsolete, Prev: Example, Up: Protocol
+
+5.14 Required versus optional parts of the protocol
+===================================================
+
+The following are part of every known implementation of the CVS protocol
+(except obsolete, pre-1.5, versions of CVS) and it is considered
+reasonable behavior to completely fail to work if you are connected with
+an implementation which attempts to not support them. Requests:
+`Root', `Valid-responses', `valid-requests', `Directory', `Entry',
+`Modified', `Unchanged', `Argument', `Argumentx', `ci', `co', `update'.
+Responses: `ok', `error', `Valid-requests', `Checked-in', `Updated',
+`Merged', `Removed', `M', `E'.
+
+ A server need not implement `Repository', but in order to
+interoperate with CVS 1.5 through 1.9 it must claim to implement it (in
+`Valid-requests'). The client will not actually send the request.
+
+
+File: cvsclient.info, Node: Obsolete, Prev: Requirements, Up: Protocol
+
+5.15 Obsolete protocol elements
+===============================
+
+This section briefly describes protocol elements which are obsolete.
+There is no attempt to document them in full detail.
+
+ There was a `Repository' request which was like `Directory' except
+it only provided REPOSITORY, and the local directory was assumed to be
+similarly named.
+
+ If the `UseUnchanged' request was not sent, there was a `Lost'
+request which was sent to indicate that a file did not exist in the
+working directory, and the meaning of sending `Entries' without `Lost'
+or `Modified' was different. All current clients (CVS 1.5 and later)
+will send `UseUnchanged' if it is supported.
+
+
+File: cvsclient.info, Node: Protocol Notes, Prev: Protocol, Up: Top
+
+6 Notes on the Protocol
+***********************
+
+A number of enhancements are possible. Also see the file TODO in the
+CVS source distribution, which has further ideas concerning various
+aspects of CVS, some of which impact the protocol. Similarly, the
+`http://www.nongnu.org/cvs/' site, in particular the `Development'
+pages.
+
+ * The `Modified' request could be speeded up by sending diffs rather
+ than entire files. The client would need some way to keep the
+ version of the file which was originally checked out; probably
+ requiring the use of "cvs edit" in this case is the most sensible
+ course (the "cvs edit" could be handled by a package like VC for
+ emacs). This would also allow local operation of `cvs diff'
+ without arguments.
+
+ * The fact that `pserver' requires an extra network turnaround in
+ order to perform authentication would be nice to avoid. This
+ relates to the issue of reporting errors; probably the clean
+ solution is to defer the error until the client has issued a
+ request which expects a response. To some extent this might
+ relate to the next item (in terms of how easy it is to skip a
+ whole bunch of requests until we get to one that expects a
+ response). I know that the kerberos code doesn't wait in this
+ fashion, but that probably can cause network deadlocks and perhaps
+ future problems running over a transport which is more transaction
+ oriented than TCP. On the other hand I'm not sure it is wise to
+ make the client conduct a lengthy upload only to find there is an
+ authentication failure.
+
+ * The protocol uses an extra network turnaround for protocol
+ negotiation (`valid-requests'). It might be nice to avoid this by
+ having the client be able to send requests and tell the server to
+ ignore them if they are unrecognized (different requests could
+ produce a fatal error if unrecognized). To do this there should
+ be a standard syntax for requests. For example, perhaps all
+ future requests should be a single line, with mechanisms analogous
+ to `Argumentx', or several requests working together, to provide
+ greater amounts of information. Or there might be a standard
+ mechanism for counted data (analogous to that used by `Modified')
+ or continuation lines (like a generalized `Argumentx'). It would
+ be useful to compare what HTTP is planning in this area; last I
+ looked they were contemplating something called Protocol Extension
+ Protocol but I haven't looked at the relevant IETF documents in
+ any detail. Obviously, we want something as simple as possible
+ (but no simpler).
+
+ * The scrambling algorithm in the CVS client and server actually
+ support more characters than those documented in *Note Password
+ scrambling::. Someday we are going to either have to document
+ them all (but this is not as easy as it may look, see below), or
+ (gradually and with adequate process) phase out the support for
+ other characters in the CVS implementation. This business of
+ having the feature partly undocumented isn't a desirable state
+ long-term.
+
+ The problem with documenting other characters is that unless we
+ know what character set is in use, there is no way to make a
+ password portable from one system to another. For example, a with
+ a circle on top might have different encodings in different
+ character sets.
+
+ It _almost_ works to say that the client picks an arbitrary,
+ unknown character set (indeed, having the CVS client know what
+ character set the user has in mind is a hard problem otherwise),
+ and scrambles according to a certain octet<->octet mapping. There
+ are two problems with this. One is that the protocol has no way
+ to transmit character 10 decimal (linefeed), and the current
+ server and clients have no way to handle 0 decimal (NUL). This
+ may cause problems with certain multibyte character sets, in which
+ octets 10 and 0 will appear in the middle of other characters.
+ The other problem, which is more minor and possibly not worth
+ worrying about, is that someone can type a password on one system
+ and then go to another system which uses a different encoding for
+ the same characters, and have their password not work.
+
+ The restriction to the ISO646 invariant subset is the best
+ approach for strings which are not particularly significant to
+ users. Passwords are visible enough that this is somewhat
+ doubtful as applied here. ISO646 does, however, have the virtue
+ (!?) of offending everyone. It is easy to say "But the $ is right
+ on people's keyboards! Surely we can't forbid that". From a
+ human factors point of view, that makes quite a bit of sense. The
+ contrary argument, of course, is that a with a circle on top, or
+ some of the characters poorly handled by Unicode, are on
+ _someone_'s keyboard.
+
+
+
+
+Tag Table:
+Node: Top212
+Node: Introduction1031
+Node: Goals3567
+Node: Connection and Authentication6487
+Node: Password scrambling12726
+Node: Protocol14594
+Node: Entries Lines16680
+Node: File Modes17787
+Node: Filenames19330
+Node: File transmissions20642
+Node: Strings22205
+Node: Dates22893
+Node: Request intro23962
+Node: Requests24987
+Node: Response intro63870
+Node: Response pathnames65242
+Node: Responses67427
+Node: Text tags84766
+Node: Example86644
+Node: Requirements90401
+Node: Obsolete91316
+Node: Protocol Notes92061
+
+End Tag Table