xref: /openbsd/gnu/usr.bin/cvs/TODO (revision 43c1707e)
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