1The "TODO" file! -*-Indented-Text-*- 2 322. Catch signals for cleanup when "add"ing files. 4 524. Insist on a log message. 6 (If done, this should be configurable via commitinfo or some new 7 config file -kingdon, Jun 1995). 8 930. Add "rdiff" program option to the modules database (and "diff" 10too?). (perhaps should think a little harder about what this is 11trying to accomplish and what the best way is -kingdon, Jul 1997). 12 1331. Think hard about ^C recovery. 14 One particular issue: RCS removes the ,foo.c, file on ^C and CVS 15 doesn't. 16 1738. Think hard about using RCS state information to allow one to checkin 18 a new vendor release without having it be accessed until it has been 19 integrated into the local changes. 20 2139. Think about a version of "cvs update -j" which remembers what from 22 that other branch is already merged. This has pitfalls--it could 23 easily lead to invisible state which could confuse users very 24 rapidly--but having to create a tag or some such mechanism to keep 25 track of what has been merged is a pain. Take a look at PRCS 1.2. 26 PRCS 1.0 was particularly bad the way it handled the "invisible 27 state", but 1.2 is significantly better. 28 2945. Consider enhancing the "rdiff" and "tag" (rtag??) command support in 30 the module database -- they seem hard to use since these commands 31 deal directly with the RCS ,v files. 32 3349. cvs xxx commands should be able to deal with files in other 34 directories. I want to do a cvs add foo/bar.c. 35 [[ most commands now use the generic recursion processor, but not all; 36 this note is left here to remind me to fix the others ]] 37 3852. SCCS has a feature that I would *love* to see in CVS, as it is very 39 useful. One may make a private copy of SCCS suid to a particular user, 40 so other users in the authentication list may check files in and out of 41 a project directory without mucking about with groups. Is there any 42 plan to provide a similar functionality to CVS? Our site (and, I'd 43 imagine, many other sites with large user bases) has decided against 44 having the user-groups feature of unix available to the users, due to 45 perceived administrative, technical and performance headaches. A tool 46 such as CVS with features that provide group-like functionality would 47 be a huge help. 48 4962. Consider using revision controlled files and directories to handle the 50 new module format -- consider a cvs command front-end to 51 add/delete/modify module contents, maybe. 52 5363. The "import" and vendor support commands (co -j) need to be documented 54 better. 55 5666. Length of the CVS temporary files must be limited to 14 characters for 57 System-V stupid support. As well as the length on the CVS.adm files. 58 5972. Consider re-design of the module -o, -i, -t options to use the file 60 system more intuitively. 61 6273. Consider an option (in .cvsrc?) to automatically add files that are new 63 and specified to commit. 64 6579. Might be nice to have some sort of interface to Sun's Translucent 66 (?) File System and tagged revisions. 67 6882. Maybe the import stuff should allow an arbitrary revision to be 69 specified. 70 7184. Improve the documentation about administration of the repository and 72 how to add/remove files and the use of symbolic links. 73 7485. Make symbolic links a valid thing to put under version control. 75 Perhaps use one of the tag fields in the RCS file? Note that we 76 can only support symlinks that are relative and within the scope of 77 the sources being controlled. 78 7992. Look into this: 80 After a bit of soul searching via dbx, I realized my sin was that I'd 81 specified "echo" as the program to call from loginfo. The commit 82 procedure worked fine till it hit my echo, then silently aborted 83 leaving the lockfiles intact. Since I needn't use the loginfo 84 facility, I simply removed those commands and it all works. 85 8693. Need to think hard about release and development environments. Think 87 about execsets as well. 88 8998. If diff3 bombs out (too many differences) cvs then thinks that the file 90 has been updated and is OK to be commited even though the file 91 has not yet been merged. 92 93100. Checked out files should have revision control support. Maybe. 94 95102. Perhaps directory modes should be propagated on all import check-ins. 96 Not necessarily uid/gid changes. 97 98103. setuid/setgid on files is suspect. 99 100104. cvs should recover nicely on unreadable files/directories. 101 102105. cvs should have administrative tools to allow for changing permissions 103 and modes and what not. In particular, this would make cvs a 104 more attractive alternative to rdist. 105 106107. It should be possible to specify a list of symbolic revisions to 107 checkout such that the list is processed in reverse order looking for 108 matches within the RCS file for the symbolic revision. If there is 109 not a match, the next symbolic rev on the list is checked, and so on, 110 until all symbolic revs are exhausted. This would allow one to, say, 111 checkout "4.0" + "4.0.3" + "4.0.3Patch1" + "4.0.3Patch2" to get the 112 most recent 4.x stuff. This is usually handled by just specifying the 113 right release_tag, but most people forget to do this. 114 115108. If someone creates a whole new directory (i.e. adds it to the cvs 116 repository) and you happen to have a directory in your source farm by 117 the same name, when you do your cvs update -d it SILENTLY does 118 *nothing* to that directory. At least, I think it was silent; 119 certainly, it did *not* abort my cvs update, as it would have if the 120 same thing had happened with a file instead of a directory. 121 122109. I had gotten pieces of the sys directory in the past but not a 123 complete tree. I just did something like: 124 125 cvs get * 126 127 Where sys was in * and got the message 128 129 cvs get: Executing 'sys/tools/make_links sys' 130 sh: sys/tools/make_links: not found 131 132 I suspect this is because I didn't have the file in question, 133 but I do not understand how I could fool it into getting an 134 error. I think a later cvs get sys seemed to work so perhaps 135 something is amiss in handling multiple arguments to cvs get? 136 137113. The "cvs update" command should tee its output to a log file in ".". 138 (why? What is wrong with piping stdout to "tee"? -kingdon, Jun 1995) 139 140119. When importing a directory tree that is under SCCS/RCS control, 141 consider an option to have import checkout the SCCS/RCS files if 142 necessary. (This is if someone wants to import something which 143 is in RCS or SCCS without preserving the history, but makes sure 144 they do get the latest versions. It isn't clear to me how useful 145 that is -kingdon, June 1996). 146 147122. If Name_Repository fails, it currently causes CVS to die completely. It 148 should instead return NULL and have the caller do something reasonable 149 (??? -what is reasonable? I'm not sure there is a real problem here. 150 -kingdon, June 1996). 151 152123. Add a flag to import to not build vendor branches for local code. 153 (See `importb' tests in src/sanity.sh for more details). 154 155124. Anyway, I thought you might want to add something like the following 156 to the cvs man pages: 157 158 BUGS 159 The sum of the sizes of a module key and its contents are 160 limited. See ndbm(3). 161 162126. Do an analysis to see if CVS is forgetting to close file descriptors. 163 Especially when committing many files (more than the open file limit 164 for the particular UNIX). 165 166127. Look at *info files; they should all be quiet if the files are not 167 there. Should be able to point at a RCS directory and go. 168 169130. cvs diff with no -r arguments does not need to look up the current RCS 170 version number since it only cares about what's in the Entries file. 171 This should make it much faster. 172 173 It should ParseEntries itself and access the entries list much like 174 Version_TS does (sticky tags and sticky options may need to be 175 supported here as well). Then it should only diff the things that 176 have the wrong time stamp (the ones that look modified). 177 178134. Make a statement about using hard NFS mounts to your source 179 repository. Look into checking NULL fgets() returns with ferror() to 180 see if an error had occurred. (we should be checking for errors, quite 181 aside from NFS issues -kingdon, June 1996). 182 183137. Some sites might want CVS to fsync() the RCS ,v file to protect 184 against nasty hardware errors. There is a slight performance hit with 185 doing so, though, so it should be configurable in the .cvsrc file. 186 Also, along with this, we should look at the places where CVS itself 187 could be a little more synchronous so as not to lose data. 188 [[ I've done some of this, but it could use much more ]] 189 190138. Some people have suggested that CVS use a VPATH-like environment 191 variable to limit the amount of sources that need to be duplicated for 192 sites with giant source trees and no disk space. 193 194141. Import should accept modules as its directory argument. If we're 195 going to implement this, we should think hard about how modules 196 might be expanded and how to handle those cases. 197 198143. Update the documentation to show that the source repository is 199 something far away from the files that you work on. (People who 200 come from an RCS background are used to their `repository' being 201 _very_ close to their working directory.) 202 203144. Have cvs checkout look for the environment variable CVSPREFIX 204 (or CVSMODPREFIX or some such). If it's set, then when looking 205 up an alias in the modules database, first look it up with the 206 value of CVSPREFIX attached, and then look for the alias itself. 207 This would be useful when you have several projects in a single 208 repository. You could have aliases abc_src and xyz_src and 209 tell people working on project abc to put "setenv CVSPREFIX abc_" 210 in their .cshrc file (or equivalent for other shells). 211 Then they could do "cvs co src" to get a copy of their src 212 directory, not xyz's. (This should create a directory called 213 src, not abc_src.) 214 215145. After you create revision 1.1.1.1 in the previous scenario, if 216 you do "cvs update -r1 filename" you get revision 1.1, not 217 1.1.1.1. It would be nice to get the later revision. Again, 218 this restriction comes from RCS and is probably hard to 219 change in CVS. Sigh. 220 221 |"cvs update -r1 filename" does not tell RCS to follow any branches. CVS 222 |tries to be consistent with RCS in this fashion, so I would not change 223 |this. Within CVS we do have the flexibility of extending things, like 224 |making a revision of the form "-r1HEAD" find the most recent revision 225 |(branch or not) with a "1." prefix in the RCS file. This would get what 226 |you want maybe. 227 228 This would be very useful. Though I would prefer an option 229 such as "-v1" rather than "-r1HEAD". This option might be 230 used quite often. 231 232146. The merging of files should be controlled via a hook so that programs 233 other than "rcsmerge" can be used, like Sun's filemerge or emacs's 234 emerge.el. (but be careful in making this work client/server--it means 235 doing the interactive merging at the end after the server is done). 236 (probably best is to have CVS do the non-interactive part and 237 tell the user about where the files are (.#foo.c.working and 238 .#foo.c.1.5 or whatever), so they can do the interactive part at 239 that point -kingdon, June 1996). 240 241149. Maybe there should be an option to cvs admin that allows a user to 242 change the Repository/Root file with some degree of error checking? 243 Something like "cvs admin reposmv /old/path /new/pretty/path". Before 244 it does the replace it check to see that the files 245 /new/pretty/path/<dir>/<files> exist. 246 247 The obvious cases are where one moves the repository to another 248 machine or directory. But there are other cases, like where the 249 user might want to change from :pserver: to :ext:, use a different 250 server (if there are two server machines which share the 251 repository using a networked file system), etc. 252 253 The status quo is a bit of a mess (as of, say, CVS 1.9). It is 254 that the -d global option has two moderately different uses. One 255 is to use a totally different repository (in which case we'd 256 probably want to give an error if it disagreed with CVS/Root, as 257 CVS 1.8 and earlier did). The other is the "reposmv" 258 functionality above (in which the two repositories really are the 259 same, and we want to update the CVS/Root files). In CVS 1.9 and 260 1.10, -d rewrites the CVS/Root file (but not in subdirectories). 261 This behavior was not particularly popular and has been since 262 reverted. 263 264 Note also RELATIVE_REPOS in options.h; it needs to be set for 265 changing CVS/Root (not CVS/Repository) to be sufficient in the 266 case where the directory has changed. 267 268 This whole area is a rather bad pile of individual decisions which 269 accumulated over time, some of them probably bad decisions with 270 hindsight. But we didn't get into this mess overnight, and we're 271 not going to get out of it overnight (that is, we need to come up 272 with a replacement behavior, document what parts of the status 273 quo are deprecated, probably circulate some unofficial patches, &c). 274 275 (this item originally added 2 Feb 1992 but revised since). 276 277150. I have a customer request for a way to specify log message per 278 file, non-interactively before the commit, such that a single, fully 279 recursive commit prompts for one commit message, and concatenates the 280 per file messages for each file. In short, one commit, one editor 281 session, log messages allowed to vary across files within the commit. 282 Also, the per file messages should be allowed to be written when the 283 files are changed, which may predate the commit considerably. 284 285 A new command seems appropriate for this. The state can be saved in the 286 CVS directory. I.e., 287 288 % cvs message foo.c 289 Enter log message for foo.c 290 >> fixed an uninitialized variable 291 >> ^D 292 293 The text is saved as CVS/foo.c,m (or some such name) and commit 294 is modified to append (prepend?) the text (if found) to the log 295 message specified at commit time. Easy enough. (having cvs 296 commit be non-interactive takes care of various issues like 297 whether to connect to the server before or after prompting for a 298 message (see comment in commit.c at call to start_server). Also 299 would clean up the kludge for what to do with the message from 300 do_editor if the up-to-date check fails (see commit.c client code). 301 302 I'm not sure about the part above about having commit prompt 303 for an overall message--part of the point is having commit 304 non-interactive and somehow combining messages seems like (excess?) 305 hair. 306 307 Would be nice to do this so it allows users more flexibility in 308 specifying messages per-directory ("cvs message -l") or per-tree 309 ("cvs message") or per-file ("cvs message foo.c"), and fixes the 310 incompatibility between client/server (per-tree) and 311 non-client/server (per-directory). 312 313 A few interesting issues with this: (1) if you do a cvs update or 314 some other operation which changes the working directory, do you 315 need to run "cvs message" again (it would, of course, bring up 316 the old message which you could accept)? Probably yes, after all 317 merging in some conflicts might change the situation. (2) How do 318 you change the stored messages if you change your mind before the 319 commit (probably run "cvs message" again, as hinted in (1))? 320 321151. Also, is there a flag I am missing that allows replacing Ulrtx_Build 322 by Ultrix_build? I.E. I would like a tag replacement to be a one step 323 operation rather than a two step "cvs rtag -r Ulrtx_Build Ultrix_Build" 324 followed by "cvs rtag -d Ulrtx_Build" 325 326152. The "cvs -n" option does not work as one would expect for all the 327 commands. In particular, for "commit" and "import", where one would 328 also like to see what it would do, without actually doing anything. 329 330153. There should be some command (maybe I just haven't figured out 331 which one...) to import a source directory which is already 332 RCS-administered without losing all prior RCS gathered data. 333 Thus, it would have to examine the RCS files and choose a 334 starting version and branch higher than previous ones used. 335 (Check out rcs-to-cvs and see if it addresses this issue.) 336 337154. When committing the modules file, a pre-commit check should be done to 338 verify the validity of the new modules file before allowing it to be 339 committed. 340 341155. The options for "cvs history" are mutually exclusive, even though 342 useful queries can be done if they are not, as in specifying both 343 a module and a tag. A workaround is to specify the module, then 344 run the output through grep to only display lines that begin with 345 T, which are tag lines. (Better perhaps if we redesign the whole 346 "history" business -- check out doc/cvs.texinfo for the entire 347 rant.) 348 349156. Also, how hard would it be to allow continuation lines in the 350 {commit,rcs,log}info files? It would probably be useful with all of 351 the various flags that are now available, or if somebody has a lot of 352 files to put into a module. 353 354158. If I do a recursive commit and find that the same RCS file is checked 355 out (and modified!) in two different places within my checked-out 356 files (but within the realm of a single "commit"), CVS will commit the 357 first change, then overwrite that change with the second change. We 358 should catch this (typically unusual) case and issue an appropriate 359 diagnostic and die. 360 361160. The checks that the commit command does should be extended to make 362 sure that the revision that we will lock is not already locked by 363 someone else. Maybe it should also lock the new revision if the old 364 revision was already locked by the user as well, thus moving the lock 365 forward after the commit. 366 367163. The rtag/tag commands should have an option that removes the specified 368 tag from any file that is in the attic. This allows one to re-use a 369 tag (like "Mon", "Tue", ...) all the time and still have it tag the 370 real main-line code. 371 372165. The "import" command will create RCS files automatically, but will 373 screw-up when trying to create long file names on short file name 374 file systems. Perhaps import should be a bit more cautious. 375 376166. There really needs to be a "Getting Started" document which describes 377 some of the new CVS philosophies. Folks coming straight from SCCS or 378 RCS might be confused by "cvs import". Also need to explain: 379 - How one might setup their $CVSROOT 380 - What all the tags mean in an "import" command 381 - Tags are important; revision numbers are not 382 383170. Is there an "info" file that can be invoked when a file is checked out, or 384 updated ? What I want to do is to advise users, particularly novices, of 385 the state of their working source whenever they check something out, as 386 a sanity check. 387 388 For example, I've written a perl script which tells you what branch you're 389 on, if any. Hopefully this will help guard against mistaken checkins to 390 the trunk, or to the wrong branch. I suppose I can do this in 391 "commitinfo", but it'd be nice to advise people before they edit their 392 files. 393 394 It would also be nice if there was some sort of "verboseness" switch to 395 the checkout and update commands that could turn this invocation of the 396 script off, for mature users. 397 398173. We have a tagged branch in CVS. How do we get the version of that branch 399 (for an entire directory) that corresponds to the files on that branch on a 400 certain day? I'd like to specify BOTH -r and -D to 'cvs checkout', but I 401 can't. It looks like I can only specify the date for the main line (as 402 opposed to any branches). True? Any workarounds to get what I need? 403 404174. I would like to see "cvs release" modified so that it only removes files 405 which are known to CVS - all the files in the repository, plus those which 406 are listed in .cvsignore. This way, if you do leave something valuable in 407 a source tree you can "cvs release -d" the tree and your non-CVS goodies 408 are still there. If a user is going to leave non-CVS files in their source 409 trees, they really should have to clean them up by hand. 410 411175. And, in the feature request department, I'd dearly love a command-line 412 interface to adding a new module to the CVSROOT/modules file. 413 414176. If you use the -i flag in the modules file, you can control access 415 to source code; this is a Good Thing under certain circumstances. I 416 just had a nasty thought, and on experiment discovered that the 417 filter specified by -i is _not_ run before a cvs admin command; as 418 this allows a user to go behind cvs's back and delete information 419 (cvs admin -o1.4 file) this seems like a serious problem. 420 421177. We've got some external vendor source that sits under a source code 422 hierarchy, and when we do a cvs update, it gets wiped out because 423 its tag is different from the "main" distribution. I've tried to 424 use "-I" to ignore the directory, as well as .cvsignore, but this 425 doesn't work. 426 427179. "cvs admin" does not log its actions with loginfo, nor does it check 428 whether the action is allowed with commitinfo. It should. 429 430180. "cvs edit" should show you who is already editing the files, 431 probably (that is, do "cvs editors" before executing, or some 432 similar result). (But watch out for what happens if the network 433 is down!). 434 435182. There should be a way to show log entries corresponding to 436changes from tag "foo" to tag "bar". "cvs log -rfoo:bar" doesn't cut 437it, because it erroneously shows the changes associated with the 438change from the revision before foo to foo. I'm not sure that is ever 439a useful or logical behavior ("cvs diff -r foo -r bar" gets this 440right), but is compatibility an issue? See 441http://www.cyclic.com/cvs/unoff-log.txt for an unofficial patch. 442 443183. "cvs status" should report on Entries.Static flag and CVS/Tag (how? 444maybe a "cvs status -d" to give directory status?). There should also 445be more documentation of how these get set and how/when to re-set them. 446 447184. Would be nice to implement the FreeBSD MD5-based password hash 448algorithm in pserver. For more info see "6.1. DES, MD5, and Crypt" in 449the FreeBSD Handbook, and src/lib/libcrypt/crypt.c in the FreeBSD 450sources. Certainly in the context of non-unix servers this algorithm 451makes more sense than the traditional unix crypt() algorithm, which 452suffers from export control problems. 453 454185. A frequent complaint is that keyword expansion causes conflicts 455when merging from one branch to another. The first step is 456documenting CVS's existing features in this area--what happens with 457various -k options in various places? The second step is thinking 458about whether there should be some new feature and if so how it should 459be designed. For example, here is one thought: 460 461 rcs' co command needs a new -k option. The new option should expand 462 $Log entries without expanding $Revision entries. This would 463 allow cvs to use rcsmerge in such a way that joining branches into 464 main lines would neither generate extra collisions on revisions nor 465 drop log lines. 466 467The details of this are out of date (CVS no longer invokes "co", and 468any changes in this area would be done by bypassing RCS rather than 469modifying it), but even as to the general idea, I don't have a clear 470idea about whether it would be good (see what I mean about the need 471for better documentation? I work on CVS full-time, and even I don't 472understand the state of the art on this subject). 473 474186. There is a frequent discussion of multisite features. 475 476* There may be some overlap with the client/server CVS, which is good 477especially when there is a single developer at each location. But by 478"multisite" I mean something in which each site is more autonomous, to 479one extent or another. 480 481* Vendor branches are the closest thing that CVS currently has for 482multisite features. They have fixable drawbacks (such as poor 483handling of added and removed files), and more fundamental drawbacks 484(when you import a vendor branch, you are importing a set of files, 485not importing any knowledge of their version history outside the 486current repository). 487 488* One approach would be to require checkins (or other modifications to 489the repository) to succeed at a write quorum of sites (51%) before 490they are allowed to complete. To work well, the network should be 491reliable enough that one can typically get to that many sites. When a 492server which has been out of touch reconnects, it would want to update 493its data before doing anything else. Any of the servers can service 494all requests locally, except perhaps for a check that they are 495up-to-date. The way this differs from a run-of-the-mill distributed 496database is that if one only allows reversible operations via this 497mechanism (exclude "cvs admin -o", "cvs tag -d", &c), then each site 498can back up the others, such that failures at one site, including 499something like deleting all the sources, can be recovered from. Thus 500the sites need not trust each other as much as for many shared 501databases, and the system may be resilient to many types of 502organizational failures. Sometimes I call this design the 503"CVScluster" design. 504 505* Another approach is a master/slave one. Checkins happen at the 506master site, and slave sites need to check whether their local 507repository is up to date before relying on its information. 508 509* Another approach is to have each site own a particular branch. This 510one is the most tolerant of flaky networks; if checkins happen at each 511site independently there is no particular problem. The big question 512is whether merges happen only manually, as with existing CVS branches, 513or whether there is a feature whereby there are circumstances in which 514merges from one branch to the other happen automatically (for example, 515the case in which the branches have not diverged). This might be a 516legitimate question to ask even quite aside from multisite features. 517 518187. Might want to separate out usage error messages and help 519messages. The problem now is that if you specify an invalid option, 520for example, the error message is lost among all the help text. In 521the new regime, the error message would be followed by a one-line 522message directing people to the appropriate help option ("cvs -H 523<command>" or "cvs --help-commands" or whatever, according to the 524situation). I'm not sure whether this change would be controversial 525(as defined in HACKING), so there might be a need for further 526discussion or other actions other than just coding. 527 528188. Option parsing and .cvsrc has at least one notable limitation. 529If you want to set a global option only for some CVS commands, there 530is no way to do it (for example, if one wants to set -q only for 531"rdiff"). I am told that the "popt" package from RPM 532(http://www.rpm.org) could solve this and other problems (for example, 533if the syntax of option stuff in .cvsrc is similar to RPM, that would 534be great from a user point of view). It would at least be worth a 535look (it also provides a cleaner API than getopt_long). 536 537Another issue which may or may not be related is the issue of 538overriding .cvsrc from the command line. The cleanest solution might 539be to have options in mutually exclusive sets (-l/-R being a current 540example, but --foo/--no-foo is a better way to name such options). Or 541perhaps there is some better solution. 542 543189. Renaming files and directories is a frequently discussed topic. 544 545Some of the problems with the status quo: 546 547a. "cvs annotate" cannot operate on both the old and new files in a 548single run. You need to run it twice, once for the new name and once 549for the old name. 550 551b. "cvs diff" (or "cvs diff -N") shows a rename as a removal of the 552old file and an addition of the new one. Some people would like to 553see the differences between the file contents (but then how would we 554indicate the fact that the file has been renamed? Certainly the 555notion that "patch(1)" has of renames is as a removal and addition). 556 557c. "cvs log" should be able to show the changes between two 558tags/dates, even in the presence of adds/removes/renames (I'm not sure 559what the status quo is on this; see also item #182). 560 561d. Renaming directories is way too hard. 562 563Implementations: 564 565It is perhaps premature to try to design implementation details 566without answering some of the above questions about desired behaviors 567but several general implementations get mentioned. 568 569i. No fundamental changes (for example, a "cvs rename" command which 570operated on directories could still implement the current recommended 571practice for renaming directories, which is to rename each of the 572files contained therein via an add and a remove). One thing to note 573that the status quo gets right is proper merges, even with adds and 574removals (Well, mostly right at least. There are a *LOT* of different 575cases; see the testsuite for some of them). 576 577ii. Rename database. In this scheme the files in the repository 578would have some arbitrary name, and then a separate rename database 579would indicate the current correspondence between the filename in the 580working directory and the actual storage. As far as I know this has 581never been designed in detail for CVS. 582 583iii. A modest change in which the RCS files would contain some 584information such as "renamed from X" or "renamed to Y". That is, this 585would be generally similar to the log messages which are suggested 586when one renames via an add and a removal, but would be 587computer-parseable. I don't think anyone has tried to flesh out any 588details here either. 589 590It is interesting to note that in solution ii. version numbers in the 591"new file" start where the "old file" left off, while in solutions 592i. and iii., version numbers restart from 1.1 each time a file is 593renamed. Except perhaps in the case where we rename a file from foo 594to bar and then back to foo. I'll shut up now. 595 596Regardless of the method we choose, we need to address how renames 597affect existing CVS behaviors. For example, what happens when you 598rename a file on a branch but not the trunk and then try to merge the 599two? What happens when you rename a file on one branch and delete it 600on another and try to merge the two? 601 602Ideally, we'd come up with a way to parameterize the problem and 603simply write up a lookup table to determine the correct behavior. 604 605190. The meaning of the -q and -Q global options is very ad hoc; 606there is no clear definition of which messages are suppressed by them 607and which are not. Here is a classification of the current meanings 608of -q; I don't know whether anyone has done a similar investigation of 609-Q: 610 611 a. The "warm fuzzies" printed upon entering each directory (for 612 example, "cvs update: Updating sdir"). The need for these messages 613 may be decreased now that most of CVS uses ->fullname instead of 614 ->file in messages (a project which is *still* not 100% complete, 615 alas). However, the issue of whether CVS can offer status as it 616 runs is an important one. Of course from the command line it is 617 hard to do this well and one ends up with options like -q. But 618 think about emacs, jCVS, or other environments which could flash you 619 the latest status line so you can see whether the system is working 620 or stuck. 621 622 b. Other cases where the message just offers information (rather 623 than an error) and might be considered unnecessarily verbose. These 624 have a certain point to them, although it isn't really clear whether 625 it should be the same option as the warm fuzzies or whether it is 626 worth the conceptual hair: 627 628 add.c: scheduling %s `%s' for addition (may be an issue) 629 modules.c: %s %s: Executing '%s' (I can see how that might be noise, 630 but...) 631 remove.c: scheduling `%s' for removal (analogous to the add.c one) 632 update.c: Checking out %s (hmm, that message is a bit on the noisy side...) 633 (but the similar message in annotate is not affected by -q). 634 635 c. Suppressing various error messages. This is almost surely 636 bogus. 637 638 commit.c: failed to remove tag `%s' from `%s' (Questionable. 639 Rationale might be that we already printed another message 640 elsewhere but why would it be necessary to avoid 641 the extra message in such an uncommon case?) 642 commit.c: failed to commit dead revision for `%s' (likewise) 643 remove.c: file `%s' still in working directory (see below about rm 644 -f analogy) 645 remove.c: nothing known about `%s' (looks dubious to me, especially in 646 the case where the user specified it explicitly). 647 remove.c: removed `%s' (seems like an obscure enough case that I fail 648 to see the appeal of being cryptically concise here). 649 remove.c: file `%s' already scheduled for removal (now it is starting 650 to look analogous to the infamous rm -f option). 651 rtag.c: cannot find tag `%s' in `%s' (more rm -f like behavior) 652 rtag.c: failed to remove tag `%s' from `%s' (ditto) 653 tag.c: failed to remove tag %s from %s (see above about whether RCS_* 654 has already printed an error message). 655 tag.c: couldn't tag added but un-commited file `%s' (more rm -f 656 like behavior) 657 tag.c: skipping removed but un-commited file `%s' (ditto) 658 tag.c: cannot find revision control file for `%s' (ditto, but at first 659 glance seems even worse, as this would seem to be a "can't happen" 660 condition) 661 662191. Storing RCS files, especially binary files, takes rather more 663space than it could, typically. 664 - The virtue of the status quo is that it is simple to implement. 665 Of course it is also simplest in terms of dealing with compatibility. 666 - Just storing the revisions as separate gzipped files is a common 667 technique. It also is pretty simple (no new algorithms, CVS 668 already has zlib around). Of course for some files (such as files 669 which are already compressed) the gzip step won't help, but 670 something which can at least sometimes avoid rewriting the entire 671 RCS file for each new revision would, I would think, be a big 672 speedup for large files. 673 - Josh MacDonald has written a tool called xdelta which produces 674 differences (that is, sufficient information to transform the old 675 to the new) which looks for common sequences of bytes, like RCS 676 currently does, but which is not based on lines. This seems to do 677 quite well for some kinds of files (e.g. FrameMaker documents, 678 text files), and not as well for others (anything which is already 679 compressed, executables). xdelta 1.10 also is faster than GNU diff. 680 - Karl Fogel has thought some about using a difference technique 681 analogous to fractal compression (see the comp.compression FAQ for 682 more on fractal compression, including at least one patent to 683 watch for; I don't know how analogous Karl's ideas are to the 684 techniques described there). 685 - Quite possibly want some documented interface by which a site can 686 plug in their choice of external difference programs (with the 687 ability to choose the program based on filename, magic numbers, 688 or some such). 689 690192. "cvs update" using an absolute pathname does not work if the 691working directory is not a CVS-controlled directory with the correct 692CVSROOT. For example, the following will fail: 693 694 cd /tmp 695 cvs -d /repos co foo 696 cd / 697 cvs update /tmp/foo 698 699It is possible to read the CVSROOT from the administrative files in 700the directory specified by the absolute pathname argument to update. 701In that case, the last command above would be equivalent to: 702 703 cd /tmp/foo 704 cvs update . 705 706This can be problematic, however, if we ask CVS to update two 707directories with different CVSROOTs. Currently, CVS has no way of 708changing CVSROOT mid-stream. Consider the following: 709 710 cd /tmp 711 cvs -d /repos1 co foo 712 cvs -d /repos2 co bar 713 cd / 714 cvs update /tmp/foo /tmp/bar 715 716To make that example work, we need to think hard about: 717 718 - where and when CVSROOT-related variables get set 719 - who caches said variables for later use 720 - how the remote protocol should be extended to handle sending a new 721 repository mid-stream 722 - how the client should maintain connections to a variety of servers 723 in a single invocation. 724 725Because those issues are hairy, I suspect that having a change in 726CVSROOT be an error would be a better move. 727 728193. The client relies on timestamps to figure out whether a file is 729(maybe) modified. If something goes awry, then it ends up sending 730entire files to the server to be checked, and this can be quite slow 731especially over a slow network. A couple of things that can happen: 732(a) other programs, like make, use timestamps, so one ends up needing 733to do "touch foo" and otherwise messing with timestamps, (b) changing 734the timezone offset (e.g. summer vs. winter or moving a machine) 735should work on unix, but there may be problems with non-unix. 736 737Possible solutions: 738 739 a. Store a checksum for each file in CVS/Entries or some such 740 place. What to do about hash collisions is interesting: using a 741 checksum, like MD5, large enough to "never" have collisions 742 probably works in practice (of course, if there is a collision then 743 all hell breaks loose because that code path was not tested, but 744 given the tiny, tiny probability of that I suppose this is only an 745 aesthetic issue). 746 747 b. I'm not thinking of others, except storing the whole file in 748 CVS/Base, and I'm sure using twice the disk space would be 749 unpopular. 750 751194. CVS does not separate the "metadata" from the actual revision 752history; it stores them both in the RCS files. Metadata means tags 753and header information such as the number of the head revision. 754Storing the metadata separately could speed up "cvs tag" enormously, 755which is a big problem for large repositories. It could also probably 756make CVS's locking much less in the way (see comment in do_recursion 757about "two-pass design"). 758 759195. Many people using CVS over a slow link are interested in whether 760the remote protocol could be any more efficient with network 761bandwidth. This item is about one aspect of that--how the server 762sends a new version of a file the client has a different version of, 763or vice versa. 764 765a. Cases in which the status quo already sends a diff. For most text 766files, this is probably already close to optimal. For binary files, 767and anomalous (?) text files (e.g. those in which it would help to do 768moves, as well as adds and deletes), it might be worth looking into other 769difference algorithms (see item #191). 770 771b. Cases in which the status quo does not send a diff (e.g. "cvs 772commit"). 773 774b1. With some frequency, people suggest rsync or a similar algorithm 775(see ftp://samba.anu.edu.au/pub/rsync/). This could speed things up, 776and in some ways involves the most minimal changes to the default CVS 777paradigm. There are some downsides though: (1) there is an extra 778network turnaround, (2) the algorithm needs to transmit some data to 779discover what difference type programs can discover locally (although 780this is only about 1% of the size of the files). 781 782b2. If one is willing to require that users use "cvs edit" before 783editing a file on the client side (in some cases, a development 784environment like emacs can make this fairly easy), then the Modified 785request in the protocol could be extended to allow the client to just 786send differences instead of entire files. In the degenerate case 787(e.g. "cvs diff" without arguments) the required network traffic is 788reduced to zero, and the client need not even contact the server. 789 790196. Using a CVSROOT with a trailing slash will confuse CVS. I think 791we need to add a call to strip_trailing_slashes in root.c 792(parse_cvsroot), but I haven't considered all of the ramifications. 793 794197. Analyze the difference between CVS_UNLINK & unlink_file. As far as I 795can tell, unlink_file aborts in noexec mode and CVS_UNLINK does not. I'm not 796sure it would be possible to remove even the use of temp files in noexec mode, 797but most unlinks should probably be using unlink_file and not CVS_UNLINK. 798 799198. Remove references to deprecated cvs_temp_name function. 800 801199. Add test for login & logout functionality, including support for 802backwards compatibility with old CVSROOTs. 803 804200. Make a 'cvs add' without write access a non-fatal error so that the 805user's Entries file is updated and future 'cvs diffs' will work properly. This 806should ease patch submission. 807 808201. cvs_temp_file should be creating temporary files in a privately owned 809subdirectory of of temp due to security issues on some systems. 810 811** 812202. Merge most of the diff & rdiff code. Enable rdiff to accept most diff 813options. Make rdiff output look like diff's. Make diff garbage go to stderr 814and only standard diff output go to stdout. 815** In progress - DRP 816