Notable changes in development snapshot 16.1h:

  Implemented some fixes necessary to build and operate under
  glibc-2.3.2.  You will most likely need to use the new version
  1.1 of Ezm3 to build CVSup on platforms using glibc-2.3.2.

Notable changes in development snapshot 16.1g:

  Fixed a bug that caused the client to crash sometimes when updating
  the KDE sources.  The crashes were caused by thread stack overflow,
  triggered by the unusually large "refuse" files that are often used
  in the KDE project.

  Added support for preserving access lists in RCS files.  Access
  lists are rarely used in CVS repositories, and until now CVSup
  simply discarded them.  However, the KDE project makes extensive use
  of access lists, and the lack of support for them caused many fixups
  when updating.  The support added in this release is only partial.
  It does not transfer access lists during an update, but it
  preserves any access lists which are already present in the user's
  files.  Many thanks to Martin Birgmeier for contributing this fix.

  Added a new "-f" option to cvsupd which makes it remain in the
  foreground rather than becoming a daemon.  This makes it possible
  to control cvsupd using the "daemontools" package.  Many thanks to
  Andrew J. Korty for implementing this option.

  Fixed an obscure bug in which NFS-related lstat() failures could
  cause cvsupd to die with a segmentation violation.  The error is
  almost impossible to reproduce, and may depend on NFS bugs.

  Added a portability fix submitted by Olaf Wagner, which fixed a bug
  in the handling of filenames when using the CM3 Modula-3 compiler.

  Changed the font of the GUI's "messages" pane to make it legible
  on more systems.

Notable changes in development snapshot 16.1f:

  Fixed a bug in the updating of setuid/setgid files for some versions
  of Linux.  The symptom was that the setuid/setgid bits were not
  preserved, and CVSup transferred each setuid/setgid file on every
  run.  This was caused by changes in the Linux kernel which caused
  chown() to clear the setuid/setgid bits even when performed by
  root.

  Fixed a portability bug that broke the build on some versions of
  Linux.

  Removed some obsolete backward-compatibility code.

  Updated some documentation.

Notable changes in development snapshot 16.1e:

  Added code in both the client and the server to detect whether the
  peer is an old version with the S1G bug.  The server will refuse
  to serve such clients, and the client will refuse updates from
  such a server.  In each case, an error message is printed with a
  URL that describes the bug and the upgrade procedure.

  Fixed a bug in suplib/src/m3makefile which caused the build of
  cvpasswd to die with the message, "unable to find interface
  (CText)".  This occurred with the SRC compiler, but not with the
  PM3 compiler.

Notable changes in development snapshot 16.1d:

  Fixed a terrible bug which caused CVSup to decode file attribute
  values of 10 or more digits incorrectly.  This caused file modtimes
  to come out wrong once the date passed 1000000000 seconds past the
  epoch.  This occurred on Sun Sep  9 01:46:40 UTC 2001.

Notable changes in development snapshot 16.1c:

  Corrected the fix to handle ECONNABORTED properly.  Also expanded it
  so that the master server process survives some additional possible
  temporary errors (too many open files in the system; out of buffer
  space).

Notable changes in development snapshot 16.1b:

  Made it a warning rather than a fatal error if the client is unable
  to delete a file that it wants to delete.  This works around certain
  problems in checkout mode where the CVS repository has been manually
  altered to change an RCS file into a directory with the same
  (checked-out) name.

  Fixed the server to stay alive if accept() returns ECONNABORTED.
  Traditionally this error was not returned by accept() in most Unix
  systems.  But in recent versions of FreeBSD this error can be
  returned.

