Commits

Anonymous committed e84daed

Created

  • Participants
  • Tags xemacs

Comments (0)

Files changed (15)

+1998-01-12  SL Baur  <steve@altair.xemacs.org>
+
+	* Makefile: Update to newer package interface.
+
+1998-01-03  SL Baur  <steve@altair.xemacs.org>
+
+	* Makefile: Update to newer package interface.
+
+1997-10-09  SL Baur  <steve@altair.xemacs.org>
+
+	* pcl-cvs.el (cvs-changelog-ours-p): Grok new ChangeLog format.
+
+1997-08-28  SL Baur  <steve@altair.xemacs.org>
+
+	* pcl-cvs.el (cvs-changelog-ours-p): correct for drift in
+	`user-full-name' semantics.
+
+Fri May  2 20:04:35 1997  Steven L Baur  <steve@altair.xemacs.org>
+
+	* pcl-cvs.el (cvs-update): Inhibit dialog box usage in call to
+	cvs-do-update as this bombs when this function is invoked from a
+	menu.
+
+Wed Mar 19 23:25:26 1997  Steven L Baur  <steve@altair.xemacs.org>
+
+	* pcl-cvs.el (cvs-changelog-ours-p): Use function.
+
+Sat Dec 21 22:37:37 1996  Neal Becker  <neal@ctd.comsat.com>
+
+	* pcl-cvs.el: Synched with pcl-cvs.el from cvs-1.9.
+
+Tue Jan 23 13:02:24 1996  Greg A. Woods  <woods@most.weird.com>
+
+	* pcl-cvs.el (pcl-cvs-bugs-address): change the default address
+	as suggested by Per Cederqvist.
+	* pcl-cvs.el: removed comments refering to Signum, etc.
+
+Sun Jan 21 12:51:12 1996  Greg A. Woods  <woods@most.weird.com>
+
+	* pcl-cvs.el (cvs-parse-stderr): fix typo (missing '\') that was
+	causing occasional un-reported, un-traced, failures that simply
+	said something like "RE missing '\(' or '\\('" -- hopefully this
+	is the last such bug!
+
+Tue Jan 16 13:57:16 1996  Jim Kingdon  <kingdon@harvey.cyclic.com>
+
+	* Makefile.in: Rename "dist" target back to "dist-dir".  The
+	latter is what actually gets used.
+	(pcl-cvs.dvi): Restore srcdir to pcl-cvs.texinfo.  Fix typo
+	(pcl-cvs.texifo -> pcl-cvs.texinfo).
+	(TEXINDEX,TEX,SET_TEXINPUTS): New variables.
+	(.el.elc): Copy .el file to build dir so .elc file gets put there.
+	(dist-dir): Fix typo (cvs.info -> pcl-cvs.info).
+	* cookie.el: New file, copied from elib 1.0.
+	* README: Remove note about requiring elib; it claimed that CVS
+	contained a copy of elib, but it lied.
+	* pcl-cvs.el: Change (require 'cookie) to (load "cookie.el").
+	* pcl-cvs-lucid.el: Change (require 'pcl-cvs) to (load "pcl-cvs.el").
+
+Fri Jan 12 10:32:14 1996  Greg A. Woods  <woods@most.weird.com>
+
+	* pcl-cvs.elc, pcl-cvs-lucid.elc: removed
+
+	* pcl-cvs.el: run through the spell checker...
+	- noted some free variables in comments
+	(cvs-inhibit-copyright-message): move this above
+	cvs-startup-message to keep the compiler quiet
+
+	* compile-all.el: removed (use make for dependency checking!)
+
+	* Makefile.in: tweak various comments and echo messages...
+	(elcfiles): removed this target.
+	(.SUFFIXES, .el.elc): added support for elisp files.
+	(CORE): new macro -- list of files all .elc depend on [still empty]
+	(BATCHFLAGS): new macro -- flags to pass to emacs
+	(OBJDIR_DISTFILES): added ELCFILES to be shipped in distribution
+
+	* README: fix the RCS Id.
+
+	* INSTALL: re-copy formatted makeinfo output from pcl-cvs.info,
+	just to keep everything in proper synchronisation.
+
+	* pcl-cvs.texinfo (Pcl-cvs installation): update to match Karl's
+	new wording from INSTALL.
+
+Wed Jan 10 22:04:35 1996  Karl Fogel  <kfogel@floss.red-bean.com>
+
+        * INSTALL: make first item read a little more smoothly.
+
+        * README: note that pcl-cvs has been tested under 19.30.
+
+Wed Jan 10 17:59:00 1996  Greg A. Woods  <woods@most.weird.com>
+
+	* ChangeLog.woods: these are changes integrated in from my
+	own pcl-cvs repository module, and based on the original PCL-CVS
+	Version 1.05 release.  They include most, if not all, of the
+	changes from the Cygnus and Cyclic CVS contrib versions of
+	PCL-CVS (i.e. the changes noted below).
+
+Sat Dec 30 15:01:45 1995  Karl Fogel  <kfogel@floss.cyclic.com>
+
+        * pcl-cvs.el (cvs-changelog-ours-p): check that
+        `add-log-full-name' and `add-log-mailing-address' are non-nil, in
+        addition to checking that they are boundp.
+        
+Thu Dec 21 16:45:48 1995  Karl Fogel  <kfogel@occs.cs.oberlin.edu>
+
+        * pcl-cvs.el (cvs-parse-stderr): ignore kerberos connection
+        failure, since CVS will automatically try rsh next.  I think this
+        is okay because if a person needs to know that kerberos failed,
+        then chances are the rsh failed too, and *that* error message will
+        clue them in that something's afoot.
+
+Wed Nov 22 11:01:50 1995  Joshua Cowan <jcowan@hermit.reslife.okstate.edu>
+
+        * pcl-cvs.el (cvs-changelog-ours-p): use `user-full-name' if
+        `add-log-full-name' unbound, as not every uses the stuff in
+        add-log.el.  Same with `add-log-mailing-address'.
+        (cvs-changelog-entries): change to `change-log-mode' unless
+        already in it.
+
+Sun Jul  9 20:57:11 1995  Karl Fogel  <kfogel@floss.cyclic.com>
+
+        * "/bin/rmdir" as default, not "/usr/local/bin/rmdir".
+
+Fri Jun 16 15:24:34 1995  Jim Kingdon  (kingdon@cyclic.com)
+
+	* pcl-cvs.elc, pcl-cvs-lucid.elc: Added.
+
+	* Makefile.in: Rename from Makefile and set srcdir.
+
+Thu May 18 17:10:27 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+
+        Automatically guess CVS log entries from ChangeLog contents.
+	* pcl-cvs.el (cvs-mode-changelog-commit): New command.
+	(cvs-changelog-full-paragraphs): New variable.
+	(cvs-changelog-name, cvs-narrow-changelog,
+	cvs-changelog-paragraph, cvs-changelog-subparagraph,
+	cvs-changelog-entry, cvs-changelog-ours-p, cvs-relative-path,
+	cvs-changelog-entries, cvs-changelog-insert-entries, cvs-union,
+	cvs-insert-changelog-entries, cvs-edit-delete-common-indentation):
+	New functions.
+	(cvs-mode-map): Bind 'C' to cvs-mode-changelog-commit.
+	(cvs-mode): Mention cvs-mode-changelog-commit in docstring.
+
+        Give the info files names ending in ".info".
+	* Makefile (INFOFILES, install_info): Change pcl-cvs to
+	pcl-cvs.info.
+	(pcl-cvs.info): Target renamed from pcl-cvs.
+	(DISTFILES): pcl-cvs removed; we handle the info files explicitly
+	in the dist-dir target.
+	(dist-dir): Depend on pcl-cvs.info.  Distribute pcl-cvs.info*.
+	* pcl-cvs.texinfo: Change @setfilename appropriately.
+	* INSTALL: Updated.
+	* .cvsignore: Correctly ignore the info files.
+
+	* README: Note that pcl-cvs has been tested under 19.28, and that
+	the "cookie" naming conflict was resolved in 19.11.
+
+	* Makefile (pcl-cvs-lucid.elc): Changed this target from
+	pcl-cvs-lucid.el.  That's a source file, for goodness' sake!
+
+Tue May  9 13:56:50 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+
+	* Change references to "Cygnus's remote CVS" to "Cyclic CVS".
+
+Wed May  3 13:55:27 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+
+	* pcl-cvs.el (cvs-parse-stderr): Handle colons after both
+	"rcsmerge" and "warning".
+
+Fri Apr 28 22:38:14 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+
+        * Makefile (ELFILES): Include pcl-cvs-startup.el.
+	(info, pcl-cvs): Call makeinfo appropriately for modern versions.
+	(pcl-cvs.aux): List dependency on pcl-cvs.texinfo.
+	(pcl-cvs.ps): New target.
+	(DVIPS): New variable.
+	(dist-dir): Renamed from dist, updated to accept DISTDIR value
+	passed from parent.
+	(DISTFILES): New varible.
+	(pcl-cvs.elc, pcl-cvs-lucid.elc): Add targets to elcfiles target.
+
+Tue Apr 25 21:33:49 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+
+	* pcl-cvs.el: (cvs-parse-stderr): Recognize "conflicts" as well as
+	"overlaps" before "during merge."
+
+Thu Feb 16 12:17:20 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+
+	* pcl-cvs.el (cvs-parse-stderr): Recognize "conflicts found in..."
+	messages attributed to "cvs server", as well as "cvs update".
+
+Sat Feb  4 01:47:01 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+
+	* pcl-cvs.el: Deal with the 'P' action, produced by remote CVS.
+	(cvs-parse-stdout): Treat 'P' like 'U' --- file is updated.
+
+Tue Jan 31 23:31:39 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+
+	* pcl-cvs.el (cvs-cvsroot-required): New variable.
+	(cvs-do-update): If cvs-cvsroot-required is not set, don't complain if
+	CVSROOT and cvs-cvsroot are both unset.
+
+Sun Jan 22 21:22:22 1995  Jim Blandy  <jimb@totoro.bio.indiana.edu>
+
+	* pcl-cvs.el (cvs-parse-stderr):
+	Some changes for Cygnus's Remote CVS.  Treat
+	messages like "cvs server: Updating DIRECTORY" as we treat those like
+	"cvs update: Updating DIRECTORY".  Ignore other messages starting with
+	"cvs server".
+
+	* pcl-cvs.el (cvs-parse-stderr): Re-indent.
+
+	* .cvsignore: Add ignore list for Texinfo litter.
+
+	* Makefile (lispdir): Set appropriately for totoro.
+	* pcl-cvs.el (cvs-program, cvs-diff-program, cvs-rmdir-program): Same.
+
+Tue Jun  1 00:00:03 1993  Per Cederqvist  (ceder@lysator.liu.se)
+
+	* Release 1.05. (This release was promised before the end of May,
+	but I didn't quite make it.  No, I didn't fake the date above).
+
+Mon May 31 01:32:25 1993  Per Cederqvist  (ceder@lysator.liu.se)
+
+	* Removed the elib sub-directory. Users must now get the Elib
+	library separately.
+	* pcl-cvs.texinfo: Document it.
+
+	* pcl-cvs-lucid.el: A new version, supplied by Jamie Zawinsky,
+	added.
+
+	* pcl-cvs Id 68: Transform RCS keywords
+	* Makefile (pcl-cvs-$(VER)): Remove the $ signs in most files in
+	the distribution.
+
+	* pcl-cvs Id 76: Extra " in cvs-mode-add.
+	* pcl-cvs.el (cvs-mode-add): Don't add the extra level of quotes
+	around the log message, since it doesn't work with CVS.
+
+	* pcl-cvs Id 56: '-d <CVSROOT>' support in pcl-cvs
+	* pcl-cvs.el (cvs-change-cvsroot): New function.
+
+	* pcl-cvs Id 77: *cvs* isn't cleared properly
+	* pcl-cvs.el (cvs-do-update): Always erase the *cvs* buffer and
+	re-create the collection.
+
+	* pcl-cvs.el (cvs-do-update): Set mode-line-process in the *cvs*
+	buffer.
+	* pcl-cvs.el (cvs-mode): Reset mode-line-process.
+
+	* pcl-cvs Id 59: sort .cvsignore alphabetically!
+	* pcl-cvs.el (cvs-sort-ignore-file): New variable.
+	* pcl-cvs.el (cvs-mode-ignore): Use it.
+	* pcl-cvs.texinfo: Document it.
+
+	* pcl-cvs Id 75: Require final newline.
+	* pcl-cvs.el (cvs-commit-buffer-require-final-newline): New
+	variable.
+	* pcl-cvs.el (cvs-edit-done): Use it.
+	* pcl-cvs.texinfo: Document it.
+
+	* pcl-cvs Id 72: make clean deletes lucid-emacs.el
+	* dist-makefile (ELCFILES): Fixed a typo.
+
+	* pcl-cvs Id 46: "cvs remove f" "touch f" "cvs update f" -> parse err.
+	* pcl-cvs.el (cvs-fileinfo->type): New type: REM-EXIST.
+	* pcl-cvs.el (cvs-shadow-entry-p): A REMOVED that follows a
+	REM-EXIST is a shadow.
+	* pcl-cvs.el (cvs-parse-stderr): Recognize the "should be removed
+	and is still there" message.
+	* pcl-cvs.el (cvs-pp): Recognize REM-EXIST.
+	* pcl-cvs.el (cvs-mode-undo-local-changes): Recognize and complain
+	about REM-EXIST.  Defensive test added: complain about unknown types.
+
+	* pcl-cvs.el (cvs-mode-add): Add an extra level of quotes around
+	the log message. This is apparently needed by RCVS. <This change
+	has been removed. --ceder>.
+
+	* pcl-cvs.el (cvs-parse-stderr): Ignore output from RCVS.
+
+Tue Apr 27 00:48:40 1993  Per Cederqvist  (ceder@lysator.liu.se)
+
+	* pcl-cvs.el (cvs-startup-message): Now a defconst instead of a
+	defvar.
+	* pcl-cvs.el (cvs-mode-commit): Add a defvar for it.
+
+	* dist-makefile (EMACS): Use $(EMACS) instead of hard-coding 'emacs'.
+
+Sat Apr 17 12:47:10 1993  Per Cederqvist  (ceder@lysator.liu.se)
+
+	* Release 1.04.
+
+	* pcl-cvs.texinfo: Updated the Contributors node.
+
+	* pcl-cvs Id 58: Lucid GNU Emacs support
+	* pcl-cvs-lucid.el: New file, contributed by the people at Lucid.
+	* pcl-cvs.el: Autoload pcl-cvs-lucid if running in an Lucid GNU
+	Emacs.
+	* compile-all.el: (files-to-compile): Add pcl-cvs-lucid.
+	* dist-makefile (ELFILES, ELCFILES): Dito.
+
+	* pcl-cvs Id 55: cvs-diff-backup swaps old and new version.
+	* pcl-cvs.el (cvs-diff-backup-extractor): Old version should be
+	first.
+	* pcl-cvs.el (cvs-mode-diff-backup): Call cvs-backup-diffable
+	correctly.
+
+	* pcl-cvs Id 64: elib substitute
+	* dist-makefile (install): Warn about Elib.
+	* pcl-cvs.texinfo: Talk about Elib.
+
+	* pcl-cvs Id 50: Committing the *commit* buffer twice.
+	* pcl-cvs.el (cvs-edit-done): Report an error if cvs-commit-list
+	is empty, and empty it when the commit is done.
+
+	* pcl-cvs Id 56: '-d <CVSROOT>' support.
+	* pcl-cvs.el (cvs-cvsroot): New variable.
+	* pcl-cvs.el (cvs-do-update, all callers of cvs-execute-list): Use
+	it everywhere CVS is called, to override CVSROOT.
+	* pcl-cvs.texinfo (Customization): Document it.
+
+Thu Apr  1 00:34:55 1993  Per Cederqvist  (ceder@lysator.liu.se)
+
+	* pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): Exit status nil
+	  from call-process means everything was successful in some Emacs
+	  versions.
+
+	* pcl-cvs.el (cvs-mode-map): Bind "q" to bury-buffer.
+	* pcl-cvs.texinfo: Document it.
+
+Thu Mar 11 00:05:03 1993  Per Cederqvist  (ceder@lysator.liu.se)
+
+	* Release 1.03-Emerge (not released).
+
+	* Makefile (pcl-cvs-$(VER)): Don't includ elib-dll-debug.el in the
+	  distribution. (It's included as elib/dll-debug.el).
+
+	* pcl-cvs.el (cvs-mode): Document the "e" key (cvs-mode-emerge).
+
+Tue Mar  9 00:02:57 1993  Per Cederqvist  (ceder@lysator.liu.se)
+
+	* pcl-cvs.texinfo (Emerge): New node.
+
+	* pcl-cvs.el (cvs-kill-buffer-visiting): New function.
+
+	* pcl-cvs.el (cvs-mode-emerge): Handle Conflict and Merged files.
+
+	* pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): Handle any revision.
+
+	* pcl-cvs.el (cvs-fileinfo-*): Store base-revision instead of
+	  backup-file.
+
+	* pcl-cvs.el (cvs-backup-diffable): The file is only diffable if
+	  the backup file is readable.
+
+	* pcl-cvs.el (cvs-mode-map): Bind "e" to cvs-mode-emerge instead
+	  of cvs-mode-find-file (which is anyhow bound to "f").
+
+Mon Mar  8 23:06:52 1993  Per Cederqvist  (ceder@lysator.liu.se)
+
+	* pcl-cvs.el (cvs-mode-emerge): New function. Currently only
+	  handles emerge of Modified files.
+
+	* pcl-cvs.el (cvs-retrieve-revision-to-tmpfile): New function.
+
+Sun Jan 24 20:07:18 1993  Per Cederqvist  (ceder@lysator.liu.se)
+
+	* elib-dll-debug.el: Moved to elib.
+
+Mon Jan 18 00:35:59 1993  Per Cederqvist  (ceder@mauritz)
+
+ 	* pcl-cvs.el (cvs-do-update): Added a probably unnecessary sit-for.
+
+	* Release 1.03-Elib-0.05.1 (not released).
+
+        * Elib 0.05 compatibility:
+	* elib-dll-debug.el, pcl-cvs-buffer.el, test-dll.el: Fix the
+	  require strings.
+	* pcl-cvs.el (cvs-pp): Insert the string.
+
+	* Release 1.03-Elib-0.05 (not released).
+
+	* elib: New directory, containing the parts of elib that are
+	  required for pcl-cvs. Changes to the files in that directory
+	  that are present in Elib are documented in the ChangeLog of
+	  Elib, not here.
+	* Makefile (pcl-cvs-$(VER)): Copy the new dir to the distribution.
+	* dist-makefile (ELFILES, ELCFILES): Don't include the Elib files.
+
+Fri Jan  8 02:43:49 1993  Per Cederqvist  (ceder@konrad)
+
+	* pcl-cvs.el (cvs-mode-map): Bind "e" to cvs-mode-find-file, like
+	in dired.
+
+Sun Jan  3 23:25:13 1993  Per Cederqvist  (ceder@konrad)
+
+	* elib-dll.el, elib-node.el, cookie.el: Moved to the elib package.
+	  Pcl-cvs now requires elib.
+
+Tue Dec 29 22:06:57 1992  Per Cederqvist  (ceder@konrad)
+
+	* pcl-cvs.el: Tracked the latest (last?) rename of all functions
+	  in cookie.el.
+
+Thu Sep 24 00:29:16 1992  Per Cederqvist  (ceder@robert)
+
+	* pcl-cvs.texinfo (Archives): This version is not distributed with
+	CVS 1.3, so don't claim that it is.
+
+Fri Aug 21 15:17:08 1992  Per Cederqvist  (ceder@maskros)
+
+	* pcl-cvs.el (cvs-parse-stderr): Fixed two "(set head" that should
+	be "(setq head".
+
+Thu Aug 20 05:53:58 1992  Per Cederqvist  (ceder@robin)
+
+	* cookie.el: Changes to this file is documented in the ChangeLog
+	  of elib in the future.
+
+Tue Aug 18 03:30:28 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el: Don't use cookie-last-tin (which no longer exists).
+
+	* cookie.el: Use prefix cookie:: for internal functions.
+
+	* cookie.el: (cookie:enter-after, cookie:enter-before,
+	cookie:nth-cookie): Implemented.
+	* cookie.el: No longer define (impl).
+
+	* cookie.el: More renames:
+	  cookie:next-cookie     -> cookie:goto-next-tin
+	  cookie:previous-cookie -> cookie:goto-previous-tin
+	  tin-next		 -> cookie:next-tin
+	  tin-previous		 -> cookie:previous-tin
+	  tin-nth		 -> cookie:nth-tin
+	  tin-delete		 -> cookie:delete-tin
+	  cookie:collect	 -> cookie:collect-cookies
+	  cookie:tin-collect	 -> cookie:collect-tins
+	  (new)			 -> cookie:tin-collect-cookies
+	  (new)			 -> cookie:tin-collect-tins
+	  cookie:refresh	 -> cookie:refresh-all
+	  tin-invalidate-tins	 -> cookie:invalidate-tins
+
+Mon Aug 17 01:39:49 1992  Per Cederqvist  (ceder@robin)
+
+	* cookie.el (cookie:set-buffer-bind-dll-let*): New macro. Used in
+	many places instead of cookie:set-buffer-bind-dll.
+	* cookie.el (cookie:set-buffer-bind-dll): Renamed the macro
+	cookie:set-buffer to this.
+
+	* pcl-cvs.el (cvs-use-temp-buffer): Set default-directory.
+
+Sun Aug 16 20:51:30 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el (cvs-add-sub): Fixed call to cvs-add-file-update-buffer.
+
+Sat Aug  8 20:28:21 1992  Per Cederqvist  (ceder@robin)
+
+	* Release 1.03-Cookie-II (not released).
+
+	* pcl-cvs.el (cvs-mode-diff-cvs): Don't care about the exit status
+	from ``cvs diff''.
+
+	* pcl-cvs.el (cvs-mode): Document cvs-mode-undo-local-changes.
+	* pcl-cvs.el (cvs-diffable): New function.
+
+	* pcl-cvs.el: Use the new cookie package.
+	* pcl-cvs.el (cvs-cookie-handle): New variable.
+	* pcl-cvs.el (cvs-do-update): User the new cookie:create
+	interface, and cookie:clear if the buffer already existed. Make
+	the buffer read-only.
+	* pcl-cvs.el (cvs-mode-next-line, cvs-mode-previous-line): New
+	functions (used instead of cookie:next-cookie and
+	cookie:previous-cookie).
+
+	* cookie.el: Major redesign. The handle that is passed to all
+	cookie functions is now a new datatype, and not the buffer that
+	the cookies resides in. This way it is possible to have more than
+	one set of cookies in a buffer. Things that used to be
+	buffer-local variables are now fields in the handle data type.
+	cookie-last-tin is no longer available.
+	* cookie.el (cookie:create): The buffer is not cleared, nor set to
+	be read-only.
+	* cookie.el (cookie:next-cookie, cookie:previous-cookie): Since
+	the first argument is now a handle and not a buffer, these can no
+	longer be called interactively. You have to write a small wrapper
+	about them.
+	* cookie.el (cookie:buffer): New function.
+
+Tue Aug  4 03:02:25 1992  Per Cederqvist  (ceder@robert)
+
+	* pcl-cvs.texinfo (Bugs): Renamed "Reporting bugs and ideas" to
+	"Bugs" and added a table of known bugs/FAQ:s.
+
+Mon Aug  3 00:19:39 1992  Per Cederqvist  (ceder@robert)
+
+	* pcl-cvs.el, pcl-cvs.texinfo: Big Renaming Time!
+	  The commands that operate in the *cvs* buffer:
+	      cvs-add-change-log-entry-other-window  -> cvs-mode-add-change-log-entry-other-window
+              cvs-mark-all-files     	 -> cvs-mode-mark-all-files
+	      cvs-revert-updated-buffers -> cvs-mode-revert-updated-buffers
+	      cvs-undo-local-changes	 -> cvs-mode-undo-local-changes
+	      cvs-unmark-up		 -> cvs-mode-unmark-up
+	      cvs-acknowledge		 -> cvs-mode-acknowledge
+	      cvs-unmark-all-files	 -> cvs-mode-unmark-all-files
+	      cvs-add			 -> cvs-mode-add
+	      cvs-diff-backup		 -> cvs-mode-diff-backup
+	      cvs-commit		 -> cvs-mode-commit
+	      cvs-diff-cvs		 -> cvs-mode-diff-cvs
+	      cvs-find-file		 -> cvs-mode-find-file
+	      cvs-update-no-prompt	 -> cvs-mode-update-no-prompt
+	      cvs-ignore		 -> cvs-mode-ignore
+	      cvs-log			 -> cvs-mode-log
+	      cvs-mark			 -> cvs-mode-mark
+	      cvs-find-file-other-window -> cvs-mode-find-file-other-window
+	      cvs-remove-file		 -> cvs-mode-remove-file
+	      cvs-status		 -> cvs-mode-status
+	      cvs-remove-handled	 -> cvs-mode-remove-handled
+	      cvs-unmark		 -> cvs-mode-unmark
+
+	* pcl-cvs.el (cvs-cvs-diff-flags): Variable deleted.
+	* pcl-cvs.el (cvs-diff-cvs): Use cvs-diff-flags instead.
+	* pcl-cvs.texinfo (Customization): Update the doc.
+
+	* pcl-cvs.el (cvs-diff-cvs): Handle exit status 0 (no diffs), 1
+	(diffs) and other (error).
+	* pcl-cvs.el (cvs-execute-list): Add support for this kind of
+	thing.
+
+	* Revert buffers for committed files:
+	* pcl-cvs.el (cvs-auto-revert-after-commit): New variable.
+	* pcl-cvs.texinfo (Committing changes, Customization): Document
+	it.
+	* pcl-cvs.el (cvs-after-commit-function): New function.
+
+	* pcl-cvs.el (cvs-execute-list): Return the exit status or nil.
+	* pcl-cvs.el (cvs-edit-done, cvs-diff-cvs, cvs-remove-file,
+	cvs-undo-local-changes, cvs-add, cvs-status, cvs-log): Use the
+	exit status to generate an error message.
+
+
+	* pcl-cvs.el (cvs-do-update): It should be "cvs -n update -l", not
+	"cvs -l update -n". Put the -n and/or -l in the message that is
+	displayed in the *cvs* buffer during the update.
+
+Sat Aug  1 00:55:49 1992  Per Cederqvist  (ceder@robert)
+
+	* cookie.el (cookie-sort): New function.
+
+	* cookie.el (cookie-clear): Rewritten. No longer clears all local
+	variables.
+
+Tue Jul 28 17:21:17 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el (cvs-parse-stderr): Try to handle the output from RCS
+	when it is compiled without DIFF3_BIN and a conflict occurs.
+
+	* pcl-cvs.texinfo (Getting Started): Fixed typo.
+
+	* pcl-cvs-startup.el (cvs-update-other-window): Make the autoload
+	be interactive.
+
+Mon Jul 27 19:36:40 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el (cvs-revert-updated-buffers, cvs-revert-fileinfo):
+	New functions.
+	* pcl-cvs.texinfo (Reverting your buffers): Document it.
+
+	* pcl-cvs.el (cvs-fileinfo->full-path): New function.
+	* pcl-cvs.el (cvs-full-path): Use it.
+
+	* cookie.el (cookie-map, cookie-map-reverse): Better doc-
+	string. Removed the unused local variable 'result'.
+
+	* compile-all.el: Renamed elib-files to files-to-compare.
+	* compile-all.el (compile-pcl-cvs): Bind load-path in a let
+	statement instead of globally.
+
+Thu Jul 23 19:02:41 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el (cvs-do-update): Check that CVSROOT is set.
+	* pcl-cvs.el (cvs-diff-cvs): Check that cvs-cvs-diff-flags is a
+	list.
+	* pcl-cvs.el (cvs-diff-backup): Check that cvs-diff-flags is a
+	list.
+
+Tue Jul 21 11:27:39 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el (cvs-parse-error): Make the *cvs* buffer writeable
+	before trying to write the email message. Require sendmail before
+	trying to switch to mail-mode.
+
+	* pcl-cvs.el (cvs-do-update): Check that cvs-program exists.
+
+	* pcl-cvs.el (cvs-skip-line): Fixed bracketing error.
+
+Mon Jul 20 10:31:51 1992  Per Cederqvist  (ceder@robin)
+
+	* Release 1.03.
+
+	* pcl-cvs.el, cookie.el: Indentation fixes.
+
+	* Makefile (pcl-cvs-$(VER)): Include NEWS in the distribution.
+
+	* pcl-cvs.el (cvs-rm-program): Deleted.
+	* pcl-cvs.el (cvs-rmdir-program, cvs-lock-file): New variables.
+
+	* Handle lock files in a nicer way:
+	* pcl-cvs.el (cvs-update-filter, cvs-delete-lock,
+	cvs-lock-file-p): New functions.
+	* pcl-cvs.el (cvs-do-update, cvs-sentinel): Redirect stdout to the
+	temporary file, not stderr. Use cvs-update-filter.
+	* pcl-cvs.el (cvs-parse-update): New arguments.
+	* pcl-cvs.el (cvs-parse-buffer): Renamed to cvs-parse-update.
+	* pcl-cvs.el (cvs-stderr-file): Renamed to cvs-stdout-file.
+	* pcl-cvs.texinfo (Miscellaneous commands, Updating the
+	directory): Document cvs-delete-lock.
+
+	* pcl-cvs.el (cvs-mode): Don't reset buffer-read-only.
+
+	* pcl-cvs.el (cvs-find-file-other-window): Don't save-some-buffers.
+
+Thu Jul 16 00:19:58 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el, test-cookie-el: Use the new names from cookie.el.
+
+	* cookie.el: Big Renaming Time!
+	  External functions:
+	      cookie-next     	      ->  tin-next
+	      cookie-previous	      ->  tin-previous
+	      cookie-nth	      ->  tin-nth
+	      cookie-delete	      ->  tin-delete
+	      cookie-filter-tins      ->  tin-filter
+	      cookie-get-selection    ->  tin-get-selection
+	      cookie-start-marker     ->  tin-start-marker
+	      cookie-end-marker       ->  tin-end-marker
+	      cookie-invalidate-tins  ->  tin-invalidate-tins
+	      cookie-collect-tins     ->  tin-collect
+	      cookie-collect-cookies  ->  cookie-collect
+	  Internal functions:
+	      cookie-create-tin            ->  cookie-create-wrapper
+	      cookie-tin-start-marker      ->  cookie-wrapper-start-marker
+	      cookie-tin-cookie-safe       ->  cookie-wrapper-cookie-safe
+	      cookie-tin-cookie            ->  cookie-wrapper-cookie
+	      set-cookie-tin-start-marker  ->  cookie-wrapper-set-start-marker
+	      set-cookie-tin-cookie	   ->  cookie-wrapper-set-cookie
+	      cookie-tin-p		   ->  cookie-wrapper-p
+	      cookie-create-tin-and-insert ->  cookie-create-wrapper-and-insert
+
+	* pcl-cvs.el (cvs-find-file, cvs-find-file-other-window): Signal
+	an appropriate error message if the *cvs* buffer is empty.
+
+	* cookie.el (cookie-create): Make the buffer read-only.
+	* cookie.el (cookie-create-tin-and-insert, cookie-refresh,
+	cookie-delete-tin-internal, cookie-refresh-tin): Bind
+	buffer-read-only to nil while changing the contents of 
+	the buffer.
+
+	* pcl-cvs.el (cvs-byte-compile-files): New function.
+	* pcl-cvs.texinfo (Miscellaneous commands): Document it.
+
+	* pcl-cvs.el (cvs-diff-ignore-marks): New variable.
+	* pcl-cvs.el (cvs-diff-cvs, cvs-diff-backup): Don't consider
+	marked files to be selected if a prefix argument is given XOR the
+	variable cvs-diff-ignore-marks is non-nil.
+	* pcl-cvs.el (cvs-get-marked): New optional argument `ignore-marks'.
+	* pcl-cvs.texinfo (Customization, Viewing differences): Document
+	this behaviour.
+
+	* pcl-cvs.el (cvs-undo-local-changes): New function.
+	* pcl-cvs.texinfo (Undoing changes): Document
+	cvs-undo-local-changes.
+	* pcl-cvs.el (cvs-mode-map): cvs-unmark-all-files moved from "U"
+	to "ESC DEL".  cvs-undo-local-changes bound to "U".
+	* pcl-cvs.texinfo (Marking files): Document ESC DEL.
+
+	* pcl-cvs.el (cvs-skip-line): New arguments. All callers updated.
+	Now calls cvs-parse-error if a parse error occurs.
+	* pcl-cvs.el (cvs-parse-error): New function that creates a bug
+	report.
+	* pcl-cvs.el (cvs-parse-stderr, cvs-parse-stdout): New arguments.
+	The only caller (cvs-parse-buffer) updated. Call cvs-parse-error
+	in case of parse error.
+
+	* pcl-cvs.el (pcl-cvs-version): New variable.
+
+	* cookie.el (cookie-create): Kill all local variables in the buffer.
+
+Fri Jul 10 11:17:40 1992  Per Cederqvist  (ceder@robin)
+
+	* Release 1.03beta1.
+
+Thu Jul  9 03:12:00 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el (cvs-update-running): New variable.
+	* pcl-cvs.el (cvs-do-update): Use it instead of the previous local
+	variable cvs-process (that no longer exists).  Make sure that only
+	one `cvs update' runs at any given moment.
+	* pcl-cvs.el (cvs-sentinel): Reset cvs-update-running when the
+	update process exits.
+
+	* pcl-cvs.el (cvs-update): Switch to the *cvs* buffer.
+	* pcl-cvs.el (cvs-update-other-window): New function.
+	* pcl-cvs-startup.el (cvs-update-other-window): Added a autoload
+	for it.
+	* pcl-cvs.el (cvs-do-update): Don't pop up any buffer in a window
+	- let cvs-update or cvs-update-other-window handle that.  Also
+	don't kill the *cvs* buffer, but rather insert a "Running cvs..."
+	message into it.
+	* pcl-cvs.el (cvs-parse-buffer): Don't change the window
+	configuration.
+
+	* pcl-cvs.el (cvs-create-fileinfo, cvs-pp, cvs-fileninfo->type):
+	New type for a fileinfo: MESSAGE.
+
+	* pcl-cvs.el (cvs-cvs-buffer): Deleted the variable. Use
+	cvs-buffer-name instead. (I no longer have any plans to allow more
+	than one cvs update to run at the same time - things only get
+	confusing). Changed all places where cvs-cvs-buffer was used.
+
+	* pcl-cvs.el: Take care of update programs (the -u option in the
+	modules file):
+	* pcl-cvs.el (cvs-update-prog-output-skip-regexp): New variable.
+	* pcl-cvs.el (cvs-parse-stdout): Skip output from the update
+	program (using cvs-update-prog-output-skip-regexp).
+	* pcl-cvs.texinfo (Future enhancements): Document that the
+	solution is not as good as it should be.
+	* pcl-cvs.texinfo (Customization): Document the variable.
+
+Wed Jul  8 20:29:44 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el (cvs-do-update): Check that this-dir really exists
+	and is a directory, and that this-dir/CVS exists and is a
+	directory.
+
+Tue Jul  7 01:02:24 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.texinfo (Customization): Document TMPDIR.
+
+	* This chunk of modifications should make it possible to run
+	pcl-cvs on hosts that do not line-buffer stdout (such as
+	DECstation).  They work by diverting stdout and stderr from 
+	`cvs update' and later sorting them together.
+	* pcl-cvs.el (cvs-parse-stderr): Don't fail to parse conflict
+	data.
+        * pcl-cvs.el (cvs-remove-stdout-shadows, cvs-shadow-entry-p): New
+	functions.
+	* pcl-cvs.el (cvs-parse-buffer): Use it.
+	* pcl-cvs.el (cvs-remove-empty-directories): New function.
+	* pcl-cvs.el (cvs-remove-handled, cvs-parse-buffer): Use it.
+	* pcl-cvs.el (cvs-get-current-dir): New argument ROOT-DIR. All
+	calls to cvs-get-current-dir updated.
+	* pcl-cvs.el (cvs-do-update): Allocate a tmp file. Use cvs-shell
+	(typically /bin/sh) to redirect stderr from CVS to the tmp file.
+	* pcl-cvs.el (cvs-sentinel): Handle the tmp file. Remove it when
+	it is parsed.
+	* pcl-cvs.el (cvs-parse-buffer): New argument STDERR-BUFFER. All
+	calls to cvs-parse-buffer updated. Rewritten to handle the
+	separation of stderr and stdout.
+	* pcl-cvs.el (cvs-shell, cvs-stderr-file): New variables.
+	* pcl-cvs.el (cvs-compare-fileinfos, cvs-parse-stderr,
+	cvs-parse-stdout): New functions.
+
+	* pcl-cvs.el (cvs-parse-buffer): Some modifications for output
+	from RCS 5.6.
+
+Tue Apr  7 09:11:27 1992  Per Cederqvist  (ceder@leopold)
+
+	* Release 1.02.
+
+	* pcl-cvs.el (cvs-diff-backup, cvs-edit-done, cvs-status): Call
+	save-some-buffers.
+
+	* pcl-cvs.el (cvs-diff-backup-extractor): Fixed syntax error.
+
+	* Makefile, README, compile-all.el, dist-makefile, pcl-cvs.el,
+	pcl-cvs.texinfo (XXRELEASEXX): A magic string that is substituted
+	for the current release number when a distribution is made.
+	(Release 1.01 says that it is release 1.00).
+
+	* pcl-cvs.el (cvs-find-file): Added missing pair of parenthesis.
+
+Mon Mar 30 14:25:26 1992  Per Cederqvist  (ceder@leopold)
+
+	* Release 1.01.
+
+	* pcl-cvs.el (cvs-parse-buffer): The message when waiting for a
+	lock has been changed.
+
+Sun Mar 29 05:29:57 1992  Per Cederqvist  (ceder@leopold)
+
+	* Release 1.00.
+
+	* pcl-cvs.el (cvs-do-update, cvs-sentinel, cvs-parse-buffer):
+	Major rewrite of buffer and window selection and handling.  
+	The *cvs* buffer is now killed whenever a new "cvs update" is
+	initiated.  The -update buffer is replaced with the *cvs* 
+	buffer when the update is completed.
+
+Sat Mar 28 21:03:05 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el (cvs-delete-unused-temporary-buffers): Fixed it.
+
+	* pcl-cvs.el (cvs-auto-remove-handled): New variable.
+	* pcl-cvs.el (cvs-edit-done): Use it.
+	* pcl-cvs.texinfo (Customization, Removing handled entries):
+	Document it.
+
+	* pcl-cvs.el (cvs-mode): Turn of the undo feature.  It really
+	isn't useful in a cookie buffer...
+
+	* pcl-cvs.el (cvs-edit-done): Committing a file now looks more
+	like diffing a file.  The window handling is better.
+	* pcl-cvs.el (cvs-use-temp-buffer): The &optional switch is no
+	longer needed.
+
+Mon Mar 23 00:20:33 1992  Per Cederqvist  (ceder@robin)
+
+	* Release 0.97.
+
+	* pcl-cvs.el (default-directory): Make sure it always ends in a
+	slash. fileinfo->dir does NOT end in a slash, and I had forgotten
+	to call	file-name-as-directory in various places.
+
+	* pcl-cvs.el (cvs-diff-backup-extractor): Signal an error if a
+	fileinfo without backup file is given.
+
+	* pcl-cvs.el (cvs-mode): Added documentation.
+
+	* pcl-cvs.el (cvs-execute-list): Fix the order of files in the
+	same directory.
+
+	* pcl-cvs.el (cvs-log-flags, cvs-status-flags): New variables.
+	* pcl-cvs.el (cvs-log, cvs-status): Use them.
+	* pcl-cvs.texinfo (Customization): Document them.
+
+	* pcl-cvs.el (cvs-diff-backup): Filter non-backup-diffable files
+	at an earlier stage, like cvs-commit does.
+
+	* pcl-cvs.el (cvs-diff-flags): New variable.
+	* pcl-cvs.el (cvs-diff-backup): Use it.
+	* pcl-cvs.texinfo (Customization): Document it.
+
+	* pcl-cvs.el (cvs-execute-single-file-list): Remove &rest before
+	last argument.  No callers needed updating.
+
+	* pcl-cvs.el (cvs-execute-list): Remove the &rest before the last
+	argument (constant-args).  Update all callers of cvs-execute-list
+	to use the new calling convention.
+	* pcl-cvs.el (cvs-cvs-diff-flags): Now a list of strings instead
+	of a string.
+	* pcl-cvs.texinfo (Customization): Document the change to
+	cvs-cvs-diff-flags.
+
+	* Release 0.96.
+
+	* pcl-cvs.el (cvs-cvs-diff-flags): New variable.
+	* pcl-cvs.el (cvs-diff-cvs): Use it.
+	* pcl-cvs.texinfo (Customization, Viewing differences): Document it.
+
+	* pcl-cvs.el (cvs-use-temp-buffe): Don't switch to the temporary
+	buffer.  Use display-buffer and set-buffer instead.  This way
+	cvs-log, cvs-status, cvs-diff-cvs and friends don't select the
+	temporary buffer. The cursor will remain in the *cvs* buffer.
+
+Sun Mar 22 21:50:18 1992  Per Cederqvist  (ceder@robin)
+
+	* pcl-cvs.el (cvs-find-file, cvs-find-file-other-window): Don't
+	prompt when reading in a directory in dired.
+
+	* Makefile (pcl-cvs-$(VER)): Include pcl-cvs-startup.el in the
+	distribution.
+
+	* dist-makefile (pcl-cvs.dvi): Don't fail even if texindex does
+	not exist.
+
+	* pcl-cvs.texinfo (@setchapternewpage): Changed from 'off' to 'on'.
+	* pcl-cvs.texinfo (Variable index): Joined into function index.
+	* pcl-cvs.texinfo (Key index): add a description about the key.
+	* pcl-cvs.texinfo: Many other small changes.
+
+Wed Mar 18 01:58:38 1992  Per Cederqvist  (ceder@leopold)
+
+	* Use GNU General Public License version 2.
+
+This text is copied from the TeXinfo manual for pcl-cvs.
+
+Installation of the pcl-cvs program
+===================================
+
+  1. Possibly edit the file `Makefile' to reflect the situation at your
+     site.  We say "possibly" because the version of pcl-cvs included
+     with CVS uses a configuration mechanism integrated with the overall
+     mechanisms used by the CVS build and install procedures.  Thus the
+     file `Makefile' will be generated automatically from the file
+     `Makefile.in', and it should not be necessary to edit it further.
+
+     If you do have to edit the `Makefile', the only things you have to
+     change is the definition of `lispdir' and `infodir'.  The elisp
+     files will be copied to `lispdir', and the info file(s) to
+     `infodir'.
+
+  2. Configure pcl-cvs.el
+
+     There are a couple of pathnames that you have to check to make
+     sure that they match your system.  They appear early in the file
+     `pcl-cvs.el'.
+
+     *NOTE:*  If your system is running emacs 18.57 or earlier you MUST
+     uncomment the line that says:
+          (setq delete-exited-processes nil)
+
+     Setting `delete-exited-processes' to `nil' works around a bug in
+     emacs that causes it to dump core.  The bug was fixed in emacs
+     18.58.
+
+  3. Release 1.05 and later of pcl-cvs requires parts of the Elib
+     library, version 1.0 or later.  Elib is available via anonymous
+     ftp from prep.ai.mit.edu in `pub/gnu/elib-1.0.tar.gz', and from a
+     lot of other sites that mirror prep.  Get Elib, and install it,
+     before proceeding.
+
+     *NOTE:* The version of pcl-cvs included with CVS includes a copy
+     of Elib in the sub-directory `elib' under the `contrib/pcl-cvs'
+     directory.
+
+  4. Type `make install' in the source directory.  This will
+     byte-compile all `.el' files and copy the `*.elc' files into the
+     directory you specified in step 1.
+
+     If you want to install the `*.el' files too, you can type `make
+     install-el' to do so.
+
+     If you only want to create the compiled elisp files, but don't
+     want to install them, you can type `make' without parameters.
+
+  5. Edit the file `default.el' in your emacs lisp directory (usually
+     `/usr/gnu/lib/emacs/site-lisp' or something similar) and enter the
+     contents of the file `pcl-cvs-startup.el' into it.  It contains a
+     couple of `auto-load's that facilitates the use of pcl-cvs.
+
+
+Installation of the on-line manual.
+===================================
+
+  1. Create the info file(s) `pcl-cvs.info*' from `pcl-cvs.texinfo' by
+     typing `make info'.  If you don't have the program `makeinfo' you
+     can get it by anonymous ftp from e.g. `prep.ai.mit.edu' as
+     `pub/gnu/texinfo-3.7.tar.gz' (there might be a newer version there
+     when you read this).
+
+  2. Install the info file(s) `pcl-cvs.info*' into your standard `info'
+     directory.  You should be able to do this by typing `make
+     install-info'.
+
+  3. Edit the file `dir' in the `info' directory and enter one line to
+     contain a pointer to the info file(s) `pcl-cvs.info*'.  The line
+     can, for instance, look like this:
+
+          * Pcl-cvs: (pcl-cvs).           An Emacs front-end to CVS.
+
+How to make typeset documentation from pcl-cvs.texinfo
+======================================================
+
+   If you have TeX installed at your site, you can make a typeset manual
+from `pcl-cvs.texinfo'.
+
+  1. Run TeX by typing ``make pcl-cvs.dvi''.  You will not get the
+     indices unless you have the `texindex' program.
+
+  2. Convert the resulting device independent file `pcl-cvs.dvi' to a
+     form which your printer can output and print it.  If you have a
+     postscript printer there is a program, `dvi2ps', which does.  There
+     is also a program which comes together with TeX, `dvips', which
+     you can use.
+
+
+-- 
+#ident	"@(#)cvs/contrib/pcl-cvs:$Name$Id$"
+# Makefile for PCL CVS lisp code
+
+# This file is part of XEmacs.
+
+# XEmacs is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+
+# XEmacs is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with XEmacs; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+VERSION = 1.02
+PACKAGE = pcl-cvs
+PKG_TYPE = regular
+REQUIRES = xemacs-base
+CATEGORY = prog
+
+ELCS = cookie.elc dll-debug.elc dll.elc elib-node.elc generic-sc.elc \
+	pcl-cvs-startup.elc pcl-cvs-xemacs.elc pcl-cvs.elc
+
+INFO_FILES = pcl-cvs.info*
+
+include ../../XEmacs.rules
+
+all:: $(ELCS) auto-autoloads.elc custom-load.elc $(PACKAGE).info
+
+srckit: srckit-std
+
+binkit: binkit-sourceinfo
+This is the NEWS file for pcl-cvs, an Emacs elisp front-end to CVS.
+
+User-visible changes in the un-official CVS release of pcl-cvs
+from the official 1.05 release to 1.05-CVS-$Name$:
+
+* Support for using ChangeLog files, including hooks to automatically
+  guess CVS log entries from ChangeLog contents.
+
+* Support for client/server CVS (versions 1.5 through 1.7 and newer).
+
+* New commands for tagging files and directory trees (still needs to
+  be made to run in the background).
+
+* Better support for recognizing and handling unknown directories.
+
+* An attempt at new ediff and emerge interfaces (still needs work!),
+  including attempts to make vendor-branch merging work.
+
+* In a possibly misguided attempt to make it easier to see the effects
+  of changes that affect several files, diff output is now stored in a
+  uniqe buffer for each file.
+
+* Some commands now have default flags (cvs-*-flags).
+
+* Proper quoting of command line arguments displayed in *cvs-tmp*.
+
+* More hacking with getting CVSROOT right, though probably all
+  pointless, since CVS should do the right thing all the time.
+
+* Elib is back, at least in the CVS distribution.
+
+* Lots of minor bug fixes, tweaks, cleanup, re-indentation, etc.
+
+* Some minor tweaks, fixes, re-indentation, etc., in the
+  documentation.
+
+
+User-visible changes in pcl-cvs from 1.04 to 1.05:
+
+* Elib is no longer distributed with pcl-cvs.  You must get Elib
+  separately, for instance from ftp.lysator.liu.se in pub/emacs.
+
+* The Lucid Emacs support works again.
+
+* A new function, cvs-change-cvsroot, can be used to interactively
+  switch between CVS repositories.
+
+* The mode line in the *cvs* buffer now indicates when a "cvs update"
+  is running.
+
+* The .cvsignore file is automatically sorted alphabetically (to
+  reduce the risk of conflicts when two people add different files
+  simultaneously). This behaviour can be turned off with
+  cvs-sort-ignore-file.
+
+* A trailing newline is always added in commit log messages.  This
+  behaviour can be turned off with
+  cvs-commit-buffer-require-final-newline.
+
+* This version of pcl-cvs should work together with RCVS.  I have not
+  tested this myself, though.
+
+* Plus some bug fixes.  (Note that the version of cookie.el that is
+  distributed with pcl-cvs 1.04 contains errors that affects pcl-cvs.
+  You should get Elib 0.07).
+
+
+User-visible changes in pcl-cvs from 1.03 to 1.04:
+
+* Support for Emerge.  Hitting "e" on a file that is Modified, Merged
+  or in Conflict will start Emerge, an interactive file merger written
+  in Emacs Lisp.  This requires Emerge version 4.  Emerge is not
+  included in this package.  If you can't find it anywhere else, you
+  can get in from ftp.lysator.liu.se in pub/emacs.  This package makes
+  it a lot easier to resolve conflicts.
+
+* Emacs will now automatically revert your buffers when the CVS
+  commands pcl-cvs issues causes the file to change.  This automatic
+  revert never occurs if the buffer contents did not agree with the
+  file prior to the command.
+
+* If you are running Lucid GNU Emacs, you will get some fonts and
+  mouse support.  This was contributed from people at Lucid.
+
+* The variable cvs-cvsroot can be used to select the location if the
+  repository.  You no longer need to exit Emacs, setenv CVSROOT, and
+  start a new Emacs if you work with multiple repositories.
+
+* The "q" key can be used to hide the *cvs* buffer.
+
+* The name of the commands in the *cvs* have changed. If it was called
+  cvs-foo, it will now be called cvs-mode-foo.  See the ChangeLog
+  entry from Tue Aug  4 03:02:25 1992 for a complete list of changes.
+
+* The variable cvs-cvs-diff-flags is no longer used.  Instead,
+  cvs-diff-flags is always used.
+
+* Plus a lot of bug fixes.
+
+
+User-visible changes in pcl-cvs from 1.02 to 1.03:
+
+* Output from CVS to stdout and stderr is separated and parsed
+  independently.  In that way pcl-cvs should work regardless of
+  whether stdout is buffered or line-buffered.  Pcl-cvs should now
+  work with CVS 1.3 without modifications on hosts such as
+  DECstations.
+
+* Pcl-cvs now fully supports RCS version 5.6 as well as 5.5.
+
+* New functions:
+
+    + cvs-undo-local-changes ("U") - Undo all your modifications
+				     to a file and get the newest
+				     version from the repository.
+    + cvs-update-other-window	   - Similar to cvs-update.
+    + cvs-byte-compile-files       - Byte compile the selected files.
+
+* cvs-update now displays the *cvs* buffer, which initially contains a
+  small message ("Running `cvs update' in /foo/bar/gazonk/...") until
+  the update is ready.  The *cvs* buffer no longer pops up when the
+  update is ready.  It often failed to pop up, due to race conditions
+  that are very hard to solve (and I doubt that they were at all
+  solvable).
+
+* cvs-unmark-all-files is moved from "U" to "ESC DEL" to be
+  "compatible" with dired.
+
+* cvs-diff ("d") and cvs-diff-backup ("b") can be configured to work
+  on only the file the cursor is positioned on, and ignore any marked
+  files.  A prefix argument toggles this.
+
+* Only one `cvs update' can be run at a time.  (It was previously
+  possible to start more than one simultaneously, but pcl-cvs could
+  not really handle more than one.)
+
+* Some rudimentary support for programs that CVS runs at update (due
+  to the -u switch in the modules file).
+
+* Pcl-cvs now automatically generates a bug report if it can't parse
+  the output from CVS.
+
+* The *cvs* buffer is read-only.
+
+* Pcl-cvs now creates temporary files in $TMPDIR if that environment
+  variable is set (otherwise it uses /tmp).
+
+---End of file NEWS---
+#ident	"@(#)cvs/contrib/pcl-cvs:$Name$:$Id$"
+This is the readme file for pcl-cvs, release 1.05-CVS-$Name$.
+
+Pcl-cvs is a front-end to CVS versions 1.5 through 1.7.  It integrates
+the most frequently used CVS commands into an emacs interface.
+
+There may be some configuration that needs to be done in pcl-cvs.el to
+get it to work.  See the instructions in the file INSTALL.
+
+Full documentation is in Texinfo format in the file pcl-cvs.texinfo.  To
+browse this document online, or in the emacs info mode, you will need to
+process this file with the makeinfo program, which can also be found on
+prep.ai.mit.edu in pub/gnu.
+
+If you have been using a previous version of pcl-cvs (for instance the
+official 1.05 release, or any previous releases) you should read through
+the file NEWS to see what has changed.
+
+This release has been tested under, Emacs 19.28 and Emacs 19.30.
+
+Per Cederqvist
+(updated by Jim Blandy, Greg A. Woods, Karl Fogel)
+
+-- 
+#OrigId	"@(#) Id: README,v 1.14 1993/05/31 22:43:36 ceder Exp "
+#ident	"@(#)cvs/contrib/pcl-cvs:$Name$:$Id$"
+;;; $Id$
+;;; cookie.el -- Utility to display cookies in buffers
+
+;; Copyright (C) 1991-1995   Free Software Foundation
+
+;; Author: Per Cederqvist <ceder@lysator.liu.se>
+;;	Inge Wallin <inge@lysator.liu.se>
+;; Maintainer: elib-maintainers@lysator.liu.se
+;; Created: 3 Aug 1992
+;; Keywords: extensions, lisp
+
+;;; This program is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Elib; see the file COPYING.  If not, write to
+;;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA
+;;;
+
+
+;;; Commentary:
+
+;;;     Introduction
+;;;     ============
+;;;
+;;; Cookie is a package that implements a connection between an
+;;; dll (a doubly linked list) and the contents of a buffer.
+;;; Possible uses are dired (have all files in a list, and show them),
+;;; buffer-list, kom-prioritize (in the LysKOM elisp client) and
+;;; others.  pcl-cvs.el uses cookie.el.
+;;;
+;;; A `cookie' can be any lisp object.  When you use the cookie
+;;; package you specify a pretty-printer, a function that inserts
+;;; a printable representation of the cookie in the buffer.  (The
+;;; pretty-printer should use "insert" and not
+;;; "insert-before-markers").
+;;;
+;;; A `collection' consists of a doubly linked list of cookies, a
+;;; header, a footer and a pretty-printer.  It is displayed at a
+;;; certain point in a certain buffer.  (The buffer and point are
+;;; fixed when the collection is created).  The header and the footer
+;;; are constant strings.  They appear before and after the cookies.
+;;; (Currently, once set, they can not be changed).
+;;;
+;;; Cookie does not affect the mode of the buffer in any way. It
+;;; merely makes it easy to connect an underlying data representation
+;;; to the buffer contents.
+;;;
+;;; A `tin' is an object that contains one cookie.  There are
+;;; functions in this package that given a tin extracts the cookie, or
+;;; gives the next or previous tin.  (All tins are linked together in
+;;; a doubly linked list.  The 'previous' tin is the one that appears
+;;; before the other in the buffer.)  You should not do anything with
+;;; a tin except pass it to the functions in this package.
+;;;
+;;; A collection is a very dynamic thing.  You can easily add or
+;;; delete cookies.  You can sort all cookies in a collection (you
+;;; have to supply a function that compares two cookies).  You can
+;;; apply a function to all cookies in a collection, et c, et c.
+;;;
+;;; Remember that a cookie can be anything.  Your imagination is the
+;;; limit!  It is even possible to have another collection as a
+;;; cookie.  In that way some kind of tree hierarchy can be created.
+;;;
+;;; Full documentation will, God willing, soon be available in a
+;;; Texinfo manual.
+
+
+
+;;;     Coding conventions
+;;;     ==================
+;;;
+;;; All functions that are intended for external use begin with one of
+;;; the prefixes "cookie-", "collection-" or "tin-".  The prefix
+;;; "elib-" is used for internal functions and macros.  There are
+;;; currently no global or buffer-local variables used.
+;;;
+;;; Many function operate on `tins' instead of `cookies'.  To avoid
+;;; confusion most of the function names include the string "cookie"
+;;; or "tin" to show this.
+;;;
+;;; Most doc-strings contains an "Args:" line that lists the
+;;; arguments.
+;;;
+;;; The internal functions don't contain any doc-strings.  RMS thinks
+;;; this is a good way to save space.
+
+
+
+;;; INTERNAL DOCUMENTATION (Your understanding of this package might
+;;; increase if you read it, but you should not exploit the knowledge
+;;; you gain. The internal details might change without notice).
+;;;
+;;; A collection is implemented as an dll (a doubly linked list).
+;;; The first and last element on the list are always the header and
+;;; footer (as strings). Any remaining entries are `wrappers'.
+;;;
+;;; At the implementation level a `tin' is really an elib-node that
+;;; consists of
+;;;      left        Pointer to previous tin
+;;;      right       Pointer to next tin
+;;;      data        Holder of a `wrapper'.
+;;; These internals of an elib-node are in fact unknown to cookie.el.
+;;; It uses dll.el to handle everything that deals with the
+;;; doubly linked list.
+;;;
+;;; The wrapper data type contains
+;;;      start-marker    Position of the printed representation of the
+;;;                      cookie in the buffer. 
+;;;      cookie          The user-supplied cookie.
+;;;
+;;; The wrapper is not accessible to the user of this package.
+
+;;; Code:
+
+(require 'dll)
+(provide 'cookie)
+
+
+;;; ================================================================
+;;;      Internal   macros   for use in the cookie package
+
+
+(put 'elib-set-buffer-bind-dll 'lisp-indent-hook 1)
+
+(defmacro elib-set-buffer-bind-dll (collection &rest forms)
+
+  ;; Execute FORMS with collection->buffer selected as current buffer,
+  ;; and dll bound to collection->dll.
+  ;; Return value of last form in FORMS.  INTERNAL USE ONLY.
+
+  (let ((old-buffer (make-symbol "old-buffer"))
+	(hnd (make-symbol "collection")))
+    (` (let* (((, old-buffer) (current-buffer))
+	      ((, hnd) (, collection))
+	      (dll (elib-collection->dll (, hnd))))
+	 (set-buffer (elib-collection->buffer (, hnd)))
+	 (unwind-protect
+	     (progn (,@ forms))
+	   (set-buffer (, old-buffer)))))))
+
+
+(put 'elib-set-buffer-bind-dll-let* 'lisp-indent-hook 2)
+
+(defmacro elib-set-buffer-bind-dll-let* (collection varlist &rest forms)
+
+  ;; Execute FORMS with collection->buffer selected as current buffer,
+  ;; dll bound to collection->dll, and VARLIST bound as in a let*.
+  ;; dll will be bound when VARLIST is initialized, but the current
+  ;; buffer will *not* have been changed.
+  ;; Return value of last form in FORMS.  INTERNAL USE ONLY.
+
+  (let ((old-buffer (make-symbol "old-buffer"))
+	(hnd (make-symbol "collection")))
+    (` (let* (((, old-buffer) (current-buffer))
+	      ((, hnd) (, collection))
+	      (dll (elib-collection->dll (, hnd)))
+	      (,@ varlist))
+	 (set-buffer (elib-collection->buffer (, hnd)))
+	 (unwind-protect
+	     (progn (,@ forms))
+	   (set-buffer (, old-buffer)))))))
+
+
+(defmacro elib-filter-hf (collection tin)
+
+  ;; Evaluate TIN once and return it. BUT if it is
+  ;; the header or the footer in COLLECTION return nil instead.
+  ;; Args: COLLECTION TIN
+  ;; INTERNAL USE ONLY.
+
+  (let ((tempvar (make-symbol "tin"))
+	(tmpcoll (make-symbol "tmpcollection")))
+    (` (let (((, tempvar) (, tin))
+	     ((, tmpcoll) (, collection)))
+	 (if (or (eq (, tempvar) (elib-collection->header (, tmpcoll)))
+		 (eq (, tempvar) (elib-collection->footer (, tmpcoll))))
+	     nil
+	   (, tempvar))))))
+
+
+
+;;; ================================================================
+;;;      Internal   data types   for use in the cookie package
+
+;;; Yes, I know about cl.el, but I don't like it.   /ceder
+
+;;; The wrapper data type.
+
+(defun elib-create-wrapper (start-marker cookie)
+  ;; Create a wrapper.   INTERNAL USE ONLY.
+  (cons 'WRAPPER (vector start-marker cookie)))
+
+(defun elib-wrapper->start-marker (wrapper)
+  ;; Get start-marker from wrapper.    INTERNAL USE ONLY.
+  (elt (cdr wrapper) 0))
+
+(defun elib-wrapper->cookie-safe (wrapper)
+  ;; Get cookie from wrapper.   INTERNAL USE ONLY.
+  ;; Returns nil if given nil as input.
+  ;; Since (elt nil 1) returns nil in emacs version 18.57 and 18.58
+  ;; this can be defined in this way. The documentation in the info
+  ;; file says that elt should signal an error in that case. I think
+  ;; it is the documentation that is buggy. (The bug is reported).
+  (elt (cdr wrapper) 1))
+
+(defun elib-wrapper->cookie (wrapper)
+  ;; Get cookie from wrapper.   INTERNAL USE ONLY.
+  (elt (cdr wrapper) 1))
+
+
+
+;;; The collection data type
+
+(defun elib-create-collection (buffer pretty-printer 
+					 header-wrapper footer-wrapper
+					 dll)
+  ;; Create a collection. INTERNAL USE ONLY.
+  (cons 'COLLECTION
+	;; The last element is a pointer to the last tin
+	;; the cursor was at, or nil if that is unknown.  
+	(vector buffer
+		pretty-printer 
+		header-wrapper footer-wrapper
+		dll nil)))
+
+
+(defun elib-collection->buffer (collection)
+  ;; Get buffer from COLLECTION.
+  (elt (cdr collection) 0))
+
+(defun elib-collection->pretty-printer (collection)
+  ;; Get pretty-printer from COLLECTION.
+  (elt (cdr collection) 1))
+
+(defun elib-collection->header (collection)
+  ;; Get header from COLLECTION.
+  (elt (cdr collection) 2))
+
+(defun elib-collection->footer (collection)
+  ;; Get footer from COLLECTION.
+  (elt (cdr collection) 3))
+
+(defun elib-collection->dll (collection)
+  ;; Get dll from COLLECTION.
+  (elt (cdr collection) 4))
+
+(defun elib-collection->last-tin (collection)
+  ;; Get last-tin from COLLECTION.
+  (elt (cdr collection) 5))
+
+
+
+(defun elib-set-collection->buffer (collection buffer)
+  ;; Change the buffer. Args: COLLECTION BUFFER.
+  (aset (cdr collection) 0 buffer))
+
+(defun elib-set-collection->pretty-printer (collection pretty-printer)
+  ;; Change the pretty-printer. Args: COLLECTION PRETTY-PRINTER.
+  (aset (cdr collection) 1 pretty-printer))
+
+(defun elib-set-collection->header (collection header)
+  ;; Change the header. Args: COLLECTION HEADER.
+  (aset (cdr collection) 2 header))
+
+(defun elib-set-collection->footer (collection footer)
+  ;; Change the footer. Args: COLLECTION FOOTER.
+  (aset (cdr collection) 3 footer))
+
+(defun elib-set-collection->dll (collection dll)
+  ;; Change the dll. Args: COLLECTION DLL.
+  (aset (cdr collection) 4 dll))
+
+(defun elib-set-collection->last-tin (collection last-tin)
+  ;; Change the last-tin. Args: COLLECTION LAST-TIN.
+  (aset (cdr collection) 5 last-tin))
+
+
+;;; ================================================================
+;;;      Internal   functions   for use in the cookie package
+
+(defun elib-abs (x)
+  ;; Return the absolute value of x
+  (max x (- x)))
+
+(defun elib-create-wrapper-and-insert (cookie string pos)
+  ;; Insert STRING at POS in current buffer. Remember the start
+  ;; position. Create a wrapper containing that start position and the
+  ;; COOKIE.
+  ;;    INTERNAL USE ONLY.
+
+  (save-excursion
+    (goto-char pos)
+    ;; Remember the position as a number so that it doesn't move
+    ;; when we insert the string.
+    (let ((start (if (markerp pos)
+		     (marker-position pos)
+		   pos))
+	  (buffer-read-only nil))
+      ;; Use insert-before-markers so that the marker for the
+      ;; next cookie is updated.
+      (insert-before-markers string)
+
+      ;; Always insert a newline. You want invisible cookies? You
+      ;; lose. (At least in this version). FIXME-someday. (It is
+      ;; harder to fix than it might seem. All markers have to point
+      ;; to the right place all the time...)
+      (insert-before-markers ?\n)
+      (elib-create-wrapper (copy-marker start) cookie))))
+
+
+(defun elib-create-wrapper-and-pretty-print (cookie
+						pretty-printer pos)
+  ;; Call PRETTY-PRINTER with point set at POS in current buffer.
+  ;; Remember the start position. Create a wrapper containing that
+  ;; start position and the COOKIE.
+  ;;    INTERNAL USE ONLY.
+
+  (save-excursion
+    (goto-char pos)
+    ;; Remember the position as a number so that it doesn't move
+    ;; when we insert the string.
+    (let ((start (if (markerp pos)
+		     (marker-position pos)
+		   pos))
+	  (buffer-read-only nil))
+      ;; Insert the trailing newline using insert-before-markers
+      ;; so that the start position for the next cookie is updated.
+      (insert-before-markers ?\n)
+      ;; Move back, and call the pretty-printer.
+      (backward-char 1)
+      (funcall pretty-printer cookie)
+      (elib-create-wrapper (copy-marker start) cookie))))
+
+
+(defun elib-delete-tin-internal (collection tin)
+  ;; Delete a cookie string from COLLECTION.  INTERNAL USE ONLY.
+  ;; Can not be used on the footer. Returns the wrapper that is deleted.
+  ;; The start-marker in the wrapper is set to nil, so that it doesn't
+  ;; consume any more resources.
+  (let ((dll (elib-collection->dll collection))
+	(buffer-read-only nil))
+    ;; If we are about to delete the tin pointed at by last-tin,
+    ;; set last-tin to nil.
+    (if (eq (elib-collection->last-tin collection) tin)
+	(elib-set-collection->last-tin collection nil))
+
+    (delete-region (elib-wrapper->start-marker (dll-element dll tin))
+		   (elib-wrapper->start-marker
+		    (dll-element dll (dll-next dll tin))))
+    (set-marker (elib-wrapper->start-marker (dll-element dll tin)) nil)
+    ;; Delete the tin, and return the wrapper.
+    (dll-delete dll tin)))
+
+(defun elib-refresh-tin (collection tin)
+  ;; Redisplay the cookie represented by TIN. INTERNAL USE ONLY.
+  ;; Args: COLLECTION TIN
+  ;; Can not be used on the footer. dll *must* be bound to
+  ;; (elib-collection->dll collection).
+
+  (let ((buffer-read-only nil))
+    (save-excursion
+      ;; First, remove the string from the buffer:
+      (delete-region (elib-wrapper->start-marker (dll-element dll tin))
+		     (1- (marker-position
+			  (elib-wrapper->start-marker
+			   (dll-element dll (dll-next dll tin))))))
+
+      ;; Calculate and insert the string.
+
+      (goto-char (elib-wrapper->start-marker (dll-element dll tin)))
+      (funcall (elib-collection->pretty-printer collection)
+	       (elib-wrapper->cookie (dll-element dll tin))))))
+
+
+(defun elib-pos-before-middle-p (collection pos tin1 tin2)
+
+  ;; Return true if for the cookies in COLLECTION, POS is in the first
+  ;; half of the region defined by TIN1 and TIN2.
+
+  (let ((dll (elib-collection->dll collection)))
+    (< pos (/ (+ (elib-wrapper->start-marker (dll-element dll tin1))
+		 (elib-wrapper->start-marker (dll-element dll tin2)))
+	      2))))
+
+
+;;; ===========================================================================
+;;;                  Public members of the cookie package
+
+
+(defun collection-create (buffer pretty-printer 
+			     &optional header footer pos)
+  "Create an empty collection of cookies.
+Args: BUFFER PRETTY-PRINTER &optional HEADER FOOTER POS.
+
+The collection will be inserted in BUFFER. BUFFER may be a
+buffer or a buffer name. It is created if it does not exist.
+
+PRETTY-PRINTER should be a function that takes one argument, a
+cookie, and inserts a string representing it in the buffer (at
+point). The string PRETTY-PRINTER inserts may be empty or span
+several linse. A trailing newline will always be inserted
+automatically. The PRETTY-PRINTER should use insert, and not
+insert-before-markers.
+
+Optional third argument HEADER is a string that will always be
+present at the top of the collection. HEADER should end with a
+newline.  Optionaly fourth argument FOOTER is similar, and will
+always be inserted at the bottom of the collection.
+
+Optional fifth argument POS is a buffer position, specifying
+where the collection will be inserted. It defaults to the
+begining of the buffer."
+
+  (let ((new-collection
+	 (elib-create-collection (get-buffer-create buffer)
+				    pretty-printer nil nil (dll-create))))
+
+    (elib-set-buffer-bind-dll new-collection
+      ;; Set default values
+      (if (not header)
+	  (setq header ""))
+      (if (not footer)
+	  (setq footer ""))
+      (if (not pos)
+	  (setq pos (point-min))
+	(if (markerp pos)
+	    (set pos (marker-position pos)))) ;Force header to be above footer.
+
+      (let ((foot (elib-create-wrapper-and-insert footer footer pos))
+	    (head (elib-create-wrapper-and-insert header header pos)))
+
+	(dll-enter-first dll head)
+	(dll-enter-last  dll foot)
+	(elib-set-collection->header new-collection (dll-nth dll 0))
+	(elib-set-collection->footer new-collection (dll-nth dll -1))))
+
+    ;; Return the collection
+    new-collection))
+
+
+(defun tin-cookie (collection tin)
+  "Get the cookie from a TIN. Args: COLLECTION TIN."
+  (elib-wrapper->cookie (dll-element (cookie->dll collection) tin)))
+
+(defun cookie-enter-first (collection cookie)
+  "Enter a COOKIE first in the cookie collection COLLECTION.
+Args: COLLECTION COOKIE."
+
+  (elib-set-buffer-bind-dll collection
+
+    ;; It is always safe to insert an element after the first element,
+    ;; because the header is always present. (dll-nth dll 0) should
+    ;; therefore never return nil.
+
+    (dll-enter-after
+     dll
+     (dll-nth dll 0)
+     (elib-create-wrapper-and-pretty-print
+      cookie
+      (elib-collection->pretty-printer collection)
+      (elib-wrapper->start-marker
+       (dll-element dll (dll-nth dll 1)))))))
+
+
+(defun cookie-enter-last (collection cookie)
+  "Enter a COOKIE last in the cookie-collection COLLECTION.
+Args: COLLECTION COOKIE."
+
+  (elib-set-buffer-bind-dll collection
+
+    ;; Remember that the header and footer are always present. There
+    ;; is no need to check if (dll-nth dll -1) returns nil - it never
+    ;; does.
+
+    (dll-enter-before
+     dll
+     (dll-nth dll -1)
+     (elib-create-wrapper-and-pretty-print
+      cookie
+      (elib-collection->pretty-printer collection)
+      (elib-wrapper->start-marker (dll-last dll))))))
+
+
+(defun cookie-enter-after-tin (collection tin cookie)
+  "Enter a new COOKIE after TIN.
+Args: COLLECTION TIN COOKIE."
+  (elib-set-buffer-bind-dll collection
+    (dll-enter-after
+     dll tin
+     (elib-create-wrapper-and-pretty-print
+      cookie
+      (elib-collection->pretty-printer collection)
+      (elib-wrapper->start-marker (dll-element dll (dll-next dll tin)))))))
+
+
+(defun cookie-enter-before-tin (collection tin cookie)
+  "Enter a new COOKIE before TIN.
+Args: COLLECTION TIN COOKIE."
+  (elib-set-buffer-bind-dll collection
+    (dll-enter-before
+     dll tin
+     (elib-create-wrapper-and-pretty-print
+      cookie
+      (elib-collection->pretty-printer collection)
+      (elib-wrapper->start-marker (dll-element dll tin))))))
+
+
+(defun tin-next (collection tin)
+  "Get the next tin. Args: COLLECTION TIN.
+Returns nil if TIN is nil or the last cookie."
+  (if tin
+      (elib-filter-hf
+       collection (dll-next (elib-collection->dll collection) tin))
+    nil))
+
+(defun tin-previous (collection tin)
+  "Get the previous tin. Args: COLLECTION TIN.
+Returns nil if TIN is nil or the first cookie."
+  (if tin
+      (elib-filter-hf
+       collection
+       (dll-previous (elib-collection->dll collection) tin))
+    nil))
+
+
+(defun tin-nth (collection n)
+  "Return the Nth tin. Args: COLLECTION N.
+N counts from zero. Nil is returned if there is less than N cookies.
+If N is negative, return the -(N+1)th last element.
+Thus, (tin-nth dll 0) returns the first node,
+and (tin-nth dll -1) returns the last node.
+
+Use tin-cookie to extract the cookie from the tin (or use
+cookie-nth instead)."
+
+    ;; Skip the header (or footer, if n is negative).
+    (if (< n 0)
+	(setq n (1- n))
+      (setq n (1+ n)))
+
+    (elib-filter-hf collection
+		       (dll-nth (elib-collection->dll collection) n)))
+
+(defun cookie-nth (collection n)
+  "Return the Nth cookie. Args: COLLECTION N.
+N counts from zero. Nil is returned if there is less than N cookies.
+If N is negative, return the -(N+1)th last element.
+Thus, (cookie-nth dll 0) returns the first cookie,
+and (cookie-nth dll -1) returns the last cookie."
+
+    ;; Skip the header (or footer, if n is negative).
+    (if (< n 0)
+	(setq n (1- n))
+      (setq n (1+ n)))
+
+    (let* ((dll (elib-collection->dll collection))
+	   (tin (elib-filter-hf collection (dll-nth dll n))))
+      (if tin
+	  (elib-wrapper->cookie (dll-element dll tin))
+	nil)))
+
+(defun tin-delete (collection tin)
+  "Delete a tin from a collection. Args: COLLECTION TIN.
+The cookie in the tin is returned."
+
+  (elib-set-buffer-bind-dll collection
+    (elib-wrapper->cookie
+     (elib-delete-tin-internal collection tin))))
+
+
+(defun cookie-delete-first (collection)
+  "Delete first cookie and return it. Args: COLLECTION.
+Returns nil if there are no cookies left in the collection."
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((tin (dll-nth dll 1)))         ;Skip the header.
+
+    ;; We have to check that we do not try to delete the footer.
+    (if (eq tin (elib-collection->footer collection))
+	nil
+      (elib-wrapper->cookie (elib-delete-tin-internal collection tin)))))
+
+
+(defun cookie-delete-last (collection)
+  "Delete last cookie and return it. Args: COLLECTION.
+Returns nil if there is no cookie left in the collection."
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((tin (dll-nth dll -2)))		;Skip the footer.
+    ;; We have to check that we do not try to delete the header.
+    (if (eq tin (elib-collection->header collection))
+	nil
+      (elib-wrapper->cookie (elib-delete-tin-internal collection tin)))))
+
+(defun cookie-first (collection)
+  "Return the first cookie in COLLECTION. The cookie is not removed."
+
+  (let* ((dll (elib-collection->dll collection))
+	 (tin (elib-filter-hf collection (dll-nth dll -1))))
+    (if tin
+	(elib-wrapper->cookie (dll-element dll tin)))))
+
+
+
+(defun cookie-last (collection)
+  "Return the last cookie in COLLECTION. The cookie is not removed."
+
+  (let* ((dll (elib-collection->dll collection))
+	 (tin (elib-filter-hf collection (dll-nth dll -2))))
+      (if tin
+	  (elib-wrapper->cookie (dll-element dll tin)))))
+
+
+(defun collection-empty (collection)
+  "Return true if there are no cookies in COLLECTION."
+
+  (eq (dll-nth (elib-collection->dll collection) 1) 
+      (elib-collection->footer collection)))
+
+
+(defun collection-length (collection)
+  "Return the number of cookies in COLLECTION."
+
+  ;; Don't count the footer and header.
+  (- (dll-length (elib-collection->dll collection)) 2))
+
+
+(defun collection-list-cookies (collection)
+  "Return a list of all cookies in COLLECTION."
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((result nil)
+       (header (elib-collection->header collection))
+       (tin (dll-nth dll -2)))
+    (while (not (eq tin header))
+      (setq result (cons (elib-wrapper->cookie (dll-element dll tin))
+			 result))
+      (setq tin (dll-previous dll tin)))
+    result))
+
+
+(defun collection-clear (collection)
+  "Remove all cookies in COLLECTION."
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((header (elib-collection->header collection))
+       (footer (elib-collection->footer collection)))
+
+    ;; We have to bind buffer-read-only separately, so that the
+    ;; current buffer is correct.
+    (let ((buffer-read-only nil))
+      (delete-region (elib-wrapper->start-marker
+		      (dll-element dll (dll-nth dll 1)))
+		     (elib-wrapper->start-marker
+		      (dll-element dll footer))))
+    (setq dll (dll-create-from-list (list (dll-element dll header)
+					  (dll-element dll footer))))
+    (elib-set-collection->dll collection dll)
+
+    ;; Re-set the header and footer, since they are now new objects.
+    ;; elib-filter-hf uses eq to compare objects to them...
+    (elib-set-collection->header collection (dll-nth dll 0))
+    (elib-set-collection->footer collection (dll-nth dll -1))))
+
+
+(defun cookie-map (map-function collection &rest map-args)
+  "Apply MAP-FUNCTION to all cookies in COLLECTION.
+MAP-FUNCTION is applied to the first element first.
+If MAP-FUNCTION returns non-nil the cookie will be refreshed (its
+pretty-printer will be called once again).
+
+Note that the buffer for COLLECTION will be current buffer when MAP-FUNCTION 
+is called.  MAP-FUNCTION must restore the current buffer to BUFFER before 
+it returns, if it changes it.
+
+If more than two arguments are given to cookie-map, remaining
+arguments will be passed to MAP-FUNCTION."
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((footer (elib-collection->footer collection))
+       (tin (dll-nth dll 1)))
+
+    (while (not (eq tin footer))
+
+      (if (apply map-function
+		 (elib-wrapper->cookie (dll-element dll tin))
+		 map-args)
+	  (elib-refresh-tin collection tin))
+
+      (setq tin (dll-next dll tin)))))
+
+
+
+(defun cookie-map-reverse (map-function collection &rest map-args)
+  "Apply MAP-FUNCTION to all cookies in COLLECTION.
+MAP-FUNCTION is applied to the last cookie first.
+If MAP-FUNCTION returns non-nil the cookie will be refreshed.
+
+Note that the buffer for COLLECTION will be current buffer when MAP-FUNCTION 
+is called.  MAP-FUNCTION must restore the current buffer to BUFFER before 
+it returns, if it changes the current buffer.
+
+If more than two arguments are given to cookie-map, remaining
+arguments will be passed to MAP-FUNCTION."
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((header (elib-collection->header collection))
+       (tin (dll-nth dll -2)))
+
+    (while (not (eq tin header))
+
+      (if (apply map-function
+		 (elib-wrapper->cookie (dll-element dll tin))
+		 map-args)
+	  (elib-refresh-tin collection tin))
+
+      (setq tin (dll-previous dll tin)))))
+
+
+
+(defun collection-append-cookies (collection cookie-list)
+  "Insert all cookies in the list COOKIE-LIST last in COLLECTION.
+Args: COLLECTION COOKIE-LIST."
+
+  (while cookie-list
+    (cookie-enter-last collection (car cookie-list))
+    (setq cookie-list (cdr cookie-list))))
+
+
+(defun collection-filter-cookies (collection predicate &rest extra-args)
+  "Remove all cookies in COLLECTION for which PREDICATE returns nil.
+Args: COLLECTION PREDICATE &rest EXTRA-ARGS.
+Note that the buffer for COLLECTION will be current-buffer when PREDICATE 
+is called. PREDICATE must restore the current buffer before it returns
+if it changes it.
+
+The PREDICATE is called with the cookie as its first argument. If any
+EXTRA-ARGS are given to collection-filter-cookies they will be passed to the
+PREDICATE."
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((tin (dll-nth dll 1))
+       (footer (elib-collection->footer collection))
+       (next nil))
+    (while (not (eq tin footer))
+      (setq next (dll-next dll tin))
+      (if (apply predicate
+		 (elib-wrapper->cookie (dll-element dll tin))
+		 extra-args)
+	  nil
+	(elib-delete-tin-internal collection tin))
+      (setq tin next))))
+
+
+(defun collection-filter-tins (collection predicate &rest extra-args)
+  "Remove all cookies in COLLECTION for which PREDICATE returns nil.
+Note that the buffer for COLLECTION will be current-buffer when PREDICATE 
+is called. PREDICATE must restore the current buffer before it returns
+if it changes it.
+
+The PREDICATE is called with one argument, the tin. If any EXTRA-ARGS
+are given to collection-filter-cookies they will be passed to the PREDICATE."
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((tin (dll-nth dll 1))
+       (footer (elib-collection->footer collection))
+       (next nil))
+    (while (not (eq tin footer))
+      (setq next (dll-next dll tin))
+      (if (apply predicate tin extra-args)
+	  nil
+	(elib-delete-tin-internal collection tin))
+      (setq tin next))))
+
+
+(defun tin-locate (collection pos &optional guess)
+  "Return the tin that POS (a buffer position) is within.
+Args: COLLECTION POS &optional GUESS.
+POS may be a marker or an integer.
+GUESS should be a tin that it is likely that POS is near.
+
+If POS points before the first cookie, the first cookie is returned.
+If POS points after the last cookie, the last cookie is returned.
+If the COLLECTION is empty, nil is returned."
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((footer (elib-collection->footer collection)))
+
+    (cond
+     ;; No cookies present?
+     ((eq (dll-nth dll 1) (dll-nth dll -1))
+      nil)
+
+     ;; Before first cookie?
+     ((< pos (elib-wrapper->start-marker
+	      (dll-element dll (dll-nth dll 1))))
+      (dll-nth dll 1))
+
+     ;; After last cookie?
+     ((>= pos (elib-wrapper->start-marker (dll-last dll)))
+      (dll-nth dll -2))
+
+     ;; We now know that pos is within a cookie.
+     (t
+      ;; Make an educated guess about which of the three known
+      ;; cookies (the first, the last, or GUESS) is nearest.
+      (let* ((best-guess (dll-nth dll 1))
+	     (distance (elib-abs (- pos (elib-wrapper->start-marker
+					 (dll-element dll best-guess))))))
+	(if guess
+	    (let* ((g guess)		;Check the guess, if given.
+		   (d (elib-abs
+		       (- pos (elib-wrapper->start-marker
+			       (dll-element dll g))))))
+	      (cond
+	       ((< d distance)
+		(setq distance d)
+		(setq best-guess g)))))
+
+	(let* ((g (dll-nth dll -1))	;Check the last cookie
+	       (d (elib-abs
+		   (- pos (elib-wrapper->start-marker
+			   (dll-element dll g))))))
+	  (cond
+	   ((< d distance)
+	    (setq distance d)
+	    (setq best-guess g))))
+
+	(if (elib-collection->last-tin collection) ;Check "previous".
+	    (let* ((g (elib-collection->last-tin collection)) 
+		   (d (elib-abs
+		       (- pos (elib-wrapper->start-marker
+			       (dll-element dll g))))))
+	      (cond
+	       ((< d distance)
+		(setq distance d)
+		(setq best-guess g)))))
+
+	;; best-guess is now a "best guess".
+     
+	;; Find the correct cookie. First determine in which direction
+	;; it lies, and then move in that direction until it is found.
+    
+	(cond
+	 ;; Is pos after the guess?
+	 ((>= pos
+	      (elib-wrapper->start-marker (dll-element dll best-guess)))
+
+	  ;; Loop until we are exactly one cookie too far down...
+	  (while (>= pos (elib-wrapper->start-marker
+			  (dll-element dll best-guess)))
+	    (setq best-guess (dll-next dll best-guess)))
+
+	  ;; ...and return the previous cookie.
+	  (dll-previous dll best-guess))
+
+	 ;; Pos is before best-guess
+	 (t
+
+	  (while (< pos (elib-wrapper->start-marker
+			 (dll-element dll best-guess)))
+	    (setq best-guess (dll-previous dll best-guess)))
+
+	  best-guess)))))))
+
+
+;;(defun tin-start-marker (collection tin)
+;;  "Return start-position of a cookie in COLLECTION.
+;;Args: COLLECTION TIN.
+;;The marker that is returned should not be modified in any way,
+;;and is only valid until the contents of the cookie buffer changes."
+;;
+;;  (elib-wrapper->start-marker 
+;;   (dll-element (elib-collection->dll collection) tin)))
+
+
+;;(defun tin-end-marker (collection tin)
+;;  "Return end-position of a cookie in COLLECTION.
+;;Args: COLLECTION TIN.
+;;The marker that is returned should not be modified in any way,
+;;and is only valid until the contents of the cookie buffer changes."
+;;
+;;  (let ((dll (elib-collection->dll collection)))
+;;    (elib-wrapper->start-marker
+;;     (dll-element dll (dll-next dll tin)))))
+
+
+
+(defun collection-refresh (collection)
+  "Refresh all cookies in COLLECTION.
+
+The pretty-printer that was specified when the COLLECTION was created
+will be called for all cookies in COLLECTION.
+
+Note that tin-invalidate is more efficient if only a small
+number of cookies needs to be refreshed."
+
+  (elib-set-buffer-bind-dll-let* collection
+
+      ((header (elib-collection->header collection))
+       (footer (elib-collection->footer collection)))
+
+    (let ((buffer-read-only nil))
+      (delete-region (elib-wrapper->start-marker
+		      (dll-element dll (dll-nth dll 1)))
+		     (elib-wrapper->start-marker
+		      (dll-element dll footer)))
+
+      (goto-char (elib-wrapper->start-marker
+		  (dll-element dll footer)))
+    
+      (let ((tin (dll-nth dll 1)))
+	(while (not (eq tin footer))
+
+	  (set-marker (elib-wrapper->start-marker (dll-element dll tin))
+		      (point))
+	  (funcall (elib-collection->pretty-printer collection)
+		   (elib-wrapper->cookie (dll-element dll tin)))
+	  (insert "\n")
+	  (setq tin (dll-next dll tin)))))
+    
+    (set-marker (elib-wrapper->start-marker (dll-element dll footer))
+		(point))))
+
+
+(defun tin-invalidate (collection &rest tins)
+  "Refresh some cookies. Args: COLLECTION &rest TINS.
+The pretty-printer that for COLLECTION will be called for all TINS."
+
+  (elib-set-buffer-bind-dll collection
+    
+    (while tins
+      (elib-refresh-tin collection (car tins))
+      (setq tins (cdr tins)))))
+
+
+(defun collection-set-goal-column (collection goal)
+  "Set goal-column for COLLECTION.
+Args: COLLECTION GOAL.
+goal-column is made buffer-local.
+
+There will eventually be a better way to specify the cursor position."
+  (elib-set-buffer-bind-dll collection 
+    (make-local-variable 'goal-column)
+    (setq goal-column goal)))
+
+
+(defun tin-goto-previous (collection pos arg)
+  "Move point to the ARGth previous cookie.
+Don't move if we are at the first cookie, or if COLLECTION is empty.
+Args: COLLECTION POS ARG.
+Returns the tin we move to."
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((tin (tin-locate
+	     collection pos (elib-collection->last-tin collection))))
+
+    (cond
+     (tin
+      (while (and tin (> arg 0))
+	(setq arg (1- arg))
+	(setq tin (dll-previous dll tin)))
+
+      ;; Never step above the first cookie.
+
+      (if (null (elib-filter-hf collection tin))
+	  (setq tin (dll-nth dll 1)))
+
+      (goto-char
+       (elib-wrapper->start-marker
+	(dll-element dll tin)))
+
+      (if goal-column
+	  (move-to-column goal-column))
+      (elib-set-collection->last-tin collection tin)
+      tin))))
+
+
+(defun tin-goto-next (collection pos arg)
+  "Move point to the ARGth next cookie.
+Don't move if we are at the last cookie.
+Args: COLLECTION POS ARG.
+Returns the tin."
+
+  ;;Need to do something clever with (current-buffer)...
+  ;;Previously, when the buffer was used instead of the collection, this line
+  ;;did the trick. No longer so... This is hard to do right! Remember that a
+  ;;cookie can contain a collection!
+  ;;(interactive (list (current-buffer) (point)
+  ;;		     (prefix-numeric-value current-prefix-arg)))
+
+  (elib-set-buffer-bind-dll-let* collection
+      ((tin (tin-locate
+	     collection pos (elib-collection->last-tin collection))))
+
+    (while (and tin (> arg 0))
+      (setq arg (1- arg))
+      (setq tin (dll-next dll tin)))
+
+    ;; Never step below the first cookie.
+
+    (if (null (elib-filter-hf collection tin))
+	(setq tin (dll-nth dll -2)))
+
+    (goto-char
+     (elib-wrapper->start-marker
+      (dll-element dll tin)))
+
+    (if goal-column
+	(move-to-column goal-column))
+
+    (elib-set-collection->last-tin collection tin)
+    tin))
+
+
+(defun tin-goto (collection tin)
+  "Move point to TIN.  Args: COLLECTION TIN."
+  (elib-set-buffer-bind-dll collection
+    (goto-char
+     (elib-wrapper->start-marker
+      (dll-element dll tin)))
+
+    (if goal-column
+	(move-to-column goal-column))
+
+    (elib-set-collection->last-tin collection tin)))
+
+
+(defun collection-collect-tin (collection predicate &rest predicate-args)
+  "Select cookies from COLLECTION using PREDICATE.
+Return a list of all selected tins.
+
+PREDICATE is a function that takes a cookie as its first argument.
+
+The tins on the returned list will appear in the same order as in the
+buffer.  You should not rely on in which order PREDICATE is called.
+
+Note that the buffer the COLLECTION is displayed in is current-buffer
+when PREDICATE is called.  If PREDICATE must restore current-buffer if
+it changes it.
+
<