1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
|
This is Info file cvsclient.info, produced by Makeinfo version 1.67
from the input file ../../work/ccvs/doc/cvsclient.texi.
File: cvsclient.info, Node: Response intro, Next: Response pathnames, Prev: Requests, Up: Protocol
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
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). For example, for a file `i386.mh' which is in
the local directory `gas.clean/config' and for which the repository is
`/rel/cvsfiles/devo/gas/config':
gas.clean/config/
/rel/cvsfiles/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
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.
`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'.
`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).
`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.
`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.
`ok \n'
The command completed successfully.
File: cvsclient.info, Node: Text tags, Next: Example, Prev: Responses, Up: Protocol
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
File: cvsclient.info, Node: Example, Next: Requirements, Prev: Text tags, Up: Protocol
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: /u/cvsroot
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: /u/cvsroot
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: /u/cvsroot/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
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
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
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.
* 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 current procedure for `cvs update' is highly sub-optimal if
there are many modified files. One possible alternative would be
to have the client send a first request without the contents of
every modified file, then have the server tell it what files it
needs. Note the server needs to do the what-needs-to-be-updated
check twice (or more, if changes in the repository mean it has to
ask the client for more files), because it can't keep locks open
while waiting for the network. Perhaps this whole thing is
irrelevant if there is a multisite capability (as noted in TODO),
and therefore the rcsmerge can be done with a repository which is
connected via a fast connection.
* 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.
|