Notable changes in development snapshot 16.1a:

  Added a new "client class" feature which allows the server to
  hide collections or individual branches from specific groups of
  clients.  Access is controlled by a new "cvsupd.class" file.  This
  feature is still in flux.  If you use it in its current form
  you must be prepared to deal with incompatible changes in the
  future.  Many thanks to Olaf Wagner and Elego Software Solutions
  GmbH <http://www.elego-software-solutions.com/> for developing and
  contributing this feature.

  Made the necessary changes so that CVSup can be built using the
  Critical Mass compiler "cm3" (see http://www.m3.org/).  To do this
  add "M3=cm3" to the "make" command.

  Added "cvsuplog2html" by John Reynolds, a new and improved script
  for converting CVSup client logs into HTML pages.  It can be found
  in the "contrib" subdirectory.

  Fixed a bug which sometimes caused hard links to be updated as
  separate files when the server was operating in mirror mode ("-s
  scanDir" option).

  Fixed a bug on Digital Unix and Tru64 Unix systems, where updating a
  0-length file in some cases produced the error "Updater failed: foo:
  Cannot open: No such device or address".

  Fixed a bug which could cause revision 1.1.1.1 to be checked out
  when really revision 1.1 should have been gotten.  This occurred
  with OpenBSD's "src/gnu/egcs/libiberty/hashtab.c" and possibly
  other files which were originally created by "cvs add" and then
  subsequently had a "cvs import" done on them.

  Fixed a bug which caused the server to quit if it encountered an
  unreadable directory.  Now the server logs a warning and continues
  as if the directory were empty.

  Fixed a client bug involving symbolic links and checkout mode.  If
  a directory in the client's tree was actually a symbolic link to a
  directory, the client would under certain circumstances delete the
  link, replace it with a directory, and populate it with a new copy
  of the collection.

  Fixed a client bug that sometimes resulted in a segmentation
  violation or an ASSERT failure if the filesystem containing the
  "base" directory became full during an update.

  Fixed a set of related bugs which caused the last line of certain
  client and server configuration files to be ignored if its
  terminating newline was missing.  The files which were affected by
  the bug were supfiles and refuse files on the client, and releases
  files, list files, and the "${CVSROOT}/CVSROOT/options" file on the
  server.

  Fixed a bug which could cause the client or server to die if an
  existing configuration, including the checkouts files, was moved
  from one operating system to a different one.

  Added a work-around for an apparent Modula-3 threads package bug
  which on extremely rare occasions could cause the master server to
  fail to reap a child process.

Notable changes in release 16.1:

  Fixed a couple of long-standing bugs in the rsync code which caused
  it to miss many compression opportunities.  This mode is actually
  useful now.

  Fixed a server bug that caused the inactivity timeout to fail in
  certain situations.  If the network connection to a client vanished
  just after start-up, the inactivity timer wasn't able to kill the
  server process.  It would then have to be killed manually.  Now the
  inactivity timeout should work reliably.

  Fixed a bug that affected some versions of Solaris, e.g., Solaris
  2.5.1.  The server would loop after serving the first client.

  Fixed a bug that would kill the client or server after 2 GB of data
  (before compression) had gone through the network.

  Fixed bug: if the server tried to follow a circular symbolic link,
  it was a fatal error.

  Added new "norsync" and "rnorsync" commands for the server's list
  files, to allow better control over when the rsync algorithm is
  used.  The use of "norsync" in the releases file is now deprecated;
  it should be specified in the list file instead.

  Added a command-line option "-A ipaddr" for both client and server.
  It causes the sockets to be bound to a specific IP address on the
  local host.  The option is useful for controlling which network
  interface is used.

  Added Dom Mitchell's handy "cvsup2html" script to the contrib
  directory.  It converts cvsup's log output into a web page for
  conveniently browsing log messages and diffs.  Each filename
  becomes a link to the corresponding cvsweb page.

  Changed the GUI so that pressing the enter key in the "Filter"
  type-in has the same effect as clicking the start button.

  Refuse files are explained in better detail in the cvsup(1) manual
  page, thanks to some changes submitted by Mark Ovens.

Notable changes in release 16.0:

  Implemented strong authentication to control access to the server
  when desired.  It uses a challenge-response protocol which is immune
  to packet sniffing and replay attacks.  No passwords are sent over
  the network in either direction.  Both the client and the server
  can independently verify the identities of each other.  A new
  "-a" option on the client allows it to force the server to prove
  its identity.  There is a new "cvpasswd" utility which is used
  for creating scrambled passwords for the server's authentication
  database.

  Extended the update algorithm for RCS files to handle arbitrary
  "newphrases" attached to deltas.  (See rcsfile(5) if you don't
  know what "newphrases" means.)  Newer versions of CVS use them
  when the "PreservePermissions" feature is turned on.  This caused
  previous versions of CVSup to get checksum mismatches and perform
  time-consuming fixups.  Note, checkout mode doesn't actually honor
  these newphrases yet; but CVS mode mirrors them properly now.

  Added a "umask=nnn" option in cvsupfiles to specify the umask to
  use when updating a collection.  It can be different for each
  collection if desired.

  Made CVSup preserve file permissions more strictly.  It used to
  ignore the mode bits masked off by the umask.  That was wrong.  Now
  it enforces (client mode) == ((server mode) & ~(client umask))
  exactly.  As a result, you may see a few zillion "SetAttrs" messages
  the first time you update using this version of CVSup.  This is
  nothing to be alarmed about.  Note: if "preserve" is in your
  cvsupfile, the effective umask is forced to 0.  That causes the
  client's file permissions to be set exactly equal to those on the
  server.

  Fixed a bug that caused the client to loop if a collection contained
  a top-level directory with a one-character name.

  Fixed a bug that could cause the client to die if its version of an
  RCS file was in fact completely unrelated to the one on the server
  even though they had the same name.  Now that situation is detected,
  and CVSup simply replaces the file wholesale rather than attempting
  to edit it.

  Fixed the client to clean up better if it is killed by a signal.

  Added Joseph Koshy's "cvsupchk" script, which finds extra unwanted
  files that may be littering your source tree.  Look for it in the
  new "contrib" subdirectory of the release.

  Added Wolfram Schneider's "cvsup2httplog" script.  It converts a
  cvsupd log file to standard httpd log file format, so that it can
  be analyzed by tools such as webalizer.  You'll find it in the new
  "contrib" subdirectory.

  Added a "cvsupwho" script, inspired by Garrett Wollman, to list the
  currently active clients of a CVSup server.  Look for it in the new
  "contrib" subdirectory.

  Changed the default connection mode to multiplexed, since it can
  handle all situations that the other modes can handle.  Deprecated
  active mode, passive mode, and SOCKS mode.

  Added a setsockopt(... SO_REUSEADDR ...) call in the server just
  before the point where it tries to bind the listen socket on
  start-up.  This allows the server to be re-started immediately after
  you have killed it, even if some of the old connections are still
  lingering.  Formerly, a "Port in use" error would be reported, and
  you would have no choice but to wait until the old connections timed
  out.

  Added network I/O statistics to the server's final log message
  for each client.  Also added logging of I/O statistics on a
  per-collection basis.  The per-collection messages are at "info"
  priority, while the others are at "notice" level.

  Made some portability fixes for Linux and Digital Unix.  The
  software now builds and runs whether using SRC Modula-3 or the newer
  PM3 release.

  Added pre-formatted manual pages to the source distribution.  They
  are named "*.cat".

Notable changes in release 15.5 (not a public release):

  Added a new "-s" client option to greatly reduce the client's disk
  load, at significant cost in safety.  The option suppresses the
  usual stat(2) calls that check the status of each file against what
  is recorded in the list (checkouts) file.  It makes updates run
  quite a bit faster, but it is not safe if there is any possibility
  that the client's files might be modified locally in between CVSup
  updates.  See the caveats in cvsup(1) for more details.

  Added a new "-D" client option to skip all updates except file
  deletions.  This is useful if the client's disk space is very
  limited.  You can make one run with "-D" to free up as much space
  as possible.  Then make another run without "-D" to update the
  remaining files.  If files or directories have been renamed on
  the server, this ensures that all of the old versions are deleted
  before any of the new ones are created.  NOTE: This option is not
  implemented yet for checkout mode.

  Fixed a signal race in the server.  Under extremely rare conditions,
  the race caused the master server to hang in an infinite loop.

  Fixed the client so that it no longer dies if it fails to delete a
  directory.  The usual cause is that the user has put an extraneous
  file in the directory, making it non-empty even though CVSup thinks
  it should be empty.  Now the client issues a warning but continues
  on.

  Made the necessary changes so that CVSup can be compiled by the PM3
  release of Modula-3.  The SRC release still works too.

  Added some portability fixes from Adam Richter.

Notable changes in release 15.4.2:

  Implemented an improved bugfix for the same server bug that 15.4.1
  had addressed.  Sorry, but I just wasn't happy with the original
  fix.  The original bug was:  If a client connection was lost during
  a particular narrow time window, it could cause the master server to
  die.  Manual intervention would then be required in order to restore
  service.

  Fixed a client bug that showed up if cvsup got a transient failure
  and tried again automatically after a delay.  The "Inactivity
  Timeout" timer from the first connection was still running, and
  would kill off the process if it took more than 15 minutes after the
  original transient error.  It produced log output similar to this:

    Connected to freefall.freebsd.org
    Rejected by server: Server is going down for maintenance
    Will retry at 04:25:13
    Retrying
    Connected to freefall.freebsd.org
    Rejected by server: Server is going down for maintenance
    Will retry at 04:34:53
    Retrying
    Connected to freefall.freebsd.org
    Updating collection cvs-all/cvs
     Append to CVSROOT/commitlogs/ports
    Interrupted

  Added references to the CVSup web page in a various places.

Notable changes in release 15.4.1:

  This is a bugfix release to correct a problem in the server.  Prior
  to this release, if a client connection was lost during a particular
  narrow time window, it could cause the master server to die.  Manual
  intervention would then be required in order to restore service.

  No changes were made to the client in this release.

Notable changes in release 15.4:

  Implemented a "loose" checksumming algorithm for verifying updated
  RCS files.  The algorithm is still basically MD5, but it carefully
  ignores harmless differences (and only harmless differences) in
  white space.  Thus two RCS files which are logically the same will
  have identical checksums, even if they have meaningless differences
  in white space.  This change was made necessary by recent new
  versions of CVS, which introduced some gratuitous changes in the
  white space conventions for RCS files.  Since CVSup updates RCS
  files by disassembling them on the server and putting them together
  again on the client, the changes in the conventions for white space
  led to spurious checksum mismatches under the old, strict checksum.
  Note: Loose checksums require both the client and server to be at
  version 15.4 or later.  If either is older, then strict checksums
  are still used.

  Added a "strictrcs" supfile keyword, for those who don't trust the
  loose checksums.  It causes strict byte-by-byte checksums to be
  used for RCS files, as was the default in older versions of CVSup.

  Implemented a "nocheckrcs" keyword for client supfiles and server
  "releases" files, to suppress the comparison of MD5 checksums for
  updated RCS files entirely.  Given the new loose checksumming
  algorithm, this option is probably not very useful.

  Implemented a "norcs" keyword for client supfiles and server
  "releases" files, to disable the usual algorithm for updating RCS
  files.  If this keyword is specified, RCS files are treated the same
  as other kinds of files.  You can use this to force RCS files to be
  updated using the rsync algorithm, for instance.

  Fixed things up so that file names containing white space or other
  obnoxious characters no longer cause problems.  Also, when a release
  15.4 or later server or client is connected to an older peer, it is
  careful not to mention any files whose names contain white space.

Notable changes in release 15.3:

  Implemented a much more flexible access control scheme in the
  server.  It still uses the "cvsupd.access" file, and the syntax is
  backward compatible with the previous versions.  But it adds a lot
  of capability, supporting both permit and deny rules with per-host
  and per-network connection limits.  See cvsupd(8) for details.
  NOTE: The one incompatibility is that _all_ clients are now subject
  to the limit imposed by the server's "-C maxClients" command line
  option.  If you have been using "-C 0" in conjunction with the
  "cvsupd.access" file, you will need to increase the number.

  Implemented a new "mirror mode" for servers that are mirroring
  files from a master site.  It reduces the disk load by orders of
  magnitude.  Mirror mode is enabled by a new "-s" option to cvsupd.
  See cvsupd(8) for full details.

  Restructured a recursive function which could cause a thread stack
  to overflow in pathological cases involving RCS files with zillions
  of deltas.  If you have ever seen illegal instruction faults,
  segmentation violations, or infinite looping (especially when
  updating CVSROOT/modules,v), this is the fix for it.

  Fixed the protocol engine so that a lost network connection no
  longer can cause a misleading error message.  This also fixed a
  rare problem (I've only seen it once) in which a lost connection
  at exactly the wrong time could abort the server due to an assert
  failure.

  Made the server processes display pertinent information about what
  they are doing in the Unix "ps" listing.  [Supported only under
  FreeBSD.]

  Fixed the server so that the whole thing doesn't die if a fork()
  fails.

  Improved the error message when a collection is temporarily
  unavailable because an NFS server is not responding.

  Fixed the Makefiles so that they are much more portable.  You should
  be able to use them on any Unix system worthy of the name.

  Beefed up the "-v" version messages so that the client indicates
  whether it is the GUI version, and both the client and server
  mention the e-mail address for bug reports.

  Added the bug reporting address to the info window in the client's
  GUI.

  Removed the obsolete "supconv" utility.

  Fixed lots of minor bugs.

Notable changes in release 15.2:

  Changed the expansion of the "CVSHeader" RCS keyword so that
  it deletes "Attic/" from the pathname if it is present.  This
  prevents the expansion from changing on a branch simply because
  the file was killed or brought back to life on the main branch.  A
  similar change has been made to FreeBSD's RCS and CVS systems.

  Fixed the handling of file permissions in checkout mode.  Now each
  checked out file's execute bits are set based on the permissions
  of the corresponding RCS file and the client's umask setting.
  This means that checked out shell scripts and similar files will
  be executable as they should be.

  Fixed the general policy for dealing with file permissions when
  "preserve" is not set in the supfile.  Formerly, the permissions
  were set when CVSup first created each file, and then ignored
  after that.  Now, CVSup checks the permissions on each update, and
  sets them properly within the restrictions imposed by the client's
  umask setting.

  Made checkout-mode updates more robust against evil manipulations
  of RCS files by CVS repository administrators.  The client now
  records the revision date as well as the revision number for each
  checkout-mode file.  If the CVS administrator replaces an RCS file
  with a completely different RCS file, CVSup will notice that the
  dates of corresponding revision numbers are different and realize
  that the client's revision m.n doesn't correspond to the server's
  idea of what revision m.n is.  It will do a full checkout of the
  affected file instead of trying to edit it based on bad information.
  Formerly, this sort of thing could cause assertion failures and
  other embarrassments.

  Fixed a bug in the negotiation of file attribute support which could
  cause an assertion failure if "preserve" mode was used between a
  server [or client] running under FreeBSD and a client [or server]
  running under a non-FreeBSD OS such as Linux.

  Eliminated this server warning message: "Could not generate edits
  for foo,v 1.1.2.1 -> 1.1.1.1.2.1: 36: Non-existent revision number
  1.1.2.1 -- attempting full checkout".  The message was too scary,
  and it typically didn't represent a situation that required human
  intervention.

  Fixed several portability problems, based on experiences with HP-UX
  10.20, Linux, Digital Unix, and SunOS.

  Improved the error messages emitted by the client when a corrupted
  or truncated "checkouts" file is detected.  They now suggest what
  to do about it.  Also eliminated an assertion failure that could
  arise in this situation.

  Added extra validity checks for the deltas received from the server,
  to ensure that the edits will apply cleanly to the client's file
  before attempting to apply them.  This eliminates a few potential
  assertion failures.

Notable changes in release 15.1:

  Implemented a new "multiplexed" mode of operation which should
  eliminate all of the obstacles to using CVSup behind a firewall.
  In multiplexed mode, only a single TCP connection from the client
  to the server is used.  A built-in packet layer multiplexes the
  four data streams over the single connection.  This mode is
  enabled by specifying "-P m" on the cvsup command line.  It works
  with or without SOCKS.

  Fixed a potential security problem:  In certain circumstances
  it was possible for the client to create a setuid file with the
  wrong owner.

  Made the client and server deal better with files such as log
  files which often grow on the server while they are being
  transferred.  The fix is duplicated in both the client and server,
  so that a current version of either is sufficient to get the
  improved behavior.

  Made the client and the server log the software version of the
  other, if it is known.  Of course, it is only known if it is this
  version or later.

  Fixed a GUI bug:  The "other" statistics weren't reset properly when
  starting a new update.

  In checkout mode, made the system deal better with broken CVS
  repositories that have file deaths recorded on the vendor branch.

  Fixed a bug in the handling of the client's "-i pattern" options and
  the equivalent "filter" type-in when in checkout mode.  Specifying
  a directory did not cause an update of all files under it when in
  checkout mode; it was necessary to specify a pattern like "dir/*".

  Added a new server option "-e" to suppress the usual redirection of
  the standard output and standard error to "/dev/null".  This really
  helps to diagnose crashes when they happen.  Please use it!

Notable changes in release 15.0:

  Added the ability to update only selected files from a collection,
  by specifying file name patterns with a new "-i " command line
  option on the client.  The GUI also has a type-in field where
  patterns can be entered, separated by spaces.

  Added the ability to update all kinds of files, including symbolic
  links, hard links, and device nodes.

  Added support for mirroring directories exactly.  I.e., empty
  directories on the server are now preserved on the client.

  Added the ability to preseve all file attributes, including owner,
  group, modes, and flags.  This is under control of a new "preserve"
  keyword in the supfile.

  Changed the client's default verbosity level from "-L 0" to "-L 1".

  Added support for the "symlink" and "rsymlink" directives on the
  server, to control which symbolic links are followed and which
  are updated as links.

  Added support for specifying patterns and/or non-directory files
  in the server's "upgrade" and "always" directives.

  Added support for multiple patterns on the server's "upgrade",
  "always", and "omitany" directives, as well as on the new "symlink"
  and "rsymlink" directives.

  Enhanced server's "-c" option to accept a colon-separated list
  of directories for searching for collections, so that the
  collections no longer all need to be in the same place.

  Eliminated the client's "-d" and "-D" command line options.  They
  were never very useful, and I had other purposes in mind for those
  letters.  (See the next item.)

  Added a new "-d delLimit" option for specifying the maximum number
  of files that may be deleted by the client before it decides that
  something is seriously wrong.  The "-d" conflicts with older
  versions' uses of "-d".  But there should be little confusion,
  because the new version requires a numeric argument while the
  old one accepted no arguments.

  Significantly sped up the processing of the client's "checkouts"
  file.  This eliminates a long delay that had been observed between
  updating the last collection and shutting down.

  Added support for the non-standard RCS keyword "CVSHeader".  It
  expands the same as "Header", except that the pathname comes out
  as relative to the prefix rather than as absolute.  Assuming the
  prefix is the root of the CVS repository, this gives relative
  pathnames within the repository.

  Added support for defining aliases for existing RCS keywords, and
  for enabling and disabling the recognition of individual keywords.
  This is controlled on a repository-wide basis by directives in a
  file "<prefix>/CVSROOT/options" on the server.

  Added checking of file sizes in addition to modtimes during the
  initial culling phase.  This adds some network traffic, but it
  also adds a degree of safety.  It doesn't seem to slow things
  down much for typical updates.

  Added the "fnmatch" sources to the distribution, so that CVSup
  can be built on platforms that lack a full-featured version of
  it.

  The static binaries for FreeBSD now include a distribution of the
  client built without the GUI.  It is much smaller, and may be
  preferred by people who never use the GUI.

Notable changes in release 14.1.4 (a beta release):

  Added an inactivity timeout to the client, enabled only in non-GUI
  mode.  If 15 minutes pass without any network I/O, the update is
  terminated with a transient error (so that it will be retried).
  This is useful when the client is run from cron.

  Added a new "-r maxRetries" command line option for the client,
  to cause it to give up after the specified number of retries.
  This is a generalization of the old "-1" option, which is equivalent
  to "-r 0".

  Added checking to ensure that the client-side "checkouts*" file
  is sorted properly.  CVSup always keeps this file in sorted order.
  But if it gets corrupted such that it is no longer sorted, mass
  deletions can result.  This actually happened on a system that
  had faulty RAM.  A 1-bit error changed a "/" to something else.

  Added checksumming and fixups for all kinds of file updates.
  Formerly, this was done only for updates that modified (edited)
  existing files.  Now, even files that are sent verbatim are
  checked.

  Fixed a bug in searching for the revision in effect on a certain
  date.  Example:  Searching on the trunk.  The head is 2.2.  The
  selected revision is 1.7.  Because the first components were
  different, the code erroneously considered the file to be dead
  on the given date.  The fix treats the trunk as a special case.
  The bug affected just a few files, and only when checkout mode
  was used on the main branch with "date=yy.mm.dd.hh.mm.ss".

  Added support for the "execute" keyword, for executing server-specified
  commands on the client when certain files are updated.

  Added new client options "-e" and "-E", to enable and disable
  the "execute" feature.

  Fixed the server's logging so that it now works to specify "-l
  /dev/stdout" on the command line.

  Added the necessary "libmd" sources to the distribution, so it
  is no longer necessary to get them separately and install them.

  Changed the server so that it will let you run it as root again.

Notable changes in release 14.1.1:

  This release was made solely to fix a server bug that was imminently
  going to cause problems for the FreeBSD mirror sites.  The bug
  showed itself in checkout mode.  If an RCS file in the repository
  had the client's delta _deleted_ from it (i.e., "rcs -o1.15
  file.c"), then the server would do a null pointer dereference
  and die.  Deltas are "never" supposed to be deleted from a
  repository, but it may happen in the case of manual repairs.
  (Unamusingly, the null pointer dereference happened in the code
  that was simply trying to warn about the strange situation.)

  There were _no_ client changes between release 14.1 and 14.1.1.

Notable changes in release 14.1:

  For both the client and the server, there is now a "-c collDir"
  command line option for overriding the name of the subdirectory
  where the collection information is maintained.  The name used
  to be hard-wired to "sup", and that is still the default.

  If the client's prefix directory for a collection doesn't exist,
  it is no longer a fatal error.  A warning is produced and the
  offending collection is skipped, but the others are still processed
  normally.  If the prefix is a symbolic link pointing to "SKIP",
  the warning is suppressed.

  Fixed a server problem that caused certain pathological updates in
  checkout mode to take damned near forever.

  Fixed a problem that caused fixups to be performed for certain
  RCS files that were corrupted to begin with.  The files had incorrect
  dates on some revisions, because they had been hacked up by hand.
  That caused the client to write out the delta texts in the wrong
  order.  Since there was a way to work around this dubious situation, I
  implemented it.

  Changed the logic surrounding the time stamp comparisons between
  files on the client and files on the server, eliminating a
  miniscule possibility of missed updates.  Now, the system can
  detect it if a file happens to have been modified independently
  on both the client and the server at exactly the same time.  The
  file is recognized as possibly needing an update, even though
  its time stamp is the same on the client and the server.

  Fixed the client's lock file handling ("-l" option) so that the
  lock remains held during the intervals between retries.  Formerly,
  the lock was released during those intervals, rendering it fairly
  useless for avoiding multiple stacked up processes from cron
  jobs.

  Added a check to make sure it is possible to get the client host's
  own IP address before starting up the GUI.  Formerly, misconfigured
  hosts (e.g., incorrect host name) would result in a baffling
  "IP.FatalError" message.

  Changed the priorities for syslog messages from the server so
  that messages associated with individual client connections are
  logged at "info" level rather than "notice".  For simple syslog.conf
  setups, that takes these mostly informational messages out of
  /var/log/messages, where they caused a lot of clutter.  The
  logging still isn't perfect, as a few more serious messages now
  also come out at "info" level.  Nevertheless, the new situation
  is an improvement.

  Added a new "-k" command line option for the client, intended
  for debugging.  This option causes the bad temporary files to be
  saved for files requiring fixups due to incorrect edits.  The
  fixups are still performed, regardless.

  Further improved the server's handling of corrupted RCS files.
  In virtually all circumstances, the server should now be able to
  issue warnings for corrupted RCS files and carry on with the
  remaining updates.

  Beefed up the semantic checking of RCS files, to detect some more
  pernicious kinds of corruption.

  Added a "norsync" option which can be specified in the server's
  "releases" files.  It allows the server to disable the use of
  the rsync algorithm for selected collections and releases.  This
  is beneficial for CVS repositories, where CVSup's "append" updates
  work better and more efficiently than the rsync algorithm.

  Added additional server checks of the filenames received from
  the client, to ensure that the server cannot be spoofed into
  delivering files from outside its collections.

Notable changes in release 14.0:

  CVSup now uses Tridgell & Mackerras' "rsync" algorithm for updating
  non-RCS files.  It is enabled by default, though it can be turned
  off for individual collections by specifying the "norysnc" keyword.

  The supfile can now have special collections named "*default" to
  specify default parameters for subsequent collections.

  The "base" and "host" supfile settings can now be overridden on
  the client's command line.

  The client now supports multiple "refuse" files:  a global one
  which applies to all collections; a per-collection one; and one
  that is specific to a release+tag within its collection.

  There is now a client option to specify a lock file, to prevent
  multiple cvsup processes from interfering with each other.  It
  is useful when the client is run periodically from cron, to avoid
  trouble if a job runs unusually long because of network problems.

  The client now refuses to create the "base" or "prefix" directory
  for any collection.  Instead, it emits a diagnostic if either
  directory doesn't exist.  As a special case, if the "prefix" is
  a symbolic link pointing to a nonexistent file named "SKIP", the
  associated collection will be skipped without complaint.

  The default "base" for the client is now "/usr/local/etc/cvsup".

  Both the server's and client's "prefix" directories are now
  interpreted relative to their base directories, if they are not
  absolute pathnames.

  The client now silently refuses to set the setuid, setgid, and
  sticky bits in files that it creates or updates.

  The client now does a better job of cleaning up its temporary
  files when it is killed by a signal.

  The client now tries harder to look up the IP address of the
  server host.

  There is a new "keywordprefix" keyword for the server's "releases"
  file.  It specifies a prefix that is used when constructing the
  pathnames generated by the Header and Source RCS keywords.  This
  allows the actual repositories to be in different places on
  different machines, while still producing identical expansions
  of the RCS keywords.

  The server will now accept connections from certain "friends"
  listed in a configuration file, regardless of whether the maximum
  number of simultaneous connections has been exceeded.

  The server can now do its logging via syslog.

  The server log messages have been cleaned up quite a bit.

  The server now logs any repository problems that it notices,
  e.g., unparsable RCS files, non-RCS files in the Attic, and so
  forth.

  The server now ignores any "hostbase" specified in the client's
  supfile.  A new server argument "-b base" specifies the base
  directory.  The default is now "/usr/local/etc/cvsup".

  The server now validates all collection names to make sure they
  contain no slashes and are not equal to "." or "..".

  The server now checks for certain errors earlier, before becoming
  a daemon.

  All of the programs except the server now install into
  "/usr/local/bin".  The server still installs into "/usr/local/sbin".

  Fixed a bug in the ordering of the "branches" list in the RCS file,
  which on very rare occasions caused a "fixup" to be required.

  Fixed a bug which could cause the client to hang trying to flush
  its network buffers after the user pressed the "stop" button in
  the GUI.

  Fixed a bug that caused the client to complain "file exists" when
  trying to create directories leading up to a new file, if the
  pathname contained a "." (current directory) component in it.
  This prevented "upgrade ." from being used in the server collection
  list files.  Unfortunately, since it's a client-side bug, such
  lines still should not be used for a while, until older releases
  of the client have evaporated away.

  Fixed a bug which produced a misleading error message when a
  failure occurred in making the directories leading up to the
  temporary file that is used for the list file in the client.

  When bad tokens or protocol errors are encountered, the offending
  text is no longer included in the error message.  Sometimes it
  contained voluminous amounts of garbage.

  Messages reporting errors in the client-side list files are
  accompanied by line numbers now.

Notable changes in release 13.5:

  Support SOCKS, using a new add-on library in ports/lang/modula-3-socks.

  Add command line options "-z" and "-Z" for directly controlling the
  "compress" option, overriding what is in the supfile.  Likewise, add
  "-d" and "-D" for overriding the "delete" option.

  Make the client retry automatically when transient failures occur.
  This is done only in batch (non-GUI) mode.  Retries use randomized
  exponential backoff.  The retry delay starts out at about 5 minutes,
  and increases to a maximum of about 2 hours.

  Programs are now built fully dynamically linked by default.  If
  "-DSTATIC" is in the "M3FLAGS" environment variable, then they are
  linked fully static.  If "-DM3STATIC" is present, then the Modula-3
  libraries are linked statically, and the system libraries are linked
  dynamically.  (This used to be the default.)

  It is now possible to build the client without the GUI, by adding
  "-DNOGUI" to the "M3FLAGS" environment variable.

Notable changes in release 13.4:

  Detect and send changes to the RCS keyword expansion mode.
  Formerly, these (rare) changes were ignored.  That caused checksum
  mismatches, which slowed down updates because the whole files had
  to be sent as fixups.

  Report 0-byte appends as what they really are, i.e., touches.
  Add a new statistics line for them.

  Make the command line option handling comply better with POSIX.

  Fix supconv to handle recent changes to the example "ports-supfile"
  in FreeBSD-current.

  Add a timeout to kill a server process when it has been inactive
  too long (15 minutes).  This replaces the TCP keepalives that were
  added in the previous release.

  Add a hack to the server to make it easier to shut it down in a
  controlled manner.  If a file "cvsupd-HALT" exists in the directory
  from which the server was started, and if it is newer than the
  time when the server was started, then the server will reject
  all new incoming connection requests.

  Make some changes to the zlib interface to eliminate the potential for
  an unsafe interaction with the garbage collector.

  FreeBSD binary releases are now built with a new version of the
  Modula-3 runtime that has a thread-safe version of malloc built
  into it.  This cures some vexing core dumps that had been happening
  from time to time.

  Add work-arounds for the worst of the problems associated with malloc
  packages that are not thread-safe.  These are not complete, however.
  I will probably incorporate a (hopefully portable) thread-safe malloc
  in the next release.

  Eliminate several FreeBSD-specific constructs that caused
  portability problems on other platforms.  There is a good chance
  now that this software will compile and run out-of-the-box on
  most POSIX systems with standard SRC Modula-3 installations.

Notable changes in release 13.3:

  Implement a passive mode for establishing the data connection,
  to help people who live behind firewalls.  Passive mode is similar
  to ftp's passive mode: all TCP connections are initiated from
  the client.  See the "-P -" option in cvsup(1).

  Make the system much more resiliant in the face of errors in the
  server's CVS repository, such as unreadable files and garbled
  RCS files.  Almost all such situations now lead to simple warnings,
  rather than fatal errors.

  Make it a warning rather than a fatal error when the client
  specifies an invalid collection.

  Fix the broken "refuse" file handling.

  Make the server refuse to run as root, for security reasons.

  Fix a bug that could cause a fatal error to occur in certain
  situations involving local check-ins to RCS files in the CVS
  repository.

  Fix a server bug encountered during SOCKS testing.  Note: This
  release of CVSup still does not work with SOCKS.

  Enable TCP keepalives on the server.

Notable changes in release 13.2:

  Fix a bug that caused the server to give up when an RCS file in the
  repository got really out of whack.  This happened only when it was
  trying to update a client file in checkout mode.  Now the server falls
  back upon checking out a fresh copy of the file.

Notable changes in release 13.1:

  Fix a bug that caused the server to leave zombie processes under
  FreeBSD-current.

  Fix a bug that caused the build to fail on a manual page problem
  under FreeBSD-current.

  Permit more control over which TCP ports are used, making it more
  convenient to use the client behind a firewall.  See the new "-P"
  option in cvsup(1).

  Support building static, dynamic, or partly dynamic executables.
  "Partly dynamic" means the system libraries are dynamic, but the
  Modula-3 runtime libraries are static.  See "Install" for details.
  For now, I am still putting fully static executables in the binary
  distributions.

  Respond more quickly to the interrupt button on the client GUI.

  Fix the supconv utility to handle the ports collection better.

  Make supconv install properly, and add a manual page for it.

  Add various enhancements to the manual pages.

Release 13.0:

  Initial public release.