12286d8edStholoThe "TODO" file! -*-Indented-Text-*- 22286d8edStholo 31e72d8d2Sderaadt22. Catch signals for cleanup when "add"ing files. 41e72d8d2Sderaadt 51e72d8d2Sderaadt24. Insist on a log message. 650bf276cStholo (If done, this should be configurable via commitinfo or some new 750bf276cStholo config file -kingdon, Jun 1995). 81e72d8d2Sderaadt 92286d8edStholo30. Add "rdiff" program option to the modules database (and "diff" 102286d8edStholotoo?). (perhaps should think a little harder about what this is 112286d8edStholotrying to accomplish and what the best way is -kingdon, Jul 1997). 121e72d8d2Sderaadt 131e72d8d2Sderaadt31. Think hard about ^C recovery. 14c71bc7e2Stholo One particular issue: RCS removes the ,foo.c, file on ^C and CVS 15c71bc7e2Stholo doesn't. 161e72d8d2Sderaadt 171e72d8d2Sderaadt38. Think hard about using RCS state information to allow one to checkin 181e72d8d2Sderaadt a new vendor release without having it be accessed until it has been 191e72d8d2Sderaadt integrated into the local changes. 201e72d8d2Sderaadt 2150bf276cStholo39. Think about a version of "cvs update -j" which remembers what from 2250bf276cStholo that other branch is already merged. This has pitfalls--it could 2350bf276cStholo easily lead to invisible state which could confuse users very 2450bf276cStholo rapidly--but having to create a tag or some such mechanism to keep 252286d8edStholo track of what has been merged is a pain. Take a look at PRCS 1.2. 262286d8edStholo PRCS 1.0 was particularly bad the way it handled the "invisible 272286d8edStholo state", but 1.2 is significantly better. 281e72d8d2Sderaadt 2950bf276cStholo45. Consider enhancing the "rdiff" and "tag" (rtag??) command support in 3050bf276cStholo the module database -- they seem hard to use since these commands 3150bf276cStholo deal directly with the RCS ,v files. 321e72d8d2Sderaadt 331e72d8d2Sderaadt49. cvs xxx commands should be able to deal with files in other 341e72d8d2Sderaadt directories. I want to do a cvs add foo/bar.c. 351e72d8d2Sderaadt [[ most commands now use the generic recursion processor, but not all; 361e72d8d2Sderaadt this note is left here to remind me to fix the others ]] 371e72d8d2Sderaadt 381e72d8d2Sderaadt52. SCCS has a feature that I would *love* to see in CVS, as it is very 391e72d8d2Sderaadt useful. One may make a private copy of SCCS suid to a particular user, 401e72d8d2Sderaadt so other users in the authentication list may check files in and out of 411e72d8d2Sderaadt a project directory without mucking about with groups. Is there any 421e72d8d2Sderaadt plan to provide a similar functionality to CVS? Our site (and, I'd 431e72d8d2Sderaadt imagine, many other sites with large user bases) has decided against 441e72d8d2Sderaadt having the user-groups feature of unix available to the users, due to 451e72d8d2Sderaadt perceived administrative, technical and performance headaches. A tool 461e72d8d2Sderaadt such as CVS with features that provide group-like functionality would 471e72d8d2Sderaadt be a huge help. 481e72d8d2Sderaadt 491e72d8d2Sderaadt62. Consider using revision controlled files and directories to handle the 501e72d8d2Sderaadt new module format -- consider a cvs command front-end to 511e72d8d2Sderaadt add/delete/modify module contents, maybe. 521e72d8d2Sderaadt 531e72d8d2Sderaadt63. The "import" and vendor support commands (co -j) need to be documented 541e72d8d2Sderaadt better. 551e72d8d2Sderaadt 561e72d8d2Sderaadt66. Length of the CVS temporary files must be limited to 14 characters for 5713571821Stholo System-V stupid support. As well as the length on the CVS.adm files. 581e72d8d2Sderaadt 591e72d8d2Sderaadt72. Consider re-design of the module -o, -i, -t options to use the file 601e72d8d2Sderaadt system more intuitively. 611e72d8d2Sderaadt 621e72d8d2Sderaadt73. Consider an option (in .cvsrc?) to automatically add files that are new 631e72d8d2Sderaadt and specified to commit. 641e72d8d2Sderaadt 652286d8edStholo79. Might be nice to have some sort of interface to Sun's Translucent 662286d8edStholo (?) File System and tagged revisions. 671e72d8d2Sderaadt 681e72d8d2Sderaadt82. Maybe the import stuff should allow an arbitrary revision to be 691e72d8d2Sderaadt specified. 701e72d8d2Sderaadt 711e72d8d2Sderaadt84. Improve the documentation about administration of the repository and 721e72d8d2Sderaadt how to add/remove files and the use of symbolic links. 731e72d8d2Sderaadt 742286d8edStholo85. Make symbolic links a valid thing to put under version control. 752286d8edStholo Perhaps use one of the tag fields in the RCS file? Note that we 762286d8edStholo can only support symlinks that are relative and within the scope of 772286d8edStholo the sources being controlled. 781e72d8d2Sderaadt 791e72d8d2Sderaadt92. Look into this: 801e72d8d2Sderaadt After a bit of soul searching via dbx, I realized my sin was that I'd 811e72d8d2Sderaadt specified "echo" as the program to call from loginfo. The commit 821e72d8d2Sderaadt procedure worked fine till it hit my echo, then silently aborted 831e72d8d2Sderaadt leaving the lockfiles intact. Since I needn't use the loginfo 841e72d8d2Sderaadt facility, I simply removed those commands and it all works. 851e72d8d2Sderaadt 861e72d8d2Sderaadt93. Need to think hard about release and development environments. Think 871e72d8d2Sderaadt about execsets as well. 881e72d8d2Sderaadt 891e72d8d2Sderaadt98. If diff3 bombs out (too many differences) cvs then thinks that the file 901e72d8d2Sderaadt has been updated and is OK to be commited even though the file 911e72d8d2Sderaadt has not yet been merged. 921e72d8d2Sderaadt 931e72d8d2Sderaadt100. Checked out files should have revision control support. Maybe. 941e72d8d2Sderaadt 951e72d8d2Sderaadt102. Perhaps directory modes should be propagated on all import check-ins. 961e72d8d2Sderaadt Not necessarily uid/gid changes. 971e72d8d2Sderaadt 981e72d8d2Sderaadt103. setuid/setgid on files is suspect. 991e72d8d2Sderaadt 1001e72d8d2Sderaadt104. cvs should recover nicely on unreadable files/directories. 1011e72d8d2Sderaadt 1021e72d8d2Sderaadt105. cvs should have administrative tools to allow for changing permissions 1031e72d8d2Sderaadt and modes and what not. In particular, this would make cvs a 1041e72d8d2Sderaadt more attractive alternative to rdist. 1051e72d8d2Sderaadt 1061e72d8d2Sderaadt107. It should be possible to specify a list of symbolic revisions to 1071e72d8d2Sderaadt checkout such that the list is processed in reverse order looking for 1081e72d8d2Sderaadt matches within the RCS file for the symbolic revision. If there is 1091e72d8d2Sderaadt not a match, the next symbolic rev on the list is checked, and so on, 1101e72d8d2Sderaadt until all symbolic revs are exhausted. This would allow one to, say, 1111e72d8d2Sderaadt checkout "4.0" + "4.0.3" + "4.0.3Patch1" + "4.0.3Patch2" to get the 1121e72d8d2Sderaadt most recent 4.x stuff. This is usually handled by just specifying the 1131e72d8d2Sderaadt right release_tag, but most people forget to do this. 1141e72d8d2Sderaadt 1151e72d8d2Sderaadt108. If someone creates a whole new directory (i.e. adds it to the cvs 1161e72d8d2Sderaadt repository) and you happen to have a directory in your source farm by 1171e72d8d2Sderaadt the same name, when you do your cvs update -d it SILENTLY does 1181e72d8d2Sderaadt *nothing* to that directory. At least, I think it was silent; 1191e72d8d2Sderaadt certainly, it did *not* abort my cvs update, as it would have if the 1201e72d8d2Sderaadt same thing had happened with a file instead of a directory. 1211e72d8d2Sderaadt 1221e72d8d2Sderaadt109. I had gotten pieces of the sys directory in the past but not a 1231e72d8d2Sderaadt complete tree. I just did something like: 1241e72d8d2Sderaadt 1251e72d8d2Sderaadt cvs get * 1261e72d8d2Sderaadt 1271e72d8d2Sderaadt Where sys was in * and got the message 1281e72d8d2Sderaadt 1291e72d8d2Sderaadt cvs get: Executing 'sys/tools/make_links sys' 1301e72d8d2Sderaadt sh: sys/tools/make_links: not found 1311e72d8d2Sderaadt 1321e72d8d2Sderaadt I suspect this is because I didn't have the file in question, 1331e72d8d2Sderaadt but I do not understand how I could fool it into getting an 1341e72d8d2Sderaadt error. I think a later cvs get sys seemed to work so perhaps 1351e72d8d2Sderaadt something is amiss in handling multiple arguments to cvs get? 1361e72d8d2Sderaadt 1371e72d8d2Sderaadt113. The "cvs update" command should tee its output to a log file in ".". 1381e72d8d2Sderaadt (why? What is wrong with piping stdout to "tee"? -kingdon, Jun 1995) 1391e72d8d2Sderaadt 1402286d8edStholo119. When importing a directory tree that is under SCCS/RCS control, 1412286d8edStholo consider an option to have import checkout the SCCS/RCS files if 1422286d8edStholo necessary. (This is if someone wants to import something which 1432286d8edStholo is in RCS or SCCS without preserving the history, but makes sure 1442286d8edStholo they do get the latest versions. It isn't clear to me how useful 1452286d8edStholo that is -kingdon, June 1996). 1461e72d8d2Sderaadt 1471e72d8d2Sderaadt122. If Name_Repository fails, it currently causes CVS to die completely. It 14850bf276cStholo should instead return NULL and have the caller do something reasonable 14950bf276cStholo (??? -what is reasonable? I'm not sure there is a real problem here. 15050bf276cStholo -kingdon, June 1996). 1511e72d8d2Sderaadt 1521e72d8d2Sderaadt123. Add a flag to import to not build vendor branches for local code. 1532286d8edStholo (See `importb' tests in src/sanity.sh for more details). 1541e72d8d2Sderaadt 1551e72d8d2Sderaadt124. Anyway, I thought you might want to add something like the following 156c26070a5Stholo to the cvs man pages: 1571e72d8d2Sderaadt 1581e72d8d2Sderaadt BUGS 1591e72d8d2Sderaadt The sum of the sizes of a module key and its contents are 1601e72d8d2Sderaadt limited. See ndbm(3). 1611e72d8d2Sderaadt 1621e72d8d2Sderaadt126. Do an analysis to see if CVS is forgetting to close file descriptors. 1631e72d8d2Sderaadt Especially when committing many files (more than the open file limit 1641e72d8d2Sderaadt for the particular UNIX). 1651e72d8d2Sderaadt 1661e72d8d2Sderaadt127. Look at *info files; they should all be quiet if the files are not 1671e72d8d2Sderaadt there. Should be able to point at a RCS directory and go. 1681e72d8d2Sderaadt 1691e72d8d2Sderaadt130. cvs diff with no -r arguments does not need to look up the current RCS 1701e72d8d2Sderaadt version number since it only cares about what's in the Entries file. 1711e72d8d2Sderaadt This should make it much faster. 1721e72d8d2Sderaadt 1731e72d8d2Sderaadt It should ParseEntries itself and access the entries list much like 1741e72d8d2Sderaadt Version_TS does (sticky tags and sticky options may need to be 1751e72d8d2Sderaadt supported here as well). Then it should only diff the things that 1761e72d8d2Sderaadt have the wrong time stamp (the ones that look modified). 1771e72d8d2Sderaadt 1781e72d8d2Sderaadt134. Make a statement about using hard NFS mounts to your source 1791e72d8d2Sderaadt repository. Look into checking NULL fgets() returns with ferror() to 18050bf276cStholo see if an error had occurred. (we should be checking for errors, quite 18150bf276cStholo aside from NFS issues -kingdon, June 1996). 1821e72d8d2Sderaadt 1831e72d8d2Sderaadt137. Some sites might want CVS to fsync() the RCS ,v file to protect 1841e72d8d2Sderaadt against nasty hardware errors. There is a slight performance hit with 1851e72d8d2Sderaadt doing so, though, so it should be configurable in the .cvsrc file. 1861e72d8d2Sderaadt Also, along with this, we should look at the places where CVS itself 1871e72d8d2Sderaadt could be a little more synchronous so as not to lose data. 1881e72d8d2Sderaadt [[ I've done some of this, but it could use much more ]] 1891e72d8d2Sderaadt 1901e72d8d2Sderaadt138. Some people have suggested that CVS use a VPATH-like environment 1911e72d8d2Sderaadt variable to limit the amount of sources that need to be duplicated for 1921e72d8d2Sderaadt sites with giant source trees and no disk space. 1931e72d8d2Sderaadt 1942286d8edStholo141. Import should accept modules as its directory argument. If we're 1952286d8edStholo going to implement this, we should think hard about how modules 1962286d8edStholo might be expanded and how to handle those cases. 1971e72d8d2Sderaadt 1981e72d8d2Sderaadt143. Update the documentation to show that the source repository is 1992286d8edStholo something far away from the files that you work on. (People who 2002286d8edStholo come from an RCS background are used to their `repository' being 2012286d8edStholo _very_ close to their working directory.) 2021e72d8d2Sderaadt 2031e72d8d2Sderaadt144. Have cvs checkout look for the environment variable CVSPREFIX 2041e72d8d2Sderaadt (or CVSMODPREFIX or some such). If it's set, then when looking 2051e72d8d2Sderaadt up an alias in the modules database, first look it up with the 2061e72d8d2Sderaadt value of CVSPREFIX attached, and then look for the alias itself. 2071e72d8d2Sderaadt This would be useful when you have several projects in a single 2081e72d8d2Sderaadt repository. You could have aliases abc_src and xyz_src and 2091e72d8d2Sderaadt tell people working on project abc to put "setenv CVSPREFIX abc_" 2101e72d8d2Sderaadt in their .cshrc file (or equivalent for other shells). 2111e72d8d2Sderaadt Then they could do "cvs co src" to get a copy of their src 2121e72d8d2Sderaadt directory, not xyz's. (This should create a directory called 2131e72d8d2Sderaadt src, not abc_src.) 2141e72d8d2Sderaadt 2151e72d8d2Sderaadt145. After you create revision 1.1.1.1 in the previous scenario, if 2161e72d8d2Sderaadt you do "cvs update -r1 filename" you get revision 1.1, not 2171e72d8d2Sderaadt 1.1.1.1. It would be nice to get the later revision. Again, 2181e72d8d2Sderaadt this restriction comes from RCS and is probably hard to 2191e72d8d2Sderaadt change in CVS. Sigh. 2201e72d8d2Sderaadt 2211e72d8d2Sderaadt |"cvs update -r1 filename" does not tell RCS to follow any branches. CVS 2221e72d8d2Sderaadt |tries to be consistent with RCS in this fashion, so I would not change 2231e72d8d2Sderaadt |this. Within CVS we do have the flexibility of extending things, like 2241e72d8d2Sderaadt |making a revision of the form "-r1HEAD" find the most recent revision 2251e72d8d2Sderaadt |(branch or not) with a "1." prefix in the RCS file. This would get what 2261e72d8d2Sderaadt |you want maybe. 2271e72d8d2Sderaadt 2281e72d8d2Sderaadt This would be very useful. Though I would prefer an option 2291e72d8d2Sderaadt such as "-v1" rather than "-r1HEAD". This option might be 2301e72d8d2Sderaadt used quite often. 2311e72d8d2Sderaadt 2321e72d8d2Sderaadt146. The merging of files should be controlled via a hook so that programs 2331e72d8d2Sderaadt other than "rcsmerge" can be used, like Sun's filemerge or emacs's 2341e72d8d2Sderaadt emerge.el. (but be careful in making this work client/server--it means 2351e72d8d2Sderaadt doing the interactive merging at the end after the server is done). 23650bf276cStholo (probably best is to have CVS do the non-interactive part and 23750bf276cStholo tell the user about where the files are (.#foo.c.working and 23850bf276cStholo .#foo.c.1.5 or whatever), so they can do the interactive part at 23950bf276cStholo that point -kingdon, June 1996). 2401e72d8d2Sderaadt 2412286d8edStholo149. Maybe there should be an option to cvs admin that allows a user to 2422286d8edStholo change the Repository/Root file with some degree of error checking? 2431e72d8d2Sderaadt Something like "cvs admin reposmv /old/path /new/pretty/path". Before 2441e72d8d2Sderaadt it does the replace it check to see that the files 2451e72d8d2Sderaadt /new/pretty/path/<dir>/<files> exist. 2461e72d8d2Sderaadt 2472286d8edStholo The obvious cases are where one moves the repository to another 2482286d8edStholo machine or directory. But there are other cases, like where the 2492286d8edStholo user might want to change from :pserver: to :ext:, use a different 2502286d8edStholo server (if there are two server machines which share the 2512286d8edStholo repository using a networked file system), etc. 2522286d8edStholo 2532286d8edStholo The status quo is a bit of a mess (as of, say, CVS 1.9). It is 2542286d8edStholo that the -d global option has two moderately different uses. One 2552286d8edStholo is to use a totally different repository (in which case we'd 2562286d8edStholo probably want to give an error if it disagreed with CVS/Root, as 2572286d8edStholo CVS 1.8 and earlier did). The other is the "reposmv" 2582286d8edStholo functionality above (in which the two repositories really are the 259c71bc7e2Stholo same, and we want to update the CVS/Root files). In CVS 1.9 and 260c71bc7e2Stholo 1.10, -d rewrites the CVS/Root file (but not in subdirectories). 261c71bc7e2Stholo This behavior was not particularly popular and has been since 262c71bc7e2Stholo reverted. 2632286d8edStholo 2642286d8edStholo Note also RELATIVE_REPOS in options.h; it needs to be set for 2652286d8edStholo changing CVS/Root (not CVS/Repository) to be sufficient in the 2662286d8edStholo case where the directory has changed. 2672286d8edStholo 2682286d8edStholo This whole area is a rather bad pile of individual decisions which 2692286d8edStholo accumulated over time, some of them probably bad decisions with 2702286d8edStholo hindsight. But we didn't get into this mess overnight, and we're 2712286d8edStholo not going to get out of it overnight (that is, we need to come up 2722286d8edStholo with a replacement behavior, document what parts of the status 2732286d8edStholo quo are deprecated, probably circulate some unofficial patches, &c). 2742286d8edStholo 2752286d8edStholo (this item originally added 2 Feb 1992 but revised since). 2762286d8edStholo 2771e72d8d2Sderaadt150. I have a customer request for a way to specify log message per 2781e72d8d2Sderaadt file, non-interactively before the commit, such that a single, fully 2791e72d8d2Sderaadt recursive commit prompts for one commit message, and concatenates the 2801e72d8d2Sderaadt per file messages for each file. In short, one commit, one editor 2811e72d8d2Sderaadt session, log messages allowed to vary across files within the commit. 2821e72d8d2Sderaadt Also, the per file messages should be allowed to be written when the 2831e72d8d2Sderaadt files are changed, which may predate the commit considerably. 2841e72d8d2Sderaadt 2851e72d8d2Sderaadt A new command seems appropriate for this. The state can be saved in the 2861e72d8d2Sderaadt CVS directory. I.e., 2871e72d8d2Sderaadt 288b6c02222Stholo % cvs message foo.c 2891e72d8d2Sderaadt Enter log message for foo.c 2901e72d8d2Sderaadt >> fixed an uninitialized variable 2911e72d8d2Sderaadt >> ^D 2921e72d8d2Sderaadt 293b6c02222Stholo The text is saved as CVS/foo.c,m (or some such name) and commit 294b6c02222Stholo is modified to append (prepend?) the text (if found) to the log 295b6c02222Stholo message specified at commit time. Easy enough. (having cvs 296b6c02222Stholo commit be non-interactive takes care of various issues like 297b6c02222Stholo whether to connect to the server before or after prompting for a 2982286d8edStholo message (see comment in commit.c at call to start_server). Also 2992286d8edStholo would clean up the kludge for what to do with the message from 3002286d8edStholo do_editor if the up-to-date check fails (see commit.c client code). 301b6c02222Stholo 302b6c02222Stholo I'm not sure about the part above about having commit prompt 303b6c02222Stholo for an overall message--part of the point is having commit 304b6c02222Stholo non-interactive and somehow combining messages seems like (excess?) 305b6c02222Stholo hair. 306b6c02222Stholo 307b6c02222Stholo Would be nice to do this so it allows users more flexibility in 308b6c02222Stholo specifying messages per-directory ("cvs message -l") or per-tree 309b6c02222Stholo ("cvs message") or per-file ("cvs message foo.c"), and fixes the 310b6c02222Stholo incompatibility between client/server (per-tree) and 311b6c02222Stholo non-client/server (per-directory). 3121e72d8d2Sderaadt 3132286d8edStholo A few interesting issues with this: (1) if you do a cvs update or 3142286d8edStholo some other operation which changes the working directory, do you 3152286d8edStholo need to run "cvs message" again (it would, of course, bring up 3162286d8edStholo the old message which you could accept)? Probably yes, after all 3172286d8edStholo merging in some conflicts might change the situation. (2) How do 3182286d8edStholo you change the stored messages if you change your mind before the 3192286d8edStholo commit (probably run "cvs message" again, as hinted in (1))? 3202286d8edStholo 3211e72d8d2Sderaadt151. Also, is there a flag I am missing that allows replacing Ulrtx_Build 3221e72d8d2Sderaadt by Ultrix_build? I.E. I would like a tag replacement to be a one step 3231e72d8d2Sderaadt operation rather than a two step "cvs rtag -r Ulrtx_Build Ultrix_Build" 3242286d8edStholo followed by "cvs rtag -d Ulrtx_Build" 3251e72d8d2Sderaadt 3261e72d8d2Sderaadt152. The "cvs -n" option does not work as one would expect for all the 3271e72d8d2Sderaadt commands. In particular, for "commit" and "import", where one would 3281e72d8d2Sderaadt also like to see what it would do, without actually doing anything. 3291e72d8d2Sderaadt 3302286d8edStholo153. There should be some command (maybe I just haven't figured out 3312286d8edStholo which one...) to import a source directory which is already 3322286d8edStholo RCS-administered without losing all prior RCS gathered data. 3332286d8edStholo Thus, it would have to examine the RCS files and choose a 3342286d8edStholo starting version and branch higher than previous ones used. 3352286d8edStholo (Check out rcs-to-cvs and see if it addresses this issue.) 3361e72d8d2Sderaadt 3371e72d8d2Sderaadt154. When committing the modules file, a pre-commit check should be done to 3381e72d8d2Sderaadt verify the validity of the new modules file before allowing it to be 339c26070a5Stholo committed. 3401e72d8d2Sderaadt 3411e72d8d2Sderaadt155. The options for "cvs history" are mutually exclusive, even though 3422286d8edStholo useful queries can be done if they are not, as in specifying both 3432286d8edStholo a module and a tag. A workaround is to specify the module, then 3442286d8edStholo run the output through grep to only display lines that begin with 3452286d8edStholo T, which are tag lines. (Better perhaps if we redesign the whole 3462286d8edStholo "history" business -- check out doc/cvs.texinfo for the entire 3472286d8edStholo rant.) 3481e72d8d2Sderaadt 3491e72d8d2Sderaadt156. Also, how hard would it be to allow continuation lines in the 3501e72d8d2Sderaadt {commit,rcs,log}info files? It would probably be useful with all of 3511e72d8d2Sderaadt the various flags that are now available, or if somebody has a lot of 3521e72d8d2Sderaadt files to put into a module. 3531e72d8d2Sderaadt 3541e72d8d2Sderaadt158. If I do a recursive commit and find that the same RCS file is checked 3551e72d8d2Sderaadt out (and modified!) in two different places within my checked-out 3561e72d8d2Sderaadt files (but within the realm of a single "commit"), CVS will commit the 3571e72d8d2Sderaadt first change, then overwrite that change with the second change. We 3581e72d8d2Sderaadt should catch this (typically unusual) case and issue an appropriate 3591e72d8d2Sderaadt diagnostic and die. 3601e72d8d2Sderaadt 3611e72d8d2Sderaadt160. The checks that the commit command does should be extended to make 3621e72d8d2Sderaadt sure that the revision that we will lock is not already locked by 3631e72d8d2Sderaadt someone else. Maybe it should also lock the new revision if the old 3641e72d8d2Sderaadt revision was already locked by the user as well, thus moving the lock 3651e72d8d2Sderaadt forward after the commit. 3661e72d8d2Sderaadt 3671e72d8d2Sderaadt163. The rtag/tag commands should have an option that removes the specified 3681e72d8d2Sderaadt tag from any file that is in the attic. This allows one to re-use a 3691e72d8d2Sderaadt tag (like "Mon", "Tue", ...) all the time and still have it tag the 3701e72d8d2Sderaadt real main-line code. 3711e72d8d2Sderaadt 3721e72d8d2Sderaadt165. The "import" command will create RCS files automatically, but will 3731e72d8d2Sderaadt screw-up when trying to create long file names on short file name 3741e72d8d2Sderaadt file systems. Perhaps import should be a bit more cautious. 3751e72d8d2Sderaadt 3761e72d8d2Sderaadt166. There really needs to be a "Getting Started" document which describes 3771e72d8d2Sderaadt some of the new CVS philosophies. Folks coming straight from SCCS or 3781e72d8d2Sderaadt RCS might be confused by "cvs import". Also need to explain: 3791e72d8d2Sderaadt - How one might setup their $CVSROOT 3801e72d8d2Sderaadt - What all the tags mean in an "import" command 3811e72d8d2Sderaadt - Tags are important; revision numbers are not 3821e72d8d2Sderaadt 3831e72d8d2Sderaadt170. Is there an "info" file that can be invoked when a file is checked out, or 3841e72d8d2Sderaadt updated ? What I want to do is to advise users, particularly novices, of 3851e72d8d2Sderaadt the state of their working source whenever they check something out, as 3861e72d8d2Sderaadt a sanity check. 3871e72d8d2Sderaadt 3881e72d8d2Sderaadt For example, I've written a perl script which tells you what branch you're 3891e72d8d2Sderaadt on, if any. Hopefully this will help guard against mistaken checkins to 3901e72d8d2Sderaadt the trunk, or to the wrong branch. I suppose I can do this in 3911e72d8d2Sderaadt "commitinfo", but it'd be nice to advise people before they edit their 3921e72d8d2Sderaadt files. 3931e72d8d2Sderaadt 3941e72d8d2Sderaadt It would also be nice if there was some sort of "verboseness" switch to 3951e72d8d2Sderaadt the checkout and update commands that could turn this invocation of the 3961e72d8d2Sderaadt script off, for mature users. 3971e72d8d2Sderaadt 3981e72d8d2Sderaadt173. We have a tagged branch in CVS. How do we get the version of that branch 3991e72d8d2Sderaadt (for an entire directory) that corresponds to the files on that branch on a 4001e72d8d2Sderaadt certain day? I'd like to specify BOTH -r and -D to 'cvs checkout', but I 4011e72d8d2Sderaadt can't. It looks like I can only specify the date for the main line (as 4021e72d8d2Sderaadt opposed to any branches). True? Any workarounds to get what I need? 4031e72d8d2Sderaadt 4041e72d8d2Sderaadt174. I would like to see "cvs release" modified so that it only removes files 4051e72d8d2Sderaadt which are known to CVS - all the files in the repository, plus those which 4061e72d8d2Sderaadt are listed in .cvsignore. This way, if you do leave something valuable in 4071e72d8d2Sderaadt a source tree you can "cvs release -d" the tree and your non-CVS goodies 4081e72d8d2Sderaadt are still there. If a user is going to leave non-CVS files in their source 4091e72d8d2Sderaadt trees, they really should have to clean them up by hand. 4101e72d8d2Sderaadt 4111e72d8d2Sderaadt175. And, in the feature request department, I'd dearly love a command-line 4121e72d8d2Sderaadt interface to adding a new module to the CVSROOT/modules file. 4131e72d8d2Sderaadt 4141e72d8d2Sderaadt176. If you use the -i flag in the modules file, you can control access 4151e72d8d2Sderaadt to source code; this is a Good Thing under certain circumstances. I 4161e72d8d2Sderaadt just had a nasty thought, and on experiment discovered that the 4171e72d8d2Sderaadt filter specified by -i is _not_ run before a cvs admin command; as 4181e72d8d2Sderaadt this allows a user to go behind cvs's back and delete information 4191e72d8d2Sderaadt (cvs admin -o1.4 file) this seems like a serious problem. 4201e72d8d2Sderaadt 4211e72d8d2Sderaadt177. We've got some external vendor source that sits under a source code 4221e72d8d2Sderaadt hierarchy, and when we do a cvs update, it gets wiped out because 4231e72d8d2Sderaadt its tag is different from the "main" distribution. I've tried to 4241e72d8d2Sderaadt use "-I" to ignore the directory, as well as .cvsignore, but this 4251e72d8d2Sderaadt doesn't work. 4261e72d8d2Sderaadt 4271e72d8d2Sderaadt179. "cvs admin" does not log its actions with loginfo, nor does it check 4281e72d8d2Sderaadt whether the action is allowed with commitinfo. It should. 42950bf276cStholo 43050bf276cStholo180. "cvs edit" should show you who is already editing the files, 43150bf276cStholo probably (that is, do "cvs editors" before executing, or some 43250bf276cStholo similar result). (But watch out for what happens if the network 43350bf276cStholo is down!). 43450bf276cStholo 43550bf276cStholo182. There should be a way to show log entries corresponding to 4362286d8edStholochanges from tag "foo" to tag "bar". "cvs log -rfoo:bar" doesn't cut 4372286d8edStholoit, because it erroneously shows the changes associated with the 4382286d8edStholochange from the revision before foo to foo. I'm not sure that is ever 4392286d8edStholoa useful or logical behavior ("cvs diff -r foo -r bar" gets this 4402286d8edStholoright), but is compatibility an issue? See 4412286d8edStholohttp://www.cyclic.com/cvs/unoff-log.txt for an unofficial patch. 44250bf276cStholo 443780d15dfStholo183. "cvs status" should report on Entries.Static flag and CVS/Tag (how? 444780d15dfStholomaybe a "cvs status -d" to give directory status?). There should also 445780d15dfStholobe more documentation of how these get set and how/when to re-set them. 446780d15dfStholo 447780d15dfStholo184. Would be nice to implement the FreeBSD MD5-based password hash 448780d15dfStholoalgorithm in pserver. For more info see "6.1. DES, MD5, and Crypt" in 449780d15dfStholothe FreeBSD Handbook, and src/lib/libcrypt/crypt.c in the FreeBSD 450780d15dfStholosources. Certainly in the context of non-unix servers this algorithm 451780d15dfStholomakes more sense than the traditional unix crypt() algorithm, which 452780d15dfStholosuffers from export control problems. 4532770ece5Stholo 4542770ece5Stholo185. A frequent complaint is that keyword expansion causes conflicts 4552770ece5Stholowhen merging from one branch to another. The first step is 4562770ece5Stholodocumenting CVS's existing features in this area--what happens with 4572770ece5Stholovarious -k options in various places? The second step is thinking 4582770ece5Stholoabout whether there should be some new feature and if so how it should 4592770ece5Stholobe designed. For example, here is one thought: 4602770ece5Stholo 4612770ece5Stholo rcs' co command needs a new -k option. The new option should expand 4622770ece5Stholo $Log entries without expanding $Revision entries. This would 4632770ece5Stholo allow cvs to use rcsmerge in such a way that joining branches into 4642770ece5Stholo main lines would neither generate extra collisions on revisions nor 4652770ece5Stholo drop log lines. 4662770ece5Stholo 4672770ece5StholoThe details of this are out of date (CVS no longer invokes "co", and 4682770ece5Stholoany changes in this area would be done by bypassing RCS rather than 4692770ece5Stholomodifying it), but even as to the general idea, I don't have a clear 4702770ece5Stholoidea about whether it would be good (see what I mean about the need 4712770ece5Stholofor better documentation? I work on CVS full-time, and even I don't 4722770ece5Stholounderstand the state of the art on this subject). 4732286d8edStholo 4742286d8edStholo186. There is a frequent discussion of multisite features. 4752286d8edStholo 4762286d8edStholo* There may be some overlap with the client/server CVS, which is good 4772286d8edStholoespecially when there is a single developer at each location. But by 4782286d8edStholo"multisite" I mean something in which each site is more autonomous, to 4792286d8edStholoone extent or another. 4802286d8edStholo 4812286d8edStholo* Vendor branches are the closest thing that CVS currently has for 4822286d8edStholomultisite features. They have fixable drawbacks (such as poor 4832286d8edStholohandling of added and removed files), and more fundamental drawbacks 4842286d8edStholo(when you import a vendor branch, you are importing a set of files, 4852286d8edStholonot importing any knowledge of their version history outside the 4862286d8edStholocurrent repository). 4872286d8edStholo 4882286d8edStholo* One approach would be to require checkins (or other modifications to 4892286d8edStholothe repository) to succeed at a write quorum of sites (51%) before 4902286d8edStholothey are allowed to complete. To work well, the network should be 4912286d8edStholoreliable enough that one can typically get to that many sites. When a 4922286d8edStholoserver which has been out of touch reconnects, it would want to update 4932286d8edStholoits data before doing anything else. Any of the servers can service 4942286d8edStholoall requests locally, except perhaps for a check that they are 4952286d8edStholoup-to-date. The way this differs from a run-of-the-mill distributed 4962286d8edStholodatabase is that if one only allows reversible operations via this 4972286d8edStholomechanism (exclude "cvs admin -o", "cvs tag -d", &c), then each site 4982286d8edStholocan back up the others, such that failures at one site, including 4992286d8edStholosomething like deleting all the sources, can be recovered from. Thus 5002286d8edStholothe sites need not trust each other as much as for many shared 5012286d8edStholodatabases, and the system may be resilient to many types of 5022286d8edStholoorganizational failures. Sometimes I call this design the 5032286d8edStholo"CVScluster" design. 5042286d8edStholo 5052286d8edStholo* Another approach is a master/slave one. Checkins happen at the 5062286d8edStholomaster site, and slave sites need to check whether their local 5072286d8edStholorepository is up to date before relying on its information. 5082286d8edStholo 5092286d8edStholo* Another approach is to have each site own a particular branch. This 5102286d8edStholoone is the most tolerant of flaky networks; if checkins happen at each 5112286d8edStholosite independently there is no particular problem. The big question 5122286d8edStholois whether merges happen only manually, as with existing CVS branches, 5132286d8edStholoor whether there is a feature whereby there are circumstances in which 5142286d8edStholomerges from one branch to the other happen automatically (for example, 5152286d8edStholothe case in which the branches have not diverged). This might be a 5162286d8edSthololegitimate question to ask even quite aside from multisite features. 5172286d8edStholo 5182286d8edStholo187. Might want to separate out usage error messages and help 5192286d8edStholomessages. The problem now is that if you specify an invalid option, 5202286d8edStholofor example, the error message is lost among all the help text. In 5212286d8edStholothe new regime, the error message would be followed by a one-line 5222286d8edStholomessage directing people to the appropriate help option ("cvs -H 5232286d8edStholo<command>" or "cvs --help-commands" or whatever, according to the 5242286d8edStholosituation). I'm not sure whether this change would be controversial 5252286d8edStholo(as defined in HACKING), so there might be a need for further 5262286d8edStholodiscussion or other actions other than just coding. 5272286d8edStholo 5282286d8edStholo188. Option parsing and .cvsrc has at least one notable limitation. 5292286d8edStholoIf you want to set a global option only for some CVS commands, there 5302286d8edStholois no way to do it (for example, if one wants to set -q only for 5312286d8edStholo"rdiff"). I am told that the "popt" package from RPM 5322286d8edStholo(http://www.rpm.org) could solve this and other problems (for example, 5332286d8edStholoif the syntax of option stuff in .cvsrc is similar to RPM, that would 5342286d8edStholobe great from a user point of view). It would at least be worth a 5352286d8edSthololook (it also provides a cleaner API than getopt_long). 5362286d8edStholo 5372286d8edStholoAnother issue which may or may not be related is the issue of 5382286d8edStholooverriding .cvsrc from the command line. The cleanest solution might 5392286d8edStholobe to have options in mutually exclusive sets (-l/-R being a current 5402286d8edStholoexample, but --foo/--no-foo is a better way to name such options). Or 5412286d8edStholoperhaps there is some better solution. 5422286d8edStholo 5432286d8edStholo189. Renaming files and directories is a frequently discussed topic. 5442286d8edStholo 5452286d8edStholoSome of the problems with the status quo: 5462286d8edStholo 5472286d8edStholoa. "cvs annotate" cannot operate on both the old and new files in a 5482286d8edStholosingle run. You need to run it twice, once for the new name and once 5492286d8edStholofor the old name. 5502286d8edStholo 5512286d8edStholob. "cvs diff" (or "cvs diff -N") shows a rename as a removal of the 5522286d8edStholoold file and an addition of the new one. Some people would like to 5532286d8edStholosee the differences between the file contents (but then how would we 5542286d8edStholoindicate the fact that the file has been renamed? Certainly the 5552286d8edStholonotion that "patch(1)" has of renames is as a removal and addition). 5562286d8edStholo 5572286d8edStholoc. "cvs log" should be able to show the changes between two 5582286d8edStholotags/dates, even in the presence of adds/removes/renames (I'm not sure 5592286d8edStholowhat the status quo is on this; see also item #182). 5602286d8edStholo 5612286d8edStholod. Renaming directories is way too hard. 5622286d8edStholo 5632286d8edStholoImplementations: 5642286d8edStholo 5652286d8edStholoIt is perhaps premature to try to design implementation details 5662286d8edStholowithout answering some of the above questions about desired behaviors 5672286d8edStholobut several general implementations get mentioned. 5682286d8edStholo 5692286d8edStholoi. No fundamental changes (for example, a "cvs rename" command which 5702286d8edStholooperated on directories could still implement the current recommended 5712286d8edStholopractice for renaming directories, which is to rename each of the 5722286d8edStholofiles contained therein via an add and a remove). One thing to note 5732286d8edStholothat the status quo gets right is proper merges, even with adds and 5742286d8edStholoremovals (Well, mostly right at least. There are a *LOT* of different 5752286d8edStholocases; see the testsuite for some of them). 5762286d8edStholo 5772286d8edStholoii. Rename database. In this scheme the files in the repository 5782286d8edStholowould have some arbitrary name, and then a separate rename database 5792286d8edStholowould indicate the current correspondence between the filename in the 5802286d8edStholoworking directory and the actual storage. As far as I know this has 5812286d8edStholonever been designed in detail for CVS. 5822286d8edStholo 5832286d8edStholoiii. A modest change in which the RCS files would contain some 5842286d8edStholoinformation such as "renamed from X" or "renamed to Y". That is, this 5852286d8edStholowould be generally similar to the log messages which are suggested 5862286d8edStholowhen one renames via an add and a removal, but would be 5872286d8edStholocomputer-parseable. I don't think anyone has tried to flesh out any 5882286d8edStholodetails here either. 5892286d8edStholo 5902286d8edStholoIt is interesting to note that in solution ii. version numbers in the 5912286d8edStholo"new file" start where the "old file" left off, while in solutions 5922286d8edStholoi. and iii., version numbers restart from 1.1 each time a file is 5932286d8edStholorenamed. Except perhaps in the case where we rename a file from foo 5942286d8edStholoto bar and then back to foo. I'll shut up now. 5952286d8edStholo 5962286d8edStholoRegardless of the method we choose, we need to address how renames 5972286d8edStholoaffect existing CVS behaviors. For example, what happens when you 5982286d8edStholorename a file on a branch but not the trunk and then try to merge the 5992286d8edStholotwo? What happens when you rename a file on one branch and delete it 6002286d8edStholoon another and try to merge the two? 6012286d8edStholo 6022286d8edStholoIdeally, we'd come up with a way to parameterize the problem and 6032286d8edStholosimply write up a lookup table to determine the correct behavior. 6042286d8edStholo 6052286d8edStholo190. The meaning of the -q and -Q global options is very ad hoc; 6062286d8edStholothere is no clear definition of which messages are suppressed by them 6072286d8edStholoand which are not. Here is a classification of the current meanings 6082286d8edStholoof -q; I don't know whether anyone has done a similar investigation of 6092286d8edStholo-Q: 6102286d8edStholo 6112286d8edStholo a. The "warm fuzzies" printed upon entering each directory (for 6122286d8edStholo example, "cvs update: Updating sdir"). The need for these messages 6132286d8edStholo may be decreased now that most of CVS uses ->fullname instead of 6142286d8edStholo ->file in messages (a project which is *still* not 100% complete, 6152286d8edStholo alas). However, the issue of whether CVS can offer status as it 6162286d8edStholo runs is an important one. Of course from the command line it is 6172286d8edStholo hard to do this well and one ends up with options like -q. But 6182286d8edStholo think about emacs, jCVS, or other environments which could flash you 6192286d8edStholo the latest status line so you can see whether the system is working 6202286d8edStholo or stuck. 6212286d8edStholo 6222286d8edStholo b. Other cases where the message just offers information (rather 6232286d8edStholo than an error) and might be considered unnecessarily verbose. These 6242286d8edStholo have a certain point to them, although it isn't really clear whether 6252286d8edStholo it should be the same option as the warm fuzzies or whether it is 6262286d8edStholo worth the conceptual hair: 6272286d8edStholo 6282286d8edStholo add.c: scheduling %s `%s' for addition (may be an issue) 6292286d8edStholo modules.c: %s %s: Executing '%s' (I can see how that might be noise, 6302286d8edStholo but...) 6312286d8edStholo remove.c: scheduling `%s' for removal (analogous to the add.c one) 6322286d8edStholo update.c: Checking out %s (hmm, that message is a bit on the noisy side...) 6332286d8edStholo (but the similar message in annotate is not affected by -q). 6342286d8edStholo 6352286d8edStholo c. Suppressing various error messages. This is almost surely 6362286d8edStholo bogus. 6372286d8edStholo 6382286d8edStholo commit.c: failed to remove tag `%s' from `%s' (Questionable. 6392286d8edStholo Rationale might be that we already printed another message 6402286d8edStholo elsewhere but why would it be necessary to avoid 6412286d8edStholo the extra message in such an uncommon case?) 6422286d8edStholo commit.c: failed to commit dead revision for `%s' (likewise) 6432286d8edStholo remove.c: file `%s' still in working directory (see below about rm 6442286d8edStholo -f analogy) 6452286d8edStholo remove.c: nothing known about `%s' (looks dubious to me, especially in 6462286d8edStholo the case where the user specified it explicitly). 6472286d8edStholo remove.c: removed `%s' (seems like an obscure enough case that I fail 6482286d8edStholo to see the appeal of being cryptically concise here). 6492286d8edStholo remove.c: file `%s' already scheduled for removal (now it is starting 6502286d8edStholo to look analogous to the infamous rm -f option). 6512286d8edStholo rtag.c: cannot find tag `%s' in `%s' (more rm -f like behavior) 6522286d8edStholo rtag.c: failed to remove tag `%s' from `%s' (ditto) 6532286d8edStholo tag.c: failed to remove tag %s from %s (see above about whether RCS_* 6542286d8edStholo has already printed an error message). 6552286d8edStholo tag.c: couldn't tag added but un-commited file `%s' (more rm -f 6562286d8edStholo like behavior) 6572286d8edStholo tag.c: skipping removed but un-commited file `%s' (ditto) 6582286d8edStholo tag.c: cannot find revision control file for `%s' (ditto, but at first 6592286d8edStholo glance seems even worse, as this would seem to be a "can't happen" 6602286d8edStholo condition) 6612286d8edStholo 6622286d8edStholo191. Storing RCS files, especially binary files, takes rather more 6632286d8edStholospace than it could, typically. 6642286d8edStholo - The virtue of the status quo is that it is simple to implement. 6652286d8edStholo Of course it is also simplest in terms of dealing with compatibility. 6662286d8edStholo - Just storing the revisions as separate gzipped files is a common 6672286d8edStholo technique. It also is pretty simple (no new algorithms, CVS 6682286d8edStholo already has zlib around). Of course for some files (such as files 6692286d8edStholo which are already compressed) the gzip step won't help, but 6702286d8edStholo something which can at least sometimes avoid rewriting the entire 6712286d8edStholo RCS file for each new revision would, I would think, be a big 6722286d8edStholo speedup for large files. 6732286d8edStholo - Josh MacDonald has written a tool called xdelta which produces 6742286d8edStholo differences (that is, sufficient information to transform the old 6752286d8edStholo to the new) which looks for common sequences of bytes, like RCS 6762286d8edStholo currently does, but which is not based on lines. This seems to do 6772286d8edStholo quite well for some kinds of files (e.g. FrameMaker documents, 6782286d8edStholo text files), and not as well for others (anything which is already 6792286d8edStholo compressed, executables). xdelta 1.10 also is faster than GNU diff. 6802286d8edStholo - Karl Fogel has thought some about using a difference technique 6812286d8edStholo analogous to fractal compression (see the comp.compression FAQ for 6822286d8edStholo more on fractal compression, including at least one patent to 6832286d8edStholo watch for; I don't know how analogous Karl's ideas are to the 6842286d8edStholo techniques described there). 6852286d8edStholo - Quite possibly want some documented interface by which a site can 6862286d8edStholo plug in their choice of external difference programs (with the 6872286d8edStholo ability to choose the program based on filename, magic numbers, 6882286d8edStholo or some such). 6892286d8edStholo 6902286d8edStholo192. "cvs update" using an absolute pathname does not work if the 6912286d8edStholoworking directory is not a CVS-controlled directory with the correct 6922286d8edStholoCVSROOT. For example, the following will fail: 6932286d8edStholo 6942286d8edStholo cd /tmp 6952286d8edStholo cvs -d /repos co foo 6962286d8edStholo cd / 6972286d8edStholo cvs update /tmp/foo 6982286d8edStholo 6992286d8edStholoIt is possible to read the CVSROOT from the administrative files in 7002286d8edStholothe directory specified by the absolute pathname argument to update. 7012286d8edStholoIn that case, the last command above would be equivalent to: 7022286d8edStholo 7032286d8edStholo cd /tmp/foo 7042286d8edStholo cvs update . 7052286d8edStholo 7062286d8edStholoThis can be problematic, however, if we ask CVS to update two 7072286d8edStholodirectories with different CVSROOTs. Currently, CVS has no way of 7082286d8edStholochanging CVSROOT mid-stream. Consider the following: 7092286d8edStholo 7102286d8edStholo cd /tmp 7112286d8edStholo cvs -d /repos1 co foo 7122286d8edStholo cvs -d /repos2 co bar 7132286d8edStholo cd / 7142286d8edStholo cvs update /tmp/foo /tmp/bar 7152286d8edStholo 7162286d8edStholoTo make that example work, we need to think hard about: 7172286d8edStholo 7182286d8edStholo - where and when CVSROOT-related variables get set 7192286d8edStholo - who caches said variables for later use 7202286d8edStholo - how the remote protocol should be extended to handle sending a new 7212286d8edStholo repository mid-stream 7222286d8edStholo - how the client should maintain connections to a variety of servers 7232286d8edStholo in a single invocation. 7242286d8edStholo 7252286d8edStholoBecause those issues are hairy, I suspect that having a change in 7262286d8edStholoCVSROOT be an error would be a better move. 7272286d8edStholo 7282286d8edStholo193. The client relies on timestamps to figure out whether a file is 7292286d8edStholo(maybe) modified. If something goes awry, then it ends up sending 7302286d8edStholoentire files to the server to be checked, and this can be quite slow 7312286d8edStholoespecially over a slow network. A couple of things that can happen: 7322286d8edStholo(a) other programs, like make, use timestamps, so one ends up needing 7332286d8edStholoto do "touch foo" and otherwise messing with timestamps, (b) changing 7342286d8edStholothe timezone offset (e.g. summer vs. winter or moving a machine) 7352286d8edStholoshould work on unix, but there may be problems with non-unix. 7362286d8edStholo 7372286d8edStholoPossible solutions: 7382286d8edStholo 7392286d8edStholo a. Store a checksum for each file in CVS/Entries or some such 7402286d8edStholo place. What to do about hash collisions is interesting: using a 7412286d8edStholo checksum, like MD5, large enough to "never" have collisions 7422286d8edStholo probably works in practice (of course, if there is a collision then 7432286d8edStholo all hell breaks loose because that code path was not tested, but 7442286d8edStholo given the tiny, tiny probability of that I suppose this is only an 7452286d8edStholo aesthetic issue). 7462286d8edStholo 7472286d8edStholo b. I'm not thinking of others, except storing the whole file in 7482286d8edStholo CVS/Base, and I'm sure using twice the disk space would be 7492286d8edStholo unpopular. 7502286d8edStholo 7512286d8edStholo194. CVS does not separate the "metadata" from the actual revision 7522286d8edStholohistory; it stores them both in the RCS files. Metadata means tags 7532286d8edStholoand header information such as the number of the head revision. 7542286d8edStholoStoring the metadata separately could speed up "cvs tag" enormously, 7552286d8edStholowhich is a big problem for large repositories. It could also probably 7562286d8edStholomake CVS's locking much less in the way (see comment in do_recursion 7572286d8edStholoabout "two-pass design"). 7582286d8edStholo 7592286d8edStholo195. Many people using CVS over a slow link are interested in whether 7602286d8edStholothe remote protocol could be any more efficient with network 7612286d8edStholobandwidth. This item is about one aspect of that--how the server 7622286d8edStholosends a new version of a file the client has a different version of, 7632286d8edStholoor vice versa. 7642286d8edStholo 7652286d8edStholoa. Cases in which the status quo already sends a diff. For most text 7662286d8edStholofiles, this is probably already close to optimal. For binary files, 767c71bc7e2Stholoand anomalous (?) text files (e.g. those in which it would help to do 768c71bc7e2Stholomoves, as well as adds and deletes), it might be worth looking into other 7692286d8edStholodifference algorithms (see item #191). 7702286d8edStholo 7712286d8edStholob. Cases in which the status quo does not send a diff (e.g. "cvs 7722286d8edStholocommit"). 7732286d8edStholo 7742286d8edStholob1. With some frequency, people suggest rsync or a similar algorithm 7752286d8edStholo(see ftp://samba.anu.edu.au/pub/rsync/). This could speed things up, 7762286d8edStholoand in some ways involves the most minimal changes to the default CVS 7772286d8edStholoparadigm. There are some downsides though: (1) there is an extra 778c71bc7e2Stholonetwork turnaround, (2) the algorithm needs to transmit some data to 779c71bc7e2Stholodiscover what difference type programs can discover locally (although 780c71bc7e2Stholothis is only about 1% of the size of the files). 7812286d8edStholo 7822286d8edStholob2. If one is willing to require that users use "cvs edit" before 7832286d8edStholoediting a file on the client side (in some cases, a development 7842286d8edStholoenvironment like emacs can make this fairly easy), then the Modified 7852286d8edStholorequest in the protocol could be extended to allow the client to just 7862286d8edStholosend differences instead of entire files. In the degenerate case 7872286d8edStholo(e.g. "cvs diff" without arguments) the required network traffic is 7882286d8edStholoreduced to zero, and the client need not even contact the server. 789c71bc7e2Stholo 790c71bc7e2Stholo196. Using a CVSROOT with a trailing slash will confuse CVS. I think 791c71bc7e2Stholowe need to add a call to strip_trailing_slashes in root.c 792c71bc7e2Stholo(parse_cvsroot), but I haven't considered all of the ramifications. 793*43c1707eStholo 794*43c1707eStholo197. Analyze the difference between CVS_UNLINK & unlink_file. As far as I 795*43c1707eStholocan tell, unlink_file aborts in noexec mode and CVS_UNLINK does not. I'm not 796*43c1707eStholosure it would be possible to remove even the use of temp files in noexec mode, 797*43c1707eStholobut most unlinks should probably be using unlink_file and not CVS_UNLINK. 798*43c1707eStholo 799*43c1707eStholo198. Remove references to deprecated cvs_temp_name function. 800*43c1707eStholo 801*43c1707eStholo199. Add test for login & logout functionality, including support for 802*43c1707eStholobackwards compatibility with old CVSROOTs. 803*43c1707eStholo 804*43c1707eStholo200. Make a 'cvs add' without write access a non-fatal error so that the 805*43c1707eStholouser's Entries file is updated and future 'cvs diffs' will work properly. This 806*43c1707eStholoshould ease patch submission. 807*43c1707eStholo 808*43c1707eStholo201. cvs_temp_file should be creating temporary files in a privately owned 809*43c1707eStholosubdirectory of of temp due to security issues on some systems. 810*43c1707eStholo 811*43c1707eStholo** 812*43c1707eStholo202. Merge most of the diff & rdiff code. Enable rdiff to accept most diff 813*43c1707eStholooptions. Make rdiff output look like diff's. Make diff garbage go to stderr 814*43c1707eStholoand only standard diff output go to stdout. 815*43c1707eStholo** In progress - DRP 816