[Unison-hackers] [unison-svn] r412 - in branches: . 2.40/doc 2.40/src 2.40/src/ubase

bcpierce@seas.upenn.edu bcpierce at seas.upenn.edu
Sat Feb 20 18:23:17 EST 2010


Author: bcpierce
Date: 2010-02-20 18:23:17 -0500 (Sat, 20 Feb 2010)
New Revision: 412

Added:
   branches/2.40/
   branches/2.40/doc/changes.tex
   branches/2.40/src/NEWS
   branches/2.40/src/RECENTNEWS
   branches/2.40/src/mkProjectInfo.ml
   branches/2.40/src/strings.ml
   branches/2.40/src/ubase/depend
Removed:
   branches/2.40/doc/changes.tex
   branches/2.40/src/NEWS
   branches/2.40/src/RECENTNEWS
   branches/2.40/src/mkProjectInfo.ml
   branches/2.40/src/strings.ml
   branches/2.40/src/ubase/depend
Log:
New release branch

Deleted: branches/2.40/doc/changes.tex
===================================================================
--- trunk/doc/changes.tex	2010-02-17 13:06:38 UTC (rev 410)
+++ branches/2.40/doc/changes.tex	2010-02-20 23:23:17 UTC (rev 412)
@@ -1,1613 +0,0 @@
-\begin{changesfromversion}{2.31}
-\item Small user interface changes
-\begin{itemize}
-\item Small change to text UI "scanning..." messages, to print just
-  directories (hopefully making it clearer that individual files are
-  not necessarily being fingerprinted).  
-\end{itemize}
-\item Minor fixes and improvements:
-\begin{itemize}
-\item Ignore one hour differences when deciding whether a file may have
-  been updated.  This avoids slow update detection after daylight
-  saving time changes under Windows.  This makes Unison slightly more
-  likely to miss an update, but it should be safe enough.
-\item Fix a small bug that was affecting mainly windows users.  We need to
-  commit the archives at the end of the sync even if there are no
-  updates to propagate because some files (in fact, if we've just
-  switched to DST on windows, a LOT of files) might have new modtimes
-  in the archive.  (Changed the text UI only.  It's less clear where
-  to change the GUI.)
-\item Don't delete the temp file when a transfer fails due to a
-  fingerprint mismatch (so that we can have a look and see why!)  We've also
-  added more debugging code togive more informative error messages when we
-  encounter the dreaded and longstanding "assert failed during file
-  transfer" bug
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.27}
-\item If Unison is interrupted during a directory transfer, it will now
-leave the partially transferred directory intact in a temporary
-location. (This maintains the invariant that new files/directories are
-transferred either completely or not at all.)  The next time Unison is run,
-it will continue filling in this temporary directory, skipping transferring
-files that it finds are already there.
-\item We've added experimental support for invoking an external file
-transfer tool for whole-file copies instead of Unison's built-in transfer
-protocol.  Three new preferences have been added:
-\begin{itemize}
-\item {\tt copyprog} is a string giving the name (and command-line
-switches, if needed) of an external program that can be used to copy large
-files efficiently.  By default, rsync is invoked, but other tools such as
-scp can be used instead by changing the value of this preference.  (Although
-this is not its primary purpose, rsync is actually a pretty fast way of
-copying files that don't already exist on the receiving host.)  For files
-that do already exist on (but that have been changed in one replica), Unison
-will always use its built-in implementation of the rsync algorithm.
-\item Added a "copyprogrest" preference, so that we can give different
-command lines for invoking the external copy utility depending on whether a
-partially transferred file already exists or not.  (Rsync doesn't seem to
-care about this, but other utilities may.)
-\item {\tt copythreshold} is an integer (-1 by default), indicating above what
-filesize (in megabytes) Unison should use the external copying utility
-specified by copyprog.  Specifying 0 will cause ALL copies to use the
-external program; a negative number will prevent any files from using it.
-(Default is -1.)
-\end{itemize}
-Thanks to Alan Schmitt for a huge amount of hacking and to an anonymous
-sponsor for suggesting and underwriting this extension.
-\item Small improvements:
-\begin{itemize}
-\item Added a new preference, {\tt dontchmod}.  By default, Unison uses the
-{\tt chmod} system call to set the permission bits of files after it has
-copied them.  But in some circumstances (and under some operating systems),
-the chmod call always fails.  Setting this preference completely prevents
-Unison from ever calling {\tt chmod}.
-\item Don't ignore files that look like backup files if the {\tt
-  backuplocation} preference is set to {\tt central}
-\item Shortened the names of several preferences.  The old names are also
-still supported, for backwards compatibility, but they do not appear in the
-documentation.
-\item Lots of little documentation tidying.  (In particular, preferences are
-separated into Basic and Advanced!  This should hopefully make Unison a
-little more approachable for new users.
-\item Unison can sometimes fail to transfer a file, giving the unhelpful
-message "Destination updated during synchronization" even though the file
-has not been changed.  This can be caused by programs that change either the
-file's contents \emph{or} the file's extended attributes without changing
-its modification time.  It's not clear what is the best fix for this -- it
-is not Unison's fault, but it makes Unison's behavior puzzling -- but at
-least Unison can be more helpful about suggesting a workaround (running once
-with {\tt fastcheck} set to false).  The failure message has been changed to
-give this advice.
-\item Further improvements to the OS X GUI (thanks to Alan Schmitt and Craig
-Federighi).
-\end{itemize}
-\item Very preliminary support for triggering Unison from an external 
-  filesystem-watching utility.  The current implementation is very
-  simple, not efficient, and almost completely untested---not ready 
-  for real users.  But if someone wants to help improve it (e.g.,
-  by writing a filesystem watcher for your favorite OS), please make
-  yourself known!
-
-  On the Unison side, the new behavior is very simple:
-  \begin{itemize}
-  \item use the text UI 
-    \item start Unison with the command-line flag "-repeat FOO", 
-      where FOO is name of a file where Unison should look 
-      for notifications of changes
-    \item  when it starts up, Unison will read the whole contents 
-      of this file (on both hosts), which should be a 
-      newline-separated list of paths (relative to the root 
-      of the synchronization) and synchronize just these paths, 
-      as if it had been started with the "-path=xxx" option for 
-      each one of them
-    \item when it finishes, it will sleep for a few seconds and then
-      examine the watchfile again; if anything has been added, it
-      will read the new paths, synchronize them, and go back to 
-      sleep
-    \item that's it!
-  \end{itemize}
-  To use this to drive Unison "incrementally," just start it in 
-  this mode and start up a tool (on each host) to watch for
-  new changes to the filesystem and append the appropriate paths
-  to the watchfile.  Hopefully such tools should not be too hard
-  to write.
-\item Bug fixes:
-\begin{itemize}
-\item Fixed a bug that was causing new files to be created with
-  permissions 0x600 instead of using a reasonable default (like
-  0x644), if the 'perms' flag was set to 0.  (Bug reported by Ben
-  Crowell.)
-\item Follow maxthreads preference when transferring directories.
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.17}
-\item Major rewrite and cleanup of the whole Mac OS X graphical user
-interface by Craig Federighi.  Thanks, Craig!!!
-\item Small fix to ctime (non-)handling in update detection under windows
-  with fastcheck.  
-\item Several small fixes to the GTK2 UI to make it work better under
-Windows [thanks to Karl M for these].
-\item The backup functionality has been completely rewritten.  The external
-interface has not changed, but numerous bugs, irregular behaviors, and
-cross-platform inconsistencies have been corrected.
-\item The Unison project now accepts donations via PayPal.  If you'd like to
-donate, you can find a link to the donation page on the
-\URL{http://www.cis.upenn.edu/~bcpierce/unison/lists.html}{Unison home
-  page}.
-\item Some important safety improvements:
-\begin{itemize}
-\item Added a new \verb|mountpoint| preference, which can be used to specify
-a path that must exist in both replicas at the end of update detection
-(otherwise Unison aborts).  This can be used to avoid potentially dangerous
-situations when Unison is used with removable media such as external hard
-drives and compact flash cards.  
-\item The confirmation of ``big deletes'' is now controlled by a boolean preference
-  \verb|confirmbigdeletes|.  Default is true, which gives the same behavior as
-  previously.  (This functionality is at least partly superceded by the
-  \verb|mountpoint| preference, but it has been left in place in case it is
-  useful to some people.)
-  \item If Unison is asked to ``follow'' a symbolic link but there is
-  nothing at the other end of the link, it will now flag this path as an
-  error, rather than treating the symlink itself as missing or deleted.
-  This avoids a potentially dangerous situation where a followed symlink
-  points to an external filesystem that might be offline when Unison is run
-  (whereupon Unison would cheerfully delete the corresponding files in the
-  other replica!).
-\end{itemize}
-
-\item Smaller changes:
-\begin{itemize}
-\item Added \verb|forcepartial| and \verb|preferpartial| preferences, which
-behave like \verb|force| and \verb|prefer| but can be specified on a
-per-path basis. [Thanks to Alan Schmitt for this.]
-\item A bare-bones self test feature was added, which runs unison through
-  some of its paces and checks that the results are as expected.  The
-  coverage of the tests is still very limited, but the facility has already
-  been very useful in debugging the new backup functionality (especially in
-  exposing some subtle cross-platform issues).
-\item Refined debugging code so that the verbosity of individual modules
-  can be controlled separately.  Instead of just putting '-debug
-  verbose' on the command line, you can put '-debug update+', which
-  causes all the extra messages in the Update module, but not other
-  modules, to be printed.  Putting '-debug verbose' causes all modules
-  to print with maximum verbosity.
-\item Removed \verb|mergebatch| preference.  (It never seemed very useful, and
-  its semantics were confusing.)
-\item Rewrote some of the merging functionality, for better cooperation
-  with external Harmony instances.
-\item Changed the temp file prefix from \verb|.#| to \verb|.unison|.
-\item Compressed the output from the text user interface (particularly
-  when run with the \verb|-terse| flag) to make it easier to interpret the
-  results when Unison is run several times in succession from a script.
-\item Diff and merge functions now work under Windows.
-\item Changed the order of arguments to the default diff command (so that
-  the + and - annotations in diff's output are reversed).
-\item Added \verb|.mpp| files to the ``never fastcheck'' list (like
-\verb|.xls| files). 
-\end{itemize}
-
-\item Many small bugfixes, including:
-\begin{itemize}
-\item Fixed a longstanding bug regarding fastcheck and daylight saving time
-  under Windows when Unison is set up to synchronize modification times.
-  (Modification times cannot be updated in the archive in this case,
-  so we have to ignore one hour differences.)
-\item Fixed a bug that would occasionally cause the archives to be left in
-  non-identical states on the two hosts after synchronization.
-\item Fixed a bug that prevented Unison from communicating correctly between
-  32- and 64-bit architectures.
-\item On windows, file creation times are no longer used as a proxy for
-  inode numbers.  (This is unfortunate, as it makes fastcheck a little less
-  safe.  But it turns out that file creation times are not reliable 
-  under Windows: if a file is removed and a new file is created in its
-  place, the new one will sometimes be given the same creation date as the
-  old one!)
-\item Set read-only file to R/W on OSX before attempting to change other attributes.
-\item Fixed bug resulting in spurious "Aborted" errors during transport
-(thanks to Jerome Vouillon) 
-\item Enable diff if file contents have changed in one replica, but
-only properties in the other.
-\item Removed misleading documentation for 'repeat' preference.
-\item Fixed a bug in merging code where Unison could sometimes deadlock
-  with the external merge program, if the latter produced large
-  amounts of output.
-\item Workaround for a bug compiling gtk2 user interface against current versions
-  of gtk2+ libraries.  
-\item Added a better error message for "ambiguous paths".
-\item Squashed a longstanding bug that would cause file transfer to fail
-  with the message ``Failed: Error in readWrite: Is a directory.''
-\item Replaced symlinks with copies of their targets in the Growl framework in src/uimac.
-  This should make the sources easier to check out from the svn repository on WinXP
-  systems.
-\item Added a workaround (suggested by Karl M.) for the problem discussed
-  on the unison users mailing list where, on the Windows platform, the
-  server would hang when transferring files.  I conjecture that
-  the problem has to do with the RPC mechanism, which was used to
-  make a call {\em back} from the server to the client (inside the Trace.log 
-  function) so that the log message would be appended to the log file on 
-  the client.  The workaround is to dump these messages (about when
-  xferbycopying shortcuts are applied and whether they succeed) just to the
-  standard output of the Unison process, not to the log file.
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.13.0}
-\item The features for performing backups and for invoking external merge
-programs have been completely rewritten by Stephane Lescuyer (thanks,
-Stephane!).  The user-visible functionality should not change, but the
-internals have been rationalized and there are a number of new features.
-See the manual (in particular, the description of the \verb|backupXXX|
-preferences) for details.
-\item Incorporated patches for ipv6 support, contributed by Samuel Thibault.
-(Note that, due to a bug in the released OCaml 3.08.3 compiler, this code
-will not actually work with ipv6 unless compiled with the CVS version of the
-OCaml compiler, where the bug has been fixed; however, ipv4 should continue
-to work normally.)
-\item OSX interface:
-\begin{itemize}
-\item Incorporated Ben Willmore's cool new icon for the Mac UI.
-\end{itemize}
-\item Small fixes:
-\begin{itemize}
-\item Fixed off by one error in month numbers (in printed dates) reported 
-  by Bob Burger
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.12.0}
-\item New convention for release numbering: Releases will continue to be
-given numbers of the form \verb|X.Y.Z|, but, 
-from now on, just the major version number (\verb|X.Y|) will be considered
-significant when checking compatibility between client and server versions.
-The third component of the version number will be used only to identify
-``patch levels'' of releases.
-
-This change goes hand in hand with a change to the procedure for making new
-releases.  Candidate releases will initially be given ``beta release''
-status when they are announced for public consumption.  Any bugs that are
-discovered will be fixed in a separate branch of the source repository
-(without changing the major version number) and new tarballs re-released as
-needed.  When this process converges, the patched beta version will be
-dubbed stable.
-\item Warning (failure in batch mode) when one path is completely emptied.
-  This prevents Unison from deleting everything on one replica when
-  the other disappear.
-\item Fix diff bug (where no difference is shown the first time the diff
-  command is given).
-\item User interface changes:
-\begin{itemize}
-\item Improved workaround for button focus problem (GTK2 UI)
-\item Put leading zeroes in date fields
-\item More robust handling of character encodings in GTK2 UI
-\item Changed format of modification time displays, from \verb|modified at hh:mm:ss on dd MMM, yyyy|
-to \verb|modified on yyyy-mm-dd hh:mm:ss|
-\item Changed time display to include seconds (so that people on FAT
-  filesystems will not be confused when Unison tries to update a file
-  time to an odd number of seconds and the filesystem truncates it to
-  an even number!)
-\item Use the diff "-u" option by default when showing differences between files
-  (the output is more readable)
-\item In text mode, pipe the diff output to a pager if the environment
-  variable PAGER is set
-\item Bug fixes and cleanups in ssh password prompting.  Now works with
-  the GTK2 UI under Linux.  (Hopefully the Mac OS X one is not broken!)
-\item Include profile name in the GTK2 window name
-\item Added bindings ',' (same as '<') and '.' (same as '>') in the GTK2 UI
-\end{itemize}
-\item Mac GUI:
-\begin{itemize}
-\item actions like < and > scroll to the next item as necessary.
-\item Restart has a menu item and keyboard shortcut (command-R).
-\item 
-    Added a command-line tool for Mac OS X.  It can be installed from
-    the Unison menu.
-\item New icon.
-\item   Handle the "help" command-line argument properly.
-\item   Handle profiles given on the command line properly.
-\item  When a profile has been selected, the profile dialog is replaced by a
-    "connecting" message while the connection is being made.  This
-    gives better feedback.
-\item   Size of left and right columns is now large enough so that
-    "PropsChanged" is not cut off.
-\end{itemize}
-\item Minor changes:
-\begin{itemize}
-\item Disable multi-threading when both roots are local
-\item Improved error handling code.  In particular, make sure all files
-  are closed in case of a transient failure
-\item Under Windows, use \verb|$UNISON| for home directory as a last resort
-  (it was wrongly moved before \verb|$HOME| and \verb|$USERPROFILE| in
-  Unison 2.12.0)
-\item Reopen the logfile if its name changes (profile change)
-\item Double-check that permissions and modification times have been
-  properly set: there are some combination of OS and filesystem on
-  which setting them can fail in a silent way.
-\item Check for bad Windows filenames for pure Windows synchronization
-  also (not just cross architecture synchronization).
-  This way, filenames containing backslashes, which are not correctly
-  handled by unison, are rejected right away.
-\item Attempt to resolve issues with synchronizing modification times
-  of read-only files under Windows
-\item Ignore chmod failures when deleting files
-\item Ignore trailing dots in filenames in case insensitive mode
-\item Proper quoting of paths, files and extensions ignored using the UI
-\item The strings CURRENT1 and CURRENT2 are now correctly substitued when
-  they occur in the diff preference
-\item Improvements to syncing resource forks between Macs via a non-Mac system.
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.10.2}
-\item \incompatible{} Archive format has changed.  
-\item Source code availability: The Unison sources are now managed using
-  Subversion.  One nice side-effect is that anonymous checkout is now
-  possible, like this:
-\begin{verbatim}
-        svn co https://cvs.cis.upenn.edu:3690/svnroot/unison/
-\end{verbatim}
-We will also continue to export a ``developer tarball'' of the current
-(modulo one day) sources in the web export directory.  To receive commit logs
-for changes to the sources, subscribe to the \verb|unison-hackers| list
-(\ONEURL{http://www.cis.upenn.edu/~bcpierce/unison/lists.html}). 
-\item Text user interface:
-\begin{itemize}
-\item Substantial reworking of the internal logic of the text UI to make it
-a bit easier to modify.
-\item The {\tt dumbtty} flag in the text UI is automatically set to true if
-the client is running on a Unix system and the {\tt EMACS} environment
-variable is set to anything other than the empty string.
-\end{itemize}
-\item Native OS X gui:
-\begin{itemize}
-\item Added a synchronize menu item with keyboard shortcut
-\item Added a merge menu item, still needs to be debugged
-\item Fixes to compile for Panther
-\item Miscellaneous improvements and bugfixes
-\end{itemize}
-\item Small changes:
-\begin{itemize}
-\item Changed the filename checking code to apply to Windows only, instead
-  of OS X as well.
-\item Finder flags now synchronized
-\item Fallback in copy.ml for filesystem that do not support \verb|O_EXCL|
-\item  Changed buffer size for local file copy (was highly inefficient with
-  synchronous writes)
-\item Ignore chmod failure when deleting a directory
-\item  Fixed assertion failure when resolving a conflict content change /
-  permission changes in favor of the content change.
-\item Workaround for transferring large files using rsync.
-\item Use buffered I/O for files (this is the only way to open files in binary
-  mode under Cygwin).
-\item On non-Cygwin Windows systems, the UNISON environment variable is now checked first to determine 
-  where to look for Unison's archive and preference files, followed by \verb|HOME| and 
-  \verb|USERPROFILE| in that order.  On Unix and Cygwin systems, \verb|HOME| is used.
-\item Generalized \verb|diff| preference so that it can be given either as just 
-  the command name to be used for calculating diffs or else a whole command
-  line, containing the strings \verb|CURRENT1| and \verb|CURRENT2|, which will be replaced
-  by the names of the files to be diff'ed before the command is called.
-\item Recognize password prompts in some newer versions of ssh.
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.9.20}
-\item \incompatible{} Archive format has changed.  
-\item Major functionality changes:
-\begin{itemize}
-\item Major tidying and enhancement of 'merge' functionality.  The main
-  user-visible change is that the external merge program may either write
-  the merged output to a single new file, as before, or it may modify one or
-  both of its input files, or it may write {\em two} new files.  In the
-  latter cases, its modifications will be copied back into place on both the
-  local and the remote host, and (if the two files are now equal) the
-  archive will be updated appropriately.  More information can be found in
-  the user manual.  Thanks to Malo Denielou and Alan Schmitt for these
-  improvements.
-
-  Warning: the new merging functionality is not completely compatible with
-  old versions!  Check the manual for details.
-\item Files larger than 2Gb are now supported.
-\item Added preliminary (and still somewhat experimental) support for the
-  Apple OS X operating system.   
-\begin{itemize}
-\item Resource forks should be transferred correctly.  (See the manual for
-details of how this works when synchronizing HFS with non-HFS volumes.)
-Synchronization of file type and creator information is also supported.
-\item On OSX systems, the name of the directory for storing Unison's
-archives, preference files, etc., is now determined as follows:
-\begin{itemize}
-    \item if \verb+~/.unison+ exists, use it
-     \item otherwise, use \verb|~/Library/Application Support/Unison|, 
-         creating it if necessary.
-\end{itemize}
-\item A preliminary native-Cocoa user interface is under construction.  This
-still needs some work, and some users experience unpredictable crashes, so
-it is only for hackers for now.  Run make with {\tt UISTYLE=mac} to build
-this interface.
-\end{itemize}
-\end{itemize}
-
-\item Minor functionality changes:
-\begin{itemize}
-\item Added an {\tt ignorelocks} preference, which forces Unison to override left-over
-  archive locks.  (Setting this preference is dangerous!  Use it only if you
-  are positive you know what you are doing.) 
-% BCP: removed later
-% \item Running with the {\tt -timers} flag set to true will now show the total time taken
-%   to check for updates on each directory.  (This can be helpful for tidying directories to improve
-%   update detection times.)  
-\item Added a new preference {\tt assumeContentsAreImmutable}.  If a directory
-  matches one of the patterns set in this preference, then update detection
-  is skipped for files in this directory.  (The 
-  purpose is to speed update detection for cases like Mail folders, which
-  contain lots and lots of immutable files.)  Also a preference
-  {\tt assumeContentsAreImmutableNot}, which overrides the first, similarly
-  to {\tt ignorenot}.  (Later amendment: these preferences are now called
-  {\tt immutable} and {\tt immutablenot}.)
-\item The {\tt ignorecase} flag has been changed from a boolean to a three-valued
-  preference.  The default setting, called {\tt default}, checks the operating systems
-  running on the client and server and ignores filename case if either of them is
-  OSX or Windows.  Setting ignorecase to {\tt true} or {\tt false} overrides
-  this behavior.  If you have been setting {\tt ignorecase} on the command
-  line using {\tt -ignorecase=true} or {\tt -ignorecase=false}, you will
-  need to change to {\tt -ignorecase true} or {\tt -ignorecase false}.
-\item a new preference, 'repeat', for the text user interface (only).  If 'repeat' is set to
-  a number, then, after it finishes synchronizing, Unison will wait for that many seconds and
-  then start over, continuing this way until it is killed from outside.  Setting repeat to true
-  will automatically set the batch preference to true.  
-\item Excel files are now handled specially, so that the {\tt fastcheck}
-  optimization is skipped even if the {\tt fastcheck} flag is set.  (Excel
-  does some naughty things with modtimes, making this optimization
-  unreliable and leading to failures during change propagation.)
-\item The ignorecase flag has been changed from a boolean to a three-valued
-  preference.  The default setting, called 'default', checks the operating systems
-  running on the client and server and ignores filename case if either of them is
-  OSX or Windows.  Setting ignorecase to 'true' or 'false' overrides this behavior.
-\item Added a new preference, 'repeat', for the text user interface (only,
-  at the moment).  If 'repeat' is set to a number, then, after it finishes
-  synchronizing, Unison will wait for that many seconds and then start over,
-  continuing this way until it is killed from outside.  Setting repeat to
-  true will automatically set the batch preference to true.
-\item The 'rshargs' preference has been split into 'rshargs' and 'sshargs' 
-  (mainly to make the documentation clearer).  In fact, 'rshargs' is no longer
-  mentioned in the documentation at all, since pretty much everybody uses
-  ssh now anyway.
-\end{itemize}
-\item Documentation
-\begin{itemize}
-\item The web pages have been completely redesigned and reorganized.
-  (Thanks to Alan Schmitt for help with this.)
-\end{itemize}
-\item User interface improvements
-\begin{itemize}
-\item Added a GTK2 user interface, capable (among other things) of displaying filenames
-  in any locale encoding.  Kudos to Stephen Tse for contributing this code!  
-\item The text UI now prints a list of failed and skipped transfers at the end of
-  synchronization. 
-\item Restarting update detection from the graphical UI will reload the current
-  profile (which in particular will reset the -path preference, in case
-  it has been narrowed by using the ``Recheck unsynchronized items''
-  command).
-\item Several small improvements to the text user interface, including a
-  progress display.
-\end{itemize}
-\item Bug fixes (too numerous to count, actually, but here are some):
-\begin{itemize}
-\item The {\tt maxthreads} preference works now.
-\item Fixed bug where warning message about uname returning an unrecognized
-  result was preventing connection to server.  (The warning is no longer
-  printed, and all systems where 'uname' returns anything other than 'Darwin' 
-  are assumed not to be running OS X.)
-\item Fixed a problem on OS X that caused some valid file names (e.g.,
-  those including colons) to be considered invalid.
-\item Patched Path.followLink to follow links under cygwin in addition to Unix
-  (suggested by Matt Swift).
-\item Small change to the storeRootsName function, suggested by bliviero at 
-  ichips.intel.com, to fix a problem in unison with the `rootalias'
-  option, which allows you to tell unison that two roots contain the same 
-  files.  Rootalias was being applied after the hosts were 
-  sorted, so it wouldn't work properly in all cases.
-\item Incorporated a fix by Dmitry Bely for setting utimes of read-only files
-  on Win32 systems.   
-\end{itemize}
-\item Installation / portability:
-\begin{itemize}
-\item Unison now compiles with OCaml version 3.07 and later out of the box.
-\item Makefile.OCaml fixed to compile out of the box under OpenBSD.
-\item a few additional ports (e.g. OpenBSD, Zaurus/IPAQ) are now mentioned in 
-  the documentation 
-\item Unison can now be installed easily on OSX systems using the Fink
-  package manager
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.9.1}
-\item Added a preference {\tt maxthreads} that can be used to limit the
-number of simultaneous file transfers.
-\item Added a {\tt backupdir} preference, which controls where backup
-files are stored.
-\item Basic support added for OSX.  In particular, Unison now recognizes
-when one of the hosts being synchronized is running OSX and switches to
-a case-insensitive treatment of filenames (i.e., 'foo' and 'FOO' are
-considered to be the same file).
-  (OSX is not yet fully working,
-  however: in particular, files with resource forks will not be
-  synchronized correctly.)
-\item The same hash used to form the archive name is now also added to
-the names of the temp files created during file transfer.  The reason for
-this is that, during update detection, we are going to silently delete
-any old temp files that we find along the way, and we want to prevent
-ourselves from deleting temp files belonging to other instances of Unison
-that may be running in parallel, e.g. synchronizing with a different
-host.  Thanks to Ruslan Ermilov for this suggestion.
-\item Several small user interface improvements
-\item Documentation
-\begin{itemize}
-\item FAQ and bug reporting instructions have been split out as separate
-      HTML pages, accessible directly from the unison web page.
-\item Additions to FAQ, in particular suggestions about performance
-tuning. 
-\end{itemize}
-\item Makefile
-\begin{itemize}
-\item Makefile.OCaml now sets UISTYLE=text or UISTYLE=gtk automatically,
-  depending on whether it finds lablgtk installed
-\item Unison should now compile ``out of the box'' under OSX
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.8.1}
-\item Changing profile works again under Windows
-\item File movement optimization: Unison now tries to use local copy instead of
-  transfer for moved or copied files.  It is controled by a boolean option
-  ``xferbycopying''.
-\item Network statistics window (transfer rate, amount of data transferred).
-      [NB: not available in Windows-Cygwin version.]
-\item symlinks work under the cygwin version (which is dynamically linked).
-\item Fixed potential deadlock when synchronizing between Windows and
-Unix 
-\item Small improvements:
-  \begin{itemize} 
-  \item If neither the {\tt USERPROFILE} nor the {\tt HOME} environment
-    variables are set, then Unison will put its temporary commit log
-    (called {\tt DANGER.README}) into the directory named by the 
-    {\tt UNISON} environment variable, if any; otherwise it will use
-    {\tt C:}.
-  \item alternative set of values for fastcheck: yes = true; no = false;
-  default = auto.
-  \item -silent implies -contactquietly
-  \end{itemize}
-\item Source code:
-  \begin{itemize}
-  \item Code reorganization and tidying.  (Started breaking up some of the
-    basic utility modules so that the non-unison-specific stuff can be
-    made available for other projects.)
-  \item several Makefile and docs changes (for release);
-  \item further comments in ``update.ml'';
-  \item connection information is not stored in global variables anymore.
-  \end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.7.78}
-\item Small bugfix to textual user interface under Unix (to avoid leaving
-  the terminal in a bad state where it would not echo inputs after Unison
-  exited).
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.7.39}
-\item Improvements to the main web page (stable and beta version docs are
-  now both accessible).
-\item User manual revised.
-\item Added some new preferences:
-\begin{itemize}
-\item ``sshcmd'' and ``rshcmd'' for specifying paths to ssh and rsh programs.
-\item ``contactquietly'' for suppressing the ``contacting server'' message
-during Unison startup (under the graphical UI).
-\end{itemize}
-\item Bug fixes:
-\begin{itemize}
-\item Fixed small bug in UI that neglected to change the displayed column 
-  headers if loading a new profile caused the roots to change.
-\item Fixed a bug that would put the text UI into an infinite loop if it
-  encountered a conflict when run in batch mode.
-\item Added some code to try to fix the display of non-Ascii characters in 
-  filenames on Windows systems in the GTK UI.  (This code is currently 
-  untested---if you're one of the people that had reported problems with
-  display of non-ascii filenames, we'd appreciate knowing if this actually 
-  fixes things.)
-\item `\verb|-prefer/-force newer|' works properly now.  
-        (The bug was reported by Sebastian Urbaniak and Sean Fulton.)
-\end{itemize}
-\item User interface and Unison behavior:
-\begin{itemize}
-\item Renamed `Proceed' to `Go' in the graphical UI.
-\item Added exit status for the textual user interface.
-\item Paths that are not synchronized because of conflicts or errors during 
-  update detection are now noted in the log file.
-\item \verb|[END]| messages in log now use a briefer format
-\item Changed the text UI startup sequence so that
-  {\tt ./unison -ui text} will use the default profile instead of failing.
-\item Made some improvements to the error messages.
-\item Added some debugging messages to remote.ml.
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.7.7}
-\item Incorporated, once again, a multi-threaded transport sub-system.
-  It transfers several files at the same time, thereby making much
-  more effective use of available network bandwidth.  Unlike the
-  earlier attempt, this time we do not rely on the native thread
-  library of OCaml.  Instead, we implement a light-weight,
-  non-preemptive multi-thread library in OCaml directly.  This version
-  appears stable.  
-
-  Some adjustments to unison are made to accommodate the multi-threaded
-  version.  These include, in particular, changes to the
-  user interface and logging, for example:
-  \begin{itemize}
-  \item Two log entries for each transferring task, one for the
-    beginning, one for the end.
-  \item Suppressed warning messages against removing temp files left
-    by a previous unison run, because warning does not work nicely
-    under multi-threading.  The temp file names are made less likely
-    to coincide with the name of a file created by the user.  They
-    take the form \\ \verb|.#<filename>.<serial>.unison.tmp|.
-    [N.b. This was later changed to \verb|.unison.<filename>.<serial>.unison.tmp|.]
-  \end{itemize}
-\item Added a new command to the GTK user interface: pressing 'f' causes
-  Unison to start a new update detection phase, using as paths {\em just}
-  those paths that have been detected as changed and not yet marked as
-  successfully completed.  Use this command to quickly restart Unison on
-  just the set of paths still needing attention after a previous run.
-\item Made the {\tt ignorecase} preference user-visible, and changed the
-  initialization code so that it can be manually set to true, even if
-  neither host is running Windows.  (This may be useful, e.g., when using 
-  Unison running on a Unix system with a FAT volume mounted.)
-\item Small improvements and bug fixes:
-  \begin{itemize}
-  \item Errors in preference files now generate fatal errors rather than
-    warnings at startup time.  (I.e., you can't go on from them.)  Also,
-    we fixed a bug that was preventing these warnings from appearing in the
-    text UI, so some users who have been running (unsuspectingly) with 
-    garbage in their prefs files may now get error reports.
-  \item Error reporting for preference files now provides file name and
-    line number.
-  \item More intelligible message in the case of identical change to the same 
-    files: ``Nothing to do: replicas have been changed only in identical 
-    ways since last sync.''
-  \item Files with prefix '.\#' excluded when scanning for preference
-    files.
-  \item Rsync instructions are send directly instead of first
-    marshaled.
-  \item Won't try forever to get the fingerprint of a continuously changing file:
-    unison will give up after certain number of retries.
-  \item Other bug fixes, including the one reported by Peter Selinger
-    (\verb|force=older preference| not working).
-  \end{itemize}
-\item Compilation:
-  \begin{itemize}
-  \item Upgraded to the new OCaml 3.04 compiler, with the LablGtk
-    1.2.3 library (patched version used for compiling under Windows).
-  \item Added the option to compile unison on the Windows platform with
-    Cygwin GNU C compiler.  This option only supports building
-    dynamically linked unison executables.
-  \end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.7.4}
-\item Fixed a silly (but debilitating) bug in the client startup sequence.
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.7.1}
-\item Added \verb|addprefsto| preference, which (when set) controls which
-preference file new preferences (e.g. new ignore patterns) are added to.
-\item Bug fix: read the initial connection header one byte at a time, so
-that we don't block if the header is shorter than expected.  (This bug
-did not affect normal operation --- it just made it hard to tell when you
-were trying to use Unison incorrectly with an old version of the server,
-since it would hang instead of giving an error message.)
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.6.59}
-\item Changed \verb|fastcheck| from a boolean to a string preference.  Its 
-  legal values are \verb|yes| (for a fast check), \verb|no| (for a safe 
-  check), or \verb|default| (for a fast check---which also happens to be 
-  safe---when running on Unix and a safe check when on Windows).  The default 
-  is \verb|default|.
-  \item Several preferences have been renamed for consistency.  All
-  preference names are now spelled out in lowercase.  For backward
-  compatibility, the old names still work, but they are not mentioned in
-  the manual any more.
-\item The temp files created by the 'diff' and 'merge' commands are now
-   named by {\em pre}pending a new prefix to the file name, rather than
-   appending a suffix.  This should avoid confusing diff/merge programs
-   that depend on the suffix  to guess the type of the file contents.
-\item We now set the keepalive option on the server socket, to make sure
-  that the server times out if the communication link is unexpectedly broken. 
-\item Bug fixes:
-\begin{itemize}
-\item When updating small files, Unison now closes the destination file.
-\item File permissions are properly updated when the file is behind a
-  followed link.
-\item Several other small fixes.
-\end{itemize}
-\end{changesfromversion}
-
-
-\begin{changesfromversion}{2.6.38}
-\item Major Windows performance improvement!  
-
-We've added a preference \verb|fastcheck| that makes Unison look only at
-a file's creation time and last-modified time to check whether it has
-changed.  This should result in a huge speedup when checking for updates
-in large replicas.
-
-  When this switch is set, Unison will use file creation times as 
-  'pseudo inode numbers' when scanning Windows replicas for updates, 
-  instead of reading the full contents of every file.  This may cause 
-  Unison to miss propagating an update if the create time, 
-  modification time, and length of the file are all unchanged by 
-  the update (this is not easy to achieve, but it can be done).  
-  However, Unison will never {\em overwrite} such an update with
-  a change from the other replica, since it 
-  always does a safe check for updates just before propagating a 
-  change.  Thus, it is reasonable to use this switch most of the time 
-  and occasionally run Unison once with {\tt fastcheck} set to false, 
-  if you are worried that Unison may have overlooked an update.
-
-  Warning: This change is has not yet been thoroughly field-tested.  If you 
-  set the \verb|fastcheck| preference, pay careful attention to what
-  Unison is doing.
-
-\item New functionality: centralized backups and merging 
-\begin{itemize}
-\item This version incorporates two pieces of major new functionality,
-   implemented by Sylvain Roy during a summer internship at Penn: a
-   {\em centralized backup} facility that keeps a full backup of
-   (selected files 
-   in) each replica, and a {\em merging} feature that allows Unison to
-   invoke an external file-merging tool to resolve conflicting changes to
-   individual files.
- 
-\item Centralized backups:
-\begin{itemize}
-  \item Unison now maintains full backups of the last-synchronized versions
-      of (some of) the files in each replica; these function both as
-      backups in the usual sense
-      and as the ``common version'' when invoking external
-      merge programs.
-  \item The backed up files are stored in a directory ~/.unison/backup on each
-      host.  (The name of this directory can be changed by setting
-      the environment variable \verb|UNISONBACKUPDIR|.)
-  \item The predicate \verb|backup| controls which files are actually
-     backed up:
-      giving the preference '\verb|backup = Path *|' causes backing up
-      of all files.
-  \item Files are added to the backup directory whenever unison updates
-      its archive.  This means that
-      \begin{itemize}
-       \item When unison reconstructs its archive from scratch (e.g., 
-           because of an upgrade, or because the archive files have
-           been manually deleted), all files will be backed up.
-       \item Otherwise, each file will be backed up the first time unison
-           propagates an update for it.
-      \end{itemize}
-  \item The preference \verb|backupversions| controls how many previous
-      versions of each file are kept.  The default is 2 (i.e., the last 
-      synchronized version plus one backup).
-  \item For backward compatibility, the \verb|backups| preference is also
-      still supported, but \verb|backup| is now preferred.
-  \item It is OK to manually delete files from the backup directory (or to throw
-      away the directory itself).  Before unison uses any of these files for 
-      anything important, it checks that its fingerprint matches the one 
-      that it expects. 
-\end{itemize}
-
-\item Merging:
-\begin{itemize}
-  \item Both user interfaces offer a new 'merge' command, invoked by pressing
-      'm' (with a changed file selected).  
-  \item The actual merging is performed by an external program.  
-      The preferences \verb|merge| and \verb|merge2| control how this
-      program is invoked.  If a backup exists for this file (see the
-      \verb|backup| preference), then the \verb|merge| preference is used for 
-      this purpose; otherwise \verb|merge2| is used.  In both cases, the 
-      value of the preference should be a string representing the command 
-      that should be passed to a shell to invoke the 
-      merge program.  Within this string, the special substrings
-      \verb|CURRENT1|, \verb|CURRENT2|, \verb|NEW|,  and \verb|OLD| may appear
-      at any point.  Unison will substitute these as follows before invoking
-      the command:
-        \begin{itemize}
-        \item \relax\verb|CURRENT1| is replaced by the name of the local 
-        copy of the file;
-        \item \relax\verb|CURRENT2| is replaced by the name of a temporary
-        file, into which the contents of the remote copy of the file have
-        been transferred by Unison prior to performing the merge;
-        \item \relax\verb|NEW| is replaced by the name of a temporary
-        file that Unison expects to be written by the merge program when
-        it finishes, giving the desired new contents of the file; and
-        \item \relax\verb|OLD| is replaced by the name of the backed up
-        copy of the original version of the file (i.e., its state at the 
-        end of the last successful run of Unison), if one exists 
-        (applies only to \verb|merge|, not \verb|merge2|).
-        \end{itemize}
-      For example, on Unix systems setting the \verb|merge| preference to
-\begin{verbatim}
-   merge = diff3 -m CURRENT1 OLD CURRENT2 > NEW
-\end{verbatim}
-      will tell Unison to use the external \verb|diff3| program for merging.  
-
-      A large number of external merging programs are available.  For 
-      example, \verb|emacs| users may find the following convenient:
-\begin{verbatim}
-    merge2 = emacs -q --eval '(ediff-merge-files "CURRENT1" "CURRENT2" 
-               nil "NEW")' 
-    merge = emacs -q --eval '(ediff-merge-files-with-ancestor 
-               "CURRENT1" "CURRENT2" "OLD" nil "NEW")' 
-\end{verbatim}
-(These commands are displayed here on two lines to avoid running off the
-edge of the page.  In your preference file, each should be written on a
-single line.) 
-
-  \item If the external program exits without leaving any file at the
-  path \verb|NEW|, 
-      Unison considers the merge to have failed.  If the merge program writes
-      a file called \verb|NEW| but exits with a non-zero status code,
-      then Unison 
-      considers the merge to have succeeded but to have generated conflicts.
-      In this case, it attempts to invoke an external editor so that the
-      user can resolve the conflicts.  The value of the \verb|editor| 
-      preference controls what editor is invoked by Unison.  The default
-      is \verb|emacs|.
-
-  \item Please send us suggestions for other useful values of the
-       \verb|merge2| and \verb|merge| preferences -- we'd like to give several 
-       examples in the manual.
-\end{itemize}
-\end{itemize}
-
-\item Smaller changes:
-\begin{itemize}
-\item When one preference file includes another, unison no longer adds the
-  suffix '\verb|.prf|' to the included file by default.  If a file with 
-  precisely the given name exists in the .unison directory, it will be used; 
-  otherwise Unison will 
-  add \verb|.prf|, as it did before.  (This change means that included 
-  preference files can be named \verb|blah.include| instead of 
-  \verb|blah.prf|, so that unison will not offer them in its 'choose 
-  a preference file' dialog.)
-\item For Linux systems, we now offer both a statically linked and a dynamically
-  linked executable.  The static one is larger, but will probably run on more
-  systems, since it doesn't depend on the same versions of dynamically
-  linked library modules being available.
-\item Fixed the \verb|force| and \verb|prefer| preferences, which were
-  getting the propagation direction exactly backwards.
-\item Fixed a bug in the startup code that would cause unison to crash
-  when the default profile (\verb|~/.unison/default.prf|) does not exist.
-\item Fixed a bug where, on the run when a profile is first created, 
-  Unison would confusingly display the roots in reverse order in the user
-  interface.
-\end{itemize}
-
-\item For developers:
-\begin{itemize}
-\item We've added a module dependency diagram to the source distribution, in
-   \verb|src/DEPENDENCIES.ps|, to help new prospective developers with
-   navigating the code. 
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.6.11}
-\item \incompatible{} Archive format has changed.  
-
-\item \incompatible{} The startup sequence has been completely rewritten
-and greatly simplified.  The main user-visible change is that the
-\verb|defaultpath| preference has been removed.  Its effect can be
-approximated by using multiple profiles, with \verb|include| directives
-to incorporate common settings.  All uses of \verb|defaultpath| in
-existing profiles should be changed to \verb|path|.
-
-Another change in startup behavior that will affect some users is that it
-is no longer possible to specify roots {\em both} in the profile {\em
-  and} on the command line.
-
-You can achieve a similar effect, though, by breaking your profile into
-two:
-\begin{verbatim}
-  
-  default.prf = 
-      root = blah
-      root = foo
-      include common
-
-  common.prf = 
-      <everything else>
-\end{verbatim}
-Now do
-\begin{verbatim}
-  unison common root1 root2
-\end{verbatim}
-when you want to specify roots explicitly.
-
-\item The \verb|-prefer| and \verb|-force| options have been extended to
-allow users to specify that files with more recent modtimes should be
-propagated, writing either \verb|-prefer newer| or \verb|-force newer|.
-(For symmetry, Unison will also accept \verb|-prefer older| or
-\verb|-force older|.)  The \verb|-force older/newer| options can only be
-used when \verb|-times| is also set.
-
-The graphical user interface provides access to these facilities on a
-one-off basis via the \verb|Actions| menu.
-
-\item Names of roots can now be ``aliased'' to allow replicas to be
-relocated without changing the name of the archive file where Unison
-stores information between runs.  (This feature is for experts only.  See
-the ``Archive Files'' section of the manual for more information.)
-
-\item Graphical user-interface:
-\begin{itemize}
-\item A new command is provided in the Synchronization menu for
-  switching to a new profile without restarting Unison from scratch.
-\item The GUI also supports one-key shortcuts for commonly
-used profiles.  If a profile contains a preference of the form 
-%
-'\verb|key = n|', where \verb|n| is a single digit, then pressing this
-key will cause Unison to immediately switch to this profile and begin
-synchronization again from scratch.  (Any actions that may have been
-selected for a set of changes currently being displayed will be
-discarded.) 
-
-\item Each profile may include a preference '\verb|label = <string>|' giving a
-  descriptive string that described the options selected in this profile.
-  The string is listed along with the profile name in the profile selection
-  dialog, and displayed in the top-right corner of the main Unison window.
-\end{itemize}
-
-\item Minor:
-\begin{itemize}
-\item Fixed a bug that would sometimes cause the 'diff' display to order
-  the files backwards relative to the main user interface.  (Thanks
-  to Pascal Brisset for this fix.)
-\item On Unix systems, the graphical version of Unison will check the
-  \verb|DISPLAY| variable and, if it is not set, automatically fall back
-  to the textual user interface.
-\item Synchronization paths (\verb|path| preferences) are now matched
-  against the ignore preferences.  So if a path is both specified in a
-  \verb|path| preference and ignored, it will be skipped.
-\item Numerous other bugfixes and small improvements.
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.6.1}
-\item The synchronization of modification times has been disabled for
-  directories.
-
-\item Preference files may now include lines of the form
-  \verb+include <name>+, which will cause \verb+name.prf+ to be read
-  at that point.
-
-\item The synchronization of permission between Windows and Unix now
-  works properly.
-
-\item A binding \verb|CYGWIN=binmode| in now added to the environment
-  so that the Cygwin port of OpenSSH works properly in a non-Cygwin
-  context.
-
-\item The \verb|servercmd| and \verb|addversionno| preferences can now
-  be used together: \verb|-addversionno| appends an appropriate
-  \verb+-NNN+ to the server command, which is found by using the value
-  of the \verb|-servercmd| preference if there is one, or else just
-  \verb|unison|.
-
-\item Both \verb|'-pref=val'| and \verb|'-pref val'| are now allowed for
-  boolean values.  (The former can be used to set a preference to false.)
-
-\item Lot of small bugs fixed.
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.5.31}
-\item The \verb|log| preference is now set to \verb|true| by default,
-  since the log file seems useful for most users.  
-\item Several miscellaneous bugfixes (most involving symlinks).
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.5.25}
-\item \incompatible{} Archive format has changed (again).  
-
-\item Several significant bugs introduced in 2.5.25 have been fixed.  
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.5.1}
-\item \incompatible{} Archive format has changed.  Make sure you
-synchronize your replicas before upgrading, to avoid spurious
-conflicts.  The first sync after upgrading will be slow.
-
-\item New functionality:
-\begin{itemize}
-\item Unison now synchronizes file modtimes, user-ids, and group-ids.  
-
-These new features are controlled by a set of new preferences, all of
-which are currently \verb|false| by default.  
-
-\begin{itemize}
-\item When the \verb|times| preference is set to \verb|true|, file
-modification times are propaged.  (Because the representations of time
-may not have the same granularity on both replicas, Unison may not always
-be able to make the modtimes precisely equal, but it will get them as
-close as the operating systems involved allow.)
-\item When the \verb|owner| preference is set to \verb|true|, file
-ownership information is synchronized.
-\item When the \verb|group| preference is set to \verb|true|, group 
-information is synchronized.
-\item When the \verb|numericIds| preference is set to \verb|true|, owner
-and group information is synchronized numerically.  By default, owner and
-group numbers are converted to names on each replica and these names are
-synchronized.  (The special user id 0 and the special group 0 are never
-mapped via user/group names even if this preference is not set.)
-\end{itemize}
-
-\item Added an integer-valued preference \verb|perms| that can be used to
-control the propagation of permission bits.  The value of this preference
-is a mask indicating which permission bits should be synchronized.  It is
-set by default to $0o1777$: all bits but the set-uid and set-gid bits are
-synchronised (synchronizing theses latter bits can be a security hazard).
-If you want to synchronize all bits, you can set the value of this
-preference to $-1$.
-
-\item Added a \verb|log| preference (default \verb|false|), which makes
-Unison keep a complete record of the changes it makes to the replicas.
-By default, this record is written to a file called \verb|unison.log| in
-the user's home directory (the value of the \verb|HOME| environment
-variable).  If you want it someplace else, set the \verb|logfile|
-preference to the full pathname you want Unison to use.
-
-\item Added an \verb|ignorenot| preference that maintains a set of patterns 
-  for paths that should definitely {\em not} be ignored, whether or not
-  they match an \verb|ignore| pattern.  (That is, a path will now be ignored
-  iff it matches an ignore pattern and does not match any ignorenot patterns.)
-\end{itemize}
-  
-\item User-interface improvements:
-\begin{itemize}
-\item Roots are now displayed in the user interface in the same order
-as they were given on the command line or in the preferences file.
-\item When the \verb|batch| preference is set, the graphical user interface no 
-  longer waits for user confirmation when it displays a warning message: it
-  simply pops up an advisory window with a Dismiss button at the bottom and
-  keeps on going.
-\item Added a new preference for controlling how many status messages are
-  printed during update detection: \verb|statusdepth| controls the maximum
-  depth for paths on the local machine (longer paths are not displayed, nor
-  are non-directory paths).  The value should be an integer; default is 1.  
-\item Removed the \verb|trace| and \verb|silent| preferences.  They did
-not seem very useful, and there were too many preferences for controlling
-output in various ways.
-\item The text UI now displays just the default command (the one that
-will be used if the user just types \verb|<return>|) instead of all
-available commands.  Typing \verb|?| will print the full list of
-possibilities.
-\item The function that finds the canonical hostname of the local host
-(which is used, for example, in calculating the name of the archive file
-used to remember which files have been synchronized) normally uses the
-\verb|gethostname| operating system call.  However, if the environment
-variable \verb|UNISONLOCALHOSTNAME| is set, its value will now be used
-instead.  This makes it easier to use Unison in situations where a
-machine's name changes frequently (e.g., because it is a laptop and gets
-moved around a lot).
-\item File owner and group are now displayed in the ``detail window'' at
-the bottom of the screen, when unison is configured to synchronize them.
-\end{itemize}
-
-\item For hackers:
-\begin{itemize}
-\item Updated to Jacques Garrigue's new version of \verb|lablgtk|, which
-  means we can throw away our local patched version.  
-
-  If you're compiling the GTK version of unison from sources, you'll need
-  to update your copy of lablgtk to the developers release.
-  (Warning: installing lablgtk under Windows is currently a bit
-  challenging.) 
-
-\item The TODO.txt file (in the source distribution) has been cleaned up
-and reorganized.  The list of pending tasks should be much easier to
-make sense of, for people that may want to contribute their programming
-energies.  There is also a separate file BUGS.txt for open bugs.
-\item The Tk user interface has been removed (it was not being maintained
-and no longer compiles).
-\item The \verb|debug| preference now prints quite a bit of additional
-information that should be useful for identifying sources of problems.
-\item The version number of the remote server is now checked right away 
-  during the connection setup handshake, rather than later.  (Somebody
-  sent a bug report of a server crash that turned out to come from using
-  inconsistent versions: better to check this earlier and in a way that
-  can't crash either client or server.)
-\item Unison now runs correctly on 64-bit architectures (e.g. Alpha
-linux).  We will not be distributing binaries for these architectures
-ourselves (at least for a while) but if someone would like to make them
-available, we'll be glad to provide a link to them.
-\end{itemize}
-
-\item Bug fixes:
-\begin{itemize}
-\item Pattern matching (e.g. for \verb|ignore|) is now case-insensitive
-  when Unison is in case-insensitive mode (i.e., when one of the replicas
-  is on a windows machine).
-\item Some people had trouble with mysterious failures during
-  propagation of updates, where files would be falsely reported as having
-  changed during synchronization.  This should be fixed.
-\item Numerous smaller fixes.
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.4.1}
-\item Added a number of 'sorting modes' for the user interface.  By
-default, conflicting changes are displayed at the top, and the rest of
-the entries are sorted in alphabetical order.  This behavior can be
-changed in the following ways:
-\begin{itemize}
-\item Setting  the \verb|sortnewfirst| preference to \verb|true| causes
-newly created files to be displayed before changed files.
-\item Setting \verb|sortbysize| causes files to be displayed in
-increasing order of size.
-\item Giving the preference \verb|sortfirst=<pattern>| (where
-\verb|<pattern>| is a path descriptor in the same format as 'ignore' and 'follow'
-patterns, causes paths matching this pattern to be displayed first.
-\item Similarly, giving the preference \verb|sortlast=<pattern>| 
-causes paths matching this pattern to be displayed last.
-\end{itemize}
-The sorting preferences are described in more detail in the user manual.
-The \verb|sortnewfirst| and \verb|sortbysize| flags can also be accessed
-from the 'Sort' menu in the grpahical user interface.
-
-\item Added two new preferences that can be used to change unison's
-fundamental behavior to make it more like a mirroring tool instead of
-a synchronizer.
-\begin{itemize}
-\item Giving the preference \verb|prefer| with argument \verb|<root>|
-(by adding \verb|-prefer <root>| to the command line or \verb|prefer=<root>|)
-to your profile) means that, if there is a conflict, the contents of
-\verb|<root>| 
-should be propagated to the other replica (with no questions asked).
-Non-conflicting changes are treated as usual.
-\item Giving the preference \verb|force| with argument \verb|<root>|
-will make unison resolve {\em all} differences in favor of the given
-root, even if it was the other replica that was changed.
-\end{itemize}
-These options should be used with care!  (More information is available in
-the manual.)
-
-\item Small changes:
-\begin{itemize}
-\item 
-Changed default answer to 'Yes' in all two-button dialogs in the 
-  graphical interface (this seems more intuitive).
-
-\item The \verb|rsync| preference has been removed (it was used to
-activate rsync compression for file transfers, but rsync compression is
-now enabled by default). 
-\item  In the text user interface, the arrows indicating which direction
-changes are being 
-  propagated are printed differently when the user has overridded Unison's
-  default recommendation (\verb|====>| instead of \verb|---->|).  This
-  matches the behavior of the graphical interface, which displays such
-  arrows in a different color.
-\item Carriage returns (Control-M's) are ignored at the ends of lines in
-  profiles, for Windows compatibility.
-\item All preferences are now fully documented in the user manual. 
-\end{itemize}
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.3.12}
-\item \incompatible{} Archive format has changed.  Make sure you
-synchronize your replicas before upgrading, to avoid spurious
-conflicts.  The first sync after upgrading will be slow.
-
-\item New/improved functionality:
-\begin{itemize}
-\item  A new preference -sortbysize controls the order in which changes
-  are displayed to the user: when it is set to true, the smallest
-  changed files are displayed first.  (The default setting is false.) 
-\item A new preference -sortnewfirst causes newly created files to be 
-  listed before other updates in the user interface.
-\item We now allow the ssh protocol to specify a port.  
-\item Incompatible change: The unison: protocol is deprecated, and we added
-  file: and socket:.  You may have to modify your profiles in the
-  .unison directory.
-  If a replica is specified without an explicit protocol, we now
-  assume it refers to a file.  (Previously "//saul/foo" meant to use
-  SSH to connect to saul, then access the foo directory.  Now it means
-  to access saul via a remote file mechanism such as samba; the old
-  effect is now achieved by writing {\tt ssh://saul/foo}.)
-\item Changed the startup sequence for the case where roots are given but
-  no profile is given on the command line.  The new behavior is to
-  use the default profile (creating it if it does not exist), and
-  temporarily override its roots.  The manual claimed that this case
-  would work by reading no profile at all, but AFAIK this was never
-  true.
-\item In all user interfaces, files with conflicts are always listed first
-\item A new preference 'sshversion' can be used to control which version
-  of ssh should be used to connect to the server.  Legal values are 1 and 2.
-  (Default is empty, which will make unison use whatever version of ssh
-  is installed as the default 'ssh' command.)
-\item The situation when the permissions of a file was updated the same on
-  both side is now handled correctly (we used to report a spurious conflict)
-
-\end{itemize}
-
-\item Improvements for the Windows version:
-\begin{itemize}
-\item The fact that filenames are treated case-insensitively under
-Windows should now be handled correctly.  The exact behavior is described
-in the cross-platform section of the manual.
-\item It should be possible to synchronize with Windows shares, e.g.,
-  //host/drive/path.
-\item Workarounds to the bug in syncing root directories in Windows.
-The most difficult thing to fix is an ocaml bug: Unix.opendir fails on
-c: in some versions of Windows.
-\end{itemize}
-
-\item Improvements to the GTK user interface (the Tk interface is no
-longer being maintained): 
-\begin{itemize}
-\item The UI now displays actions differently (in blue) when they have been
-  explicitly changed by the user from Unison's default recommendation.
-\item More colorful appearance.
-\item The initial profile selection window works better.
-\item If any transfers failed, a message to this effect is displayed along with
-  'Synchronization complete' at the end of the transfer phase (in case they
-  may have scrolled off the top).
-\item Added a global progress meter, displaying the percentage of {\em total}
-  bytes that have been transferred so far.
-\end{itemize}
-
-\item Improvements to the text user interface:
-\begin{itemize}
-\item The file details will be displayed automatically when a
-  conflict is been detected.
-\item when a warning is generated (e.g. for a temporary
-  file left over from a previous run of unison) Unison will no longer
-  wait for a response if it is running in -batch mode.
-\item The UI now displays a short list of possible inputs each time it waits
-  for user interaction.  
-\item The UI now quits immediately (rather than looping back and starting
-  the interaction again) if the user presses 'q' when asked whether to 
-  propagate changes.
-\item Pressing 'g' in the text user interface will proceed immediately
-  with propagating updates, without asking any more questions.
-\end{itemize}
-
-\item Documentation and installation changes:
-\begin{itemize}
-\item The manual now includes a FAQ, plus sections on common problems and
-on tricks contributed by users.
-\item Both the download page and the download directory explicitly say
-what are the current stable and beta-test version numbers.
-\item The OCaml sources for the up-to-the-minute developers' version (not
-guaranteed to be stable, or even to compile, at any given time!) are now
-available from the download page.
-\item Added a subsection to the manual describing cross-platform
-  issues (case conflicts, illegal filenames)
-\end{itemize}
-
-\item Many small bug fixes and random improvements.
-
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.3.1}
-\item Several bug fixes.  The most important is a bug in the rsync
-module that would occasionally cause change propagation to fail with a
-'rename' error.
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.2}
-\item The multi-threaded transport system is now disabled by default.
-(It is not stable enough yet.)
-\item Various bug fixes.
-\item A new experimental feature: 
-
-  The final component of a -path argument may now be the wildcard 
-  specifier \verb|*|.  When Unison sees such a path, it expands this path on 
-  the client into into the corresponding list of paths by listing the
-  contents of that directory.  
-
-  Note that if you use wildcard paths from the command line, you will
-  probably need to use quotes or a backslash to prevent the * from
-  being interpreted by your shell.
-
-  If both roots are local, the contents of the first one will be used
-  for expanding wildcard paths.  (Nb: this is the first one {\em after} the
-  canonization step -- i.e., the one that is listed first in the user 
-  interface -- not the one listed first on the command line or in the
-  preferences file.)
-\end{changesfromversion}
-
-\begin{changesfromversion}{2.1}
-\item The transport subsystem now includes an implementation by
-Sylvain Gommier and Norman Ramsey of Tridgell and Mackerras's
-\verb|rsync| protocol.  This protocol achieves much faster 
-transfers when only a small part of a large file has been changed by
-sending just diffs.  This feature is mainly helpful for transfers over
-slow links---on fast local area networks it can actually degrade
-performance---so we have left it off by default.  Start unison with
-the \verb|-rsync| option (or put \verb|rsync=true| in your preferences
-file) to turn it on.
-
-\item ``Progress bars'' are now diplayed during remote file transfers,
-showing what percentage of each file has been transferred so far.
-
-\item The version numbering scheme has changed.  New releases will now
-      be have numbers like 2.2.30, where the second component is
-      incremented on every significant public release and the third
-      component is the ``patch level.''
-
-\item Miscellaneous improvements to the GTK-based user interface.
-\item The manual  is now available in PDF format.
-
-\item We are experimenting with using a multi-threaded transport
-subsystem to transfer several files at the same time, making
-much more effective use of available network bandwidth.  This feature
-is not completely stable yet, so by default it is disabled in the
-release version of Unison.
-
-If you want to play with the multi-threaded version, you'll need to
-recompile Unison from sources (as described in the documentation),
-setting the THREADS flag in Makefile.OCaml to true.  Make sure that
-your OCaml compiler has been installed with the \verb|-with-pthreads|
-configuration option.  (You can verify this by checking whether the
-file \verb|threads/threads.cma| in the OCaml standard library
-directory contains the string \verb|-lpthread| near the end.)
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.292}
-\item Reduced memory footprint (this is especially important during
-the first run of unison, where it has to gather information about all
-the files in both repositories). 
-\item Fixed a bug that would cause the socket server under NT to fail
-  after the client exits. 
-\item Added a SHIFT modifier to the Ignore menu shortcut keys in GTK
-  interface (to avoid hitting them accidentally).  
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.231}
-\item Tunneling over ssh is now supported in the Windows version.  See
-the installation section of the manual for detailed instructions.
-
-\item The transport subsystem now includes an implementation of the
-\verb|rsync| protocol, built by Sylvain Gommier and Norman Ramsey.
-This protocol achieves much faster transfers when only a small part of
-a large file has been changed by sending just diffs.  The rsync
-feature is off by default in the current version.  Use the
-\verb|-rsync| switch to turn it on.  (Nb.  We still have a lot of
-tuning to do: you may not notice much speedup yet.)
-
-\item We're experimenting with a multi-threaded transport subsystem,
-written by Jerome Vouillon.  The downloadable binaries are still
-single-threaded: if you want to try the multi-threaded version, you'll
-need to recompile from sources.  (Say \verb|make THREADS=true|.)
-Native thread support from the compiler is required.  Use the option
-\verb|-threads N| to select the maximal number of concurrent 
-threads (default is 5).  Multi-threaded
-and single-threaded clients/servers can interoperate.  
-
-\item A new GTK-based user interface is now available, thanks to
-Jacques Garrigue.  The Tk user interface still works, but we'll be
-shifting development effort to the GTK interface from now on.
-\item OCaml 3.00 is now required for compiling Unison from sources.
-The modules \verb|uitk| and \verb|myfileselect| have been changed to
-use labltk instead of camltk.  To compile the Tk interface in Windows,
-you must have ocaml-3.00 and tk8.3.  When installing tk8.3, put it in
-\verb|c:\Tcl| rather than the suggested \verb|c:\Program Files\Tcl|, 
-and be sure to install the headers and libraries (which are not 
-installed by default).
-
-\item Added a new \verb|-addversionno| switch, which causes unison to
-use \verb|unison-<currentversionnumber>| instead of just \verb|unison|
-as the remote server command.  This allows multiple versions of unison
-to coexist conveniently on the same server: whichever version is run
-on the client, the same version will be selected on the server.
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.219}
-\item \incompatible{} Archive format has changed.  Make sure you
-synchronize your replicas before upgrading, to avoid spurious
-conflicts.  The first sync after upgrading will be slow.
-
-\item This version fixes several annoying bugs, including:
-\begin{itemize}
-\item Some cases where propagation of file permissions was not
-working.
-\item umask is now ignored when creating directories
-\item directories are create writable, so that a read-only directory and
-    its contents can be propagated.
-\item Handling of warnings generated by the server.
-\item Synchronizing a path whose parent is not a directory on both sides is
-now flagged as erroneous.  
-\item Fixed some bugs related to symnbolic links and nonexistant roots.
-\begin{itemize}
-\item 
-   When a change (deletion or new contents) is propagated onto a 
-     'follow'ed symlink, the file pointed to by the link is now changed.
-     (We used to change the link itself, which doesn't fit our assertion
-     that 'follow' means the link is completely invisible)
-   \item When one root did not exist, propagating the other root on top of it
-     used to fail, becuase unison could not calculate the working directory
-     into which to write changes.  This should be fixed.
-\end{itemize}
-\end{itemize}
-
-\item A human-readable timestamp has been added to Unison's archive files.
-
-\item The semantics of Path and Name regular expressions now
-correspond better. 
-
-\item Some minor improvements to the text UI (e.g. a command for going
-back to previous items)
-
-\item The organization of the export directory has changed --- should
-be easier to find / download things now.
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.200}
-\item \incompatible{} Archive format has changed.  Make sure you
-synchronize your replicas before upgrading, to avoid spurious
-conflicts.  The first sync after upgrading will be slow.
-
-\item This version has not been tested extensively on Windows.
-
-\item Major internal changes designed to make unison safer to run
-at the same time as the replicas are being changed by the user.
-
-\item Internal performance improvements.  
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.190}
-\item \incompatible{} Archive format has changed.  Make sure you
-synchronize your replicas before upgrading, to avoid spurious
-conflicts.  The first sync after upgrading will be slow.
-
-\item A number of internal functions have been changed to reduce the
-amount of memory allocation, especially during the first
-synchronization.  This should help power users with very big replicas.
-
-\item Reimplementation of low-level remote procedure call stuff, in
-preparation for adding rsync-like smart file transfer in a later
-release.   
-
-\item Miscellaneous bug fixes.
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.180}
-\item \incompatible{} Archive format has changed.  Make sure you
-synchronize your replicas before upgrading, to avoid spurious
-conflicts.  The first sync after upgrading will be slow.
-
-\item Fixed some small bugs in the interpretation of ignore patterns. 
-
-\item Fixed some problems that were preventing the Windows version
-from working correctly when click-started.
-
-\item Fixes to treatment of file permissions under Windows, which were
-causing spurious reports of different permissions when synchronizing
-between windows and unix systems.
-
-\item Fixed one more non-tail-recursive list processing function,
-which was causing stack overflows when synchronizing very large
-replicas. 
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.169}
-\item The text user interface now provides commands for ignoring
-  files. 
-\item We found and fixed some {\em more} non-tail-recursive list
-  processing functions.  Some power users have reported success with
-  very large replicas.
-\item \incompatible 
-Files ending in \verb|.tmp| are no longer ignored automatically.  If you want
-to ignore such files, put an appropriate ignore pattern in your profile.
-
-\item \incompatible{} The syntax of {\tt ignore} and {\tt follow}
-patterns has changed. Instead of putting a line of the form
-\begin{verbatim}
-                 ignore = <regexp>
-\end{verbatim}
-  in your profile ({\tt .unison/default.prf}), you should put:
-\begin{verbatim}
-                 ignore = Regexp <regexp>
-\end{verbatim}
-Moreover, two other styles of pattern are also recognized:
-\begin{verbatim}
-                 ignore = Name <name>
-\end{verbatim}
-matches any path in which one component matches \verb|<name>|, while
-\begin{verbatim}
-                 ignore = Path <path>
-\end{verbatim}
-matches exactly the path \verb|<path>|.
-
-Standard ``globbing'' conventions can be used in \verb|<name>| and
-\verb|<path>|:  
-\begin{itemize}
-\item a \verb|?| matches any single character except \verb|/|
-\item a \verb|*| matches any sequence of characters not including \verb|/|
-\item \verb|[xyz]| matches any character from the set $\{{\tt x},
-  {\tt y}, {\tt z} \}$
-\item \verb|{a,bb,ccc}| matches any one of \verb|a|, \verb|bb|, or
-  \verb|ccc|. 
-\end{itemize}
-
-See the user manual for some examples.
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.146}
-\item Some users were reporting stack overflows when synchronizing
-  huge directories.  We found and fixed some non-tail-recursive list
-  processing functions, which we hope will solve the problem.  Please 
-  give it a try and let us know.
-\item Major additions to the documentation.  
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.142}
-\item Major internal tidying and many small bugfixes.
-\item Major additions to the user manual.
-\item Unison can now be started with no arguments -- it will prompt
-automatically for the name of a profile file containing the roots to
-be synchronized.  This makes it possible to start the graphical UI
-from a desktop icon.
-\item Fixed a small bug where the text UI on NT was raising a 'no such
-  signal' exception.
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.139}
-\item The precompiled windows binary in the last release was compiled
-with an old OCaml compiler, causing propagation of permissions not to
-work (and perhaps leading to some other strange behaviors we've heard
-reports about).  This has been corrected.  If you're using precompiled
-binaries on Windows, please upgrade.
-\item Added a \verb|-debug| command line flag, which controls debugging
-of various modules.  Say \verb|-debug XXX| to enable debug tracing for
-module \verb|XXX|, or \verb|-debug all| to turn on absolutely everything.
-\item Fixed a small bug where the text UI on NT was raising a 'no such signal'
-exception.
-\end{changesfromversion}
-
-\begin{changesfromversion}{1.111}
-\item \incompatible{} The names and formats of the preference files in
-the .unison directory have changed.  In particular:
-\begin{itemize}
-\item the file ``prefs'' should be renamed to default.prf
-\item the contents of the file ``ignore'' should be merged into
-  default.prf.  Each line of the form \verb|REGEXP| in ignore should
-  become a line of the form \verb|ignore = REGEXP| in default.prf.
-\end{itemize}
-\item Unison now handles permission bits and  symbolic links.  See the
-manual for details.
-
-\item You can now have different preference files in your .unison
-directory.  If you start unison like this
-\begin{verbatim}
-             unison profilename
-\end{verbatim}
-(i.e. with just one ``anonymous'' command-line argument), then the
-file \verb|~/.unison/profilename.prf| will be loaded instead of
-\verb|default.prf|. 
-
-\item Some improvements to terminal handling in the text user interface
-
-\item Added a switch -killServer that terminates the remote server process
-when the unison client is shutting down, even when using sockets for 
-communication.  (By default, a remote server created using ssh/rsh is 
-terminated automatically, while a socket server is left running.)
-\item When started in 'socket server' mode, unison prints 'server started' on
-  stderr when it is ready to accept connections.  
-  (This may be useful for scripts that want to tell when a socket-mode server 
-  has finished initalization.)
-\item We now make a nightly mirror of our current internal development
-  tree, in case anyone wants an up-to-the-minute version to hack
-  around with.
-\item Added a file CONTRIB with some suggestions for how to help us
-make Unison better.
-\end{changesfromversion}
-

Copied: branches/2.40/doc/changes.tex (from rev 411, trunk/doc/changes.tex)
===================================================================
--- branches/2.40/doc/changes.tex	                        (rev 0)
+++ branches/2.40/doc/changes.tex	2010-02-20 23:23:17 UTC (rev 412)
@@ -0,0 +1,1818 @@
+\begin{changesfromversion}{2.32}
+\item Major enhancement: Unicode support.  
+\begin{itemize}
+\item Unison should now handle unicode filenames correctly on all platforms.
+\item This functionality is controlled by a new preference {\tt unicode}.
+\item Unicode mode is now the default when one of the hosts is under
+  Windows or MacOS.  This may make upgrades a bit more painful (the
+  archives cannot be reused), but this is a much saner default.
+\end{itemize}
+\item Partial transfer of directories.  If an error occurs while
+  transferring a directory, the part transferred so far is copied into
+  place (and the archives are updated accordingly).
+  The "maxerrors" preference controls how many transfer error Unison
+  will accept before stopping the transfer of a directory (by default,
+  only one).  This makes it possible to transfer most of a directory
+  even if there are some errors.  Currently, only the first error is
+  reported by the GUIs.
+
+  Also, allow partial transfer of a directory when there was an error deep
+  inside this directory during update detection.  At the moment, this
+  is only activated with the text and GTK UIs, which have been
+  modified so that they show that the transfer is going to be partial
+  and so that they can display all errors.
+\item Improvement to the code for resuming directory transfers:
+\begin{itemize}
+\item 
+   if a file was not correctly transferred (or the source has been
+    modified since, with unchanged size), Unison performs a new
+    transfer rather than failing
+  \item spurious files are deleted (this can happen if a file is deleted
+    on the source replica before resuming the transfer; not deleting
+    the file would result in it reappearing on the target replica)
+\end{itemize}
+\item Experimental streaming protocol for transferring file contents (can
+  be disabled by setting the directive "stream" to false): file
+  contents is transfered asynchronously (without waiting for a response
+  from the destination after each chunk sent) rather than using the
+  synchronous RPC mechanism.  As a consequence:
+  \begin{itemize}
+  \item 
+   Unison now transfers the contents of a single file at a time
+    (Unison used to transfer several contents simultaneously in order
+    to hide the connection latency.)
+  \item the transfer of large files uses the full available bandwidth
+    and is not slowed done due to the connection latency anymore
+  \item we get performance improvement for small files as well by
+    scheduling many files simultaneously (as scheduling a file for
+    transfer consume little ressource: it does not mean allocating a
+    large buffer anymore)
+  \end{itemize}
+\item Changes to the internal implementation of the rsync algorithm:
+\begin{itemize}
+\item 
+  use longer blocks for large files (the size of a block is the
+    square root of the size of the file for large files);
+  \item transmit less checksum information per block (we still have less
+    than one chance in a hundred million of transferring a file
+    incorrectly, and Unison will catch any transfer error when
+    fingerprinting the whole file)
+  \item avoid transfer overhead (which was 4 bytes per block)
+\end{itemize}
+  For a 1G file, the first optimization saves a factor 50 on the
+  amount of data transferred from the target to the source (blocks
+  are 32768 bytes rather than just 700 bytes).  The two other
+  optimizations save another factor of 2 (from 24 bytes per block
+  down to 10).
+\item Implemented an on-disk file fingerprint cache to speed-up update
+  detection after a crash: this way, Unison does not have do recompute
+  all the file fingerprints from scratch.
+  \begin{itemize}
+  \item When Unison detects that the archive case-sensitivity mode
+  does not match the current settings, it populates the fingerprint
+  cache using the archive contents.  This way, changing the
+  case-sensitivity mode should be reasonably fast.
+  \end{itemize}
+\item New preferences "noupdate=root", "nodeletion=root", "nocreation=root"
+  that prevent Unison from performing files updates, deletions or
+  creations on the given root.  Also 'partial' versions of 'noupdate',
+  'nodeletion' and 'nocreation' 
+\item Limit the number of simultaneous external copy program
+  ("copymax" preference)
+\item New "links" preference.  When set to false, Unison will report an
+  error on symlinks during update detection.  (This is the default
+  when one host is running Windows but not Cygwin.)  This is better
+  than failing during propagation.
+\item Added a preference "halfduplex" to force half-duplex communication
+  with the server.  This may be useful on unreliable links (as a more
+  efficient alternative to "maxthreads = 1").
+\item Renamed preference "pretendwin" to "ignoreinodenumbers" (an alias is
+  kept for backwards compatibility).
+\item Ignore one-second differences when synchronizing modification time.
+  (Technically, this is an incompatible archive format change, but it
+   is backward compatible.  To trigger a problem, a user would have to
+   synchronize modification times on a filesystem with a two-second
+   granularity and then downgrade to a previous version of Unison,
+   which does not work well in such a case.  Thus, it does not
+   seem worthwhile to increment the archive format number, which would
+   impact all users.)
+\item Do not keep many files simultaneously opened anymore when the rsync
+  algorithm is in use.
+\item Add ``ignorearchives'' preference to ignore existing archives (to
+  avoid forcing users to delete them manually, in situations where one
+  archive has gotten   deleted or corrupted).
+\item Mac OS
+\begin{itemize}
+\item fixed rsync bug which could result in an "index out of bounds"
+  error when transferring resource forks.
+\item Fixed bug which made Unison ignore finder information and resource
+  fork when compiled to 64bit on Mac OSX.
+\item should now be 64 bit clean (the Growl framework is not up to date,
+    though)
+\item Made the bridge between Objective C and Ocaml code GC friendly
+    (it was allocating ML values and putting them in an array which
+    was not registered with the GC)
+\item use darker grey arrows (patch contributed by Eric Y. Kow)
+\end{itemize}
+\item GTK user interface
+\begin{itemize}
+\item  assistant for creating profiles
+\item profile editor
+\item pop up a summary window when the replicas are not fully
+    synchronized after transport
+\item display estimated remaining time and transfer rate on the
+  progress bar
+\item allow simultaneous selection of several items
+\item Do not reload the preference file before a new update
+  detection if it is unchanged
+\item disabled scrolling to the first unfinished item during transport.
+  It goes way too fast when lot of small files are synchronized, and it
+  makes it impossible to browse the file list during transport.
+\item take into account the "height" preference again
+\item the internal list of selected reconciler item was not always in
+    sync with what was displayed (GTK bug?); workaround implemented
+\item Do not display "Looking for change" messages during propagation
+  (when checking the targe is unchanged) but only during update detection
+\item Apply patch to fix some crashes in the OSX GUI, thanks to Onne Gorter.
+\end{itemize}
+\item Text UI
+\begin{itemize}
+\item During update detection, display status by updating a single line
+rather than generating a new line of output every so often.  Should be less
+confusing.
+\end{itemize}
+\item Windows 
+\begin{itemize}
+\item Fastcheck is now the default under Windows.  People mostly use NTFS
+  nowadays and the Unicode API provides an equivalent to inode numbers
+  for this filesystem.
+\item Only use long UNC path for accessing replicas (as '..' is
+  not handled with this format of paths, but can be useful)
+\item Windows text UI: now put the console into UTF-8 output mode.  This
+  is the right thing to do when in Unicode mode, and is no worse than
+  what we had previously otherwise (the console use some esoteric
+  encoding by default).  This only works when using a Unicode font
+  instead of the default raster font.
+\item Don't get the home directory from environment variable HOME under
+  Windows (except for Cygwin binaries): we don't want the behavior of
+  Unison to depends on whether it is run from a Cygwin shell (where
+  HOME is set) or in any other way (where HOME is usually not set).
+\end{itemize}
+\item Miscellaneous fixes and improvements
+\begin{itemize}
+\item Made a server waiting on a socket more resilient to unexpected
+  lost connections from the client.
+\item Small patch to property setting code suggested by Ulrich Gernkow.
+\item Several fixes to the change transfer functions (both the internal ones
+  and external transfers using rsync).  In particular, limit the number of
+  simultaneous transfer using an rsync
+  (as the rsync algorithm can use a large amount of memory when
+   processing huge files)
+\item Keep track of which file contents are being transferred, and delay
+  the transfer of a file when another file with the same contents is
+  currently being transferred.  This way, the second transfer can be
+  skipped and replaced by a local copy.
+\item Experimental update detection optimization:
+  do not read the contents of unchanged directories
+\item When a file transfer fails, turn off fastcheck for this file on the
+  next sync.
+\item Fixed bug with case insensitive mode on a case sensitive filesystem:
+\begin{itemize}
+\item 
+   if file "a/a" is created on one replica and directory "A" is
+    created on the other, the file failed to be synchronized the first
+    time Unison is run afterwards, as Unison uses the wrong path "a/a"
+    (if Unison is run again, the directories are in the archive, so
+     the right path is used);
+  \item if file "a" appears on one replica and file "A" appears on the
+    other with different contents, Unison was unable to synchronize
+    them.
+\end{itemize}
+\item Improved error reporting when the destination is updated during
+  synchronization: Unison now tells which file has been updated, and how.
+\item Limit the length of temporary file names
+\item Case sensitivity information put in the archive (in a backward
+  compatible way) and checked when the archive is loaded
+\item Got rid of the 16mb marshalling limit by marshalling to a bigarray.
+\item Resume copy of partially transferred files.
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.31}
+\item Small user interface changes
+\begin{itemize}
+\item Small change to text UI "scanning..." messages, to print just
+  directories (hopefully making it clearer that individual files are
+  not necessarily being fingerprinted).  
+\end{itemize}
+\item Minor fixes and improvements:
+\begin{itemize}
+\item Ignore one hour differences when deciding whether a file may have
+  been updated.  This avoids slow update detection after daylight
+  saving time changes under Windows.  This makes Unison slightly more
+  likely to miss an update, but it should be safe enough.
+\item Fix a small bug that was affecting mainly windows users.  We need to
+  commit the archives at the end of the sync even if there are no
+  updates to propagate because some files (in fact, if we've just
+  switched to DST on windows, a LOT of files) might have new modtimes
+  in the archive.  (Changed the text UI only.  It's less clear where
+  to change the GUI.)
+\item Don't delete the temp file when a transfer fails due to a
+  fingerprint mismatch (so that we can have a look and see why!)  We've also
+  added more debugging code togive more informative error messages when we
+  encounter the dreaded and longstanding "assert failed during file
+  transfer" bug
+\item Incorrect paths ("path" directive) now result in an error update
+  item rather than a fatal error.
+\item Create parent directories (with correct permissions) during
+  transport for paths which point to non-existent locations in the
+  destination replica.
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.27}
+\item If Unison is interrupted during a directory transfer, it will now
+leave the partially transferred directory intact in a temporary
+location. (This maintains the invariant that new files/directories are
+transferred either completely or not at all.)  The next time Unison is run,
+it will continue filling in this temporary directory, skipping transferring
+files that it finds are already there.
+\item We've added experimental support for invoking an external file
+transfer tool for whole-file copies instead of Unison's built-in transfer
+protocol.  Three new preferences have been added:
+\begin{itemize}
+\item {\tt copyprog} is a string giving the name (and command-line
+switches, if needed) of an external program that can be used to copy large
+files efficiently.  By default, rsync is invoked, but other tools such as
+scp can be used instead by changing the value of this preference.  (Although
+this is not its primary purpose, rsync is actually a pretty fast way of
+copying files that don't already exist on the receiving host.)  For files
+that do already exist on (but that have been changed in one replica), Unison
+will always use its built-in implementation of the rsync algorithm.
+\item Added a "copyprogrest" preference, so that we can give different
+command lines for invoking the external copy utility depending on whether a
+partially transferred file already exists or not.  (Rsync doesn't seem to
+care about this, but other utilities may.)
+\item {\tt copythreshold} is an integer (-1 by default), indicating above what
+filesize (in megabytes) Unison should use the external copying utility
+specified by copyprog.  Specifying 0 will cause ALL copies to use the
+external program; a negative number will prevent any files from using it.
+(Default is -1.)
+\end{itemize}
+Thanks to Alan Schmitt for a huge amount of hacking and to an anonymous
+sponsor for suggesting and underwriting this extension.
+\item Small improvements:
+\begin{itemize}
+\item Added a new preference, {\tt dontchmod}.  By default, Unison uses the
+{\tt chmod} system call to set the permission bits of files after it has
+copied them.  But in some circumstances (and under some operating systems),
+the chmod call always fails.  Setting this preference completely prevents
+Unison from ever calling {\tt chmod}.
+\item Don't ignore files that look like backup files if the {\tt
+  backuplocation} preference is set to {\tt central}
+\item Shortened the names of several preferences.  The old names are also
+still supported, for backwards compatibility, but they do not appear in the
+documentation.
+\item Lots of little documentation tidying.  (In particular, preferences are
+separated into Basic and Advanced!  This should hopefully make Unison a
+little more approachable for new users.
+\item Unison can sometimes fail to transfer a file, giving the unhelpful
+message "Destination updated during synchronization" even though the file
+has not been changed.  This can be caused by programs that change either the
+file's contents \emph{or} the file's extended attributes without changing
+its modification time.  It's not clear what is the best fix for this -- it
+is not Unison's fault, but it makes Unison's behavior puzzling -- but at
+least Unison can be more helpful about suggesting a workaround (running once
+with {\tt fastcheck} set to false).  The failure message has been changed to
+give this advice.
+\item Further improvements to the OS X GUI (thanks to Alan Schmitt and Craig
+Federighi).
+\end{itemize}
+\item Very preliminary support for triggering Unison from an external 
+  filesystem-watching utility.  The current implementation is very
+  simple, not efficient, and almost completely untested---not ready 
+  for real users.  But if someone wants to help improve it (e.g.,
+  by writing a filesystem watcher for your favorite OS), please make
+  yourself known!
+
+  On the Unison side, the new behavior is very simple:
+  \begin{itemize}
+  \item use the text UI 
+    \item start Unison with the command-line flag "-repeat FOO", 
+      where FOO is name of a file where Unison should look 
+      for notifications of changes
+    \item  when it starts up, Unison will read the whole contents 
+      of this file (on both hosts), which should be a 
+      newline-separated list of paths (relative to the root 
+      of the synchronization) and synchronize just these paths, 
+      as if it had been started with the "-path=xxx" option for 
+      each one of them
+    \item when it finishes, it will sleep for a few seconds and then
+      examine the watchfile again; if anything has been added, it
+      will read the new paths, synchronize them, and go back to 
+      sleep
+    \item that's it!
+  \end{itemize}
+  To use this to drive Unison "incrementally," just start it in 
+  this mode and start up a tool (on each host) to watch for
+  new changes to the filesystem and append the appropriate paths
+  to the watchfile.  Hopefully such tools should not be too hard
+  to write.
+\item Bug fixes:
+\begin{itemize}
+\item Fixed a bug that was causing new files to be created with
+  permissions 0x600 instead of using a reasonable default (like
+  0x644), if the 'perms' flag was set to 0.  (Bug reported by Ben
+  Crowell.)
+\item Follow maxthreads preference when transferring directories.
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.17}
+\item Major rewrite and cleanup of the whole Mac OS X graphical user
+interface by Craig Federighi.  Thanks, Craig!!!
+\item Small fix to ctime (non-)handling in update detection under windows
+  with fastcheck.  
+\item Several small fixes to the GTK2 UI to make it work better under
+Windows [thanks to Karl M for these].
+\item The backup functionality has been completely rewritten.  The external
+interface has not changed, but numerous bugs, irregular behaviors, and
+cross-platform inconsistencies have been corrected.
+\item The Unison project now accepts donations via PayPal.  If you'd like to
+donate, you can find a link to the donation page on the
+\URL{http://www.cis.upenn.edu/~bcpierce/unison/lists.html}{Unison home
+  page}.
+\item Some important safety improvements:
+\begin{itemize}
+\item Added a new \verb|mountpoint| preference, which can be used to specify
+a path that must exist in both replicas at the end of update detection
+(otherwise Unison aborts).  This can be used to avoid potentially dangerous
+situations when Unison is used with removable media such as external hard
+drives and compact flash cards.  
+\item The confirmation of ``big deletes'' is now controlled by a boolean preference
+  \verb|confirmbigdeletes|.  Default is true, which gives the same behavior as
+  previously.  (This functionality is at least partly superceded by the
+  \verb|mountpoint| preference, but it has been left in place in case it is
+  useful to some people.)
+  \item If Unison is asked to ``follow'' a symbolic link but there is
+  nothing at the other end of the link, it will now flag this path as an
+  error, rather than treating the symlink itself as missing or deleted.
+  This avoids a potentially dangerous situation where a followed symlink
+  points to an external filesystem that might be offline when Unison is run
+  (whereupon Unison would cheerfully delete the corresponding files in the
+  other replica!).
+\end{itemize}
+
+\item Smaller changes:
+\begin{itemize}
+\item Added \verb|forcepartial| and \verb|preferpartial| preferences, which
+behave like \verb|force| and \verb|prefer| but can be specified on a
+per-path basis. [Thanks to Alan Schmitt for this.]
+\item A bare-bones self test feature was added, which runs unison through
+  some of its paces and checks that the results are as expected.  The
+  coverage of the tests is still very limited, but the facility has already
+  been very useful in debugging the new backup functionality (especially in
+  exposing some subtle cross-platform issues).
+\item Refined debugging code so that the verbosity of individual modules
+  can be controlled separately.  Instead of just putting '-debug
+  verbose' on the command line, you can put '-debug update+', which
+  causes all the extra messages in the Update module, but not other
+  modules, to be printed.  Putting '-debug verbose' causes all modules
+  to print with maximum verbosity.
+\item Removed \verb|mergebatch| preference.  (It never seemed very useful, and
+  its semantics were confusing.)
+\item Rewrote some of the merging functionality, for better cooperation
+  with external Harmony instances.
+\item Changed the temp file prefix from \verb|.#| to \verb|.unison|.
+\item Compressed the output from the text user interface (particularly
+  when run with the \verb|-terse| flag) to make it easier to interpret the
+  results when Unison is run several times in succession from a script.
+\item Diff and merge functions now work under Windows.
+\item Changed the order of arguments to the default diff command (so that
+  the + and - annotations in diff's output are reversed).
+\item Added \verb|.mpp| files to the ``never fastcheck'' list (like
+\verb|.xls| files). 
+\end{itemize}
+
+\item Many small bugfixes, including:
+\begin{itemize}
+\item Fixed a longstanding bug regarding fastcheck and daylight saving time
+  under Windows when Unison is set up to synchronize modification times.
+  (Modification times cannot be updated in the archive in this case,
+  so we have to ignore one hour differences.)
+\item Fixed a bug that would occasionally cause the archives to be left in
+  non-identical states on the two hosts after synchronization.
+\item Fixed a bug that prevented Unison from communicating correctly between
+  32- and 64-bit architectures.
+\item On windows, file creation times are no longer used as a proxy for
+  inode numbers.  (This is unfortunate, as it makes fastcheck a little less
+  safe.  But it turns out that file creation times are not reliable 
+  under Windows: if a file is removed and a new file is created in its
+  place, the new one will sometimes be given the same creation date as the
+  old one!)
+\item Set read-only file to R/W on OSX before attempting to change other attributes.
+\item Fixed bug resulting in spurious "Aborted" errors during transport
+(thanks to Jerome Vouillon) 
+\item Enable diff if file contents have changed in one replica, but
+only properties in the other.
+\item Removed misleading documentation for 'repeat' preference.
+\item Fixed a bug in merging code where Unison could sometimes deadlock
+  with the external merge program, if the latter produced large
+  amounts of output.
+\item Workaround for a bug compiling gtk2 user interface against current versions
+  of gtk2+ libraries.  
+\item Added a better error message for "ambiguous paths".
+\item Squashed a longstanding bug that would cause file transfer to fail
+  with the message ``Failed: Error in readWrite: Is a directory.''
+\item Replaced symlinks with copies of their targets in the Growl framework in src/uimac.
+  This should make the sources easier to check out from the svn repository on WinXP
+  systems.
+\item Added a workaround (suggested by Karl M.) for the problem discussed
+  on the unison users mailing list where, on the Windows platform, the
+  server would hang when transferring files.  I conjecture that
+  the problem has to do with the RPC mechanism, which was used to
+  make a call {\em back} from the server to the client (inside the Trace.log 
+  function) so that the log message would be appended to the log file on 
+  the client.  The workaround is to dump these messages (about when
+  xferbycopying shortcuts are applied and whether they succeed) just to the
+  standard output of the Unison process, not to the log file.
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.13.0}
+\item The features for performing backups and for invoking external merge
+programs have been completely rewritten by Stephane Lescuyer (thanks,
+Stephane!).  The user-visible functionality should not change, but the
+internals have been rationalized and there are a number of new features.
+See the manual (in particular, the description of the \verb|backupXXX|
+preferences) for details.
+\item Incorporated patches for ipv6 support, contributed by Samuel Thibault.
+(Note that, due to a bug in the released OCaml 3.08.3 compiler, this code
+will not actually work with ipv6 unless compiled with the CVS version of the
+OCaml compiler, where the bug has been fixed; however, ipv4 should continue
+to work normally.)
+\item OSX interface:
+\begin{itemize}
+\item Incorporated Ben Willmore's cool new icon for the Mac UI.
+\end{itemize}
+\item Small fixes:
+\begin{itemize}
+\item Fixed off by one error in month numbers (in printed dates) reported 
+  by Bob Burger
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.12.0}
+\item New convention for release numbering: Releases will continue to be
+given numbers of the form \verb|X.Y.Z|, but, 
+from now on, just the major version number (\verb|X.Y|) will be considered
+significant when checking compatibility between client and server versions.
+The third component of the version number will be used only to identify
+``patch levels'' of releases.
+
+This change goes hand in hand with a change to the procedure for making new
+releases.  Candidate releases will initially be given ``beta release''
+status when they are announced for public consumption.  Any bugs that are
+discovered will be fixed in a separate branch of the source repository
+(without changing the major version number) and new tarballs re-released as
+needed.  When this process converges, the patched beta version will be
+dubbed stable.
+\item Warning (failure in batch mode) when one path is completely emptied.
+  This prevents Unison from deleting everything on one replica when
+  the other disappear.
+\item Fix diff bug (where no difference is shown the first time the diff
+  command is given).
+\item User interface changes:
+\begin{itemize}
+\item Improved workaround for button focus problem (GTK2 UI)
+\item Put leading zeroes in date fields
+\item More robust handling of character encodings in GTK2 UI
+\item Changed format of modification time displays, from \verb|modified at hh:mm:ss on dd MMM, yyyy|
+to \verb|modified on yyyy-mm-dd hh:mm:ss|
+\item Changed time display to include seconds (so that people on FAT
+  filesystems will not be confused when Unison tries to update a file
+  time to an odd number of seconds and the filesystem truncates it to
+  an even number!)
+\item Use the diff "-u" option by default when showing differences between files
+  (the output is more readable)
+\item In text mode, pipe the diff output to a pager if the environment
+  variable PAGER is set
+\item Bug fixes and cleanups in ssh password prompting.  Now works with
+  the GTK2 UI under Linux.  (Hopefully the Mac OS X one is not broken!)
+\item Include profile name in the GTK2 window name
+\item Added bindings ',' (same as '<') and '.' (same as '>') in the GTK2 UI
+\end{itemize}
+\item Mac GUI:
+\begin{itemize}
+\item actions like < and > scroll to the next item as necessary.
+\item Restart has a menu item and keyboard shortcut (command-R).
+\item 
+    Added a command-line tool for Mac OS X.  It can be installed from
+    the Unison menu.
+\item New icon.
+\item   Handle the "help" command-line argument properly.
+\item   Handle profiles given on the command line properly.
+\item  When a profile has been selected, the profile dialog is replaced by a
+    "connecting" message while the connection is being made.  This
+    gives better feedback.
+\item   Size of left and right columns is now large enough so that
+    "PropsChanged" is not cut off.
+\end{itemize}
+\item Minor changes:
+\begin{itemize}
+\item Disable multi-threading when both roots are local
+\item Improved error handling code.  In particular, make sure all files
+  are closed in case of a transient failure
+\item Under Windows, use \verb|$UNISON| for home directory as a last resort
+  (it was wrongly moved before \verb|$HOME| and \verb|$USERPROFILE| in
+  Unison 2.12.0)
+\item Reopen the logfile if its name changes (profile change)
+\item Double-check that permissions and modification times have been
+  properly set: there are some combination of OS and filesystem on
+  which setting them can fail in a silent way.
+\item Check for bad Windows filenames for pure Windows synchronization
+  also (not just cross architecture synchronization).
+  This way, filenames containing backslashes, which are not correctly
+  handled by unison, are rejected right away.
+\item Attempt to resolve issues with synchronizing modification times
+  of read-only files under Windows
+\item Ignore chmod failures when deleting files
+\item Ignore trailing dots in filenames in case insensitive mode
+\item Proper quoting of paths, files and extensions ignored using the UI
+\item The strings CURRENT1 and CURRENT2 are now correctly substitued when
+  they occur in the diff preference
+\item Improvements to syncing resource forks between Macs via a non-Mac system.
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.10.2}
+\item \incompatible{} Archive format has changed.  
+\item Source code availability: The Unison sources are now managed using
+  Subversion.  One nice side-effect is that anonymous checkout is now
+  possible, like this:
+\begin{verbatim}
+        svn co https://cvs.cis.upenn.edu:3690/svnroot/unison/
+\end{verbatim}
+We will also continue to export a ``developer tarball'' of the current
+(modulo one day) sources in the web export directory.  To receive commit logs
+for changes to the sources, subscribe to the \verb|unison-hackers| list
+(\ONEURL{http://www.cis.upenn.edu/~bcpierce/unison/lists.html}). 
+\item Text user interface:
+\begin{itemize}
+\item Substantial reworking of the internal logic of the text UI to make it
+a bit easier to modify.
+\item The {\tt dumbtty} flag in the text UI is automatically set to true if
+the client is running on a Unix system and the {\tt EMACS} environment
+variable is set to anything other than the empty string.
+\end{itemize}
+\item Native OS X gui:
+\begin{itemize}
+\item Added a synchronize menu item with keyboard shortcut
+\item Added a merge menu item, still needs to be debugged
+\item Fixes to compile for Panther
+\item Miscellaneous improvements and bugfixes
+\end{itemize}
+\item Small changes:
+\begin{itemize}
+\item Changed the filename checking code to apply to Windows only, instead
+  of OS X as well.
+\item Finder flags now synchronized
+\item Fallback in copy.ml for filesystem that do not support \verb|O_EXCL|
+\item  Changed buffer size for local file copy (was highly inefficient with
+  synchronous writes)
+\item Ignore chmod failure when deleting a directory
+\item  Fixed assertion failure when resolving a conflict content change /
+  permission changes in favor of the content change.
+\item Workaround for transferring large files using rsync.
+\item Use buffered I/O for files (this is the only way to open files in binary
+  mode under Cygwin).
+\item On non-Cygwin Windows systems, the UNISON environment variable is now checked first to determine 
+  where to look for Unison's archive and preference files, followed by \verb|HOME| and 
+  \verb|USERPROFILE| in that order.  On Unix and Cygwin systems, \verb|HOME| is used.
+\item Generalized \verb|diff| preference so that it can be given either as just 
+  the command name to be used for calculating diffs or else a whole command
+  line, containing the strings \verb|CURRENT1| and \verb|CURRENT2|, which will be replaced
+  by the names of the files to be diff'ed before the command is called.
+\item Recognize password prompts in some newer versions of ssh.
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.9.20}
+\item \incompatible{} Archive format has changed.  
+\item Major functionality changes:
+\begin{itemize}
+\item Major tidying and enhancement of 'merge' functionality.  The main
+  user-visible change is that the external merge program may either write
+  the merged output to a single new file, as before, or it may modify one or
+  both of its input files, or it may write {\em two} new files.  In the
+  latter cases, its modifications will be copied back into place on both the
+  local and the remote host, and (if the two files are now equal) the
+  archive will be updated appropriately.  More information can be found in
+  the user manual.  Thanks to Malo Denielou and Alan Schmitt for these
+  improvements.
+
+  Warning: the new merging functionality is not completely compatible with
+  old versions!  Check the manual for details.
+\item Files larger than 2Gb are now supported.
+\item Added preliminary (and still somewhat experimental) support for the
+  Apple OS X operating system.   
+\begin{itemize}
+\item Resource forks should be transferred correctly.  (See the manual for
+details of how this works when synchronizing HFS with non-HFS volumes.)
+Synchronization of file type and creator information is also supported.
+\item On OSX systems, the name of the directory for storing Unison's
+archives, preference files, etc., is now determined as follows:
+\begin{itemize}
+    \item if \verb+~/.unison+ exists, use it
+     \item otherwise, use \verb|~/Library/Application Support/Unison|, 
+         creating it if necessary.
+\end{itemize}
+\item A preliminary native-Cocoa user interface is under construction.  This
+still needs some work, and some users experience unpredictable crashes, so
+it is only for hackers for now.  Run make with {\tt UISTYLE=mac} to build
+this interface.
+\end{itemize}
+\end{itemize}
+
+\item Minor functionality changes:
+\begin{itemize}
+\item Added an {\tt ignorelocks} preference, which forces Unison to override left-over
+  archive locks.  (Setting this preference is dangerous!  Use it only if you
+  are positive you know what you are doing.) 
+% BCP: removed later
+% \item Running with the {\tt -timers} flag set to true will now show the total time taken
+%   to check for updates on each directory.  (This can be helpful for tidying directories to improve
+%   update detection times.)  
+\item Added a new preference {\tt assumeContentsAreImmutable}.  If a directory
+  matches one of the patterns set in this preference, then update detection
+  is skipped for files in this directory.  (The 
+  purpose is to speed update detection for cases like Mail folders, which
+  contain lots and lots of immutable files.)  Also a preference
+  {\tt assumeContentsAreImmutableNot}, which overrides the first, similarly
+  to {\tt ignorenot}.  (Later amendment: these preferences are now called
+  {\tt immutable} and {\tt immutablenot}.)
+\item The {\tt ignorecase} flag has been changed from a boolean to a three-valued
+  preference.  The default setting, called {\tt default}, checks the operating systems
+  running on the client and server and ignores filename case if either of them is
+  OSX or Windows.  Setting ignorecase to {\tt true} or {\tt false} overrides
+  this behavior.  If you have been setting {\tt ignorecase} on the command
+  line using {\tt -ignorecase=true} or {\tt -ignorecase=false}, you will
+  need to change to {\tt -ignorecase true} or {\tt -ignorecase false}.
+\item a new preference, 'repeat', for the text user interface (only).  If 'repeat' is set to
+  a number, then, after it finishes synchronizing, Unison will wait for that many seconds and
+  then start over, continuing this way until it is killed from outside.  Setting repeat to true
+  will automatically set the batch preference to true.  
+\item Excel files are now handled specially, so that the {\tt fastcheck}
+  optimization is skipped even if the {\tt fastcheck} flag is set.  (Excel
+  does some naughty things with modtimes, making this optimization
+  unreliable and leading to failures during change propagation.)
+\item The ignorecase flag has been changed from a boolean to a three-valued
+  preference.  The default setting, called 'default', checks the operating systems
+  running on the client and server and ignores filename case if either of them is
+  OSX or Windows.  Setting ignorecase to 'true' or 'false' overrides this behavior.
+\item Added a new preference, 'repeat', for the text user interface (only,
+  at the moment).  If 'repeat' is set to a number, then, after it finishes
+  synchronizing, Unison will wait for that many seconds and then start over,
+  continuing this way until it is killed from outside.  Setting repeat to
+  true will automatically set the batch preference to true.
+\item The 'rshargs' preference has been split into 'rshargs' and 'sshargs' 
+  (mainly to make the documentation clearer).  In fact, 'rshargs' is no longer
+  mentioned in the documentation at all, since pretty much everybody uses
+  ssh now anyway.
+\end{itemize}
+\item Documentation
+\begin{itemize}
+\item The web pages have been completely redesigned and reorganized.
+  (Thanks to Alan Schmitt for help with this.)
+\end{itemize}
+\item User interface improvements
+\begin{itemize}
+\item Added a GTK2 user interface, capable (among other things) of displaying filenames
+  in any locale encoding.  Kudos to Stephen Tse for contributing this code!  
+\item The text UI now prints a list of failed and skipped transfers at the end of
+  synchronization. 
+\item Restarting update detection from the graphical UI will reload the current
+  profile (which in particular will reset the -path preference, in case
+  it has been narrowed by using the ``Recheck unsynchronized items''
+  command).
+\item Several small improvements to the text user interface, including a
+  progress display.
+\end{itemize}
+\item Bug fixes (too numerous to count, actually, but here are some):
+\begin{itemize}
+\item The {\tt maxthreads} preference works now.
+\item Fixed bug where warning message about uname returning an unrecognized
+  result was preventing connection to server.  (The warning is no longer
+  printed, and all systems where 'uname' returns anything other than 'Darwin' 
+  are assumed not to be running OS X.)
+\item Fixed a problem on OS X that caused some valid file names (e.g.,
+  those including colons) to be considered invalid.
+\item Patched Path.followLink to follow links under cygwin in addition to Unix
+  (suggested by Matt Swift).
+\item Small change to the storeRootsName function, suggested by bliviero at 
+  ichips.intel.com, to fix a problem in unison with the `rootalias'
+  option, which allows you to tell unison that two roots contain the same 
+  files.  Rootalias was being applied after the hosts were 
+  sorted, so it wouldn't work properly in all cases.
+\item Incorporated a fix by Dmitry Bely for setting utimes of read-only files
+  on Win32 systems.   
+\end{itemize}
+\item Installation / portability:
+\begin{itemize}
+\item Unison now compiles with OCaml version 3.07 and later out of the box.
+\item Makefile.OCaml fixed to compile out of the box under OpenBSD.
+\item a few additional ports (e.g. OpenBSD, Zaurus/IPAQ) are now mentioned in 
+  the documentation 
+\item Unison can now be installed easily on OSX systems using the Fink
+  package manager
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.9.1}
+\item Added a preference {\tt maxthreads} that can be used to limit the
+number of simultaneous file transfers.
+\item Added a {\tt backupdir} preference, which controls where backup
+files are stored.
+\item Basic support added for OSX.  In particular, Unison now recognizes
+when one of the hosts being synchronized is running OSX and switches to
+a case-insensitive treatment of filenames (i.e., 'foo' and 'FOO' are
+considered to be the same file).
+  (OSX is not yet fully working,
+  however: in particular, files with resource forks will not be
+  synchronized correctly.)
+\item The same hash used to form the archive name is now also added to
+the names of the temp files created during file transfer.  The reason for
+this is that, during update detection, we are going to silently delete
+any old temp files that we find along the way, and we want to prevent
+ourselves from deleting temp files belonging to other instances of Unison
+that may be running in parallel, e.g. synchronizing with a different
+host.  Thanks to Ruslan Ermilov for this suggestion.
+\item Several small user interface improvements
+\item Documentation
+\begin{itemize}
+\item FAQ and bug reporting instructions have been split out as separate
+      HTML pages, accessible directly from the unison web page.
+\item Additions to FAQ, in particular suggestions about performance
+tuning. 
+\end{itemize}
+\item Makefile
+\begin{itemize}
+\item Makefile.OCaml now sets UISTYLE=text or UISTYLE=gtk automatically,
+  depending on whether it finds lablgtk installed
+\item Unison should now compile ``out of the box'' under OSX
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.8.1}
+\item Changing profile works again under Windows
+\item File movement optimization: Unison now tries to use local copy instead of
+  transfer for moved or copied files.  It is controled by a boolean option
+  ``xferbycopying''.
+\item Network statistics window (transfer rate, amount of data transferred).
+      [NB: not available in Windows-Cygwin version.]
+\item symlinks work under the cygwin version (which is dynamically linked).
+\item Fixed potential deadlock when synchronizing between Windows and
+Unix 
+\item Small improvements:
+  \begin{itemize} 
+  \item If neither the {\tt USERPROFILE} nor the {\tt HOME} environment
+    variables are set, then Unison will put its temporary commit log
+    (called {\tt DANGER.README}) into the directory named by the 
+    {\tt UNISON} environment variable, if any; otherwise it will use
+    {\tt C:}.
+  \item alternative set of values for fastcheck: yes = true; no = false;
+  default = auto.
+  \item -silent implies -contactquietly
+  \end{itemize}
+\item Source code:
+  \begin{itemize}
+  \item Code reorganization and tidying.  (Started breaking up some of the
+    basic utility modules so that the non-unison-specific stuff can be
+    made available for other projects.)
+  \item several Makefile and docs changes (for release);
+  \item further comments in ``update.ml'';
+  \item connection information is not stored in global variables anymore.
+  \end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.7.78}
+\item Small bugfix to textual user interface under Unix (to avoid leaving
+  the terminal in a bad state where it would not echo inputs after Unison
+  exited).
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.7.39}
+\item Improvements to the main web page (stable and beta version docs are
+  now both accessible).
+\item User manual revised.
+\item Added some new preferences:
+\begin{itemize}
+\item ``sshcmd'' and ``rshcmd'' for specifying paths to ssh and rsh programs.
+\item ``contactquietly'' for suppressing the ``contacting server'' message
+during Unison startup (under the graphical UI).
+\end{itemize}
+\item Bug fixes:
+\begin{itemize}
+\item Fixed small bug in UI that neglected to change the displayed column 
+  headers if loading a new profile caused the roots to change.
+\item Fixed a bug that would put the text UI into an infinite loop if it
+  encountered a conflict when run in batch mode.
+\item Added some code to try to fix the display of non-Ascii characters in 
+  filenames on Windows systems in the GTK UI.  (This code is currently 
+  untested---if you're one of the people that had reported problems with
+  display of non-ascii filenames, we'd appreciate knowing if this actually 
+  fixes things.)
+\item `\verb|-prefer/-force newer|' works properly now.  
+        (The bug was reported by Sebastian Urbaniak and Sean Fulton.)
+\end{itemize}
+\item User interface and Unison behavior:
+\begin{itemize}
+\item Renamed `Proceed' to `Go' in the graphical UI.
+\item Added exit status for the textual user interface.
+\item Paths that are not synchronized because of conflicts or errors during 
+  update detection are now noted in the log file.
+\item \verb|[END]| messages in log now use a briefer format
+\item Changed the text UI startup sequence so that
+  {\tt ./unison -ui text} will use the default profile instead of failing.
+\item Made some improvements to the error messages.
+\item Added some debugging messages to remote.ml.
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.7.7}
+\item Incorporated, once again, a multi-threaded transport sub-system.
+  It transfers several files at the same time, thereby making much
+  more effective use of available network bandwidth.  Unlike the
+  earlier attempt, this time we do not rely on the native thread
+  library of OCaml.  Instead, we implement a light-weight,
+  non-preemptive multi-thread library in OCaml directly.  This version
+  appears stable.  
+
+  Some adjustments to unison are made to accommodate the multi-threaded
+  version.  These include, in particular, changes to the
+  user interface and logging, for example:
+  \begin{itemize}
+  \item Two log entries for each transferring task, one for the
+    beginning, one for the end.
+  \item Suppressed warning messages against removing temp files left
+    by a previous unison run, because warning does not work nicely
+    under multi-threading.  The temp file names are made less likely
+    to coincide with the name of a file created by the user.  They
+    take the form \\ \verb|.#<filename>.<serial>.unison.tmp|.
+    [N.b. This was later changed to \verb|.unison.<filename>.<serial>.unison.tmp|.]
+  \end{itemize}
+\item Added a new command to the GTK user interface: pressing 'f' causes
+  Unison to start a new update detection phase, using as paths {\em just}
+  those paths that have been detected as changed and not yet marked as
+  successfully completed.  Use this command to quickly restart Unison on
+  just the set of paths still needing attention after a previous run.
+\item Made the {\tt ignorecase} preference user-visible, and changed the
+  initialization code so that it can be manually set to true, even if
+  neither host is running Windows.  (This may be useful, e.g., when using 
+  Unison running on a Unix system with a FAT volume mounted.)
+\item Small improvements and bug fixes:
+  \begin{itemize}
+  \item Errors in preference files now generate fatal errors rather than
+    warnings at startup time.  (I.e., you can't go on from them.)  Also,
+    we fixed a bug that was preventing these warnings from appearing in the
+    text UI, so some users who have been running (unsuspectingly) with 
+    garbage in their prefs files may now get error reports.
+  \item Error reporting for preference files now provides file name and
+    line number.
+  \item More intelligible message in the case of identical change to the same 
+    files: ``Nothing to do: replicas have been changed only in identical 
+    ways since last sync.''
+  \item Files with prefix '.\#' excluded when scanning for preference
+    files.
+  \item Rsync instructions are send directly instead of first
+    marshaled.
+  \item Won't try forever to get the fingerprint of a continuously changing file:
+    unison will give up after certain number of retries.
+  \item Other bug fixes, including the one reported by Peter Selinger
+    (\verb|force=older preference| not working).
+  \end{itemize}
+\item Compilation:
+  \begin{itemize}
+  \item Upgraded to the new OCaml 3.04 compiler, with the LablGtk
+    1.2.3 library (patched version used for compiling under Windows).
+  \item Added the option to compile unison on the Windows platform with
+    Cygwin GNU C compiler.  This option only supports building
+    dynamically linked unison executables.
+  \end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.7.4}
+\item Fixed a silly (but debilitating) bug in the client startup sequence.
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.7.1}
+\item Added \verb|addprefsto| preference, which (when set) controls which
+preference file new preferences (e.g. new ignore patterns) are added to.
+\item Bug fix: read the initial connection header one byte at a time, so
+that we don't block if the header is shorter than expected.  (This bug
+did not affect normal operation --- it just made it hard to tell when you
+were trying to use Unison incorrectly with an old version of the server,
+since it would hang instead of giving an error message.)
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.6.59}
+\item Changed \verb|fastcheck| from a boolean to a string preference.  Its 
+  legal values are \verb|yes| (for a fast check), \verb|no| (for a safe 
+  check), or \verb|default| (for a fast check---which also happens to be 
+  safe---when running on Unix and a safe check when on Windows).  The default 
+  is \verb|default|.
+  \item Several preferences have been renamed for consistency.  All
+  preference names are now spelled out in lowercase.  For backward
+  compatibility, the old names still work, but they are not mentioned in
+  the manual any more.
+\item The temp files created by the 'diff' and 'merge' commands are now
+   named by {\em pre}pending a new prefix to the file name, rather than
+   appending a suffix.  This should avoid confusing diff/merge programs
+   that depend on the suffix  to guess the type of the file contents.
+\item We now set the keepalive option on the server socket, to make sure
+  that the server times out if the communication link is unexpectedly broken. 
+\item Bug fixes:
+\begin{itemize}
+\item When updating small files, Unison now closes the destination file.
+\item File permissions are properly updated when the file is behind a
+  followed link.
+\item Several other small fixes.
+\end{itemize}
+\end{changesfromversion}
+
+
+\begin{changesfromversion}{2.6.38}
+\item Major Windows performance improvement!  
+
+We've added a preference \verb|fastcheck| that makes Unison look only at
+a file's creation time and last-modified time to check whether it has
+changed.  This should result in a huge speedup when checking for updates
+in large replicas.
+
+  When this switch is set, Unison will use file creation times as 
+  'pseudo inode numbers' when scanning Windows replicas for updates, 
+  instead of reading the full contents of every file.  This may cause 
+  Unison to miss propagating an update if the create time, 
+  modification time, and length of the file are all unchanged by 
+  the update (this is not easy to achieve, but it can be done).  
+  However, Unison will never {\em overwrite} such an update with
+  a change from the other replica, since it 
+  always does a safe check for updates just before propagating a 
+  change.  Thus, it is reasonable to use this switch most of the time 
+  and occasionally run Unison once with {\tt fastcheck} set to false, 
+  if you are worried that Unison may have overlooked an update.
+
+  Warning: This change is has not yet been thoroughly field-tested.  If you 
+  set the \verb|fastcheck| preference, pay careful attention to what
+  Unison is doing.
+
+\item New functionality: centralized backups and merging 
+\begin{itemize}
+\item This version incorporates two pieces of major new functionality,
+   implemented by Sylvain Roy during a summer internship at Penn: a
+   {\em centralized backup} facility that keeps a full backup of
+   (selected files 
+   in) each replica, and a {\em merging} feature that allows Unison to
+   invoke an external file-merging tool to resolve conflicting changes to
+   individual files.
+ 
+\item Centralized backups:
+\begin{itemize}
+  \item Unison now maintains full backups of the last-synchronized versions
+      of (some of) the files in each replica; these function both as
+      backups in the usual sense
+      and as the ``common version'' when invoking external
+      merge programs.
+  \item The backed up files are stored in a directory ~/.unison/backup on each
+      host.  (The name of this directory can be changed by setting
+      the environment variable \verb|UNISONBACKUPDIR|.)
+  \item The predicate \verb|backup| controls which files are actually
+     backed up:
+      giving the preference '\verb|backup = Path *|' causes backing up
+      of all files.
+  \item Files are added to the backup directory whenever unison updates
+      its archive.  This means that
+      \begin{itemize}
+       \item When unison reconstructs its archive from scratch (e.g., 
+           because of an upgrade, or because the archive files have
+           been manually deleted), all files will be backed up.
+       \item Otherwise, each file will be backed up the first time unison
+           propagates an update for it.
+      \end{itemize}
+  \item The preference \verb|backupversions| controls how many previous
+      versions of each file are kept.  The default is 2 (i.e., the last 
+      synchronized version plus one backup).
+  \item For backward compatibility, the \verb|backups| preference is also
+      still supported, but \verb|backup| is now preferred.
+  \item It is OK to manually delete files from the backup directory (or to throw
+      away the directory itself).  Before unison uses any of these files for 
+      anything important, it checks that its fingerprint matches the one 
+      that it expects. 
+\end{itemize}
+
+\item Merging:
+\begin{itemize}
+  \item Both user interfaces offer a new 'merge' command, invoked by pressing
+      'm' (with a changed file selected).  
+  \item The actual merging is performed by an external program.  
+      The preferences \verb|merge| and \verb|merge2| control how this
+      program is invoked.  If a backup exists for this file (see the
+      \verb|backup| preference), then the \verb|merge| preference is used for 
+      this purpose; otherwise \verb|merge2| is used.  In both cases, the 
+      value of the preference should be a string representing the command 
+      that should be passed to a shell to invoke the 
+      merge program.  Within this string, the special substrings
+      \verb|CURRENT1|, \verb|CURRENT2|, \verb|NEW|,  and \verb|OLD| may appear
+      at any point.  Unison will substitute these as follows before invoking
+      the command:
+        \begin{itemize}
+        \item \relax\verb|CURRENT1| is replaced by the name of the local 
+        copy of the file;
+        \item \relax\verb|CURRENT2| is replaced by the name of a temporary
+        file, into which the contents of the remote copy of the file have
+        been transferred by Unison prior to performing the merge;
+        \item \relax\verb|NEW| is replaced by the name of a temporary
+        file that Unison expects to be written by the merge program when
+        it finishes, giving the desired new contents of the file; and
+        \item \relax\verb|OLD| is replaced by the name of the backed up
+        copy of the original version of the file (i.e., its state at the 
+        end of the last successful run of Unison), if one exists 
+        (applies only to \verb|merge|, not \verb|merge2|).
+        \end{itemize}
+      For example, on Unix systems setting the \verb|merge| preference to
+\begin{verbatim}
+   merge = diff3 -m CURRENT1 OLD CURRENT2 > NEW
+\end{verbatim}
+      will tell Unison to use the external \verb|diff3| program for merging.  
+
+      A large number of external merging programs are available.  For 
+      example, \verb|emacs| users may find the following convenient:
+\begin{verbatim}
+    merge2 = emacs -q --eval '(ediff-merge-files "CURRENT1" "CURRENT2" 
+               nil "NEW")' 
+    merge = emacs -q --eval '(ediff-merge-files-with-ancestor 
+               "CURRENT1" "CURRENT2" "OLD" nil "NEW")' 
+\end{verbatim}
+(These commands are displayed here on two lines to avoid running off the
+edge of the page.  In your preference file, each should be written on a
+single line.) 
+
+  \item If the external program exits without leaving any file at the
+  path \verb|NEW|, 
+      Unison considers the merge to have failed.  If the merge program writes
+      a file called \verb|NEW| but exits with a non-zero status code,
+      then Unison 
+      considers the merge to have succeeded but to have generated conflicts.
+      In this case, it attempts to invoke an external editor so that the
+      user can resolve the conflicts.  The value of the \verb|editor| 
+      preference controls what editor is invoked by Unison.  The default
+      is \verb|emacs|.
+
+  \item Please send us suggestions for other useful values of the
+       \verb|merge2| and \verb|merge| preferences -- we'd like to give several 
+       examples in the manual.
+\end{itemize}
+\end{itemize}
+
+\item Smaller changes:
+\begin{itemize}
+\item When one preference file includes another, unison no longer adds the
+  suffix '\verb|.prf|' to the included file by default.  If a file with 
+  precisely the given name exists in the .unison directory, it will be used; 
+  otherwise Unison will 
+  add \verb|.prf|, as it did before.  (This change means that included 
+  preference files can be named \verb|blah.include| instead of 
+  \verb|blah.prf|, so that unison will not offer them in its 'choose 
+  a preference file' dialog.)
+\item For Linux systems, we now offer both a statically linked and a dynamically
+  linked executable.  The static one is larger, but will probably run on more
+  systems, since it doesn't depend on the same versions of dynamically
+  linked library modules being available.
+\item Fixed the \verb|force| and \verb|prefer| preferences, which were
+  getting the propagation direction exactly backwards.
+\item Fixed a bug in the startup code that would cause unison to crash
+  when the default profile (\verb|~/.unison/default.prf|) does not exist.
+\item Fixed a bug where, on the run when a profile is first created, 
+  Unison would confusingly display the roots in reverse order in the user
+  interface.
+\end{itemize}
+
+\item For developers:
+\begin{itemize}
+\item We've added a module dependency diagram to the source distribution, in
+   \verb|src/DEPENDENCIES.ps|, to help new prospective developers with
+   navigating the code. 
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.6.11}
+\item \incompatible{} Archive format has changed.  
+
+\item \incompatible{} The startup sequence has been completely rewritten
+and greatly simplified.  The main user-visible change is that the
+\verb|defaultpath| preference has been removed.  Its effect can be
+approximated by using multiple profiles, with \verb|include| directives
+to incorporate common settings.  All uses of \verb|defaultpath| in
+existing profiles should be changed to \verb|path|.
+
+Another change in startup behavior that will affect some users is that it
+is no longer possible to specify roots {\em both} in the profile {\em
+  and} on the command line.
+
+You can achieve a similar effect, though, by breaking your profile into
+two:
+\begin{verbatim}
+  
+  default.prf = 
+      root = blah
+      root = foo
+      include common
+
+  common.prf = 
+      <everything else>
+\end{verbatim}
+Now do
+\begin{verbatim}
+  unison common root1 root2
+\end{verbatim}
+when you want to specify roots explicitly.
+
+\item The \verb|-prefer| and \verb|-force| options have been extended to
+allow users to specify that files with more recent modtimes should be
+propagated, writing either \verb|-prefer newer| or \verb|-force newer|.
+(For symmetry, Unison will also accept \verb|-prefer older| or
+\verb|-force older|.)  The \verb|-force older/newer| options can only be
+used when \verb|-times| is also set.
+
+The graphical user interface provides access to these facilities on a
+one-off basis via the \verb|Actions| menu.
+
+\item Names of roots can now be ``aliased'' to allow replicas to be
+relocated without changing the name of the archive file where Unison
+stores information between runs.  (This feature is for experts only.  See
+the ``Archive Files'' section of the manual for more information.)
+
+\item Graphical user-interface:
+\begin{itemize}
+\item A new command is provided in the Synchronization menu for
+  switching to a new profile without restarting Unison from scratch.
+\item The GUI also supports one-key shortcuts for commonly
+used profiles.  If a profile contains a preference of the form 
+%
+'\verb|key = n|', where \verb|n| is a single digit, then pressing this
+key will cause Unison to immediately switch to this profile and begin
+synchronization again from scratch.  (Any actions that may have been
+selected for a set of changes currently being displayed will be
+discarded.) 
+
+\item Each profile may include a preference '\verb|label = <string>|' giving a
+  descriptive string that described the options selected in this profile.
+  The string is listed along with the profile name in the profile selection
+  dialog, and displayed in the top-right corner of the main Unison window.
+\end{itemize}
+
+\item Minor:
+\begin{itemize}
+\item Fixed a bug that would sometimes cause the 'diff' display to order
+  the files backwards relative to the main user interface.  (Thanks
+  to Pascal Brisset for this fix.)
+\item On Unix systems, the graphical version of Unison will check the
+  \verb|DISPLAY| variable and, if it is not set, automatically fall back
+  to the textual user interface.
+\item Synchronization paths (\verb|path| preferences) are now matched
+  against the ignore preferences.  So if a path is both specified in a
+  \verb|path| preference and ignored, it will be skipped.
+\item Numerous other bugfixes and small improvements.
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.6.1}
+\item The synchronization of modification times has been disabled for
+  directories.
+
+\item Preference files may now include lines of the form
+  \verb+include <name>+, which will cause \verb+name.prf+ to be read
+  at that point.
+
+\item The synchronization of permission between Windows and Unix now
+  works properly.
+
+\item A binding \verb|CYGWIN=binmode| in now added to the environment
+  so that the Cygwin port of OpenSSH works properly in a non-Cygwin
+  context.
+
+\item The \verb|servercmd| and \verb|addversionno| preferences can now
+  be used together: \verb|-addversionno| appends an appropriate
+  \verb+-NNN+ to the server command, which is found by using the value
+  of the \verb|-servercmd| preference if there is one, or else just
+  \verb|unison|.
+
+\item Both \verb|'-pref=val'| and \verb|'-pref val'| are now allowed for
+  boolean values.  (The former can be used to set a preference to false.)
+
+\item Lot of small bugs fixed.
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.5.31}
+\item The \verb|log| preference is now set to \verb|true| by default,
+  since the log file seems useful for most users.  
+\item Several miscellaneous bugfixes (most involving symlinks).
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.5.25}
+\item \incompatible{} Archive format has changed (again).  
+
+\item Several significant bugs introduced in 2.5.25 have been fixed.  
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.5.1}
+\item \incompatible{} Archive format has changed.  Make sure you
+synchronize your replicas before upgrading, to avoid spurious
+conflicts.  The first sync after upgrading will be slow.
+
+\item New functionality:
+\begin{itemize}
+\item Unison now synchronizes file modtimes, user-ids, and group-ids.  
+
+These new features are controlled by a set of new preferences, all of
+which are currently \verb|false| by default.  
+
+\begin{itemize}
+\item When the \verb|times| preference is set to \verb|true|, file
+modification times are propaged.  (Because the representations of time
+may not have the same granularity on both replicas, Unison may not always
+be able to make the modtimes precisely equal, but it will get them as
+close as the operating systems involved allow.)
+\item When the \verb|owner| preference is set to \verb|true|, file
+ownership information is synchronized.
+\item When the \verb|group| preference is set to \verb|true|, group 
+information is synchronized.
+\item When the \verb|numericIds| preference is set to \verb|true|, owner
+and group information is synchronized numerically.  By default, owner and
+group numbers are converted to names on each replica and these names are
+synchronized.  (The special user id 0 and the special group 0 are never
+mapped via user/group names even if this preference is not set.)
+\end{itemize}
+
+\item Added an integer-valued preference \verb|perms| that can be used to
+control the propagation of permission bits.  The value of this preference
+is a mask indicating which permission bits should be synchronized.  It is
+set by default to $0o1777$: all bits but the set-uid and set-gid bits are
+synchronised (synchronizing theses latter bits can be a security hazard).
+If you want to synchronize all bits, you can set the value of this
+preference to $-1$.
+
+\item Added a \verb|log| preference (default \verb|false|), which makes
+Unison keep a complete record of the changes it makes to the replicas.
+By default, this record is written to a file called \verb|unison.log| in
+the user's home directory (the value of the \verb|HOME| environment
+variable).  If you want it someplace else, set the \verb|logfile|
+preference to the full pathname you want Unison to use.
+
+\item Added an \verb|ignorenot| preference that maintains a set of patterns 
+  for paths that should definitely {\em not} be ignored, whether or not
+  they match an \verb|ignore| pattern.  (That is, a path will now be ignored
+  iff it matches an ignore pattern and does not match any ignorenot patterns.)
+\end{itemize}
+  
+\item User-interface improvements:
+\begin{itemize}
+\item Roots are now displayed in the user interface in the same order
+as they were given on the command line or in the preferences file.
+\item When the \verb|batch| preference is set, the graphical user interface no 
+  longer waits for user confirmation when it displays a warning message: it
+  simply pops up an advisory window with a Dismiss button at the bottom and
+  keeps on going.
+\item Added a new preference for controlling how many status messages are
+  printed during update detection: \verb|statusdepth| controls the maximum
+  depth for paths on the local machine (longer paths are not displayed, nor
+  are non-directory paths).  The value should be an integer; default is 1.  
+\item Removed the \verb|trace| and \verb|silent| preferences.  They did
+not seem very useful, and there were too many preferences for controlling
+output in various ways.
+\item The text UI now displays just the default command (the one that
+will be used if the user just types \verb|<return>|) instead of all
+available commands.  Typing \verb|?| will print the full list of
+possibilities.
+\item The function that finds the canonical hostname of the local host
+(which is used, for example, in calculating the name of the archive file
+used to remember which files have been synchronized) normally uses the
+\verb|gethostname| operating system call.  However, if the environment
+variable \verb|UNISONLOCALHOSTNAME| is set, its value will now be used
+instead.  This makes it easier to use Unison in situations where a
+machine's name changes frequently (e.g., because it is a laptop and gets
+moved around a lot).
+\item File owner and group are now displayed in the ``detail window'' at
+the bottom of the screen, when unison is configured to synchronize them.
+\end{itemize}
+
+\item For hackers:
+\begin{itemize}
+\item Updated to Jacques Garrigue's new version of \verb|lablgtk|, which
+  means we can throw away our local patched version.  
+
+  If you're compiling the GTK version of unison from sources, you'll need
+  to update your copy of lablgtk to the developers release.
+  (Warning: installing lablgtk under Windows is currently a bit
+  challenging.) 
+
+\item The TODO.txt file (in the source distribution) has been cleaned up
+and reorganized.  The list of pending tasks should be much easier to
+make sense of, for people that may want to contribute their programming
+energies.  There is also a separate file BUGS.txt for open bugs.
+\item The Tk user interface has been removed (it was not being maintained
+and no longer compiles).
+\item The \verb|debug| preference now prints quite a bit of additional
+information that should be useful for identifying sources of problems.
+\item The version number of the remote server is now checked right away 
+  during the connection setup handshake, rather than later.  (Somebody
+  sent a bug report of a server crash that turned out to come from using
+  inconsistent versions: better to check this earlier and in a way that
+  can't crash either client or server.)
+\item Unison now runs correctly on 64-bit architectures (e.g. Alpha
+linux).  We will not be distributing binaries for these architectures
+ourselves (at least for a while) but if someone would like to make them
+available, we'll be glad to provide a link to them.
+\end{itemize}
+
+\item Bug fixes:
+\begin{itemize}
+\item Pattern matching (e.g. for \verb|ignore|) is now case-insensitive
+  when Unison is in case-insensitive mode (i.e., when one of the replicas
+  is on a windows machine).
+\item Some people had trouble with mysterious failures during
+  propagation of updates, where files would be falsely reported as having
+  changed during synchronization.  This should be fixed.
+\item Numerous smaller fixes.
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.4.1}
+\item Added a number of 'sorting modes' for the user interface.  By
+default, conflicting changes are displayed at the top, and the rest of
+the entries are sorted in alphabetical order.  This behavior can be
+changed in the following ways:
+\begin{itemize}
+\item Setting  the \verb|sortnewfirst| preference to \verb|true| causes
+newly created files to be displayed before changed files.
+\item Setting \verb|sortbysize| causes files to be displayed in
+increasing order of size.
+\item Giving the preference \verb|sortfirst=<pattern>| (where
+\verb|<pattern>| is a path descriptor in the same format as 'ignore' and 'follow'
+patterns, causes paths matching this pattern to be displayed first.
+\item Similarly, giving the preference \verb|sortlast=<pattern>| 
+causes paths matching this pattern to be displayed last.
+\end{itemize}
+The sorting preferences are described in more detail in the user manual.
+The \verb|sortnewfirst| and \verb|sortbysize| flags can also be accessed
+from the 'Sort' menu in the grpahical user interface.
+
+\item Added two new preferences that can be used to change unison's
+fundamental behavior to make it more like a mirroring tool instead of
+a synchronizer.
+\begin{itemize}
+\item Giving the preference \verb|prefer| with argument \verb|<root>|
+(by adding \verb|-prefer <root>| to the command line or \verb|prefer=<root>|)
+to your profile) means that, if there is a conflict, the contents of
+\verb|<root>| 
+should be propagated to the other replica (with no questions asked).
+Non-conflicting changes are treated as usual.
+\item Giving the preference \verb|force| with argument \verb|<root>|
+will make unison resolve {\em all} differences in favor of the given
+root, even if it was the other replica that was changed.
+\end{itemize}
+These options should be used with care!  (More information is available in
+the manual.)
+
+\item Small changes:
+\begin{itemize}
+\item 
+Changed default answer to 'Yes' in all two-button dialogs in the 
+  graphical interface (this seems more intuitive).
+
+\item The \verb|rsync| preference has been removed (it was used to
+activate rsync compression for file transfers, but rsync compression is
+now enabled by default). 
+\item  In the text user interface, the arrows indicating which direction
+changes are being 
+  propagated are printed differently when the user has overridded Unison's
+  default recommendation (\verb|====>| instead of \verb|---->|).  This
+  matches the behavior of the graphical interface, which displays such
+  arrows in a different color.
+\item Carriage returns (Control-M's) are ignored at the ends of lines in
+  profiles, for Windows compatibility.
+\item All preferences are now fully documented in the user manual. 
+\end{itemize}
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.3.12}
+\item \incompatible{} Archive format has changed.  Make sure you
+synchronize your replicas before upgrading, to avoid spurious
+conflicts.  The first sync after upgrading will be slow.
+
+\item New/improved functionality:
+\begin{itemize}
+\item  A new preference -sortbysize controls the order in which changes
+  are displayed to the user: when it is set to true, the smallest
+  changed files are displayed first.  (The default setting is false.) 
+\item A new preference -sortnewfirst causes newly created files to be 
+  listed before other updates in the user interface.
+\item We now allow the ssh protocol to specify a port.  
+\item Incompatible change: The unison: protocol is deprecated, and we added
+  file: and socket:.  You may have to modify your profiles in the
+  .unison directory.
+  If a replica is specified without an explicit protocol, we now
+  assume it refers to a file.  (Previously "//saul/foo" meant to use
+  SSH to connect to saul, then access the foo directory.  Now it means
+  to access saul via a remote file mechanism such as samba; the old
+  effect is now achieved by writing {\tt ssh://saul/foo}.)
+\item Changed the startup sequence for the case where roots are given but
+  no profile is given on the command line.  The new behavior is to
+  use the default profile (creating it if it does not exist), and
+  temporarily override its roots.  The manual claimed that this case
+  would work by reading no profile at all, but AFAIK this was never
+  true.
+\item In all user interfaces, files with conflicts are always listed first
+\item A new preference 'sshversion' can be used to control which version
+  of ssh should be used to connect to the server.  Legal values are 1 and 2.
+  (Default is empty, which will make unison use whatever version of ssh
+  is installed as the default 'ssh' command.)
+\item The situation when the permissions of a file was updated the same on
+  both side is now handled correctly (we used to report a spurious conflict)
+
+\end{itemize}
+
+\item Improvements for the Windows version:
+\begin{itemize}
+\item The fact that filenames are treated case-insensitively under
+Windows should now be handled correctly.  The exact behavior is described
+in the cross-platform section of the manual.
+\item It should be possible to synchronize with Windows shares, e.g.,
+  //host/drive/path.
+\item Workarounds to the bug in syncing root directories in Windows.
+The most difficult thing to fix is an ocaml bug: Unix.opendir fails on
+c: in some versions of Windows.
+\end{itemize}
+
+\item Improvements to the GTK user interface (the Tk interface is no
+longer being maintained): 
+\begin{itemize}
+\item The UI now displays actions differently (in blue) when they have been
+  explicitly changed by the user from Unison's default recommendation.
+\item More colorful appearance.
+\item The initial profile selection window works better.
+\item If any transfers failed, a message to this effect is displayed along with
+  'Synchronization complete' at the end of the transfer phase (in case they
+  may have scrolled off the top).
+\item Added a global progress meter, displaying the percentage of {\em total}
+  bytes that have been transferred so far.
+\end{itemize}
+
+\item Improvements to the text user interface:
+\begin{itemize}
+\item The file details will be displayed automatically when a
+  conflict is been detected.
+\item when a warning is generated (e.g. for a temporary
+  file left over from a previous run of unison) Unison will no longer
+  wait for a response if it is running in -batch mode.
+\item The UI now displays a short list of possible inputs each time it waits
+  for user interaction.  
+\item The UI now quits immediately (rather than looping back and starting
+  the interaction again) if the user presses 'q' when asked whether to 
+  propagate changes.
+\item Pressing 'g' in the text user interface will proceed immediately
+  with propagating updates, without asking any more questions.
+\end{itemize}
+
+\item Documentation and installation changes:
+\begin{itemize}
+\item The manual now includes a FAQ, plus sections on common problems and
+on tricks contributed by users.
+\item Both the download page and the download directory explicitly say
+what are the current stable and beta-test version numbers.
+\item The OCaml sources for the up-to-the-minute developers' version (not
+guaranteed to be stable, or even to compile, at any given time!) are now
+available from the download page.
+\item Added a subsection to the manual describing cross-platform
+  issues (case conflicts, illegal filenames)
+\end{itemize}
+
+\item Many small bug fixes and random improvements.
+
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.3.1}
+\item Several bug fixes.  The most important is a bug in the rsync
+module that would occasionally cause change propagation to fail with a
+'rename' error.
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.2}
+\item The multi-threaded transport system is now disabled by default.
+(It is not stable enough yet.)
+\item Various bug fixes.
+\item A new experimental feature: 
+
+  The final component of a -path argument may now be the wildcard 
+  specifier \verb|*|.  When Unison sees such a path, it expands this path on 
+  the client into into the corresponding list of paths by listing the
+  contents of that directory.  
+
+  Note that if you use wildcard paths from the command line, you will
+  probably need to use quotes or a backslash to prevent the * from
+  being interpreted by your shell.
+
+  If both roots are local, the contents of the first one will be used
+  for expanding wildcard paths.  (Nb: this is the first one {\em after} the
+  canonization step -- i.e., the one that is listed first in the user 
+  interface -- not the one listed first on the command line or in the
+  preferences file.)
+\end{changesfromversion}
+
+\begin{changesfromversion}{2.1}
+\item The transport subsystem now includes an implementation by
+Sylvain Gommier and Norman Ramsey of Tridgell and Mackerras's
+\verb|rsync| protocol.  This protocol achieves much faster 
+transfers when only a small part of a large file has been changed by
+sending just diffs.  This feature is mainly helpful for transfers over
+slow links---on fast local area networks it can actually degrade
+performance---so we have left it off by default.  Start unison with
+the \verb|-rsync| option (or put \verb|rsync=true| in your preferences
+file) to turn it on.
+
+\item ``Progress bars'' are now diplayed during remote file transfers,
+showing what percentage of each file has been transferred so far.
+
+\item The version numbering scheme has changed.  New releases will now
+      be have numbers like 2.2.30, where the second component is
+      incremented on every significant public release and the third
+      component is the ``patch level.''
+
+\item Miscellaneous improvements to the GTK-based user interface.
+\item The manual  is now available in PDF format.
+
+\item We are experimenting with using a multi-threaded transport
+subsystem to transfer several files at the same time, making
+much more effective use of available network bandwidth.  This feature
+is not completely stable yet, so by default it is disabled in the
+release version of Unison.
+
+If you want to play with the multi-threaded version, you'll need to
+recompile Unison from sources (as described in the documentation),
+setting the THREADS flag in Makefile.OCaml to true.  Make sure that
+your OCaml compiler has been installed with the \verb|-with-pthreads|
+configuration option.  (You can verify this by checking whether the
+file \verb|threads/threads.cma| in the OCaml standard library
+directory contains the string \verb|-lpthread| near the end.)
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.292}
+\item Reduced memory footprint (this is especially important during
+the first run of unison, where it has to gather information about all
+the files in both repositories). 
+\item Fixed a bug that would cause the socket server under NT to fail
+  after the client exits. 
+\item Added a SHIFT modifier to the Ignore menu shortcut keys in GTK
+  interface (to avoid hitting them accidentally).  
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.231}
+\item Tunneling over ssh is now supported in the Windows version.  See
+the installation section of the manual for detailed instructions.
+
+\item The transport subsystem now includes an implementation of the
+\verb|rsync| protocol, built by Sylvain Gommier and Norman Ramsey.
+This protocol achieves much faster transfers when only a small part of
+a large file has been changed by sending just diffs.  The rsync
+feature is off by default in the current version.  Use the
+\verb|-rsync| switch to turn it on.  (Nb.  We still have a lot of
+tuning to do: you may not notice much speedup yet.)
+
+\item We're experimenting with a multi-threaded transport subsystem,
+written by Jerome Vouillon.  The downloadable binaries are still
+single-threaded: if you want to try the multi-threaded version, you'll
+need to recompile from sources.  (Say \verb|make THREADS=true|.)
+Native thread support from the compiler is required.  Use the option
+\verb|-threads N| to select the maximal number of concurrent 
+threads (default is 5).  Multi-threaded
+and single-threaded clients/servers can interoperate.  
+
+\item A new GTK-based user interface is now available, thanks to
+Jacques Garrigue.  The Tk user interface still works, but we'll be
+shifting development effort to the GTK interface from now on.
+\item OCaml 3.00 is now required for compiling Unison from sources.
+The modules \verb|uitk| and \verb|myfileselect| have been changed to
+use labltk instead of camltk.  To compile the Tk interface in Windows,
+you must have ocaml-3.00 and tk8.3.  When installing tk8.3, put it in
+\verb|c:\Tcl| rather than the suggested \verb|c:\Program Files\Tcl|, 
+and be sure to install the headers and libraries (which are not 
+installed by default).
+
+\item Added a new \verb|-addversionno| switch, which causes unison to
+use \verb|unison-<currentversionnumber>| instead of just \verb|unison|
+as the remote server command.  This allows multiple versions of unison
+to coexist conveniently on the same server: whichever version is run
+on the client, the same version will be selected on the server.
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.219}
+\item \incompatible{} Archive format has changed.  Make sure you
+synchronize your replicas before upgrading, to avoid spurious
+conflicts.  The first sync after upgrading will be slow.
+
+\item This version fixes several annoying bugs, including:
+\begin{itemize}
+\item Some cases where propagation of file permissions was not
+working.
+\item umask is now ignored when creating directories
+\item directories are create writable, so that a read-only directory and
+    its contents can be propagated.
+\item Handling of warnings generated by the server.
+\item Synchronizing a path whose parent is not a directory on both sides is
+now flagged as erroneous.  
+\item Fixed some bugs related to symnbolic links and nonexistant roots.
+\begin{itemize}
+\item 
+   When a change (deletion or new contents) is propagated onto a 
+     'follow'ed symlink, the file pointed to by the link is now changed.
+     (We used to change the link itself, which doesn't fit our assertion
+     that 'follow' means the link is completely invisible)
+   \item When one root did not exist, propagating the other root on top of it
+     used to fail, becuase unison could not calculate the working directory
+     into which to write changes.  This should be fixed.
+\end{itemize}
+\end{itemize}
+
+\item A human-readable timestamp has been added to Unison's archive files.
+
+\item The semantics of Path and Name regular expressions now
+correspond better. 
+
+\item Some minor improvements to the text UI (e.g. a command for going
+back to previous items)
+
+\item The organization of the export directory has changed --- should
+be easier to find / download things now.
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.200}
+\item \incompatible{} Archive format has changed.  Make sure you
+synchronize your replicas before upgrading, to avoid spurious
+conflicts.  The first sync after upgrading will be slow.
+
+\item This version has not been tested extensively on Windows.
+
+\item Major internal changes designed to make unison safer to run
+at the same time as the replicas are being changed by the user.
+
+\item Internal performance improvements.  
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.190}
+\item \incompatible{} Archive format has changed.  Make sure you
+synchronize your replicas before upgrading, to avoid spurious
+conflicts.  The first sync after upgrading will be slow.
+
+\item A number of internal functions have been changed to reduce the
+amount of memory allocation, especially during the first
+synchronization.  This should help power users with very big replicas.
+
+\item Reimplementation of low-level remote procedure call stuff, in
+preparation for adding rsync-like smart file transfer in a later
+release.   
+
+\item Miscellaneous bug fixes.
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.180}
+\item \incompatible{} Archive format has changed.  Make sure you
+synchronize your replicas before upgrading, to avoid spurious
+conflicts.  The first sync after upgrading will be slow.
+
+\item Fixed some small bugs in the interpretation of ignore patterns. 
+
+\item Fixed some problems that were preventing the Windows version
+from working correctly when click-started.
+
+\item Fixes to treatment of file permissions under Windows, which were
+causing spurious reports of different permissions when synchronizing
+between windows and unix systems.
+
+\item Fixed one more non-tail-recursive list processing function,
+which was causing stack overflows when synchronizing very large
+replicas. 
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.169}
+\item The text user interface now provides commands for ignoring
+  files. 
+\item We found and fixed some {\em more} non-tail-recursive list
+  processing functions.  Some power users have reported success with
+  very large replicas.
+\item \incompatible 
+Files ending in \verb|.tmp| are no longer ignored automatically.  If you want
+to ignore such files, put an appropriate ignore pattern in your profile.
+
+\item \incompatible{} The syntax of {\tt ignore} and {\tt follow}
+patterns has changed. Instead of putting a line of the form
+\begin{verbatim}
+                 ignore = <regexp>
+\end{verbatim}
+  in your profile ({\tt .unison/default.prf}), you should put:
+\begin{verbatim}
+                 ignore = Regexp <regexp>
+\end{verbatim}
+Moreover, two other styles of pattern are also recognized:
+\begin{verbatim}
+                 ignore = Name <name>
+\end{verbatim}
+matches any path in which one component matches \verb|<name>|, while
+\begin{verbatim}
+                 ignore = Path <path>
+\end{verbatim}
+matches exactly the path \verb|<path>|.
+
+Standard ``globbing'' conventions can be used in \verb|<name>| and
+\verb|<path>|:  
+\begin{itemize}
+\item a \verb|?| matches any single character except \verb|/|
+\item a \verb|*| matches any sequence of characters not including \verb|/|
+\item \verb|[xyz]| matches any character from the set $\{{\tt x},
+  {\tt y}, {\tt z} \}$
+\item \verb|{a,bb,ccc}| matches any one of \verb|a|, \verb|bb|, or
+  \verb|ccc|. 
+\end{itemize}
+
+See the user manual for some examples.
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.146}
+\item Some users were reporting stack overflows when synchronizing
+  huge directories.  We found and fixed some non-tail-recursive list
+  processing functions, which we hope will solve the problem.  Please 
+  give it a try and let us know.
+\item Major additions to the documentation.  
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.142}
+\item Major internal tidying and many small bugfixes.
+\item Major additions to the user manual.
+\item Unison can now be started with no arguments -- it will prompt
+automatically for the name of a profile file containing the roots to
+be synchronized.  This makes it possible to start the graphical UI
+from a desktop icon.
+\item Fixed a small bug where the text UI on NT was raising a 'no such
+  signal' exception.
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.139}
+\item The precompiled windows binary in the last release was compiled
+with an old OCaml compiler, causing propagation of permissions not to
+work (and perhaps leading to some other strange behaviors we've heard
+reports about).  This has been corrected.  If you're using precompiled
+binaries on Windows, please upgrade.
+\item Added a \verb|-debug| command line flag, which controls debugging
+of various modules.  Say \verb|-debug XXX| to enable debug tracing for
+module \verb|XXX|, or \verb|-debug all| to turn on absolutely everything.
+\item Fixed a small bug where the text UI on NT was raising a 'no such signal'
+exception.
+\end{changesfromversion}
+
+\begin{changesfromversion}{1.111}
+\item \incompatible{} The names and formats of the preference files in
+the .unison directory have changed.  In particular:
+\begin{itemize}
+\item the file ``prefs'' should be renamed to default.prf
+\item the contents of the file ``ignore'' should be merged into
+  default.prf.  Each line of the form \verb|REGEXP| in ignore should
+  become a line of the form \verb|ignore = REGEXP| in default.prf.
+\end{itemize}
+\item Unison now handles permission bits and  symbolic links.  See the
+manual for details.
+
+\item You can now have different preference files in your .unison
+directory.  If you start unison like this
+\begin{verbatim}
+             unison profilename
+\end{verbatim}
+(i.e. with just one ``anonymous'' command-line argument), then the
+file \verb|~/.unison/profilename.prf| will be loaded instead of
+\verb|default.prf|. 
+
+\item Some improvements to terminal handling in the text user interface
+
+\item Added a switch -killServer that terminates the remote server process
+when the unison client is shutting down, even when using sockets for 
+communication.  (By default, a remote server created using ssh/rsh is 
+terminated automatically, while a socket server is left running.)
+\item When started in 'socket server' mode, unison prints 'server started' on
+  stderr when it is ready to accept connections.  
+  (This may be useful for scripts that want to tell when a socket-mode server 
+  has finished initalization.)
+\item We now make a nightly mirror of our current internal development
+  tree, in case anyone wants an up-to-the-minute version to hack
+  around with.
+\item Added a file CONTRIB with some suggestions for how to help us
+make Unison better.
+\end{changesfromversion}
+

Deleted: branches/2.40/src/NEWS
===================================================================
--- trunk/src/NEWS	2010-02-17 13:06:38 UTC (rev 410)
+++ branches/2.40/src/NEWS	2010-02-20 23:23:17 UTC (rev 412)
@@ -1,1332 +0,0 @@
-
-Changes in Version 2.32.1
-
-   Changes since 2.17:
-     * Major rewrite and cleanup of the whole Mac OS X graphical user
-       interface by Craig Federighi. Thanks, Craig!!!
-     * Small fix to ctime (non-)handling in update detection under
-       windows with fastcheck.
-
-   Changes since 2.17:
-     * Several small fixes to the GTK2 UI to make it work better under
-       Windows [thanks to Karl M for these].
-     * The backup functionality has been completely rewritten. The
-       external interface has not changed, but numerous bugs, irregular
-       behaviors, and cross-platform inconsistencies have been corrected.
-     * The Unison project now accepts donations via PayPal. If you'd like
-       to donate, you can find a link to the donation page on the Unison
-       home page (http://www.cis.upenn.edu/ bcpierce/unison/lists.html).
-     * Some important safety improvements:
-          + Added a new mountpoint preference, which can be used to
-            specify a path that must exist in both replicas at the end of
-            update detection (otherwise Unison aborts). This can be used
-            to avoid potentially dangerous situations when Unison is used
-            with removable media such as external hard drives and compact
-            flash cards.
-          + The confirmation of "big deletes" is now controlled by a
-            boolean preference confirmbigdeletes. Default is true, which
-            gives the same behavior as previously. (This functionality is
-            at least partly superceded by the mountpoint preference, but
-            it has been left in place in case it is useful to some
-            people.)
-          + If Unison is asked to "follow" a symbolic link but there is
-            nothing at the other end of the link, it will now flag this
-            path as an error, rather than treating the symlink itself as
-            missing or deleted. This avoids a potentially dangerous
-            situation where a followed symlink points to an external
-            filesystem that might be offline when Unison is run
-            (whereupon Unison would cheerfully delete the corresponding
-            files in the other replica!).
-     * Smaller changes:
-          + Added forcepartial and preferpartial preferences, which
-            behave like force and prefer but can be specified on a
-            per-path basis. [Thanks to Alan Schmitt for this.]
-          + A bare-bones self test feature was added, which runs unison
-            through some of its paces and checks that the results are as
-            expected. The coverage of the tests is still very limited,
-            but the facility has already been very useful in debugging
-            the new backup functionality (especially in exposing some
-            subtle cross-platform issues).
-          + Refined debugging code so that the verbosity of individual
-            modules can be controlled separately. Instead of just putting
-            '-debug verbose' on the command line, you can put '-debug
-            update+', which causes all the extra messages in the Update
-            module, but not other modules, to be printed. Putting '-debug
-            verbose' causes all modules to print with maximum verbosity.
-          + Removed mergebatch preference. (It never seemed very useful,
-            and its semantics were confusing.)
-          + Rewrote some of the merging functionality, for better
-            cooperation with external Harmony instances.
-          + Changed the temp file prefix from .# to .unison.
-          + Compressed the output from the text user interface
-            (particularly when run with the -terse flag) to make it
-            easier to interpret the results when Unison is run several
-            times in succession from a script.
-          + Diff and merge functions now work under Windows.
-          + Changed the order of arguments to the default diff command
-            (so that the + and - annotations in diff's output are
-            reversed).
-          + Added .mpp files to the "never fastcheck" list (like .xls
-            files).
-     * Many small bugfixes, including:
-          + Fixed a longstanding bug regarding fastcheck and daylight
-            saving time under Windows when Unison is set up to
-            synchronize modification times. (Modification times cannot be
-            updated in the archive in this case, so we have to ignore one
-            hour differences.)
-          + Fixed a bug that would occasionally cause the archives to be
-            left in non-identical states on the two hosts after
-            synchronization.
-          + Fixed a bug that prevented Unison from communicating
-            correctly between 32- and 64-bit architectures.
-          + On windows, file creation times are no longer used as a proxy
-            for inode numbers. (This is unfortunate, as it makes
-            fastcheck a little less safe. But it turns out that file
-            creation times are not reliable under Windows: if a file is
-            removed and a new file is created in its place, the new one
-            will sometimes be given the same creation date as the old
-            one!)
-          + Set read-only file to R/W on OSX before attempting to change
-            other attributes.
-          + Fixed bug resulting in spurious "Aborted" errors during
-            transport (thanks to Jerome Vouillon)
-          + Enable diff if file contents have changed in one replica, but
-            only properties in the other.
-          + Removed misleading documentation for 'repeat' preference.
-          + Fixed a bug in merging code where Unison could sometimes
-            deadlock with the external merge program, if the latter
-            produced large amounts of output.
-          + Workaround for a bug compiling gtk2 user interface against
-            current versions of gtk2+ libraries.
-          + Added a better error message for "ambiguous paths".
-          + Squashed a longstanding bug that would cause file transfer to
-            fail with the message "Failed: Error in readWrite: Is a
-            directory."
-          + Replaced symlinks with copies of their targets in the Growl
-            framework in src/uimac. This should make the sources easier
-            to check out from the svn repository on WinXP systems.
-          + Added a workaround (suggested by Karl M.) for the problem
-            discussed on the unison users mailing list where, on the
-            Windows platform, the server would hang when transferring
-            files. I conjecture that the problem has to do with the RPC
-            mechanism, which was used to make a call back from the server
-            to the client (inside the Trace.log function) so that the log
-            message would be appended to the log file on the client. The
-            workaround is to dump these messages (about when
-            xferbycopying shortcuts are applied and whether they succeed)
-            just to the standard output of the Unison process, not to the
-            log file.
-
-   Changes since 2.13.0:
-     * The features for performing backups and for invoking external
-       merge programs have been completely rewritten by Stephane Lescuyer
-       (thanks, Stephane!). The user-visible functionality should not
-       change, but the internals have been rationalized and there are a
-       number of new features. See the manual (in particular, the
-       description of the backupXXX preferences) for details.
-     * Incorporated patches for ipv6 support, contributed by Samuel
-       Thibault. (Note that, due to a bug in the released OCaml 3.08.3
-       compiler, this code will not actually work with ipv6 unless
-       compiled with the CVS version of the OCaml compiler, where the bug
-       has been fixed; however, ipv4 should continue to work normally.)
-     * OSX interface:
-          + Incorporated Ben Willmore's cool new icon for the Mac UI.
-     * Small fixes:
-          + Fixed off by one error in month numbers (in printed dates)
-            reported by Bob Burger
-
-   Changes since 2.12.0:
-     * New convention for release numbering: Releases will continue to be
-       given numbers of the form X.Y.Z, but, from now on, just the major
-       version number (X.Y) will be considered significant when checking
-       compatibility between client and server versions. The third
-       component of the version number will be used only to identify
-       "patch levels" of releases.
-       This change goes hand in hand with a change to the procedure for
-       making new releases. Candidate releases will initially be given
-       "beta release" status when they are announced for public
-       consumption. Any bugs that are discovered will be fixed in a
-       separate branch of the source repository (without changing the
-       major version number) and new tarballs re-released as needed. When
-       this process converges, the patched beta version will be dubbed
-       stable.
-     * Warning (failure in batch mode) when one path is completely
-       emptied. This prevents Unison from deleting everything on one
-       replica when the other disappear.
-     * Fix diff bug (where no difference is shown the first time the diff
-       command is given).
-     * User interface changes:
-          + Improved workaround for button focus problem (GTK2 UI)
-          + Put leading zeroes in date fields
-          + More robust handling of character encodings in GTK2 UI
-          + Changed format of modification time displays, from modified
-            at hh:mm:ss on dd MMM, yyyy to modified on yyyy-mm-dd
-            hh:mm:ss
-          + Changed time display to include seconds (so that people on
-            FAT filesystems will not be confused when Unison tries to
-            update a file time to an odd number of seconds and the
-            filesystem truncates it to an even number!)
-          + Use the diff "-u" option by default when showing differences
-            between files (the output is more readable)
-          + In text mode, pipe the diff output to a pager if the
-            environment variable PAGER is set
-          + Bug fixes and cleanups in ssh password prompting. Now works
-            with the GTK2 UI under Linux. (Hopefully the Mac OS X one is
-            not broken!)
-          + Include profile name in the GTK2 window name
-          + Added bindings ',' (same as '<') and '.' (same as '>') in the
-            GTK2 UI
-     * Mac GUI:
-          + actions like < and > scroll to the next item as necessary.
-          + Restart has a menu item and keyboard shortcut (command-R).
-          + Added a command-line tool for Mac OS X. It can be installed
-            from the Unison menu.
-          + New icon.
-          + Handle the "help" command-line argument properly.
-          + Handle profiles given on the command line properly.
-          + When a profile has been selected, the profile dialog is
-            replaced by a "connecting" message while the connection is
-            being made. This gives better feedback.
-          + Size of left and right columns is now large enough so that
-            "PropsChanged" is not cut off.
-     * Minor changes:
-          + Disable multi-threading when both roots are local
-          + Improved error handling code. In particular, make sure all
-            files are closed in case of a transient failure
-          + Under Windows, use $UNISON for home directory as a last
-            resort (it was wrongly moved before $HOME and $USERPROFILE in
-            Unison 2.12.0)
-          + Reopen the logfile if its name changes (profile change)
-          + Double-check that permissions and modification times have
-            been properly set: there are some combination of OS and
-            filesystem on which setting them can fail in a silent way.
-          + Check for bad Windows filenames for pure Windows
-            synchronization also (not just cross architecture
-            synchronization). This way, filenames containing backslashes,
-            which are not correctly handled by unison, are rejected right
-            away.
-          + Attempt to resolve issues with synchronizing modification
-            times of read-only files under Windows
-          + Ignore chmod failures when deleting files
-          + Ignore trailing dots in filenames in case insensitive mode
-          + Proper quoting of paths, files and extensions ignored using
-            the UI
-          + The strings CURRENT1 and CURRENT2 are now correctly
-            substitued when they occur in the diff preference
-          + Improvements to syncing resource forks between Macs via a
-            non-Mac system.
-
-   Changes since 2.10.2:
-     * INCOMPATIBLE CHANGE: Archive format has changed.
-     * Source code availability: The Unison sources are now managed using
-       Subversion. One nice side-effect is that anonymous checkout is now
-       possible, like this:
-        svn co https://cvs.cis.upenn.edu:3690/svnroot/unison/
-       We will also continue to export a "developer tarball" of the
-       current (modulo one day) sources in the web export directory. To
-       receive commit logs for changes to the sources, subscribe to the
-       unison-hackers list
-       (http://www.cis.upenn.edu/ bcpierce/unison/lists.html).
-     * Text user interface:
-          + Substantial reworking of the internal logic of the text UI to
-            make it a bit easier to modify.
-          + The dumbtty flag in the text UI is automatically set to true
-            if the client is running on a Unix system and the EMACS
-            environment variable is set to anything other than the empty
-            string.
-     * Native OS X gui:
-          + Added a synchronize menu item with keyboard shortcut
-          + Added a merge menu item, still needs to be debugged
-          + Fixes to compile for Panther
-          + Miscellaneous improvements and bugfixes
-     * Small changes:
-          + Changed the filename checking code to apply to Windows only,
-            instead of OS X as well.
-          + Finder flags now synchronized
-          + Fallback in copy.ml for filesystem that do not support O_EXCL
-          + Changed buffer size for local file copy (was highly
-            inefficient with synchronous writes)
-          + Ignore chmod failure when deleting a directory
-          + Fixed assertion failure when resolving a conflict content
-            change / permission changes in favor of the content change.
-          + Workaround for transferring large files using rsync.
-          + Use buffered I/O for files (this is the only way to open
-            files in binary mode under Cygwin).
-          + On non-Cygwin Windows systems, the UNISON environment
-            variable is now checked first to determine where to look for
-            Unison's archive and preference files, followed by HOME and
-            USERPROFILE in that order. On Unix and Cygwin systems, HOME
-            is used.
-          + Generalized diff preference so that it can be given either as
-            just the command name to be used for calculating diffs or
-            else a whole command line, containing the strings CURRENT1
-            and CURRENT2, which will be replaced by the names of the
-            files to be diff'ed before the command is called.
-          + Recognize password prompts in some newer versions of ssh.
-
-   Changes since 2.9.20:
-     * INCOMPATIBLE CHANGE: Archive format has changed.
-     * Major functionality changes:
-          + Major tidying and enhancement of 'merge' functionality. The
-            main user-visible change is that the external merge program
-            may either write the merged output to a single new file, as
-            before, or it may modify one or both of its input files, or
-            it may write two new files. In the latter cases, its
-            modifications will be copied back into place on both the
-            local and the remote host, and (if the two files are now
-            equal) the archive will be updated appropriately. More
-            information can be found in the user manual. Thanks to Malo
-            Denielou and Alan Schmitt for these improvements.
-            Warning: the new merging functionality is not completely
-            compatible with old versions! Check the manual for details.
-          + Files larger than 2Gb are now supported.
-          + Added preliminary (and still somewhat experimental) support
-            for the Apple OS X operating system.
-               o Resource forks should be transferred correctly. (See the
-                 manual for details of how this works when synchronizing
-                 HFS with non-HFS volumes.) Synchronization of file type
-                 and creator information is also supported.
-               o On OSX systems, the name of the directory for storing
-                 Unison's archives, preference files, etc., is now
-                 determined as follows:
-                    # if ~/.unison exists, use it
-                    # otherwise, use ~/Library/Application
-                      Support/Unison, creating it if necessary.
-               o A preliminary native-Cocoa user interface is under
-                 construction. This still needs some work, and some users
-                 experience unpredictable crashes, so it is only for
-                 hackers for now. Run make with UISTYLE=mac to build this
-                 interface.
-     * Minor functionality changes:
-          + Added an ignorelocks preference, which forces Unison to
-            override left-over archive locks. (Setting this preference is
-            dangerous! Use it only if you are positive you know what you
-            are doing.)
-          + Added a new preference assumeContentsAreImmutable. If a
-            directory matches one of the patterns set in this preference,
-            then update detection is skipped for files in this directory.
-            (The purpose is to speed update detection for cases like Mail
-            folders, which contain lots and lots of immutable files.)
-            Also a preference assumeContentsAreImmutableNot, which
-            overrides the first, similarly to ignorenot. (Later
-            amendment: these preferences are now called immutable and
-            immutablenot.)
-          + The ignorecase flag has been changed from a boolean to a
-            three-valued preference. The default setting, called default,
-            checks the operating systems running on the client and server
-            and ignores filename case if either of them is OSX or
-            Windows. Setting ignorecase to true or false overrides this
-            behavior. If you have been setting ignorecase on the command
-            line using -ignorecase=true or -ignorecase=false, you will
-            need to change to -ignorecase true or -ignorecase false.
-          + a new preference, 'repeat', for the text user interface
-            (only). If 'repeat' is set to a number, then, after it
-            finishes synchronizing, Unison will wait for that many
-            seconds and then start over, continuing this way until it is
-            killed from outside. Setting repeat to true will
-            automatically set the batch preference to true.
-          + Excel files are now handled specially, so that the fastcheck
-            optimization is skipped even if the fastcheck flag is set.
-            (Excel does some naughty things with modtimes, making this
-            optimization unreliable and leading to failures during change
-            propagation.)
-          + The ignorecase flag has been changed from a boolean to a
-            three-valued preference. The default setting, called
-            'default', checks the operating systems running on the client
-            and server and ignores filename case if either of them is OSX
-            or Windows. Setting ignorecase to 'true' or 'false' overrides
-            this behavior.
-          + Added a new preference, 'repeat', for the text user interface
-            (only, at the moment). If 'repeat' is set to a number, then,
-            after it finishes synchronizing, Unison will wait for that
-            many seconds and then start over, continuing this way until
-            it is killed from outside. Setting repeat to true will
-            automatically set the batch preference to true.
-          + The 'rshargs' preference has been split into 'rshargs' and
-            'sshargs' (mainly to make the documentation clearer). In
-            fact, 'rshargs' is no longer mentioned in the documentation
-            at all, since pretty much everybody uses ssh now anyway.
-     * Documentation
-          + The web pages have been completely redesigned and
-            reorganized. (Thanks to Alan Schmitt for help with this.)
-     * User interface improvements
-          + Added a GTK2 user interface, capable (among other things) of
-            displaying filenames in any locale encoding. Kudos to Stephen
-            Tse for contributing this code!
-          + The text UI now prints a list of failed and skipped transfers
-            at the end of synchronization.
-          + Restarting update detection from the graphical UI will reload
-            the current profile (which in particular will reset the -path
-            preference, in case it has been narrowed by using the
-            "Recheck unsynchronized items" command).
-          + Several small improvements to the text user interface,
-            including a progress display.
-     * Bug fixes (too numerous to count, actually, but here are some):
-          + The maxthreads preference works now.
-          + Fixed bug where warning message about uname returning an
-            unrecognized result was preventing connection to server. (The
-            warning is no longer printed, and all systems where 'uname'
-            returns anything other than 'Darwin' are assumed not to be
-            running OS X.)
-          + Fixed a problem on OS X that caused some valid file names
-            (e.g., those including colons) to be considered invalid.
-          + Patched Path.followLink to follow links under cygwin in
-            addition to Unix (suggested by Matt Swift).
-          + Small change to the storeRootsName function, suggested by
-            bliviero at ichips.intel.com, to fix a problem in unison with
-            the `rootalias' option, which allows you to tell unison that
-            two roots contain the same files. Rootalias was being applied
-            after the hosts were sorted, so it wouldn't work properly in
-            all cases.
-          + Incorporated a fix by Dmitry Bely for setting utimes of
-            read-only files on Win32 systems.
-     * Installation / portability:
-          + Unison now compiles with OCaml version 3.07 and later out of
-            the box.
-          + Makefile.OCaml fixed to compile out of the box under OpenBSD.
-          + a few additional ports (e.g. OpenBSD, Zaurus/IPAQ) are now
-            mentioned in the documentation
-          + Unison can now be installed easily on OSX systems using the
-            Fink package manager
-
-   Changes since 2.9.1:
-     * Added a preference maxthreads that can be used to limit the number
-       of simultaneous file transfers.
-     * Added a backupdir preference, which controls where backup files
-       are stored.
-     * Basic support added for OSX. In particular, Unison now recognizes
-       when one of the hosts being synchronized is running OSX and
-       switches to a case-insensitive treatment of filenames (i.e., 'foo'
-       and 'FOO' are considered to be the same file). (OSX is not yet
-       fully working, however: in particular, files with resource forks
-       will not be synchronized correctly.)
-     * The same hash used to form the archive name is now also added to
-       the names of the temp files created during file transfer. The
-       reason for this is that, during update detection, we are going to
-       silently delete any old temp files that we find along the way, and
-       we want to prevent ourselves from deleting temp files belonging to
-       other instances of Unison that may be running in parallel, e.g.
-       synchronizing with a different host. Thanks to Ruslan Ermilov for
-       this suggestion.
-     * Several small user interface improvements
-     * Documentation
-          + FAQ and bug reporting instructions have been split out as
-            separate HTML pages, accessible directly from the unison web
-            page.
-          + Additions to FAQ, in particular suggestions about performance
-            tuning.
-     * Makefile
-          + Makefile.OCaml now sets UISTYLE=text or UISTYLE=gtk
-            automatically, depending on whether it finds lablgtk
-            installed
-          + Unison should now compile "out of the box" under OSX
-
-   Changes since 2.8.1:
-     * Changing profile works again under Windows
-     * File movement optimization: Unison now tries to use local copy
-       instead of transfer for moved or copied files. It is controled by
-       a boolean option "xferbycopying".
-     * Network statistics window (transfer rate, amount of data
-       transferred). [NB: not available in Windows-Cygwin version.]
-     * symlinks work under the cygwin version (which is dynamically
-       linked).
-     * Fixed potential deadlock when synchronizing between Windows and
-       Unix
-     * Small improvements:
-          + If neither the
-            tt USERPROFILE nor the
-            tt HOME environment variables are set, then Unison will put
-            its temporary commit log (called
-            tt DANGER.README) into the directory named by the
-            tt UNISON environment variable, if any; otherwise it will use
-            tt C:.
-          + alternative set of values for fastcheck: yes = true; no =
-            false; default = auto.
-          + -silent implies -contactquietly
-     * Source code:
-          + Code reorganization and tidying. (Started breaking up some of
-            the basic utility modules so that the non-unison-specific
-            stuff can be made available for other projects.)
-          + several Makefile and docs changes (for release);
-          + further comments in "update.ml";
-          + connection information is not stored in global variables
-            anymore.
-
-   Changes since 2.7.78:
-     * Small bugfix to textual user interface under Unix (to avoid
-       leaving the terminal in a bad state where it would not echo inputs
-       after Unison exited).
-
-   Changes since 2.7.39:
-     * Improvements to the main web page (stable and beta version docs
-       are now both accessible).
-     * User manual revised.
-     * Added some new preferences:
-          + "sshcmd" and "rshcmd" for specifying paths to ssh and rsh
-            programs.
-          + "contactquietly" for suppressing the "contacting server"
-            message during Unison startup (under the graphical UI).
-     * Bug fixes:
-          + Fixed small bug in UI that neglected to change the displayed
-            column headers if loading a new profile caused the roots to
-            change.
-          + Fixed a bug that would put the text UI into an infinite loop
-            if it encountered a conflict when run in batch mode.
-          + Added some code to try to fix the display of non-Ascii
-            characters in filenames on Windows systems in the GTK UI.
-            (This code is currently untested--if you're one of the people
-            that had reported problems with display of non-ascii
-            filenames, we'd appreciate knowing if this actually fixes
-            things.)
-          + `-prefer/-force newer' works properly now. (The bug was
-            reported by Sebastian Urbaniak and Sean Fulton.)
-     * User interface and Unison behavior:
-          + Renamed `Proceed' to `Go' in the graphical UI.
-          + Added exit status for the textual user interface.
-          + Paths that are not synchronized because of conflicts or
-            errors during update detection are now noted in the log file.
-          + [END] messages in log now use a briefer format
-          + Changed the text UI startup sequence so that
-            tt ./unison -ui text will use the default profile instead of
-            failing.
-          + Made some improvements to the error messages.
-          + Added some debugging messages to remote.ml.
-
-   Changes since 2.7.7:
-     * Incorporated, once again, a multi-threaded transport sub-system.
-       It transfers several files at the same time, thereby making much
-       more effective use of available network bandwidth. Unlike the
-       earlier attempt, this time we do not rely on the native thread
-       library of OCaml. Instead, we implement a light-weight,
-       non-preemptive multi-thread library in OCaml directly. This
-       version appears stable.
-       Some adjustments to unison are made to accommodate the
-       multi-threaded version. These include, in particular, changes to
-       the user interface and logging, for example:
-          + Two log entries for each transferring task, one for the
-            beginning, one for the end.
-          + Suppressed warning messages against removing temp files left
-            by a previous unison run, because warning does not work
-            nicely under multi-threading. The temp file names are made
-            less likely to coincide with the name of a file created by
-            the user. They take the form
-            .#<filename>.<serial>.unison.tmp. [N.b. This was later
-            changed to .unison.<filename>.<serial>.unison.tmp.]
-     * Added a new command to the GTK user interface: pressing 'f' causes
-       Unison to start a new update detection phase, using as paths just
-       those paths that have been detected as changed and not yet marked
-       as successfully completed. Use this command to quickly restart
-       Unison on just the set of paths still needing attention after a
-       previous run.
-     * Made the ignorecase preference user-visible, and changed the
-       initialization code so that it can be manually set to true, even
-       if neither host is running Windows. (This may be useful, e.g.,
-       when using Unison running on a Unix system with a FAT volume
-       mounted.)
-     * Small improvements and bug fixes:
-          + Errors in preference files now generate fatal errors rather
-            than warnings at startup time. (I.e., you can't go on from
-            them.) Also, we fixed a bug that was preventing these
-            warnings from appearing in the text UI, so some users who
-            have been running (unsuspectingly) with garbage in their
-            prefs files may now get error reports.
-          + Error reporting for preference files now provides file name
-            and line number.
-          + More intelligible message in the case of identical change to
-            the same files: "Nothing to do: replicas have been changed
-            only in identical ways since last sync."
-          + Files with prefix '.#' excluded when scanning for preference
-            files.
-          + Rsync instructions are send directly instead of first
-            marshaled.
-          + Won't try forever to get the fingerprint of a continuously
-            changing file: unison will give up after certain number of
-            retries.
-          + Other bug fixes, including the one reported by Peter Selinger
-            (force=older preference not working).
-     * Compilation:
-          + Upgraded to the new OCaml 3.04 compiler, with the LablGtk
-            1.2.3 library (patched version used for compiling under
-            Windows).
-          + Added the option to compile unison on the Windows platform
-            with Cygwin GNU C compiler. This option only supports
-            building dynamically linked unison executables.
-
-   Changes since 2.7.4:
-     * Fixed a silly (but debilitating) bug in the client startup
-       sequence.
-
-   Changes since 2.7.1:
-     * Added addprefsto preference, which (when set) controls which
-       preference file new preferences (e.g. new ignore patterns) are
-       added to.
-     * Bug fix: read the initial connection header one byte at a time, so
-       that we don't block if the header is shorter than expected. (This
-       bug did not affect normal operation -- it just made it hard to
-       tell when you were trying to use Unison incorrectly with an old
-       version of the server, since it would hang instead of giving an
-       error message.)
-
-   Changes since 2.6.59:
-     * Changed fastcheck from a boolean to a string preference. Its legal
-       values are yes (for a fast check), no (for a safe check), or
-       default (for a fast check--which also happens to be safe--when
-       running on Unix and a safe check when on Windows). The default is
-       default.
-     * Several preferences have been renamed for consistency. All
-       preference names are now spelled out in lowercase. For backward
-       compatibility, the old names still work, but they are not
-       mentioned in the manual any more.
-     * The temp files created by the 'diff' and 'merge' commands are now
-       named by prepending a new prefix to the file name, rather than
-       appending a suffix. This should avoid confusing diff/merge
-       programs that depend on the suffix to guess the type of the file
-       contents.
-     * We now set the keepalive option on the server socket, to make sure
-       that the server times out if the communication link is
-       unexpectedly broken.
-     * Bug fixes:
-          + When updating small files, Unison now closes the destination
-            file.
-          + File permissions are properly updated when the file is behind
-            a followed link.
-          + Several other small fixes.
-
-   Changes since 2.6.38:
-     * Major Windows performance improvement!
-       We've added a preference fastcheck that makes Unison look only at
-       a file's creation time and last-modified time to check whether it
-       has changed. This should result in a huge speedup when checking
-       for updates in large replicas.
-       When this switch is set, Unison will use file creation times as
-       'pseudo inode numbers' when scanning Windows replicas for updates,
-       instead of reading the full contents of every file. This may cause
-       Unison to miss propagating an update if the create time,
-       modification time, and length of the file are all unchanged by the
-       update (this is not easy to achieve, but it can be done). However,
-       Unison will never overwrite such an update with a change from the
-       other replica, since it always does a safe check for updates just
-       before propagating a change. Thus, it is reasonable to use this
-       switch most of the time and occasionally run Unison once with
-       fastcheck set to false, if you are worried that Unison may have
-       overlooked an update.
-       Warning: This change is has not yet been thoroughly field-tested.
-       If you set the fastcheck preference, pay careful attention to what
-       Unison is doing.
-     * New functionality: centralized backups and merging
-          + This version incorporates two pieces of major new
-            functionality, implemented by Sylvain Roy during a summer
-            internship at Penn: a centralized backup facility that keeps
-            a full backup of (selected files in) each replica, and a
-            merging feature that allows Unison to invoke an external
-            file-merging tool to resolve conflicting changes to
-            individual files.
-          + Centralized backups:
-               o Unison now maintains full backups of the
-                 last-synchronized versions of (some of) the files in
-                 each replica; these function both as backups in the
-                 usual sense and as the "common version" when invoking
-                 external merge programs.
-               o The backed up files are stored in a directory
-                 /.unison/backup on each host. (The name of this
-                 directory can be changed by setting the environment
-                 variable UNISONBACKUPDIR.)
-               o The predicate backup controls which files are actually
-                 backed up: giving the preference 'backup = Path *'
-                 causes backing up of all files.
-               o Files are added to the backup directory whenever unison
-                 updates its archive. This means that
-                    # When unison reconstructs its archive from scratch
-                      (e.g., because of an upgrade, or because the
-                      archive files have been manually deleted), all
-                      files will be backed up.
-                    # Otherwise, each file will be backed up the first
-                      time unison propagates an update for it.
-               o The preference backupversions controls how many previous
-                 versions of each file are kept. The default is 2 (i.e.,
-                 the last synchronized version plus one backup).
-               o For backward compatibility, the backups preference is
-                 also still supported, but backup is now preferred.
-               o It is OK to manually delete files from the backup
-                 directory (or to throw away the directory itself).
-                 Before unison uses any of these files for anything
-                 important, it checks that its fingerprint matches the
-                 one that it expects.
-          + Merging:
-               o Both user interfaces offer a new 'merge' command,
-                 invoked by pressing 'm' (with a changed file selected).
-               o The actual merging is performed by an external program.
-                 The preferences merge and merge2 control how this
-                 program is invoked. If a backup exists for this file
-                 (see the backup preference), then the merge preference
-                 is used for this purpose; otherwise merge2 is used. In
-                 both cases, the value of the preference should be a
-                 string representing the command that should be passed to
-                 a shell to invoke the merge program. Within this string,
-                 the special substrings CURRENT1, CURRENT2, NEW, and OLD
-                 may appear at any point. Unison will substitute these as
-                 follows before invoking the command:
-                    # CURRENT1 is replaced by the name of the local copy
-                      of the file;
-                    # CURRENT2 is replaced by the name of a temporary
-                      file, into which the contents of the remote copy of
-                      the file have been transferred by Unison prior to
-                      performing the merge;
-                    # NEW is replaced by the name of a temporary file
-                      that Unison expects to be written by the merge
-                      program when it finishes, giving the desired new
-                      contents of the file; and
-                    # OLD is replaced by the name of the backed up copy
-                      of the original version of the file (i.e., its
-                      state at the end of the last successful run of
-                      Unison), if one exists (applies only to merge, not
-                      merge2).
-                 For example, on Unix systems setting the merge
-                 preference to
-   merge = diff3 -m CURRENT1 OLD CURRENT2 > NEW
-                 will tell Unison to use the external diff3 program for
-                 merging.
-                 A large number of external merging programs are
-                 available. For example, emacs users may find the
-                 following convenient:
-    merge2 = emacs -q --eval '(ediff-merge-files "CURRENT1" "CURRENT2"
-               nil "NEW")'
-    merge = emacs -q --eval '(ediff-merge-files-with-ancestor
-               "CURRENT1" "CURRENT2" "OLD" nil "NEW")'
-                 (These commands are displayed here on two lines to avoid
-                 running off the edge of the page. In your preference
-                 file, each should be written on a single line.)
-               o If the external program exits without leaving any file
-                 at the path NEW, Unison considers the merge to have
-                 failed. If the merge program writes a file called NEW
-                 but exits with a non-zero status code, then Unison
-                 considers the merge to have succeeded but to have
-                 generated conflicts. In this case, it attempts to invoke
-                 an external editor so that the user can resolve the
-                 conflicts. The value of the editor preference controls
-                 what editor is invoked by Unison. The default is emacs.
-               o Please send us suggestions for other useful values of
-                 the merge2 and merge preferences - we'd like to give
-                 several examples in the manual.
-     * Smaller changes:
-          + When one preference file includes another, unison no longer
-            adds the suffix '.prf' to the included file by default. If a
-            file with precisely the given name exists in the .unison
-            directory, it will be used; otherwise Unison will add .prf,
-            as it did before. (This change means that included preference
-            files can be named blah.include instead of blah.prf, so that
-            unison will not offer them in its 'choose a preference file'
-            dialog.)
-          + For Linux systems, we now offer both a statically linked and
-            a dynamically linked executable. The static one is larger,
-            but will probably run on more systems, since it doesn't
-            depend on the same versions of dynamically linked library
-            modules being available.
-          + Fixed the force and prefer preferences, which were getting
-            the propagation direction exactly backwards.
-          + Fixed a bug in the startup code that would cause unison to
-            crash when the default profile (~/.unison/default.prf) does
-            not exist.
-          + Fixed a bug where, on the run when a profile is first
-            created, Unison would confusingly display the roots in
-            reverse order in the user interface.
-     * For developers:
-          + We've added a module dependency diagram to the source
-            distribution, in src/DEPENDENCIES.ps, to help new prospective
-            developers with navigating the code.
-
-   Changes since 2.6.11:
-     * INCOMPATIBLE CHANGE: Archive format has changed.
-     * INCOMPATIBLE CHANGE: The startup sequence has been completely
-       rewritten and greatly simplified. The main user-visible change is
-       that the defaultpath preference has been removed. Its effect can
-       be approximated by using multiple profiles, with include
-       directives to incorporate common settings. All uses of defaultpath
-       in existing profiles should be changed to path.
-       Another change in startup behavior that will affect some users is
-       that it is no longer possible to specify roots both in the profile
-       and on the command line.
-       You can achieve a similar effect, though, by breaking your profile
-       into two:
-
-  default.prf =
-      root = blah
-      root = foo
-      include common
-
-  common.prf =
-      <everything else>
-       Now do
-  unison common root1 root2
-       when you want to specify roots explicitly.
-     * The -prefer and -force options have been extended to allow users
-       to specify that files with more recent modtimes should be
-       propagated, writing either -prefer newer or -force newer. (For
-       symmetry, Unison will also accept -prefer older or -force older.)
-       The -force older/newer options can only be used when -times is
-       also set.
-       The graphical user interface provides access to these facilities
-       on a one-off basis via the Actions menu.
-     * Names of roots can now be "aliased" to allow replicas to be
-       relocated without changing the name of the archive file where
-       Unison stores information between runs. (This feature is for
-       experts only. See the "Archive Files" section of the manual for
-       more information.)
-     * Graphical user-interface:
-          + A new command is provided in the Synchronization menu for
-            switching to a new profile without restarting Unison from
-            scratch.
-          + The GUI also supports one-key shortcuts for commonly used
-            profiles. If a profile contains a preference of the form 'key
-            = n', where n is a single digit, then pressing this key will
-            cause Unison to immediately switch to this profile and begin
-            synchronization again from scratch. (Any actions that may
-            have been selected for a set of changes currently being
-            displayed will be discarded.)
-          + Each profile may include a preference 'label = <string>'
-            giving a descriptive string that described the options
-            selected in this profile. The string is listed along with the
-            profile name in the profile selection dialog, and displayed
-            in the top-right corner of the main Unison window.
-     * Minor:
-          + Fixed a bug that would sometimes cause the 'diff' display to
-            order the files backwards relative to the main user
-            interface. (Thanks to Pascal Brisset for this fix.)
-          + On Unix systems, the graphical version of Unison will check
-            the DISPLAY variable and, if it is not set, automatically
-            fall back to the textual user interface.
-          + Synchronization paths (path preferences) are now matched
-            against the ignore preferences. So if a path is both
-            specified in a path preference and ignored, it will be
-            skipped.
-          + Numerous other bugfixes and small improvements.
-
-   Changes since 2.6.1:
-     * The synchronization of modification times has been disabled for
-       directories.
-     * Preference files may now include lines of the form include <name>,
-       which will cause name.prf to be read at that point.
-     * The synchronization of permission between Windows and Unix now
-       works properly.
-     * A binding CYGWIN=binmode in now added to the environment so that
-       the Cygwin port of OpenSSH works properly in a non-Cygwin context.
-     * The servercmd and addversionno preferences can now be used
-       together: -addversionno appends an appropriate -NNN to the server
-       command, which is found by using the value of the -servercmd
-       preference if there is one, or else just unison.
-     * Both '-pref=val' and '-pref val' are now allowed for boolean
-       values. (The former can be used to set a preference to false.)
-     * Lot of small bugs fixed.
-
-   Changes since 2.5.31:
-     * The log preference is now set to true by default, since the log
-       file seems useful for most users.
-     * Several miscellaneous bugfixes (most involving symlinks).
-
-   Changes since 2.5.25:
-     * INCOMPATIBLE CHANGE: Archive format has changed (again).
-     * Several significant bugs introduced in 2.5.25 have been fixed.
-
-   Changes since 2.5.1:
-     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
-       synchronize your replicas before upgrading, to avoid spurious
-       conflicts. The first sync after upgrading will be slow.
-     * New functionality:
-          + Unison now synchronizes file modtimes, user-ids, and
-            group-ids.
-            These new features are controlled by a set of new
-            preferences, all of which are currently false by default.
-               o When the times preference is set to true, file
-                 modification times are propaged. (Because the
-                 representations of time may not have the same
-                 granularity on both replicas, Unison may not always be
-                 able to make the modtimes precisely equal, but it will
-                 get them as close as the operating systems involved
-                 allow.)
-               o When the owner preference is set to true, file ownership
-                 information is synchronized.
-               o When the group preference is set to true, group
-                 information is synchronized.
-               o When the numericIds preference is set to true, owner and
-                 group information is synchronized numerically. By
-                 default, owner and group numbers are converted to names
-                 on each replica and these names are synchronized. (The
-                 special user id 0 and the special group 0 are never
-                 mapped via user/group names even if this preference is
-                 not set.)
-          + Added an integer-valued preference perms that can be used to
-            control the propagation of permission bits. The value of this
-            preference is a mask indicating which permission bits should
-            be synchronized. It is set by default to 0o1777: all bits but
-            the set-uid and set-gid bits are synchronised (synchronizing
-            theses latter bits can be a security hazard). If you want to
-            synchronize all bits, you can set the value of this
-            preference to -1.
-          + Added a log preference (default false), which makes Unison
-            keep a complete record of the changes it makes to the
-            replicas. By default, this record is written to a file called
-            unison.log in the user's home directory (the value of the
-            HOME environment variable). If you want it someplace else,
-            set the logfile preference to the full pathname you want
-            Unison to use.
-          + Added an ignorenot preference that maintains a set of
-            patterns for paths that should definitely not be ignored,
-            whether or not they match an ignore pattern. (That is, a path
-            will now be ignored iff it matches an ignore pattern and does
-            not match any ignorenot patterns.)
-     * User-interface improvements:
-          + Roots are now displayed in the user interface in the same
-            order as they were given on the command line or in the
-            preferences file.
-          + When the batch preference is set, the graphical user
-            interface no longer waits for user confirmation when it
-            displays a warning message: it simply pops up an advisory
-            window with a Dismiss button at the bottom and keeps on
-            going.
-          + Added a new preference for controlling how many status
-            messages are printed during update detection: statusdepth
-            controls the maximum depth for paths on the local machine
-            (longer paths are not displayed, nor are non-directory
-            paths). The value should be an integer; default is 1.
-          + Removed the trace and silent preferences. They did not seem
-            very useful, and there were too many preferences for
-            controlling output in various ways.
-          + The text UI now displays just the default command (the one
-            that will be used if the user just types <return>) instead of
-            all available commands. Typing ? will print the full list of
-            possibilities.
-          + The function that finds the canonical hostname of the local
-            host (which is used, for example, in calculating the name of
-            the archive file used to remember which files have been
-            synchronized) normally uses the gethostname operating system
-            call. However, if the environment variable
-            UNISONLOCALHOSTNAME is set, its value will now be used
-            instead. This makes it easier to use Unison in situations
-            where a machine's name changes frequently (e.g., because it
-            is a laptop and gets moved around a lot).
-          + File owner and group are now displayed in the "detail window"
-            at the bottom of the screen, when unison is configured to
-            synchronize them.
-     * For hackers:
-          + Updated to Jacques Garrigue's new version of lablgtk, which
-            means we can throw away our local patched version.
-            If you're compiling the GTK version of unison from sources,
-            you'll need to update your copy of lablgtk to the developers
-            release. (Warning: installing lablgtk under Windows is
-            currently a bit challenging.)
-          + The TODO.txt file (in the source distribution) has been
-            cleaned up and reorganized. The list of pending tasks should
-            be much easier to make sense of, for people that may want to
-            contribute their programming energies. There is also a
-            separate file BUGS.txt for open bugs.
-          + The Tk user interface has been removed (it was not being
-            maintained and no longer compiles).
-          + The debug preference now prints quite a bit of additional
-            information that should be useful for identifying sources of
-            problems.
-          + The version number of the remote server is now checked right
-            away during the connection setup handshake, rather than
-            later. (Somebody sent a bug report of a server crash that
-            turned out to come from using inconsistent versions: better
-            to check this earlier and in a way that can't crash either
-            client or server.)
-          + Unison now runs correctly on 64-bit architectures (e.g. Alpha
-            linux). We will not be distributing binaries for these
-            architectures ourselves (at least for a while) but if someone
-            would like to make them available, we'll be glad to provide a
-            link to them.
-     * Bug fixes:
-          + Pattern matching (e.g. for ignore) is now case-insensitive
-            when Unison is in case-insensitive mode (i.e., when one of
-            the replicas is on a windows machine).
-          + Some people had trouble with mysterious failures during
-            propagation of updates, where files would be falsely reported
-            as having changed during synchronization. This should be
-            fixed.
-          + Numerous smaller fixes.
-
-   Changes since 2.4.1:
-     * Added a number of 'sorting modes' for the user interface. By
-       default, conflicting changes are displayed at the top, and the
-       rest of the entries are sorted in alphabetical order. This
-       behavior can be changed in the following ways:
-          + Setting the sortnewfirst preference to true causes newly
-            created files to be displayed before changed files.
-          + Setting sortbysize causes files to be displayed in increasing
-            order of size.
-          + Giving the preference sortfirst=<pattern> (where <pattern> is
-            a path descriptor in the same format as 'ignore' and 'follow'
-            patterns, causes paths matching this pattern to be displayed
-            first.
-          + Similarly, giving the preference sortlast=<pattern> causes
-            paths matching this pattern to be displayed last.
-       The sorting preferences are described in more detail in the user
-       manual. The sortnewfirst and sortbysize flags can also be accessed
-       from the 'Sort' menu in the grpahical user interface.
-     * Added two new preferences that can be used to change unison's
-       fundamental behavior to make it more like a mirroring tool instead
-       of a synchronizer.
-          + Giving the preference prefer with argument <root> (by adding
-            -prefer <root> to the command line or prefer=<root>) to your
-            profile) means that, if there is a conflict, the contents of
-            <root> should be propagated to the other replica (with no
-            questions asked). Non-conflicting changes are treated as
-            usual.
-          + Giving the preference force with argument <root> will make
-            unison resolve all differences in favor of the given root,
-            even if it was the other replica that was changed.
-       These options should be used with care! (More information is
-       available in the manual.)
-     * Small changes:
-          + Changed default answer to 'Yes' in all two-button dialogs in
-            the graphical interface (this seems more intuitive).
-          + The rsync preference has been removed (it was used to
-            activate rsync compression for file transfers, but rsync
-            compression is now enabled by default).
-          + In the text user interface, the arrows indicating which
-            direction changes are being propagated are printed
-            differently when the user has overridded Unison's default
-            recommendation (====> instead of ---->). This matches the
-            behavior of the graphical interface, which displays such
-            arrows in a different color.
-          + Carriage returns (Control-M's) are ignored at the ends of
-            lines in profiles, for Windows compatibility.
-          + All preferences are now fully documented in the user manual.
-
-   Changes since 2.3.12:
-     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
-       synchronize your replicas before upgrading, to avoid spurious
-       conflicts. The first sync after upgrading will be slow.
-     * New/improved functionality:
-          + A new preference -sortbysize controls the order in which
-            changes are displayed to the user: when it is set to true,
-            the smallest changed files are displayed first. (The default
-            setting is false.)
-          + A new preference -sortnewfirst causes newly created files to
-            be listed before other updates in the user interface.
-          + We now allow the ssh protocol to specify a port.
-          + Incompatible change: The unison: protocol is deprecated, and
-            we added file: and socket:. You may have to modify your
-            profiles in the .unison directory. If a replica is specified
-            without an explicit protocol, we now assume it refers to a
-            file. (Previously "//saul/foo" meant to use SSH to connect to
-            saul, then access the foo directory. Now it means to access
-            saul via a remote file mechanism such as samba; the old
-            effect is now achieved by writing ssh://saul/foo.)
-          + Changed the startup sequence for the case where roots are
-            given but no profile is given on the command line. The new
-            behavior is to use the default profile (creating it if it
-            does not exist), and temporarily override its roots. The
-            manual claimed that this case would work by reading no
-            profile at all, but AFAIK this was never true.
-          + In all user interfaces, files with conflicts are always
-            listed first
-          + A new preference 'sshversion' can be used to control which
-            version of ssh should be used to connect to the server. Legal
-            values are 1 and 2. (Default is empty, which will make unison
-            use whatever version of ssh is installed as the default 'ssh'
-            command.)
-          + The situation when the permissions of a file was updated the
-            same on both side is now handled correctly (we used to report
-            a spurious conflict)
-     * Improvements for the Windows version:
-          + The fact that filenames are treated case-insensitively under
-            Windows should now be handled correctly. The exact behavior
-            is described in the cross-platform section of the manual.
-          + It should be possible to synchronize with Windows shares,
-            e.g., //host/drive/path.
-          + Workarounds to the bug in syncing root directories in
-            Windows. The most difficult thing to fix is an ocaml bug:
-            Unix.opendir fails on c: in some versions of Windows.
-     * Improvements to the GTK user interface (the Tk interface is no
-       longer being maintained):
-          + The UI now displays actions differently (in blue) when they
-            have been explicitly changed by the user from Unison's
-            default recommendation.
-          + More colorful appearance.
-          + The initial profile selection window works better.
-          + If any transfers failed, a message to this effect is
-            displayed along with 'Synchronization complete' at the end of
-            the transfer phase (in case they may have scrolled off the
-            top).
-          + Added a global progress meter, displaying the percentage of
-            total bytes that have been transferred so far.
-     * Improvements to the text user interface:
-          + The file details will be displayed automatically when a
-            conflict is been detected.
-          + when a warning is generated (e.g. for a temporary file left
-            over from a previous run of unison) Unison will no longer
-            wait for a response if it is running in -batch mode.
-          + The UI now displays a short list of possible inputs each time
-            it waits for user interaction.
-          + The UI now quits immediately (rather than looping back and
-            starting the interaction again) if the user presses 'q' when
-            asked whether to propagate changes.
-          + Pressing 'g' in the text user interface will proceed
-            immediately with propagating updates, without asking any more
-            questions.
-     * Documentation and installation changes:
-          + The manual now includes a FAQ, plus sections on common
-            problems and on tricks contributed by users.
-          + Both the download page and the download directory explicitly
-            say what are the current stable and beta-test version
-            numbers.
-          + The OCaml sources for the up-to-the-minute developers'
-            version (not guaranteed to be stable, or even to compile, at
-            any given time!) are now available from the download page.
-          + Added a subsection to the manual describing cross-platform
-            issues (case conflicts, illegal filenames)
-     * Many small bug fixes and random improvements.
-
-   Changes since 2.3.1:
-     * Several bug fixes. The most important is a bug in the rsync module
-       that would occasionally cause change propagation to fail with a
-       'rename' error.
-
-   Changes since 2.2:
-     * The multi-threaded transport system is now disabled by default.
-       (It is not stable enough yet.)
-     * Various bug fixes.
-     * A new experimental feature:
-       The final component of a -path argument may now be the wildcard
-       specifier *. When Unison sees such a path, it expands this path on
-       the client into into the corresponding list of paths by listing
-       the contents of that directory.
-       Note that if you use wildcard paths from the command line, you
-       will probably need to use quotes or a backslash to prevent the *
-       from being interpreted by your shell.
-       If both roots are local, the contents of the first one will be
-       used for expanding wildcard paths. (Nb: this is the first one
-       after the canonization step - i.e., the one that is listed first
-       in the user interface - not the one listed first on the command
-       line or in the preferences file.)
-
-   Changes since 2.1:
-     * The transport subsystem now includes an implementation by Sylvain
-       Gommier and Norman Ramsey of Tridgell and Mackerras's rsync
-       protocol. This protocol achieves much faster transfers when only a
-       small part of a large file has been changed by sending just diffs.
-       This feature is mainly helpful for transfers over slow links--on
-       fast local area networks it can actually degrade performance--so
-       we have left it off by default. Start unison with the -rsync
-       option (or put rsync=true in your preferences file) to turn it on.
-     * "Progress bars" are now diplayed during remote file transfers,
-       showing what percentage of each file has been transferred so far.
-     * The version numbering scheme has changed. New releases will now be
-       have numbers like 2.2.30, where the second component is
-       incremented on every significant public release and the third
-       component is the "patch level."
-     * Miscellaneous improvements to the GTK-based user interface.
-     * The manual is now available in PDF format.
-     * We are experimenting with using a multi-threaded transport
-       subsystem to transfer several files at the same time, making much
-       more effective use of available network bandwidth. This feature is
-       not completely stable yet, so by default it is disabled in the
-       release version of Unison.
-       If you want to play with the multi-threaded version, you'll need
-       to recompile Unison from sources (as described in the
-       documentation), setting the THREADS flag in Makefile.OCaml to
-       true. Make sure that your OCaml compiler has been installed with
-       the -with-pthreads configuration option. (You can verify this by
-       checking whether the file threads/threads.cma in the OCaml
-       standard library directory contains the string -lpthread near the
-       end.)
-
-   Changes since 1.292:
-     * Reduced memory footprint (this is especially important during the
-       first run of unison, where it has to gather information about all
-       the files in both repositories).
-     * Fixed a bug that would cause the socket server under NT to fail
-       after the client exits.
-     * Added a SHIFT modifier to the Ignore menu shortcut keys in GTK
-       interface (to avoid hitting them accidentally).
-
-   Changes since 1.231:
-     * Tunneling over ssh is now supported in the Windows version. See
-       the installation section of the manual for detailed instructions.
-     * The transport subsystem now includes an implementation of the
-       rsync protocol, built by Sylvain Gommier and Norman Ramsey. This
-       protocol achieves much faster transfers when only a small part of
-       a large file has been changed by sending just diffs. The rsync
-       feature is off by default in the current version. Use the -rsync
-       switch to turn it on. (Nb. We still have a lot of tuning to do:
-       you may not notice much speedup yet.)
-     * We're experimenting with a multi-threaded transport subsystem,
-       written by Jerome Vouillon. The downloadable binaries are still
-       single-threaded: if you want to try the multi-threaded version,
-       you'll need to recompile from sources. (Say make THREADS=true.)
-       Native thread support from the compiler is required. Use the
-       option -threads N to select the maximal number of concurrent
-       threads (default is 5). Multi-threaded and single-threaded
-       clients/servers can interoperate.
-     * A new GTK-based user interface is now available, thanks to Jacques
-       Garrigue. The Tk user interface still works, but we'll be shifting
-       development effort to the GTK interface from now on.
-     * OCaml 3.00 is now required for compiling Unison from sources. The
-       modules uitk and myfileselect have been changed to use labltk
-       instead of camltk. To compile the Tk interface in Windows, you
-       must have ocaml-3.00 and tk8.3. When installing tk8.3, put it in
-       c:\Tcl rather than the suggested c:\Program Files\Tcl, and be sure
-       to install the headers and libraries (which are not installed by
-       default).
-     * Added a new -addversionno switch, which causes unison to use
-       unison-<currentversionnumber> instead of just unison as the remote
-       server command. This allows multiple versions of unison to coexist
-       conveniently on the same server: whichever version is run on the
-       client, the same version will be selected on the server.
-
-   Changes since 1.219:
-     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
-       synchronize your replicas before upgrading, to avoid spurious
-       conflicts. The first sync after upgrading will be slow.
-     * This version fixes several annoying bugs, including:
-          + Some cases where propagation of file permissions was not
-            working.
-          + umask is now ignored when creating directories
-          + directories are create writable, so that a read-only
-            directory and its contents can be propagated.
-          + Handling of warnings generated by the server.
-          + Synchronizing a path whose parent is not a directory on both
-            sides is now flagged as erroneous.
-          + Fixed some bugs related to symnbolic links and nonexistant
-            roots.
-               o When a change (deletion or new contents) is propagated
-                 onto a 'follow'ed symlink, the file pointed to by the
-                 link is now changed. (We used to change the link itself,
-                 which doesn't fit our assertion that 'follow' means the
-                 link is completely invisible)
-               o When one root did not exist, propagating the other root
-                 on top of it used to fail, becuase unison could not
-                 calculate the working directory into which to write
-                 changes. This should be fixed.
-     * A human-readable timestamp has been added to Unison's archive
-       files.
-     * The semantics of Path and Name regular expressions now correspond
-       better.
-     * Some minor improvements to the text UI (e.g. a command for going
-       back to previous items)
-     * The organization of the export directory has changed -- should be
-       easier to find / download things now.
-
-   Changes since 1.200:
-     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
-       synchronize your replicas before upgrading, to avoid spurious
-       conflicts. The first sync after upgrading will be slow.
-     * This version has not been tested extensively on Windows.
-     * Major internal changes designed to make unison safer to run at the
-       same time as the replicas are being changed by the user.
-     * Internal performance improvements.
-
-   Changes since 1.190:
-     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
-       synchronize your replicas before upgrading, to avoid spurious
-       conflicts. The first sync after upgrading will be slow.
-     * A number of internal functions have been changed to reduce the
-       amount of memory allocation, especially during the first
-       synchronization. This should help power users with very big
-       replicas.
-     * Reimplementation of low-level remote procedure call stuff, in
-       preparation for adding rsync-like smart file transfer in a later
-       release.
-     * Miscellaneous bug fixes.
-
-   Changes since 1.180:
-     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
-       synchronize your replicas before upgrading, to avoid spurious
-       conflicts. The first sync after upgrading will be slow.
-     * Fixed some small bugs in the interpretation of ignore patterns.
-     * Fixed some problems that were preventing the Windows version from
-       working correctly when click-started.
-     * Fixes to treatment of file permissions under Windows, which were
-       causing spurious reports of different permissions when
-       synchronizing between windows and unix systems.
-     * Fixed one more non-tail-recursive list processing function, which
-       was causing stack overflows when synchronizing very large
-       replicas.
-
-   Changes since 1.169:
-     * The text user interface now provides commands for ignoring files.
-     * We found and fixed some more non-tail-recursive list processing
-       functions. Some power users have reported success with very large
-       replicas.
-     * INCOMPATIBLE CHANGE: Files ending in .tmp are no longer ignored
-       automatically. If you want to ignore such files, put an
-       appropriate ignore pattern in your profile.
-     * INCOMPATIBLE CHANGE: The syntax of ignore and follow patterns has
-       changed. Instead of putting a line of the form
-                 ignore = <regexp>
-       in your profile (.unison/default.prf), you should put:
-                 ignore = Regexp <regexp>
-       Moreover, two other styles of pattern are also recognized:
-                 ignore = Name <name>
-       matches any path in which one component matches <name>, while
-                 ignore = Path <path>
-       matches exactly the path <path>.
-       Standard "globbing" conventions can be used in <name> and <path>:
-          + a ? matches any single character except /
-          + a * matches any sequence of characters not including /
-          + [xyz] matches any character from the set {x, y, z }
-          + {a,bb,ccc} matches any one of a, bb, or ccc.
-       See the user manual for some examples.
-
-   Changes since 1.146:
-     * Some users were reporting stack overflows when synchronizing huge
-       directories. We found and fixed some non-tail-recursive list
-       processing functions, which we hope will solve the problem. Please
-       give it a try and let us know.
-     * Major additions to the documentation.
-
-   Changes since 1.142:
-     * Major internal tidying and many small bugfixes.
-     * Major additions to the user manual.
-     * Unison can now be started with no arguments - it will prompt
-       automatically for the name of a profile file containing the roots
-       to be synchronized. This makes it possible to start the graphical
-       UI from a desktop icon.
-     * Fixed a small bug where the text UI on NT was raising a 'no such
-       signal' exception.
-
-   Changes since 1.139:
-     * The precompiled windows binary in the last release was compiled
-       with an old OCaml compiler, causing propagation of permissions not
-       to work (and perhaps leading to some other strange behaviors we've
-       heard reports about). This has been corrected. If you're using
-       precompiled binaries on Windows, please upgrade.
-     * Added a -debug command line flag, which controls debugging of
-       various modules. Say -debug XXX to enable debug tracing for module
-       XXX, or -debug all to turn on absolutely everything.
-     * Fixed a small bug where the text UI on NT was raising a 'no such
-       signal' exception.
-
-   Changes since 1.111:
-     * INCOMPATIBLE CHANGE: The names and formats of the preference files
-       in the .unison directory have changed. In particular:
-          + the file "prefs" should be renamed to default.prf
-          + the contents of the file "ignore" should be merged into
-            default.prf. Each line of the form REGEXP in ignore should
-            become a line of the form ignore = REGEXP in default.prf.
-     * Unison now handles permission bits and symbolic links. See the
-       manual for details.
-     * You can now have different preference files in your .unison
-       directory. If you start unison like this
-             unison profilename
-       (i.e. with just one "anonymous" command-line argument), then the
-       file ~/.unison/profilename.prf will be loaded instead of
-       default.prf.
-     * Some improvements to terminal handling in the text user interface
-     * Added a switch -killServer that terminates the remote server
-       process when the unison client is shutting down, even when using
-       sockets for communication. (By default, a remote server created
-       using ssh/rsh is terminated automatically, while a socket server
-       is left running.)
-     * When started in 'socket server' mode, unison prints 'server
-       started' on stderr when it is ready to accept connections. (This
-       may be useful for scripts that want to tell when a socket-mode
-       server has finished initalization.)
-     * We now make a nightly mirror of our current internal development
-       tree, in case anyone wants an up-to-the-minute version to hack
-       around with.
-     * Added a file CONTRIB with some suggestions for how to help us make
-       Unison better.
-
-

Copied: branches/2.40/src/NEWS (from rev 411, trunk/src/NEWS)
===================================================================
--- branches/2.40/src/NEWS	                        (rev 0)
+++ branches/2.40/src/NEWS	2010-02-20 23:23:17 UTC (rev 412)
@@ -0,0 +1,1444 @@
+
+Changes in Version 2.40.1
+
+   Changes since 2.31:
+     * Small user interface changes
+          + Small change to text UI "scanning..." messages, to print just
+            directories (hopefully making it clearer that individual
+            files are not necessarily being fingerprinted).
+     * Minor fixes and improvements:
+          + Ignore one hour differences when deciding whether a file may
+            have been updated. This avoids slow update detection after
+            daylight saving time changes under Windows. This makes Unison
+            slightly more likely to miss an update, but it should be safe
+            enough.
+          + Fix a small bug that was affecting mainly windows users. We
+            need to commit the archives at the end of the sync even if
+            there are no updates to propagate because some files (in
+            fact, if we've just switched to DST on windows, a LOT of
+            files) might have new modtimes in the archive. (Changed the
+            text UI only. It's less clear where to change the GUI.)
+          + Don't delete the temp file when a transfer fails due to a
+            fingerprint mismatch (so that we can have a look and see
+            why!) We've also added more debugging code togive more
+            informative error messages when we encounter the dreaded and
+            longstanding "assert failed during file transfer" bug
+
+   Changes since 2.27:
+     * If Unison is interrupted during a directory transfer, it will now
+       leave the partially transferred directory intact in a temporary
+       location. (This maintains the invariant that new files/directories
+       are transferred either completely or not at all.) The next time
+       Unison is run, it will continue filling in this temporary
+       directory, skipping transferring files that it finds are already
+       there.
+     * We've added experimental support for invoking an external file
+       transfer tool for whole-file copies instead of Unison's built-in
+       transfer protocol. Three new preferences have been added:
+          + copyprog is a string giving the name (and command-line
+            switches, if needed) of an external program that can be used
+            to copy large files efficiently. By default, rsync is
+            invoked, but other tools such as scp can be used instead by
+            changing the value of this preference. (Although this is not
+            its primary purpose, rsync is actually a pretty fast way of
+            copying files that don't already exist on the receiving
+            host.) For files that do already exist on (but that have been
+            changed in one replica), Unison will always use its built-in
+            implementation of the rsync algorithm.
+          + Added a "copyprogrest" preference, so that we can give
+            different command lines for invoking the external copy
+            utility depending on whether a partially transferred file
+            already exists or not. (Rsync doesn't seem to care about
+            this, but other utilities may.)
+          + copythreshold is an integer (-1 by default), indicating above
+            what filesize (in megabytes) Unison should use the external
+            copying utility specified by copyprog. Specifying 0 will
+            cause ALL copies to use the external program; a negative
+            number will prevent any files from using it. (Default is -1.)
+       Thanks to Alan Schmitt for a huge amount of hacking and to an
+       anonymous sponsor for suggesting and underwriting this extension.
+     * Small improvements:
+          + Added a new preference, dontchmod. By default, Unison uses
+            the chmod system call to set the permission bits of files
+            after it has copied them. But in some circumstances (and
+            under some operating systems), the chmod call always fails.
+            Setting this preference completely prevents Unison from ever
+            calling chmod.
+          + Don't ignore files that look like backup files if the
+            backuplocation preference is set to central
+          + Shortened the names of several preferences. The old names are
+            also still supported, for backwards compatibility, but they
+            do not appear in the documentation.
+          + Lots of little documentation tidying. (In particular,
+            preferences are separated into Basic and Advanced! This
+            should hopefully make Unison a little more approachable for
+            new users.
+          + Unison can sometimes fail to transfer a file, giving the
+            unhelpful message "Destination updated during
+            synchronization" even though the file has not been changed.
+            This can be caused by programs that change either the file's
+            contents or the file's extended attributes without changing
+            its modification time. It's not clear what is the best fix
+            for this - it is not Unison's fault, but it makes Unison's
+            behavior puzzling - but at least Unison can be more helpful
+            about suggesting a workaround (running once with fastcheck
+            set to false). The failure message has been changed to give
+            this advice.
+          + Further improvements to the OS X GUI (thanks to Alan Schmitt
+            and Craig Federighi).
+     * Very preliminary support for triggering Unison from an external
+       filesystem-watching utility. The current implementation is very
+       simple, not efficient, and almost completely untested--not ready
+       for real users. But if someone wants to help improve it (e.g., by
+       writing a filesystem watcher for your favorite OS), please make
+       yourself known!
+       On the Unison side, the new behavior is very simple:
+          + use the text UI
+          + start Unison with the command-line flag "-repeat FOO", where
+            FOO is name of a file where Unison should look for
+            notifications of changes
+          + when it starts up, Unison will read the whole contents of
+            this file (on both hosts), which should be a
+            newline-separated list of paths (relative to the root of the
+            synchronization) and synchronize just these paths, as if it
+            had been started with the "-path=xxx" option for each one of
+            them
+          + when it finishes, it will sleep for a few seconds and then
+            examine the watchfile again; if anything has been added, it
+            will read the new paths, synchronize them, and go back to
+            sleep
+          + that's it!
+       To use this to drive Unison "incrementally," just start it in this
+       mode and start up a tool (on each host) to watch for new changes
+       to the filesystem and append the appropriate paths to the
+       watchfile. Hopefully such tools should not be too hard to write.
+     * Bug fixes:
+          + Fixed a bug that was causing new files to be created with
+            permissions 0x600 instead of using a reasonable default (like
+            0x644), if the 'perms' flag was set to 0. (Bug reported by
+            Ben Crowell.)
+          + Follow maxthreads preference when transferring directories.
+
+   Changes since 2.17:
+     * Major rewrite and cleanup of the whole Mac OS X graphical user
+       interface by Craig Federighi. Thanks, Craig!!!
+     * Small fix to ctime (non-)handling in update detection under
+       windows with fastcheck.
+     * Several small fixes to the GTK2 UI to make it work better under
+       Windows [thanks to Karl M for these].
+     * The backup functionality has been completely rewritten. The
+       external interface has not changed, but numerous bugs, irregular
+       behaviors, and cross-platform inconsistencies have been corrected.
+     * The Unison project now accepts donations via PayPal. If you'd like
+       to donate, you can find a link to the donation page on the Unison
+       home page (http://www.cis.upenn.edu/ bcpierce/unison/lists.html).
+     * Some important safety improvements:
+          + Added a new mountpoint preference, which can be used to
+            specify a path that must exist in both replicas at the end of
+            update detection (otherwise Unison aborts). This can be used
+            to avoid potentially dangerous situations when Unison is used
+            with removable media such as external hard drives and compact
+            flash cards.
+          + The confirmation of "big deletes" is now controlled by a
+            boolean preference confirmbigdeletes. Default is true, which
+            gives the same behavior as previously. (This functionality is
+            at least partly superceded by the mountpoint preference, but
+            it has been left in place in case it is useful to some
+            people.)
+          + If Unison is asked to "follow" a symbolic link but there is
+            nothing at the other end of the link, it will now flag this
+            path as an error, rather than treating the symlink itself as
+            missing or deleted. This avoids a potentially dangerous
+            situation where a followed symlink points to an external
+            filesystem that might be offline when Unison is run
+            (whereupon Unison would cheerfully delete the corresponding
+            files in the other replica!).
+     * Smaller changes:
+          + Added forcepartial and preferpartial preferences, which
+            behave like force and prefer but can be specified on a
+            per-path basis. [Thanks to Alan Schmitt for this.]
+          + A bare-bones self test feature was added, which runs unison
+            through some of its paces and checks that the results are as
+            expected. The coverage of the tests is still very limited,
+            but the facility has already been very useful in debugging
+            the new backup functionality (especially in exposing some
+            subtle cross-platform issues).
+          + Refined debugging code so that the verbosity of individual
+            modules can be controlled separately. Instead of just putting
+            '-debug verbose' on the command line, you can put '-debug
+            update+', which causes all the extra messages in the Update
+            module, but not other modules, to be printed. Putting '-debug
+            verbose' causes all modules to print with maximum verbosity.
+          + Removed mergebatch preference. (It never seemed very useful,
+            and its semantics were confusing.)
+          + Rewrote some of the merging functionality, for better
+            cooperation with external Harmony instances.
+          + Changed the temp file prefix from .# to .unison.
+          + Compressed the output from the text user interface
+            (particularly when run with the -terse flag) to make it
+            easier to interpret the results when Unison is run several
+            times in succession from a script.
+          + Diff and merge functions now work under Windows.
+          + Changed the order of arguments to the default diff command
+            (so that the + and - annotations in diff's output are
+            reversed).
+          + Added .mpp files to the "never fastcheck" list (like .xls
+            files).
+     * Many small bugfixes, including:
+          + Fixed a longstanding bug regarding fastcheck and daylight
+            saving time under Windows when Unison is set up to
+            synchronize modification times. (Modification times cannot be
+            updated in the archive in this case, so we have to ignore one
+            hour differences.)
+          + Fixed a bug that would occasionally cause the archives to be
+            left in non-identical states on the two hosts after
+            synchronization.
+          + Fixed a bug that prevented Unison from communicating
+            correctly between 32- and 64-bit architectures.
+          + On windows, file creation times are no longer used as a proxy
+            for inode numbers. (This is unfortunate, as it makes
+            fastcheck a little less safe. But it turns out that file
+            creation times are not reliable under Windows: if a file is
+            removed and a new file is created in its place, the new one
+            will sometimes be given the same creation date as the old
+            one!)
+          + Set read-only file to R/W on OSX before attempting to change
+            other attributes.
+          + Fixed bug resulting in spurious "Aborted" errors during
+            transport (thanks to Jerome Vouillon)
+          + Enable diff if file contents have changed in one replica, but
+            only properties in the other.
+          + Removed misleading documentation for 'repeat' preference.
+          + Fixed a bug in merging code where Unison could sometimes
+            deadlock with the external merge program, if the latter
+            produced large amounts of output.
+          + Workaround for a bug compiling gtk2 user interface against
+            current versions of gtk2+ libraries.
+          + Added a better error message for "ambiguous paths".
+          + Squashed a longstanding bug that would cause file transfer to
+            fail with the message "Failed: Error in readWrite: Is a
+            directory."
+          + Replaced symlinks with copies of their targets in the Growl
+            framework in src/uimac. This should make the sources easier
+            to check out from the svn repository on WinXP systems.
+          + Added a workaround (suggested by Karl M.) for the problem
+            discussed on the unison users mailing list where, on the
+            Windows platform, the server would hang when transferring
+            files. I conjecture that the problem has to do with the RPC
+            mechanism, which was used to make a call back from the server
+            to the client (inside the Trace.log function) so that the log
+            message would be appended to the log file on the client. The
+            workaround is to dump these messages (about when
+            xferbycopying shortcuts are applied and whether they succeed)
+            just to the standard output of the Unison process, not to the
+            log file.
+
+   Changes since 2.13.0:
+     * The features for performing backups and for invoking external
+       merge programs have been completely rewritten by Stephane Lescuyer
+       (thanks, Stephane!). The user-visible functionality should not
+       change, but the internals have been rationalized and there are a
+       number of new features. See the manual (in particular, the
+       description of the backupXXX preferences) for details.
+     * Incorporated patches for ipv6 support, contributed by Samuel
+       Thibault. (Note that, due to a bug in the released OCaml 3.08.3
+       compiler, this code will not actually work with ipv6 unless
+       compiled with the CVS version of the OCaml compiler, where the bug
+       has been fixed; however, ipv4 should continue to work normally.)
+     * OSX interface:
+          + Incorporated Ben Willmore's cool new icon for the Mac UI.
+     * Small fixes:
+          + Fixed off by one error in month numbers (in printed dates)
+            reported by Bob Burger
+
+   Changes since 2.12.0:
+     * New convention for release numbering: Releases will continue to be
+       given numbers of the form X.Y.Z, but, from now on, just the major
+       version number (X.Y) will be considered significant when checking
+       compatibility between client and server versions. The third
+       component of the version number will be used only to identify
+       "patch levels" of releases.
+       This change goes hand in hand with a change to the procedure for
+       making new releases. Candidate releases will initially be given
+       "beta release" status when they are announced for public
+       consumption. Any bugs that are discovered will be fixed in a
+       separate branch of the source repository (without changing the
+       major version number) and new tarballs re-released as needed. When
+       this process converges, the patched beta version will be dubbed
+       stable.
+     * Warning (failure in batch mode) when one path is completely
+       emptied. This prevents Unison from deleting everything on one
+       replica when the other disappear.
+     * Fix diff bug (where no difference is shown the first time the diff
+       command is given).
+     * User interface changes:
+          + Improved workaround for button focus problem (GTK2 UI)
+          + Put leading zeroes in date fields
+          + More robust handling of character encodings in GTK2 UI
+          + Changed format of modification time displays, from modified
+            at hh:mm:ss on dd MMM, yyyy to modified on yyyy-mm-dd
+            hh:mm:ss
+          + Changed time display to include seconds (so that people on
+            FAT filesystems will not be confused when Unison tries to
+            update a file time to an odd number of seconds and the
+            filesystem truncates it to an even number!)
+          + Use the diff "-u" option by default when showing differences
+            between files (the output is more readable)
+          + In text mode, pipe the diff output to a pager if the
+            environment variable PAGER is set
+          + Bug fixes and cleanups in ssh password prompting. Now works
+            with the GTK2 UI under Linux. (Hopefully the Mac OS X one is
+            not broken!)
+          + Include profile name in the GTK2 window name
+          + Added bindings ',' (same as '<') and '.' (same as '>') in the
+            GTK2 UI
+     * Mac GUI:
+          + actions like < and > scroll to the next item as necessary.
+          + Restart has a menu item and keyboard shortcut (command-R).
+          + Added a command-line tool for Mac OS X. It can be installed
+            from the Unison menu.
+          + New icon.
+          + Handle the "help" command-line argument properly.
+          + Handle profiles given on the command line properly.
+          + When a profile has been selected, the profile dialog is
+            replaced by a "connecting" message while the connection is
+            being made. This gives better feedback.
+          + Size of left and right columns is now large enough so that
+            "PropsChanged" is not cut off.
+     * Minor changes:
+          + Disable multi-threading when both roots are local
+          + Improved error handling code. In particular, make sure all
+            files are closed in case of a transient failure
+          + Under Windows, use $UNISON for home directory as a last
+            resort (it was wrongly moved before $HOME and $USERPROFILE in
+            Unison 2.12.0)
+          + Reopen the logfile if its name changes (profile change)
+          + Double-check that permissions and modification times have
+            been properly set: there are some combination of OS and
+            filesystem on which setting them can fail in a silent way.
+          + Check for bad Windows filenames for pure Windows
+            synchronization also (not just cross architecture
+            synchronization). This way, filenames containing backslashes,
+            which are not correctly handled by unison, are rejected right
+            away.
+          + Attempt to resolve issues with synchronizing modification
+            times of read-only files under Windows
+          + Ignore chmod failures when deleting files
+          + Ignore trailing dots in filenames in case insensitive mode
+          + Proper quoting of paths, files and extensions ignored using
+            the UI
+          + The strings CURRENT1 and CURRENT2 are now correctly
+            substitued when they occur in the diff preference
+          + Improvements to syncing resource forks between Macs via a
+            non-Mac system.
+
+   Changes since 2.10.2:
+     * INCOMPATIBLE CHANGE: Archive format has changed.
+     * Source code availability: The Unison sources are now managed using
+       Subversion. One nice side-effect is that anonymous checkout is now
+       possible, like this:
+        svn co https://cvs.cis.upenn.edu:3690/svnroot/unison/
+       We will also continue to export a "developer tarball" of the
+       current (modulo one day) sources in the web export directory. To
+       receive commit logs for changes to the sources, subscribe to the
+       unison-hackers list
+       (http://www.cis.upenn.edu/ bcpierce/unison/lists.html).
+     * Text user interface:
+          + Substantial reworking of the internal logic of the text UI to
+            make it a bit easier to modify.
+          + The dumbtty flag in the text UI is automatically set to true
+            if the client is running on a Unix system and the EMACS
+            environment variable is set to anything other than the empty
+            string.
+     * Native OS X gui:
+          + Added a synchronize menu item with keyboard shortcut
+          + Added a merge menu item, still needs to be debugged
+          + Fixes to compile for Panther
+          + Miscellaneous improvements and bugfixes
+     * Small changes:
+          + Changed the filename checking code to apply to Windows only,
+            instead of OS X as well.
+          + Finder flags now synchronized
+          + Fallback in copy.ml for filesystem that do not support O_EXCL
+          + Changed buffer size for local file copy (was highly
+            inefficient with synchronous writes)
+          + Ignore chmod failure when deleting a directory
+          + Fixed assertion failure when resolving a conflict content
+            change / permission changes in favor of the content change.
+          + Workaround for transferring large files using rsync.
+          + Use buffered I/O for files (this is the only way to open
+            files in binary mode under Cygwin).
+          + On non-Cygwin Windows systems, the UNISON environment
+            variable is now checked first to determine where to look for
+            Unison's archive and preference files, followed by HOME and
+            USERPROFILE in that order. On Unix and Cygwin systems, HOME
+            is used.
+          + Generalized diff preference so that it can be given either as
+            just the command name to be used for calculating diffs or
+            else a whole command line, containing the strings CURRENT1
+            and CURRENT2, which will be replaced by the names of the
+            files to be diff'ed before the command is called.
+          + Recognize password prompts in some newer versions of ssh.
+
+   Changes since 2.9.20:
+     * INCOMPATIBLE CHANGE: Archive format has changed.
+     * Major functionality changes:
+          + Major tidying and enhancement of 'merge' functionality. The
+            main user-visible change is that the external merge program
+            may either write the merged output to a single new file, as
+            before, or it may modify one or both of its input files, or
+            it may write two new files. In the latter cases, its
+            modifications will be copied back into place on both the
+            local and the remote host, and (if the two files are now
+            equal) the archive will be updated appropriately. More
+            information can be found in the user manual. Thanks to Malo
+            Denielou and Alan Schmitt for these improvements.
+            Warning: the new merging functionality is not completely
+            compatible with old versions! Check the manual for details.
+          + Files larger than 2Gb are now supported.
+          + Added preliminary (and still somewhat experimental) support
+            for the Apple OS X operating system.
+               o Resource forks should be transferred correctly. (See the
+                 manual for details of how this works when synchronizing
+                 HFS with non-HFS volumes.) Synchronization of file type
+                 and creator information is also supported.
+               o On OSX systems, the name of the directory for storing
+                 Unison's archives, preference files, etc., is now
+                 determined as follows:
+                    # if ~/.unison exists, use it
+                    # otherwise, use ~/Library/Application
+                      Support/Unison, creating it if necessary.
+               o A preliminary native-Cocoa user interface is under
+                 construction. This still needs some work, and some users
+                 experience unpredictable crashes, so it is only for
+                 hackers for now. Run make with UISTYLE=mac to build this
+                 interface.
+     * Minor functionality changes:
+          + Added an ignorelocks preference, which forces Unison to
+            override left-over archive locks. (Setting this preference is
+            dangerous! Use it only if you are positive you know what you
+            are doing.)
+          + Added a new preference assumeContentsAreImmutable. If a
+            directory matches one of the patterns set in this preference,
+            then update detection is skipped for files in this directory.
+            (The purpose is to speed update detection for cases like Mail
+            folders, which contain lots and lots of immutable files.)
+            Also a preference assumeContentsAreImmutableNot, which
+            overrides the first, similarly to ignorenot. (Later
+            amendment: these preferences are now called immutable and
+            immutablenot.)
+          + The ignorecase flag has been changed from a boolean to a
+            three-valued preference. The default setting, called default,
+            checks the operating systems running on the client and server
+            and ignores filename case if either of them is OSX or
+            Windows. Setting ignorecase to true or false overrides this
+            behavior. If you have been setting ignorecase on the command
+            line using -ignorecase=true or -ignorecase=false, you will
+            need to change to -ignorecase true or -ignorecase false.
+          + a new preference, 'repeat', for the text user interface
+            (only). If 'repeat' is set to a number, then, after it
+            finishes synchronizing, Unison will wait for that many
+            seconds and then start over, continuing this way until it is
+            killed from outside. Setting repeat to true will
+            automatically set the batch preference to true.
+          + Excel files are now handled specially, so that the fastcheck
+            optimization is skipped even if the fastcheck flag is set.
+            (Excel does some naughty things with modtimes, making this
+            optimization unreliable and leading to failures during change
+            propagation.)
+          + The ignorecase flag has been changed from a boolean to a
+            three-valued preference. The default setting, called
+            'default', checks the operating systems running on the client
+            and server and ignores filename case if either of them is OSX
+            or Windows. Setting ignorecase to 'true' or 'false' overrides
+            this behavior.
+          + Added a new preference, 'repeat', for the text user interface
+            (only, at the moment). If 'repeat' is set to a number, then,
+            after it finishes synchronizing, Unison will wait for that
+            many seconds and then start over, continuing this way until
+            it is killed from outside. Setting repeat to true will
+            automatically set the batch preference to true.
+          + The 'rshargs' preference has been split into 'rshargs' and
+            'sshargs' (mainly to make the documentation clearer). In
+            fact, 'rshargs' is no longer mentioned in the documentation
+            at all, since pretty much everybody uses ssh now anyway.
+     * Documentation
+          + The web pages have been completely redesigned and
+            reorganized. (Thanks to Alan Schmitt for help with this.)
+     * User interface improvements
+          + Added a GTK2 user interface, capable (among other things) of
+            displaying filenames in any locale encoding. Kudos to Stephen
+            Tse for contributing this code!
+          + The text UI now prints a list of failed and skipped transfers
+            at the end of synchronization.
+          + Restarting update detection from the graphical UI will reload
+            the current profile (which in particular will reset the -path
+            preference, in case it has been narrowed by using the
+            "Recheck unsynchronized items" command).
+          + Several small improvements to the text user interface,
+            including a progress display.
+     * Bug fixes (too numerous to count, actually, but here are some):
+          + The maxthreads preference works now.
+          + Fixed bug where warning message about uname returning an
+            unrecognized result was preventing connection to server. (The
+            warning is no longer printed, and all systems where 'uname'
+            returns anything other than 'Darwin' are assumed not to be
+            running OS X.)
+          + Fixed a problem on OS X that caused some valid file names
+            (e.g., those including colons) to be considered invalid.
+          + Patched Path.followLink to follow links under cygwin in
+            addition to Unix (suggested by Matt Swift).
+          + Small change to the storeRootsName function, suggested by
+            bliviero at ichips.intel.com, to fix a problem in unison with
+            the `rootalias' option, which allows you to tell unison that
+            two roots contain the same files. Rootalias was being applied
+            after the hosts were sorted, so it wouldn't work properly in
+            all cases.
+          + Incorporated a fix by Dmitry Bely for setting utimes of
+            read-only files on Win32 systems.
+     * Installation / portability:
+          + Unison now compiles with OCaml version 3.07 and later out of
+            the box.
+          + Makefile.OCaml fixed to compile out of the box under OpenBSD.
+          + a few additional ports (e.g. OpenBSD, Zaurus/IPAQ) are now
+            mentioned in the documentation
+          + Unison can now be installed easily on OSX systems using the
+            Fink package manager
+
+   Changes since 2.9.1:
+     * Added a preference maxthreads that can be used to limit the number
+       of simultaneous file transfers.
+     * Added a backupdir preference, which controls where backup files
+       are stored.
+     * Basic support added for OSX. In particular, Unison now recognizes
+       when one of the hosts being synchronized is running OSX and
+       switches to a case-insensitive treatment of filenames (i.e., 'foo'
+       and 'FOO' are considered to be the same file). (OSX is not yet
+       fully working, however: in particular, files with resource forks
+       will not be synchronized correctly.)
+     * The same hash used to form the archive name is now also added to
+       the names of the temp files created during file transfer. The
+       reason for this is that, during update detection, we are going to
+       silently delete any old temp files that we find along the way, and
+       we want to prevent ourselves from deleting temp files belonging to
+       other instances of Unison that may be running in parallel, e.g.
+       synchronizing with a different host. Thanks to Ruslan Ermilov for
+       this suggestion.
+     * Several small user interface improvements
+     * Documentation
+          + FAQ and bug reporting instructions have been split out as
+            separate HTML pages, accessible directly from the unison web
+            page.
+          + Additions to FAQ, in particular suggestions about performance
+            tuning.
+     * Makefile
+          + Makefile.OCaml now sets UISTYLE=text or UISTYLE=gtk
+            automatically, depending on whether it finds lablgtk
+            installed
+          + Unison should now compile "out of the box" under OSX
+
+   Changes since 2.8.1:
+     * Changing profile works again under Windows
+     * File movement optimization: Unison now tries to use local copy
+       instead of transfer for moved or copied files. It is controled by
+       a boolean option "xferbycopying".
+     * Network statistics window (transfer rate, amount of data
+       transferred). [NB: not available in Windows-Cygwin version.]
+     * symlinks work under the cygwin version (which is dynamically
+       linked).
+     * Fixed potential deadlock when synchronizing between Windows and
+       Unix
+     * Small improvements:
+          + If neither the USERPROFILE nor the HOME environment variables
+            are set, then Unison will put its temporary commit log
+            (called DANGER.README) into the directory named by the UNISON
+            environment variable, if any; otherwise it will use C:.
+          + alternative set of values for fastcheck: yes = true; no =
+            false; default = auto.
+          + -silent implies -contactquietly
+     * Source code:
+          + Code reorganization and tidying. (Started breaking up some of
+            the basic utility modules so that the non-unison-specific
+            stuff can be made available for other projects.)
+          + several Makefile and docs changes (for release);
+          + further comments in "update.ml";
+          + connection information is not stored in global variables
+            anymore.
+
+   Changes since 2.7.78:
+     * Small bugfix to textual user interface under Unix (to avoid
+       leaving the terminal in a bad state where it would not echo inputs
+       after Unison exited).
+
+   Changes since 2.7.39:
+     * Improvements to the main web page (stable and beta version docs
+       are now both accessible).
+     * User manual revised.
+     * Added some new preferences:
+          + "sshcmd" and "rshcmd" for specifying paths to ssh and rsh
+            programs.
+          + "contactquietly" for suppressing the "contacting server"
+            message during Unison startup (under the graphical UI).
+     * Bug fixes:
+          + Fixed small bug in UI that neglected to change the displayed
+            column headers if loading a new profile caused the roots to
+            change.
+          + Fixed a bug that would put the text UI into an infinite loop
+            if it encountered a conflict when run in batch mode.
+          + Added some code to try to fix the display of non-Ascii
+            characters in filenames on Windows systems in the GTK UI.
+            (This code is currently untested--if you're one of the people
+            that had reported problems with display of non-ascii
+            filenames, we'd appreciate knowing if this actually fixes
+            things.)
+          + `-prefer/-force newer' works properly now. (The bug was
+            reported by Sebastian Urbaniak and Sean Fulton.)
+     * User interface and Unison behavior:
+          + Renamed `Proceed' to `Go' in the graphical UI.
+          + Added exit status for the textual user interface.
+          + Paths that are not synchronized because of conflicts or
+            errors during update detection are now noted in the log file.
+          + [END] messages in log now use a briefer format
+          + Changed the text UI startup sequence so that ./unison -ui
+            text will use the default profile instead of failing.
+          + Made some improvements to the error messages.
+          + Added some debugging messages to remote.ml.
+
+   Changes since 2.7.7:
+     * Incorporated, once again, a multi-threaded transport sub-system.
+       It transfers several files at the same time, thereby making much
+       more effective use of available network bandwidth. Unlike the
+       earlier attempt, this time we do not rely on the native thread
+       library of OCaml. Instead, we implement a light-weight,
+       non-preemptive multi-thread library in OCaml directly. This
+       version appears stable.
+       Some adjustments to unison are made to accommodate the
+       multi-threaded version. These include, in particular, changes to
+       the user interface and logging, for example:
+          + Two log entries for each transferring task, one for the
+            beginning, one for the end.
+          + Suppressed warning messages against removing temp files left
+            by a previous unison run, because warning does not work
+            nicely under multi-threading. The temp file names are made
+            less likely to coincide with the name of a file created by
+            the user. They take the form
+            .#<filename>.<serial>.unison.tmp. [N.b. This was later
+            changed to .unison.<filename>.<serial>.unison.tmp.]
+     * Added a new command to the GTK user interface: pressing 'f' causes
+       Unison to start a new update detection phase, using as paths just
+       those paths that have been detected as changed and not yet marked
+       as successfully completed. Use this command to quickly restart
+       Unison on just the set of paths still needing attention after a
+       previous run.
+     * Made the ignorecase preference user-visible, and changed the
+       initialization code so that it can be manually set to true, even
+       if neither host is running Windows. (This may be useful, e.g.,
+       when using Unison running on a Unix system with a FAT volume
+       mounted.)
+     * Small improvements and bug fixes:
+          + Errors in preference files now generate fatal errors rather
+            than warnings at startup time. (I.e., you can't go on from
+            them.) Also, we fixed a bug that was preventing these
+            warnings from appearing in the text UI, so some users who
+            have been running (unsuspectingly) with garbage in their
+            prefs files may now get error reports.
+          + Error reporting for preference files now provides file name
+            and line number.
+          + More intelligible message in the case of identical change to
+            the same files: "Nothing to do: replicas have been changed
+            only in identical ways since last sync."
+          + Files with prefix '.#' excluded when scanning for preference
+            files.
+          + Rsync instructions are send directly instead of first
+            marshaled.
+          + Won't try forever to get the fingerprint of a continuously
+            changing file: unison will give up after certain number of
+            retries.
+          + Other bug fixes, including the one reported by Peter Selinger
+            (force=older preference not working).
+     * Compilation:
+          + Upgraded to the new OCaml 3.04 compiler, with the LablGtk
+            1.2.3 library (patched version used for compiling under
+            Windows).
+          + Added the option to compile unison on the Windows platform
+            with Cygwin GNU C compiler. This option only supports
+            building dynamically linked unison executables.
+
+   Changes since 2.7.4:
+     * Fixed a silly (but debilitating) bug in the client startup
+       sequence.
+
+   Changes since 2.7.1:
+     * Added addprefsto preference, which (when set) controls which
+       preference file new preferences (e.g. new ignore patterns) are
+       added to.
+     * Bug fix: read the initial connection header one byte at a time, so
+       that we don't block if the header is shorter than expected. (This
+       bug did not affect normal operation -- it just made it hard to
+       tell when you were trying to use Unison incorrectly with an old
+       version of the server, since it would hang instead of giving an
+       error message.)
+
+   Changes since 2.6.59:
+     * Changed fastcheck from a boolean to a string preference. Its legal
+       values are yes (for a fast check), no (for a safe check), or
+       default (for a fast check--which also happens to be safe--when
+       running on Unix and a safe check when on Windows). The default is
+       default.
+     * Several preferences have been renamed for consistency. All
+       preference names are now spelled out in lowercase. For backward
+       compatibility, the old names still work, but they are not
+       mentioned in the manual any more.
+     * The temp files created by the 'diff' and 'merge' commands are now
+       named by prepending a new prefix to the file name, rather than
+       appending a suffix. This should avoid confusing diff/merge
+       programs that depend on the suffix to guess the type of the file
+       contents.
+     * We now set the keepalive option on the server socket, to make sure
+       that the server times out if the communication link is
+       unexpectedly broken.
+     * Bug fixes:
+          + When updating small files, Unison now closes the destination
+            file.
+          + File permissions are properly updated when the file is behind
+            a followed link.
+          + Several other small fixes.
+
+   Changes since 2.6.38:
+     * Major Windows performance improvement!
+       We've added a preference fastcheck that makes Unison look only at
+       a file's creation time and last-modified time to check whether it
+       has changed. This should result in a huge speedup when checking
+       for updates in large replicas.
+       When this switch is set, Unison will use file creation times as
+       'pseudo inode numbers' when scanning Windows replicas for updates,
+       instead of reading the full contents of every file. This may cause
+       Unison to miss propagating an update if the create time,
+       modification time, and length of the file are all unchanged by the
+       update (this is not easy to achieve, but it can be done). However,
+       Unison will never overwrite such an update with a change from the
+       other replica, since it always does a safe check for updates just
+       before propagating a change. Thus, it is reasonable to use this
+       switch most of the time and occasionally run Unison once with
+       fastcheck set to false, if you are worried that Unison may have
+       overlooked an update.
+       Warning: This change is has not yet been thoroughly field-tested.
+       If you set the fastcheck preference, pay careful attention to what
+       Unison is doing.
+     * New functionality: centralized backups and merging
+          + This version incorporates two pieces of major new
+            functionality, implemented by Sylvain Roy during a summer
+            internship at Penn: a centralized backup facility that keeps
+            a full backup of (selected files in) each replica, and a
+            merging feature that allows Unison to invoke an external
+            file-merging tool to resolve conflicting changes to
+            individual files.
+          + Centralized backups:
+               o Unison now maintains full backups of the
+                 last-synchronized versions of (some of) the files in
+                 each replica; these function both as backups in the
+                 usual sense and as the "common version" when invoking
+                 external merge programs.
+               o The backed up files are stored in a directory
+                 /.unison/backup on each host. (The name of this
+                 directory can be changed by setting the environment
+                 variable UNISONBACKUPDIR.)
+               o The predicate backup controls which files are actually
+                 backed up: giving the preference 'backup = Path *'
+                 causes backing up of all files.
+               o Files are added to the backup directory whenever unison
+                 updates its archive. This means that
+                    # When unison reconstructs its archive from scratch
+                      (e.g., because of an upgrade, or because the
+                      archive files have been manually deleted), all
+                      files will be backed up.
+                    # Otherwise, each file will be backed up the first
+                      time unison propagates an update for it.
+               o The preference backupversions controls how many previous
+                 versions of each file are kept. The default is 2 (i.e.,
+                 the last synchronized version plus one backup).
+               o For backward compatibility, the backups preference is
+                 also still supported, but backup is now preferred.
+               o It is OK to manually delete files from the backup
+                 directory (or to throw away the directory itself).
+                 Before unison uses any of these files for anything
+                 important, it checks that its fingerprint matches the
+                 one that it expects.
+          + Merging:
+               o Both user interfaces offer a new 'merge' command,
+                 invoked by pressing 'm' (with a changed file selected).
+               o The actual merging is performed by an external program.
+                 The preferences merge and merge2 control how this
+                 program is invoked. If a backup exists for this file
+                 (see the backup preference), then the merge preference
+                 is used for this purpose; otherwise merge2 is used. In
+                 both cases, the value of the preference should be a
+                 string representing the command that should be passed to
+                 a shell to invoke the merge program. Within this string,
+                 the special substrings CURRENT1, CURRENT2, NEW, and OLD
+                 may appear at any point. Unison will substitute these as
+                 follows before invoking the command:
+                    # CURRENT1 is replaced by the name of the local copy
+                      of the file;
+                    # CURRENT2 is replaced by the name of a temporary
+                      file, into which the contents of the remote copy of
+                      the file have been transferred by Unison prior to
+                      performing the merge;
+                    # NEW is replaced by the name of a temporary file
+                      that Unison expects to be written by the merge
+                      program when it finishes, giving the desired new
+                      contents of the file; and
+                    # OLD is replaced by the name of the backed up copy
+                      of the original version of the file (i.e., its
+                      state at the end of the last successful run of
+                      Unison), if one exists (applies only to merge, not
+                      merge2).
+                 For example, on Unix systems setting the merge
+                 preference to
+   merge = diff3 -m CURRENT1 OLD CURRENT2 > NEW
+                 will tell Unison to use the external diff3 program for
+                 merging.
+                 A large number of external merging programs are
+                 available. For example, emacs users may find the
+                 following convenient:
+    merge2 = emacs -q --eval '(ediff-merge-files "CURRENT1" "CURRENT2"
+               nil "NEW")'
+    merge = emacs -q --eval '(ediff-merge-files-with-ancestor
+               "CURRENT1" "CURRENT2" "OLD" nil "NEW")'
+                 (These commands are displayed here on two lines to avoid
+                 running off the edge of the page. In your preference
+                 file, each should be written on a single line.)
+               o If the external program exits without leaving any file
+                 at the path NEW, Unison considers the merge to have
+                 failed. If the merge program writes a file called NEW
+                 but exits with a non-zero status code, then Unison
+                 considers the merge to have succeeded but to have
+                 generated conflicts. In this case, it attempts to invoke
+                 an external editor so that the user can resolve the
+                 conflicts. The value of the editor preference controls
+                 what editor is invoked by Unison. The default is emacs.
+               o Please send us suggestions for other useful values of
+                 the merge2 and merge preferences - we'd like to give
+                 several examples in the manual.
+     * Smaller changes:
+          + When one preference file includes another, unison no longer
+            adds the suffix '.prf' to the included file by default. If a
+            file with precisely the given name exists in the .unison
+            directory, it will be used; otherwise Unison will add .prf,
+            as it did before. (This change means that included preference
+            files can be named blah.include instead of blah.prf, so that
+            unison will not offer them in its 'choose a preference file'
+            dialog.)
+          + For Linux systems, we now offer both a statically linked and
+            a dynamically linked executable. The static one is larger,
+            but will probably run on more systems, since it doesn't
+            depend on the same versions of dynamically linked library
+            modules being available.
+          + Fixed the force and prefer preferences, which were getting
+            the propagation direction exactly backwards.
+          + Fixed a bug in the startup code that would cause unison to
+            crash when the default profile (~/.unison/default.prf) does
+            not exist.
+          + Fixed a bug where, on the run when a profile is first
+            created, Unison would confusingly display the roots in
+            reverse order in the user interface.
+     * For developers:
+          + We've added a module dependency diagram to the source
+            distribution, in src/DEPENDENCIES.ps, to help new prospective
+            developers with navigating the code.
+
+   Changes since 2.6.11:
+     * INCOMPATIBLE CHANGE: Archive format has changed.
+     * INCOMPATIBLE CHANGE: The startup sequence has been completely
+       rewritten and greatly simplified. The main user-visible change is
+       that the defaultpath preference has been removed. Its effect can
+       be approximated by using multiple profiles, with include
+       directives to incorporate common settings. All uses of defaultpath
+       in existing profiles should be changed to path.
+       Another change in startup behavior that will affect some users is
+       that it is no longer possible to specify roots both in the profile
+       and on the command line.
+       You can achieve a similar effect, though, by breaking your profile
+       into two:
+
+  default.prf =
+      root = blah
+      root = foo
+      include common
+
+  common.prf =
+      <everything else>
+       Now do
+  unison common root1 root2
+       when you want to specify roots explicitly.
+     * The -prefer and -force options have been extended to allow users
+       to specify that files with more recent modtimes should be
+       propagated, writing either -prefer newer or -force newer. (For
+       symmetry, Unison will also accept -prefer older or -force older.)
+       The -force older/newer options can only be used when -times is
+       also set.
+       The graphical user interface provides access to these facilities
+       on a one-off basis via the Actions menu.
+     * Names of roots can now be "aliased" to allow replicas to be
+       relocated without changing the name of the archive file where
+       Unison stores information between runs. (This feature is for
+       experts only. See the "Archive Files" section of the manual for
+       more information.)
+     * Graphical user-interface:
+          + A new command is provided in the Synchronization menu for
+            switching to a new profile without restarting Unison from
+            scratch.
+          + The GUI also supports one-key shortcuts for commonly used
+            profiles. If a profile contains a preference of the form 'key
+            = n', where n is a single digit, then pressing this key will
+            cause Unison to immediately switch to this profile and begin
+            synchronization again from scratch. (Any actions that may
+            have been selected for a set of changes currently being
+            displayed will be discarded.)
+          + Each profile may include a preference 'label = <string>'
+            giving a descriptive string that described the options
+            selected in this profile. The string is listed along with the
+            profile name in the profile selection dialog, and displayed
+            in the top-right corner of the main Unison window.
+     * Minor:
+          + Fixed a bug that would sometimes cause the 'diff' display to
+            order the files backwards relative to the main user
+            interface. (Thanks to Pascal Brisset for this fix.)
+          + On Unix systems, the graphical version of Unison will check
+            the DISPLAY variable and, if it is not set, automatically
+            fall back to the textual user interface.
+          + Synchronization paths (path preferences) are now matched
+            against the ignore preferences. So if a path is both
+            specified in a path preference and ignored, it will be
+            skipped.
+          + Numerous other bugfixes and small improvements.
+
+   Changes since 2.6.1:
+     * The synchronization of modification times has been disabled for
+       directories.
+     * Preference files may now include lines of the form include <name>,
+       which will cause name.prf to be read at that point.
+     * The synchronization of permission between Windows and Unix now
+       works properly.
+     * A binding CYGWIN=binmode in now added to the environment so that
+       the Cygwin port of OpenSSH works properly in a non-Cygwin context.
+     * The servercmd and addversionno preferences can now be used
+       together: -addversionno appends an appropriate -NNN to the server
+       command, which is found by using the value of the -servercmd
+       preference if there is one, or else just unison.
+     * Both '-pref=val' and '-pref val' are now allowed for boolean
+       values. (The former can be used to set a preference to false.)
+     * Lot of small bugs fixed.
+
+   Changes since 2.5.31:
+     * The log preference is now set to true by default, since the log
+       file seems useful for most users.
+     * Several miscellaneous bugfixes (most involving symlinks).
+
+   Changes since 2.5.25:
+     * INCOMPATIBLE CHANGE: Archive format has changed (again).
+     * Several significant bugs introduced in 2.5.25 have been fixed.
+
+   Changes since 2.5.1:
+     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
+       synchronize your replicas before upgrading, to avoid spurious
+       conflicts. The first sync after upgrading will be slow.
+     * New functionality:
+          + Unison now synchronizes file modtimes, user-ids, and
+            group-ids.
+            These new features are controlled by a set of new
+            preferences, all of which are currently false by default.
+               o When the times preference is set to true, file
+                 modification times are propaged. (Because the
+                 representations of time may not have the same
+                 granularity on both replicas, Unison may not always be
+                 able to make the modtimes precisely equal, but it will
+                 get them as close as the operating systems involved
+                 allow.)
+               o When the owner preference is set to true, file ownership
+                 information is synchronized.
+               o When the group preference is set to true, group
+                 information is synchronized.
+               o When the numericIds preference is set to true, owner and
+                 group information is synchronized numerically. By
+                 default, owner and group numbers are converted to names
+                 on each replica and these names are synchronized. (The
+                 special user id 0 and the special group 0 are never
+                 mapped via user/group names even if this preference is
+                 not set.)
+          + Added an integer-valued preference perms that can be used to
+            control the propagation of permission bits. The value of this
+            preference is a mask indicating which permission bits should
+            be synchronized. It is set by default to 0o1777: all bits but
+            the set-uid and set-gid bits are synchronised (synchronizing
+            theses latter bits can be a security hazard). If you want to
+            synchronize all bits, you can set the value of this
+            preference to -1.
+          + Added a log preference (default false), which makes Unison
+            keep a complete record of the changes it makes to the
+            replicas. By default, this record is written to a file called
+            unison.log in the user's home directory (the value of the
+            HOME environment variable). If you want it someplace else,
+            set the logfile preference to the full pathname you want
+            Unison to use.
+          + Added an ignorenot preference that maintains a set of
+            patterns for paths that should definitely not be ignored,
+            whether or not they match an ignore pattern. (That is, a path
+            will now be ignored iff it matches an ignore pattern and does
+            not match any ignorenot patterns.)
+     * User-interface improvements:
+          + Roots are now displayed in the user interface in the same
+            order as they were given on the command line or in the
+            preferences file.
+          + When the batch preference is set, the graphical user
+            interface no longer waits for user confirmation when it
+            displays a warning message: it simply pops up an advisory
+            window with a Dismiss button at the bottom and keeps on
+            going.
+          + Added a new preference for controlling how many status
+            messages are printed during update detection: statusdepth
+            controls the maximum depth for paths on the local machine
+            (longer paths are not displayed, nor are non-directory
+            paths). The value should be an integer; default is 1.
+          + Removed the trace and silent preferences. They did not seem
+            very useful, and there were too many preferences for
+            controlling output in various ways.
+          + The text UI now displays just the default command (the one
+            that will be used if the user just types <return>) instead of
+            all available commands. Typing ? will print the full list of
+            possibilities.
+          + The function that finds the canonical hostname of the local
+            host (which is used, for example, in calculating the name of
+            the archive file used to remember which files have been
+            synchronized) normally uses the gethostname operating system
+            call. However, if the environment variable
+            UNISONLOCALHOSTNAME is set, its value will now be used
+            instead. This makes it easier to use Unison in situations
+            where a machine's name changes frequently (e.g., because it
+            is a laptop and gets moved around a lot).
+          + File owner and group are now displayed in the "detail window"
+            at the bottom of the screen, when unison is configured to
+            synchronize them.
+     * For hackers:
+          + Updated to Jacques Garrigue's new version of lablgtk, which
+            means we can throw away our local patched version.
+            If you're compiling the GTK version of unison from sources,
+            you'll need to update your copy of lablgtk to the developers
+            release. (Warning: installing lablgtk under Windows is
+            currently a bit challenging.)
+          + The TODO.txt file (in the source distribution) has been
+            cleaned up and reorganized. The list of pending tasks should
+            be much easier to make sense of, for people that may want to
+            contribute their programming energies. There is also a
+            separate file BUGS.txt for open bugs.
+          + The Tk user interface has been removed (it was not being
+            maintained and no longer compiles).
+          + The debug preference now prints quite a bit of additional
+            information that should be useful for identifying sources of
+            problems.
+          + The version number of the remote server is now checked right
+            away during the connection setup handshake, rather than
+            later. (Somebody sent a bug report of a server crash that
+            turned out to come from using inconsistent versions: better
+            to check this earlier and in a way that can't crash either
+            client or server.)
+          + Unison now runs correctly on 64-bit architectures (e.g. Alpha
+            linux). We will not be distributing binaries for these
+            architectures ourselves (at least for a while) but if someone
+            would like to make them available, we'll be glad to provide a
+            link to them.
+     * Bug fixes:
+          + Pattern matching (e.g. for ignore) is now case-insensitive
+            when Unison is in case-insensitive mode (i.e., when one of
+            the replicas is on a windows machine).
+          + Some people had trouble with mysterious failures during
+            propagation of updates, where files would be falsely reported
+            as having changed during synchronization. This should be
+            fixed.
+          + Numerous smaller fixes.
+
+   Changes since 2.4.1:
+     * Added a number of 'sorting modes' for the user interface. By
+       default, conflicting changes are displayed at the top, and the
+       rest of the entries are sorted in alphabetical order. This
+       behavior can be changed in the following ways:
+          + Setting the sortnewfirst preference to true causes newly
+            created files to be displayed before changed files.
+          + Setting sortbysize causes files to be displayed in increasing
+            order of size.
+          + Giving the preference sortfirst=<pattern> (where <pattern> is
+            a path descriptor in the same format as 'ignore' and 'follow'
+            patterns, causes paths matching this pattern to be displayed
+            first.
+          + Similarly, giving the preference sortlast=<pattern> causes
+            paths matching this pattern to be displayed last.
+       The sorting preferences are described in more detail in the user
+       manual. The sortnewfirst and sortbysize flags can also be accessed
+       from the 'Sort' menu in the grpahical user interface.
+     * Added two new preferences that can be used to change unison's
+       fundamental behavior to make it more like a mirroring tool instead
+       of a synchronizer.
+          + Giving the preference prefer with argument <root> (by adding
+            -prefer <root> to the command line or prefer=<root>) to your
+            profile) means that, if there is a conflict, the contents of
+            <root> should be propagated to the other replica (with no
+            questions asked). Non-conflicting changes are treated as
+            usual.
+          + Giving the preference force with argument <root> will make
+            unison resolve all differences in favor of the given root,
+            even if it was the other replica that was changed.
+       These options should be used with care! (More information is
+       available in the manual.)
+     * Small changes:
+          + Changed default answer to 'Yes' in all two-button dialogs in
+            the graphical interface (this seems more intuitive).
+          + The rsync preference has been removed (it was used to
+            activate rsync compression for file transfers, but rsync
+            compression is now enabled by default).
+          + In the text user interface, the arrows indicating which
+            direction changes are being propagated are printed
+            differently when the user has overridded Unison's default
+            recommendation (====> instead of ---->). This matches the
+            behavior of the graphical interface, which displays such
+            arrows in a different color.
+          + Carriage returns (Control-M's) are ignored at the ends of
+            lines in profiles, for Windows compatibility.
+          + All preferences are now fully documented in the user manual.
+
+   Changes since 2.3.12:
+     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
+       synchronize your replicas before upgrading, to avoid spurious
+       conflicts. The first sync after upgrading will be slow.
+     * New/improved functionality:
+          + A new preference -sortbysize controls the order in which
+            changes are displayed to the user: when it is set to true,
+            the smallest changed files are displayed first. (The default
+            setting is false.)
+          + A new preference -sortnewfirst causes newly created files to
+            be listed before other updates in the user interface.
+          + We now allow the ssh protocol to specify a port.
+          + Incompatible change: The unison: protocol is deprecated, and
+            we added file: and socket:. You may have to modify your
+            profiles in the .unison directory. If a replica is specified
+            without an explicit protocol, we now assume it refers to a
+            file. (Previously "//saul/foo" meant to use SSH to connect to
+            saul, then access the foo directory. Now it means to access
+            saul via a remote file mechanism such as samba; the old
+            effect is now achieved by writing ssh://saul/foo.)
+          + Changed the startup sequence for the case where roots are
+            given but no profile is given on the command line. The new
+            behavior is to use the default profile (creating it if it
+            does not exist), and temporarily override its roots. The
+            manual claimed that this case would work by reading no
+            profile at all, but AFAIK this was never true.
+          + In all user interfaces, files with conflicts are always
+            listed first
+          + A new preference 'sshversion' can be used to control which
+            version of ssh should be used to connect to the server. Legal
+            values are 1 and 2. (Default is empty, which will make unison
+            use whatever version of ssh is installed as the default 'ssh'
+            command.)
+          + The situation when the permissions of a file was updated the
+            same on both side is now handled correctly (we used to report
+            a spurious conflict)
+     * Improvements for the Windows version:
+          + The fact that filenames are treated case-insensitively under
+            Windows should now be handled correctly. The exact behavior
+            is described in the cross-platform section of the manual.
+          + It should be possible to synchronize with Windows shares,
+            e.g., //host/drive/path.
+          + Workarounds to the bug in syncing root directories in
+            Windows. The most difficult thing to fix is an ocaml bug:
+            Unix.opendir fails on c: in some versions of Windows.
+     * Improvements to the GTK user interface (the Tk interface is no
+       longer being maintained):
+          + The UI now displays actions differently (in blue) when they
+            have been explicitly changed by the user from Unison's
+            default recommendation.
+          + More colorful appearance.
+          + The initial profile selection window works better.
+          + If any transfers failed, a message to this effect is
+            displayed along with 'Synchronization complete' at the end of
+            the transfer phase (in case they may have scrolled off the
+            top).
+          + Added a global progress meter, displaying the percentage of
+            total bytes that have been transferred so far.
+     * Improvements to the text user interface:
+          + The file details will be displayed automatically when a
+            conflict is been detected.
+          + when a warning is generated (e.g. for a temporary file left
+            over from a previous run of unison) Unison will no longer
+            wait for a response if it is running in -batch mode.
+          + The UI now displays a short list of possible inputs each time
+            it waits for user interaction.
+          + The UI now quits immediately (rather than looping back and
+            starting the interaction again) if the user presses 'q' when
+            asked whether to propagate changes.
+          + Pressing 'g' in the text user interface will proceed
+            immediately with propagating updates, without asking any more
+            questions.
+     * Documentation and installation changes:
+          + The manual now includes a FAQ, plus sections on common
+            problems and on tricks contributed by users.
+          + Both the download page and the download directory explicitly
+            say what are the current stable and beta-test version
+            numbers.
+          + The OCaml sources for the up-to-the-minute developers'
+            version (not guaranteed to be stable, or even to compile, at
+            any given time!) are now available from the download page.
+          + Added a subsection to the manual describing cross-platform
+            issues (case conflicts, illegal filenames)
+     * Many small bug fixes and random improvements.
+
+   Changes since 2.3.1:
+     * Several bug fixes. The most important is a bug in the rsync module
+       that would occasionally cause change propagation to fail with a
+       'rename' error.
+
+   Changes since 2.2:
+     * The multi-threaded transport system is now disabled by default.
+       (It is not stable enough yet.)
+     * Various bug fixes.
+     * A new experimental feature:
+       The final component of a -path argument may now be the wildcard
+       specifier *. When Unison sees such a path, it expands this path on
+       the client into into the corresponding list of paths by listing
+       the contents of that directory.
+       Note that if you use wildcard paths from the command line, you
+       will probably need to use quotes or a backslash to prevent the *
+       from being interpreted by your shell.
+       If both roots are local, the contents of the first one will be
+       used for expanding wildcard paths. (Nb: this is the first one
+       after the canonization step - i.e., the one that is listed first
+       in the user interface - not the one listed first on the command
+       line or in the preferences file.)
+
+   Changes since 2.1:
+     * The transport subsystem now includes an implementation by Sylvain
+       Gommier and Norman Ramsey of Tridgell and Mackerras's rsync
+       protocol. This protocol achieves much faster transfers when only a
+       small part of a large file has been changed by sending just diffs.
+       This feature is mainly helpful for transfers over slow links--on
+       fast local area networks it can actually degrade performance--so
+       we have left it off by default. Start unison with the -rsync
+       option (or put rsync=true in your preferences file) to turn it on.
+     * "Progress bars" are now diplayed during remote file transfers,
+       showing what percentage of each file has been transferred so far.
+     * The version numbering scheme has changed. New releases will now be
+       have numbers like 2.2.30, where the second component is
+       incremented on every significant public release and the third
+       component is the "patch level."
+     * Miscellaneous improvements to the GTK-based user interface.
+     * The manual is now available in PDF format.
+     * We are experimenting with using a multi-threaded transport
+       subsystem to transfer several files at the same time, making much
+       more effective use of available network bandwidth. This feature is
+       not completely stable yet, so by default it is disabled in the
+       release version of Unison.
+       If you want to play with the multi-threaded version, you'll need
+       to recompile Unison from sources (as described in the
+       documentation), setting the THREADS flag in Makefile.OCaml to
+       true. Make sure that your OCaml compiler has been installed with
+       the -with-pthreads configuration option. (You can verify this by
+       checking whether the file threads/threads.cma in the OCaml
+       standard library directory contains the string -lpthread near the
+       end.)
+
+   Changes since 1.292:
+     * Reduced memory footprint (this is especially important during the
+       first run of unison, where it has to gather information about all
+       the files in both repositories).
+     * Fixed a bug that would cause the socket server under NT to fail
+       after the client exits.
+     * Added a SHIFT modifier to the Ignore menu shortcut keys in GTK
+       interface (to avoid hitting them accidentally).
+
+   Changes since 1.231:
+     * Tunneling over ssh is now supported in the Windows version. See
+       the installation section of the manual for detailed instructions.
+     * The transport subsystem now includes an implementation of the
+       rsync protocol, built by Sylvain Gommier and Norman Ramsey. This
+       protocol achieves much faster transfers when only a small part of
+       a large file has been changed by sending just diffs. The rsync
+       feature is off by default in the current version. Use the -rsync
+       switch to turn it on. (Nb. We still have a lot of tuning to do:
+       you may not notice much speedup yet.)
+     * We're experimenting with a multi-threaded transport subsystem,
+       written by Jerome Vouillon. The downloadable binaries are still
+       single-threaded: if you want to try the multi-threaded version,
+       you'll need to recompile from sources. (Say make THREADS=true.)
+       Native thread support from the compiler is required. Use the
+       option -threads N to select the maximal number of concurrent
+       threads (default is 5). Multi-threaded and single-threaded
+       clients/servers can interoperate.
+     * A new GTK-based user interface is now available, thanks to Jacques
+       Garrigue. The Tk user interface still works, but we'll be shifting
+       development effort to the GTK interface from now on.
+     * OCaml 3.00 is now required for compiling Unison from sources. The
+       modules uitk and myfileselect have been changed to use labltk
+       instead of camltk. To compile the Tk interface in Windows, you
+       must have ocaml-3.00 and tk8.3. When installing tk8.3, put it in
+       c:\Tcl rather than the suggested c:\Program Files\Tcl, and be sure
+       to install the headers and libraries (which are not installed by
+       default).
+     * Added a new -addversionno switch, which causes unison to use
+       unison-<currentversionnumber> instead of just unison as the remote
+       server command. This allows multiple versions of unison to coexist
+       conveniently on the same server: whichever version is run on the
+       client, the same version will be selected on the server.
+
+   Changes since 1.219:
+     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
+       synchronize your replicas before upgrading, to avoid spurious
+       conflicts. The first sync after upgrading will be slow.
+     * This version fixes several annoying bugs, including:
+          + Some cases where propagation of file permissions was not
+            working.
+          + umask is now ignored when creating directories
+          + directories are create writable, so that a read-only
+            directory and its contents can be propagated.
+          + Handling of warnings generated by the server.
+          + Synchronizing a path whose parent is not a directory on both
+            sides is now flagged as erroneous.
+          + Fixed some bugs related to symnbolic links and nonexistant
+            roots.
+               o When a change (deletion or new contents) is propagated
+                 onto a 'follow'ed symlink, the file pointed to by the
+                 link is now changed. (We used to change the link itself,
+                 which doesn't fit our assertion that 'follow' means the
+                 link is completely invisible)
+               o When one root did not exist, propagating the other root
+                 on top of it used to fail, becuase unison could not
+                 calculate the working directory into which to write
+                 changes. This should be fixed.
+     * A human-readable timestamp has been added to Unison's archive
+       files.
+     * The semantics of Path and Name regular expressions now correspond
+       better.
+     * Some minor improvements to the text UI (e.g. a command for going
+       back to previous items)
+     * The organization of the export directory has changed -- should be
+       easier to find / download things now.
+
+   Changes since 1.200:
+     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
+       synchronize your replicas before upgrading, to avoid spurious
+       conflicts. The first sync after upgrading will be slow.
+     * This version has not been tested extensively on Windows.
+     * Major internal changes designed to make unison safer to run at the
+       same time as the replicas are being changed by the user.
+     * Internal performance improvements.
+
+   Changes since 1.190:
+     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
+       synchronize your replicas before upgrading, to avoid spurious
+       conflicts. The first sync after upgrading will be slow.
+     * A number of internal functions have been changed to reduce the
+       amount of memory allocation, especially during the first
+       synchronization. This should help power users with very big
+       replicas.
+     * Reimplementation of low-level remote procedure call stuff, in
+       preparation for adding rsync-like smart file transfer in a later
+       release.
+     * Miscellaneous bug fixes.
+
+   Changes since 1.180:
+     * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you
+       synchronize your replicas before upgrading, to avoid spurious
+       conflicts. The first sync after upgrading will be slow.
+     * Fixed some small bugs in the interpretation of ignore patterns.
+     * Fixed some problems that were preventing the Windows version from
+       working correctly when click-started.
+     * Fixes to treatment of file permissions under Windows, which were
+       causing spurious reports of different permissions when
+       synchronizing between windows and unix systems.
+     * Fixed one more non-tail-recursive list processing function, which
+       was causing stack overflows when synchronizing very large
+       replicas.
+
+   Changes since 1.169:
+     * The text user interface now provides commands for ignoring files.
+     * We found and fixed some more non-tail-recursive list processing
+       functions. Some power users have reported success with very large
+       replicas.
+     * INCOMPATIBLE CHANGE: Files ending in .tmp are no longer ignored
+       automatically. If you want to ignore such files, put an
+       appropriate ignore pattern in your profile.
+     * INCOMPATIBLE CHANGE: The syntax of ignore and follow patterns has
+       changed. Instead of putting a line of the form
+                 ignore = <regexp>
+       in your profile (.unison/default.prf), you should put:
+                 ignore = Regexp <regexp>
+       Moreover, two other styles of pattern are also recognized:
+                 ignore = Name <name>
+       matches any path in which one component matches <name>, while
+                 ignore = Path <path>
+       matches exactly the path <path>.
+       Standard "globbing" conventions can be used in <name> and <path>:
+          + a ? matches any single character except /
+          + a * matches any sequence of characters not including /
+          + [xyz] matches any character from the set {x, y, z }
+          + {a,bb,ccc} matches any one of a, bb, or ccc.
+       See the user manual for some examples.
+
+   Changes since 1.146:
+     * Some users were reporting stack overflows when synchronizing huge
+       directories. We found and fixed some non-tail-recursive list
+       processing functions, which we hope will solve the problem. Please
+       give it a try and let us know.
+     * Major additions to the documentation.
+
+   Changes since 1.142:
+     * Major internal tidying and many small bugfixes.
+     * Major additions to the user manual.
+     * Unison can now be started with no arguments - it will prompt
+       automatically for the name of a profile file containing the roots
+       to be synchronized. This makes it possible to start the graphical
+       UI from a desktop icon.
+     * Fixed a small bug where the text UI on NT was raising a 'no such
+       signal' exception.
+
+   Changes since 1.139:
+     * The precompiled windows binary in the last release was compiled
+       with an old OCaml compiler, causing propagation of permissions not
+       to work (and perhaps leading to some other strange behaviors we've
+       heard reports about). This has been corrected. If you're using
+       precompiled binaries on Windows, please upgrade.
+     * Added a -debug command line flag, which controls debugging of
+       various modules. Say -debug XXX to enable debug tracing for module
+       XXX, or -debug all to turn on absolutely everything.
+     * Fixed a small bug where the text UI on NT was raising a 'no such
+       signal' exception.
+
+   Changes since 1.111:
+     * INCOMPATIBLE CHANGE: The names and formats of the preference files
+       in the .unison directory have changed. In particular:
+          + the file "prefs" should be renamed to default.prf
+          + the contents of the file "ignore" should be merged into
+            default.prf. Each line of the form REGEXP in ignore should
+            become a line of the form ignore = REGEXP in default.prf.
+     * Unison now handles permission bits and symbolic links. See the
+       manual for details.
+     * You can now have different preference files in your .unison
+       directory. If you start unison like this
+             unison profilename
+       (i.e. with just one "anonymous" command-line argument), then the
+       file ~/.unison/profilename.prf will be loaded instead of
+       default.prf.
+     * Some improvements to terminal handling in the text user interface
+     * Added a switch -killServer that terminates the remote server
+       process when the unison client is shutting down, even when using
+       sockets for communication. (By default, a remote server created
+       using ssh/rsh is terminated automatically, while a socket server
+       is left running.)
+     * When started in 'socket server' mode, unison prints 'server
+       started' on stderr when it is ready to accept connections. (This
+       may be useful for scripts that want to tell when a socket-mode
+       server has finished initalization.)
+     * We now make a nightly mirror of our current internal development
+       tree, in case anyone wants an up-to-the-minute version to hack
+       around with.
+     * Added a file CONTRIB with some suggestions for how to help us make
+       Unison better.
+
+

Deleted: branches/2.40/src/RECENTNEWS
===================================================================
--- trunk/src/RECENTNEWS	2010-02-17 13:06:38 UTC (rev 410)
+++ branches/2.40/src/RECENTNEWS	2010-02-20 23:23:17 UTC (rev 412)
@@ -1,692 +0,0 @@
-CHANGES FROM VERSION 2.40.1
-
-* Bumped version number: incompatible protocol changes
-
-* Ignore one-second differences when synchronizing modification time.
-  (Technically, this is an incompatible archive format change, but it
-   is backward compatible.  To trigger a problem, a user would have to
-   synchronize modification times on a filesystem with a two-second
-   granularity and then downgrade to a previous version of Unison,
-   which does not work well in such a case.  Thus, it does not
-   seem worthwhile to increment the archive format number, which would
-   impact all users.)
-
--------------------------------
-CHANGES FROM VERSION 2.39.12
-
-* Mac OS: fixed rsync bug which could result in an "index out of bounds"
-  error when transferring resource forks.
-
--------------------------------
-CHANGES FROM VERSION 2.39.6
-
-* Fixed "assertion failed" error introduced in last commit...
-
--------------------------------
-CHANGES FROM VERSION 2.39.6
-
-* Fixed bug which made Unison ignore finder information and resource
-  fork when compiled to 64bit on Mac OSX.
-* Use asynchronous I/O under Windows
-
--------------------------------
-CHANGES FROM VERSION 2.39.6
-
-* Made a server waiting on a socket more resilient to unexpected
-  lost connections from the client.
-* Fixed possible race condition in half-duplex communication mode.
-* Minor other changes...
-
--------------------------------
-CHANGES FROM VERSION 2.39.6
-
-* Implemented 'partial' versions of 'noupdate', 'nodeletion' and 'nocreation'
-* Check sooner (before connecting to another machine) that the roots
-  given as argument to all these preference are well-formed
--------------------------------
-CHANGES FROM VERSION 2.39.4
-
-* New preferences "noupdate=root", "nodeletion=root", "nocreation=root"
-  that prevent Unison from performing files updates, deletions or
-  creations on the given root.
-* GTK UI: do not reload the preference file before a new update
-  detection if it is unchanged
-* Limit the number of simultaneous external copy program
-  ("copymax" preference)
-
--------------------------------
-CHANGES FROM VERSION 2.39.4
-
-* GTK UI:
-  - take into account the "height" preference again
-  - the internal list of selected reconciler item was not always in
-    sync with what was displayed (GTK bug?); workaround implemented
-* Do not display "Looking for change" messages during propagation
-  (when checking the targe is unchanged) but only during update detection
-* Now use an opaque datatype for file descriptors in Lwt
-
--------------------------------
-CHANGES FROM VERSION 2.39.0
-
-* Mac GUIs (NEED TESTING):
-  - use doubles rather than ints for file sizes to prevent overflows
-  - should now be 64 bit clean (the Growl framework is not up to date,
-    though)
-  - fixes from uimacnew09 copied back to uimacnew
-  - made the bridge between Objective C and Ocaml code GC friendly
-    (it was allocating ML values and putting them in an array which
-    was not registered with the GC)
-* Windows: only use long UNC path for accessing replicas (as '..' is
-  not handled with this format of paths, but can be useful)
-* Bumped fingerprint cache magic number (the format was changed in
-  revision 398)
-
--------------------------------
-CHANGES FROM VERSION 2.39.0
-
-* Back out some minimal support we'd added for checking out Unison sources via Bazaar.
-
-* Small fix for OSX GUI
-
-
-
--------------------------------
-CHANGES FROM VERSION 2.39.0
-
-* The "ignorearchives" preference now works.
-* When Unison detects that the archive case-sensitivity mode
-  does not match the current settings, it populates the fingerprint
-  cache using the archive contents.  This way, changing the
-  case-sensitivity mode should be reasonably fast.
-
--------------------------------
-CHANGES FROM VERSION 2.39.0
-
-* MacOS GUI:
-  - improved exception handling (untested code, might not even compile)
-
--------------------------------
-CHANGES FROM VERSION 2.39.0
-
-* Bumped version number: incompatible protocol changes
-
-* Resume copy of partially transferred files.
-* Unicode mode is now the default when one of the hosts is under
-  Windows or MacOS.  This may make upgrades a bit more painful (the
-  archives cannot be reused), but this is a much saner default.
-* Fastcheck is now the default under Windows.  People mostly use NTFS
-  nowadays and the Unicode API provides an equivalent to inode numbers
-  for this filesystem.
-* Unison now fails if in unicode case-insensitive mode but the archive
-  mode is not known (this means that we are upgrading from an older
-  version which did not support this mode)
-* Changed the type of trivalued preferences (true/false/default) to an
-  enumerated type
-* Removed the "reusewindows" preference, which was not used anymore.
-* GTK UI: do not reposition the file list on focus change
-
--------------------------------
-CHANGES FROM VERSION 2.38.5
-
-* Fix the fingerprint cache so that it works also with multiple paths
-
--------------------------------
-CHANGES FROM VERSION 2.38.5
-
-* GTK UI:
-  - do not reposition the file list when updating the detail view
-    anymore
-  - added Ctrl+Q as a shortcut for quitting besides just the key Q
-
--------------------------------
-CHANGES FROM VERSION 2.38.5
-
-* Implemented an on-disk file fingerprint cache to speed-up update
-  detection after a crash: this way, Unison does not have do recompute
-  all the file fingerprints from scratch.
-
--------------------------------
-CHANGES FROM VERSION 2.38.0
-
-* Roll back a previous "fix" for a permission-setting issue and
-  introduce a better one (as suggested by Jerome)
-
--------------------------------
-CHANGES FROM VERSION 2.38.0
-
-* GTK UI:
-  - revert to the previous action pixmaps
-  - made the progress bar slightly larger
-* MacOS GUI:
-  - use darker grey arrows (patch contributed by Eric Y. Kow)
-* Make STATIC=true kind of work again (though it is not possible to
-  make completely statically linked binaries with the glibc library)
-* Windows: added support for long UNC paths
-* Do not keep many files simultaneously opened anymore when the rsync
-  algorithm is in use
-* IPV6: properly deal with Unix errors, so that Unison correctly fall
-  backs to IPV4 if the kernel does not support IPV6
-
--------------------------------
-CHANGES FROM VERSION 2.38.0
-
-* Incorporated new version of OSX GUI with numerous improvements and
-  bugfixes by Markus Gross.  (Not compiling yet on my machine, though.)
-
--------------------------------
-CHANGES FROM VERSION 2.38.0
-
-* Small doc tweak in tutorial
-
-* Add preference to ignore existing archives (to avoid forcing users
-  to delete them manually, in situations where one archive has gotten
-  deleted or corrupted).
-
-* Small patch to property setting code suggested by Ulrich Gernkow.
-
-* Apply patch to fix some crashes in the OSX GUI, thanks to Onne Gorter.
-
-
--------------------------------
-CHANGES FROM VERSION 2.37.11
-
-* Fixed incompatible protocol change introduced in last commit
-  (the type of some preferences was changed)
-
--------------------------------
-CHANGES FROM VERSION 2.37.10
-
-* GTK UI:
-  - assistant for creating profiles
-  - profile editor
-
--------------------------------
-CHANGES FROM VERSION 2.37.5
-
-* Makefile tweak: don't complain if etags is not found (I hope I got my bash syntax right...)
-
--------------------------------
-CHANGES FROM VERSION 2.37.5
-
-* Transfer by rsync: fixed string token length overflow due to recent
-  changes in block size.
-
--------------------------------
-CHANGES FROM VERSION 2.37.5
-
-* Transfer by rsync algorithm: fix the hashtable size limit to be
-  below the maximum length of an array.
-
--------------------------------
-CHANGES FROM VERSION 2.37.5
-
-* GTK UI:
-  - pop up a summary window when the replicas are not fully
-    synchronized after transport
-  - always show the main window
-  - put a white border around pixmaps (arrows, ...) for better
-    contrast
-  - allow simultaneous selection of several items
-  - several other small tweaks...
-* Improved arguments to the external program used for copying large
-  files
-
--------------------------------
-CHANGES FROM VERSION 2.37.5
-
-* Windows text UI: now put the console into UTF-8 output mode.  This
-  is the right thing to do when in Unicode mode, and is no worse than
-  what we had previously otherwise (the console use some esoteric
-  encoding by default).  This only works when using a Unicode font
-  instead of the default raster font.
-* Windows text UI: put the terminal into raw mode
-* Incorrect paths ("path" directive) now result in an error update
-  item rather than a fatal error.
-* Ignore any BOM (byte-order mark) character at the beginning of
-  profile files (this character is produced by many tools under
-  Windows)
-
--------------------------------
-CHANGES FROM VERSION 2.37.1
-
-* Disabled the new directory fast check optimization under Windows, as
-  Windows does not update the directory modification time when a
-  directory contents changes on a FAT filesystem.
-* Use inode numbers in fast check mode when using the Windows Unicode
-  API or Cygwin
-* Do not print the "Connected [...]" message when both replicas are local
-
--------------------------------
-CHANGES FROM VERSION 2.37.1
-
-* Bumped version number: incompatible protocol changes
-
-* Create parent directories (with correct permissions) during
-  transport for paths which point to non-existent locations in the
-  destination replica.
-* Keep track of which file contents are being transferred, and delay
-  the transfer of a file when another file with the same contents is
-  currently being transferred.  This way, the second transfer can be
-  skipped and replaced by a local copy.
-* Changes to the implementation of the rsync algorithm:
-  - use longer blocks for large files (the size of a block is the
-    square root of the size of the file for large files);
-  - transmit less checksum information per block (we still have less
-    than one chance in a hundred million of transferring a file
-    incorrectly, and Unison will catch any transfer error when
-    fingerprinting the whole file)
-  - avoid transfer overhead (which was 4 bytes per block)
-  For a 1G file, the first optimization saves a factor 50 on the
-  amount of data transferred from the target to the source (blocks
-  are 32768 bytes rather than just 700 bytes).  The two other
-  optimizations save another factor of 2 (from 24 bytes per block
-  down to 10).
-
-* New "links" preference.  When set to false, Unison will report an
-  error on symlinks during update detection.  (This is the default
-  when one host is running Windows but not Cygwin.)  This is better
-  than failing during propagation.
-* Added a preference "halfduplex" to force half-duplex communication
-  with the server.  This may be useful on unreliable links (as a more
-  efficient alternative to "maxthreads = 1").
-* Renamed preference "pretendwin" to "ignoreinodenumbers" (an alias is
-  kept for backwards compatibility).
-* GTK UI: display estimated remaining time and transfer rate on the
-  progress bar
-* GTK UI: some polishing; in particular:
-  - stop statistics window updates when idle (save power on laptops)
-  - some ok and cancel buttons were in the wrong order
-
-* Added some support for making it easier to extend Unison without
-  breaking backwards compatibility.
-  - Possibility to mark a preference as local.  Such a preference is
-    propagated if possible but will not result in an error if it is
-    not found server-side.  This make it possible to add new
-    functionalities client-side without breaking compatibility.
-  - Added a function [Remove.commandAvailable] which tests whether a
-    command is available on a given root.
-* Removed hack in findUpdates that would update the archive in a
-  visible way for the sake of path translation: it is no longer
-  needed.
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* Performance improvement in Xferhint module.
-  Update this cache more accurately during transport.
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* Correction to previous fix: do not perform the optimization for
-  directories with ignored children *in the archive*. (The previous
-  fix was also rejecting directories with ignored children on disk,
-  which is way too conservative.)
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* Fixed small bug in new update detection optimization:
-  do not perform the optimization for directories with ignored
-  children in the archive.  Indeed, we cannot rely on the archive in
-  this case instead of reading the directory contents from the
-  filesystem (systematically pruning the ignored children from the
-  archive is too costly).
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* Experimental update detection optimization:
-  do not read the contents of unchanged directories
-* MyMap.map and MyMap.mapi now iterate in increasing order
-  (rather than in an unspecified way)
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* GTK UI: disabled scrolling to the first unfinished item during transport.
-  It goes way too fast when lot of small files are synchronized, and it
-  makes it impossible to browse the file list during transport.
-* Fixed computation of the amount of data to transfer: property updates
-  should count for zero.
-* Mac GUI: use Unicode.protect to ensure that all string displayed are
-  encoded in UTF-8.
-* In Unicode case-insensitive mode, use filenames in NFC normal form
-  when tranferring files
-* Added a property list at the end of the archive file.  This is a
-  better way to extend the format than the hack currently used to
-  store the case-sensitivity mode.
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* When a file transfer fails, turn off fastcheck for this file on the
-  next sync.
-* Limit the number of simultaneous transfer using rsync
-  (as the rsync algorithm can use a large amount of memory when
-   processing huge files)
-* Raise the number of concurrent threads, as there is not much reason
-  to leave it low anymore.
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* Clean-up in remote.ml
-* Dead-lock free flow control mechanism
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* Fixed bug with case insensitive mode on a case sensitive filesystem:
-  - if file "a/a" is created on one replica and directory "A" is
-    created on the other, the file failed to be synchronized the first
-    time Unison is run afterwards, as Unison uses the wrong path "a/a"
-    (if Unison is run again, the directories are in the archive, so
-     the right path is used);
-  - if file "a" appears on one replica and file "A" appears on the
-    other with a different contents, Unison was unable to synchronized
-    them.
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* Accurate computation of the amount of data to transfer
-* Accurate update of the amount of data transferred, including:
-  - when transferring by copying on the remote host
-  - when the file was already transferred to the remote host
-  - in case of errors
-* Text UI: list partially transferred directories in transfer summary
-  and use appropriate exit code (indicating that some files were skipped)
-* Improved error reporting when the destination is updated during
-  synchronization: Unison now tells which file has been updated, and how.
-* Fix include directive failure when the line ends by CRLF
-  (the CR was not removed)
-* Limit the length of temporary file names
-* Ignore errors when writing to the log file
-* Mac UI: some performance improvements
-* GTK UI: possibility to display errors in auxiliary detail window +
-  other small changes
-* Save archive after update detection when there is no archive on disk yet
-* GTK UI: Made restart work also when roots are given from the command line
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* Allow partial transfer of a directory when there was an error deep
-  inside this directory during update detection.  At the moment, this
-  is only activated with the text and GTK UIs, which have been
-  modified so that they show that the transfer is going to be partial
-  and so that they can display all errors.
-* Changed types Common.replicaContent and Common.replicas to use
-  records rather than tuples, as this is more readable and easier to
-  extend.
-
--------------------------------
-CHANGES FROM VERSION 2.36.-27
-
-* Bumped version number: incompatible protocol changes
-
-* Partial transfer of directories.  If an error occurs while
-  transferring a directory, the part transferred so far is copied into
-  place (and the archives are updated accordingly).
-  The "maxerrors" preference controls how many transfer error Unison
-  will accept before stopping the transfer of a directory (by default,
-  only one).  This makes it possible to transfer most of a directory
-  even if there are some errors.  Currently, only the first error is
-  reported by the GUIs.
-* Save a copy of a failed transfer only when the source file is
-  unchanged.
-* Function Trace.log is not called anymore from Copy.tryCopyMovedFile
-  as Trace.log performs a callback to the client inside a Lwt_unix.run
-  event loop, which introduces spurious synchronization between
-  threads.  Instead, the function returns a message which is sent back
-  to the client.
-* Code reorganization in files.ml/update.ml to minimize the number of
-  network roundtrips.
-
--------------------------------
-CHANGES FROM VERSION 2.35.-17
-
-* Various small changes
-
--------------------------------
-CHANGES FROM VERSION 2.35.-17
-
-* Use a better file name for keeping a copy of an incorrectly
-  transferred file.  In particular, this is now a temp filename, and
-  Unison will not try to propagate it next time it is run.
-* In function Stasher.backup, use Fspath.findWorkingDir to find the
-  right file to rename or delete, possibly following symlinks.
-* Uigtk2: relabelled "Restart" button to "Rescan"
-* Uigtk2: performance improvements
-* Don't get the home directory from environment variable HOME under
-  Windows (except for Cygwin binaries): we don't want the behavior of
-  Unison to depends on whether it is run from a Cygwin shell (where
-  HOME is set) or in any other way (where HOME is usually not set).
-* Unicode normalization: put characters in canonical order
-* Fixed recently introduced bug in Update.postCommitArchive
-* Uicommon: always reparse the command line when loading a profile
-  (not just the first time)
-
--------------------------------
-CHANGES FROM VERSION 2.35.-17
-
-* Properly deals with non-conformant AppleDouble files produced by Mac
-  OS X; for compatibility, produce AppleDouble files with the same
-  structure as the one produced by Mac OS X.
-* Fixed a bug that resulted in Unison missing ressource fork changes
-* Windows Unicode API: use hard links when available when commiting
-  the archive to disk
-
--------------------------------
-CHANGES FROM VERSION 2.35.-17
-
-* Fixed bug introduced during file transfer cleanup that could lead to
-  uncaught exceptions
-* Simplified function validate in myMap.ml
-* Mac OS: do not check filler contents in Apple Double files
-  (the spec says it should be all zeroes, but Mac OS sets it to
-   "Mac OS X        "...)
-* Use a hard link rather than a copy when possible for creating the
-  MainArch-files in Update.postCommitArchive
-* Remove duplicate calls to Stasher.stashCurrentVersion in update.ml
-  (as well as now unnecessary calls to Update.updateArchive in files.ml)
-
--------------------------------
-CHANGES FROM VERSION 2.35.-17
-
-* Fixed bug resulting in slow performances when transferring a file
-  using our rsync implementation from a 64-bit architecture to a
-  32-bit architecture.
-
--------------------------------
-CHANGES FROM VERSION 2.35.-17
-
-* Bumped minor version: many incompatible protocol changes
-
-* Message lengths are checksummed to guard against protocol corruption
-  (no more [Invalid_argument "String.create"])
-
-* Experimental streaming protocol for transferring file contents (can
-  be disabled by setting the directive "stream" to false): file
-  contents is transfered asynchronously (without waiting for a response
-  from the destination after each chunk sent) rather than using the
-  synchronous RPC mechanism.  As a consequence:
-  - Unison now transfers the contents of a single file at a time
-    (Unison used to transfer several contents simultaneously in order
-    to hide the connection latency.)
-  - the transfer of large files uses the full available bandwidth
-    and is not slowed done due to the connection latency anymore
-  - we get performance improvement for small files as well by
-    scheduling many files simultaneously (as scheduling a file for
-    transfer consume little ressource: it does not mean allocating a
-    large buffer anymore)
-
-* Improvement to the code for resuming directory transfers:
-  - if a file was not correctly transferred (or the source has been
-    modified since, with unchanged size), Unison performs a new
-    transfer rather than failing
-  - spurious files are deleted (this can happen if a file is deleted
-    on the source replica before resuming the transfer; not deleting
-    the file would result in it reappearing on the target replica)
-
-* More file transfer implementation cleanup.  In particular, the
-  "paranoid check" (checking whether the file has been correctly
-  transferred) is moved to copy.ml.  This way, one can avoid computing
-  a file fingerprint twice when a file is already transferred, and
-  when using the "transfer by copying" optimization.
-  The check of the source file is also moved to copy.ml, so if the
-  paranoid check fails, we can tell whether this is due to the source
-  file being modified.
-
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Improvement to the code for resuming directory transfers:
-  - make sure file information (permissions, ...) has been properly set
-    when using a previously transferred temp file
-  - make sure previously transferred directories are writable
-* Some cleanup in file transfer implementation
-* Got rid of all occurrences of "try ... with _ -> ..."
-* Removed ctime field from Fileinfo.t
-* Fixed bug in Lwt_unix.run which could make it fail with a Not_found
-  exception
-
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Fix to the Mac GUI: the bigarray library is now required
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Case sensitivity information put in the archive (in a backward
-  compatible way) and checked when the archive is loaded
-
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Fixed quotation of paths and names when writing to a preference file
-* Workaround for bug in new "select" implementation in Ocaml 3.11
-  (select fails with EPIPE error when monitoring a remotely closed
-   file descriptor)
-
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Windows Unicode API: when a file cannot be renamed due to a sharing
-  violation error or an access denied error, retry for up to 1 second,
-  in case the file is temporarily opened by an indexer or an anti-virus.
-
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Text UI: during update detection, display status by updating a
-  single line rather than generating a new line of output every so
-  often.  That should be less confusing.
-* Text UI: in repeat mode, don't save the archives when there is no
-  update.  Indeed, in this mode, we should minimize the amount of work
-  performed and it is unlikely that the archives have changed much.
-
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Got rid of the 16MiB marshalling limit by marshalling to a bigarray
-
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Use system dependant API for spawning processes.
-  (Unicode API under Windows.)
-* Fixed the bug with ssh not working when running unison from a cygwin
-  shell.
-* Move [protect] function (which converts a string to UTF-8 by keeping
-  all UTF-8 characters unchanged and considering all other characters
-  as ISO 8859-1 characters) from uigtk2.ml to unicode.ml, as it may be
-  useful for the other UIs.
-
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Small documentation fix suggested by mszsummer.
-
-
-
-
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Cleaned-up the Unicode selection logic
--------------------------------
-CHANGES FROM VERSION 2.34.0
-
-* Bumped minor version: incompatible protocol changes
-* The use of the Windows Unicode API is now controlled via the
-  "unicode" directive
-* Fixed bug in GTK UI: buttons could be incorrectly reenabled during
-  synchronization
-* Improved error message when trying to synchronize a symlink to a
-  Windows machine
-* Fixed compilation warnings in lwt_unix.ml and pty.c
-* Added some missing convertUnixErrorsToTransient
-
--------------------------------
-CHANGES FROM VERSION 2.33.2
-
-* Small documentation fix suggested by mszsummer.
-
-
-
-
--------------------------------
-CHANGES FROM VERSION 2.33.2
-
-* Added an abstraction layer over Unix/Sys modules in order to be able
-  to redefine all system calls involving filenames
-* Implemented corresponding bindings for the Windows Unicode API
-  (not activated by default yet)
-* Uses improved emulation of "select" call provided by Ocaml 3.11
-  under Windows (the GUI should not freeze as much during synchronization)
-
--------------------------------
-CHANGES FROM VERSION 2.33.2
-
-* Fixed predicate matching in Unicode case-insensitive mode
-
--------------------------------
-CHANGES FROM VERSION 2.33.2
-
-* Improved error messages when rejecting non-unicode encoded file names
-* uigtk2: fixed the code for transcoding from Windows Codepage 1252 to
-  UTF-8 (for some reason, I mistakenly took a table corresponding to
-  Codepage 1250 instead)
-* Windows: added icons with transparency
-
--------------------------------
-CHANGES FROM VERSION 2.33.2
-
-* Incorporate Makefile improvements from Martin von Gagern
-
--------------------------------
-CHANGES FROM VERSION 2.33.1
-
-* Incorporate recent change from 2.32 branch.
-
-
--------------------------------
-CHANGES FROM VERSION 2.33.-4
-
-* Updated list of bad Windows file names following the MSDN
-  documentation (in particular, files with trailing dots are now
-  rejected when synchronizing with a Windows machine)
-* Experimental Unicode-aware case insensitive mode.  It is activated
-  when the preference "unicode" is set to true and Unison is in
-  case-insensitive mode.
-* Bumped version number to reflect the newly added preference
-
--------------------------------
-CHANGES FROM VERSION 2.32.7
-
-* Move descriptions of recent changes to documentation.
-
-
--------------------------------

Copied: branches/2.40/src/RECENTNEWS (from rev 411, trunk/src/RECENTNEWS)
===================================================================
--- branches/2.40/src/RECENTNEWS	                        (rev 0)
+++ branches/2.40/src/RECENTNEWS	2010-02-20 23:23:17 UTC (rev 412)
@@ -0,0 +1,10 @@
+CHANGES FROM VERSION 2.40.1
+
+* Update documentation in preparation for beta-release
+
+-------------------------------
+CHANGES FROM VERSION 2.40.1
+
+* Update documentation in preparation for beta-release
+
+-------------------------------

Deleted: branches/2.40/src/mkProjectInfo.ml
===================================================================
--- trunk/src/mkProjectInfo.ml	2010-02-17 13:06:38 UTC (rev 410)
+++ branches/2.40/src/mkProjectInfo.ml	2010-02-20 23:23:17 UTC (rev 412)
@@ -1,104 +0,0 @@
-(* Program for printing project info into a Makefile.  Documentation below. *)
-
-(* FIX: When the time comes for the next alpha-release, remember to
-   increment the archive version number first. See update.ml. *)
-
-let projectName = "unison"
-let majorVersion = 2
-let minorVersion = 40
-let pointVersionOrigin = 409 (* Revision that corresponds to point version 0 *)
-
-(* Documentation:
-   This is a program to construct a version of the form Major.Minor.Point,
-   e.g., 2.10.4.
-   The Point release number is calculated from the Subversion revision number,
-   so it will be automatically incremented on svn commit.
-   The Major and Minor numbers are hard coded, as is the revision number
-   corresponding to the 0 point release.
-
-   If you want to increment the Major or Minor number, you will have to do a
-   little thinking to get the Point number back to 0.  Suppose the current svn
-   revision number is 27, and we have below
-
-        let majorVersion = 2
-        let minorVersion = 11
-        let pointVersionOrigin = 3
-
-   This means that the current Unison version is 2.11.24, since 27-3 = 24.
-   If we want to change the release to 3.0.0 we need to change things to
-
-        let majorVersion = 3
-        let minorVersion = 0
-        let pointVersionOrigin = 28
-
-   and then do a svn commit.
-
-   The first two lines are obvious.  The last line says that Subversion
-   revision 28 corresponds to a 0 point release.  Since we were at revision
-   27 and we're going to do a commit before making a release, we
-   will be at 28 after the commit and this will be Unison version 3.0.0.
-*)
-
-(* ---------------------------------------------------------------------- *)
-(* You shouldn't need to edit below. *)
-
-let revisionString = "$Rev: 410$";;
-
-(* extract a substring using a regular expression *)
-let extract_str re str =
-  let _ = Str.search_forward (Str.regexp re) str 0 in
-  Str.matched_group 1 str;;
-let extract_int re str = int_of_string (extract_str re str);;
-
-(* BCP (1/10): This bit was added to help with getting Unison via bazaar, but it
-   was never used much and I'm not confident it's working.  I'll comment it out
-   for now, but if it hasn't been needed or fixed in a few months, the next
-   person that edits this file should delete it...
-
-  (* run the bzr tool to get version information for bzr branches *)
-  exception BzrException of Unix.process_status;;
-  let bzr args =
-    let bzr = (try Sys.getenv "BZR" with Not_found -> "bzr") in
-    let cmd = bzr ^ " " ^ args in
-    let inc = Unix.open_process_in cmd in
-    let buf = Buffer.create 16 in
-    (try
-       while true do
-         Buffer.add_channel buf inc 1
-       done
-     with End_of_file -> ());
-    let status = Unix.close_process_in inc in
-    match status with
-      Unix.WEXITED 0 -> Buffer.contents buf
-    | _ -> raise (BzrException status);;
-
-  let pointVersion = if String.length revisionString > 5
-  then Scanf.sscanf revisionString "$Rev: %d " (fun x -> x) - pointVersionOrigin
-  else (* Determining the pointVersionOrigin in bzr is kind of tricky:
-          - The mentioned revision number might not be part of this branch
-          - The mentioned revision number might be rhs of some merge
-          - The bzr-svn plugin might be outdated or not installed at all
-
-          On the whole, getting this to work seems too much effort for now.
-          So we'll simply use the revno as is as the point version,
-          and revisit offsetting them if unison should ever move its trunk to bzr.
-
-         let pvo = extract_int "^revno:[ \t]*\\([0-9]+\\)[ \t]*$"
-                             (bzr ("log -r svn:" ^
-                                   string_of_int pointVersionOrigin)) in
-        *)
-       extract_int "^\\([0-9]+\\)$" (bzr "revno") (* - pvo *);;
-*)
-
-let pointVersion = 
-  Scanf.sscanf revisionString "$Rev: %d " (fun x -> x) - pointVersionOrigin;;
-
-Printf.printf "MAJORVERSION=%d.%d\n" majorVersion minorVersion;;
-Printf.printf "VERSION=%d.%d.%d\n" majorVersion minorVersion pointVersion;;
-Printf.printf "NAME=%s\n" projectName;;
-
-
-
-
-
-

Copied: branches/2.40/src/mkProjectInfo.ml (from rev 411, trunk/src/mkProjectInfo.ml)
===================================================================
--- branches/2.40/src/mkProjectInfo.ml	                        (rev 0)
+++ branches/2.40/src/mkProjectInfo.ml	2010-02-20 23:23:17 UTC (rev 412)
@@ -0,0 +1,106 @@
+(* Program for printing project info into a Makefile.  Documentation below. *)
+
+(* FIX: When the time comes for the next alpha-release, remember to
+   increment the archive version number first. See update.ml. *)
+
+let projectName = "unison"
+let majorVersion = 2
+let minorVersion = 40
+let pointVersionOrigin = 409 (* Revision that corresponds to point version 0 *)
+
+(* Documentation:
+   This is a program to construct a version of the form Major.Minor.Point,
+   e.g., 2.10.4.
+   The Point release number is calculated from the Subversion revision number,
+   so it will be automatically incremented on svn commit.
+   The Major and Minor numbers are hard coded, as is the revision number
+   corresponding to the 0 point release.
+
+   If you want to increment the Major or Minor number, you will have to do a
+   little thinking to get the Point number back to 0.  Suppose the current svn
+   revision number is 27, and we have below
+
+        let majorVersion = 2
+        let minorVersion = 11
+        let pointVersionOrigin = 3
+
+   This means that the current Unison version is 2.11.24, since 27-3 = 24.
+   If we want to change the release to 3.0.0 we need to change things to
+
+        let majorVersion = 3
+        let minorVersion = 0
+        let pointVersionOrigin = 28
+
+   and then do a svn commit.
+
+   The first two lines are obvious.  The last line says that Subversion
+   revision 28 corresponds to a 0 point release.  Since we were at revision
+   27 and we're going to do a commit before making a release, we
+   will be at 28 after the commit and this will be Unison version 3.0.0.
+*)
+
+(* ---------------------------------------------------------------------- *)
+(* You shouldn't need to edit below. *)
+
+let revisionString = "$Rev: 410$";;
+
+(* extract a substring using a regular expression *)
+let extract_str re str =
+  let _ = Str.search_forward (Str.regexp re) str 0 in
+  Str.matched_group 1 str;;
+let extract_int re str = int_of_string (extract_str re str);;
+
+(* BCP (1/10): This bit was added to help with getting Unison via bazaar, but it
+   was never used much and I'm not confident it's working.  I'll comment it out
+   for now, but if it hasn't been needed or fixed in a few months, the next
+   person that edits this file should delete it...
+
+  (* run the bzr tool to get version information for bzr branches *)
+  exception BzrException of Unix.process_status;;
+  let bzr args =
+    let bzr = (try Sys.getenv "BZR" with Not_found -> "bzr") in
+    let cmd = bzr ^ " " ^ args in
+    let inc = Unix.open_process_in cmd in
+    let buf = Buffer.create 16 in
+    (try
+       while true do
+         Buffer.add_channel buf inc 1
+       done
+     with End_of_file -> ());
+    let status = Unix.close_process_in inc in
+    match status with
+      Unix.WEXITED 0 -> Buffer.contents buf
+    | _ -> raise (BzrException status);;
+
+  let pointVersion = if String.length revisionString > 5
+  then Scanf.sscanf revisionString "$Rev: %d " (fun x -> x) - pointVersionOrigin
+  else (* Determining the pointVersionOrigin in bzr is kind of tricky:
+          - The mentioned revision number might not be part of this branch
+          - The mentioned revision number might be rhs of some merge
+          - The bzr-svn plugin might be outdated or not installed at all
+
+          On the whole, getting this to work seems too much effort for now.
+          So we'll simply use the revno as is as the point version,
+          and revisit offsetting them if unison should ever move its trunk to bzr.
+
+         let pvo = extract_int "^revno:[ \t]*\\([0-9]+\\)[ \t]*$"
+                             (bzr ("log -r svn:" ^
+                                   string_of_int pointVersionOrigin)) in
+        *)
+       extract_int "^\\([0-9]+\\)$" (bzr "revno") (* - pvo *);;
+*)
+
+let pointVersion = 
+  Scanf.sscanf revisionString "$Rev: %d " (fun x -> x) - pointVersionOrigin;;
+
+Printf.printf "MAJORVERSION=%d.%d\n" majorVersion minorVersion;;
+Printf.printf "VERSION=%d.%d.%d\n" majorVersion minorVersion pointVersion;;
+Printf.printf "NAME=%s\n" projectName;;
+
+
+
+
+
+
+
+

Deleted: branches/2.40/src/strings.ml
===================================================================
--- trunk/src/strings.ml	2010-02-17 13:06:38 UTC (rev 410)
+++ branches/2.40/src/strings.ml	2010-02-20 23:23:17 UTC (rev 412)
@@ -1,4044 +0,0 @@
-(* DO NOT MODIFY.
-   This file has been automatically generated, see docs.ml. *)
-
-let docs =
-    ("about", ("About Unison", 
-     "Unison File Synchronizer\n\
-      Version 2.32.7\n\
-      \n\
-      "))
-::
-    ("", ("Overview", 
-     "Overview\n\
-      \n\
-      \032  Unison is a file-synchronization tool for Unix and Windows. It allows\n\
-      \032  two replicas of a collection of files and directories to be stored on\n\
-      \032  different hosts (or different disks on the same host), modified\n\
-      \032  separately, and then brought up to date by propagating the changes in\n\
-      \032  each replica to the other.\n\
-      \n\
-      \032  Unison shares a number of features with tools such as configuration\n\
-      \032  management packages (CVS (http://www.cyclic.com/), PRCS\n\
-      \032  (http://www.XCF.Berkeley.EDU/~jmacd/prcs.html), etc.), distributed\n\
-      \032  filesystems (Coda (http://www.coda.cs.cmu.edu/), etc.),\n\
-      \032  uni-directional mirroring utilities (rsync\n\
-      \032  (http://samba.anu.edu.au/rsync/), etc.), and other synchronizers\n\
-      \032  (Intellisync (http://www.pumatech.com), Reconcile\n\
-      \032  (http://www.merl.com/reports/TR99-14/), etc). However, there are\n\
-      \032  several points where it differs:\n\
-      \032    * Unison runs on both Windows (95, 98, NT, 2k, and XP) and Unix\n\
-      \032      (OSX, Solaris, Linux, etc.) systems. Moreover, Unison works across\n\
-      \032      platforms, allowing you to synchronize a Windows laptop with a\n\
-      \032      Unix server, for example.\n\
-      \032    * Unlike a distributed filesystem, Unison is a user-level program:\n\
-      \032      there is no need to modify the kernel or to have superuser\n\
-      \032      privileges on either host.\n\
-      \032    * Unlike simple mirroring or backup utilities, Unison can deal with\n\
-      \032      updates to both replicas of a distributed directory structure.\n\
-      \032      Updates that do not conflict are propagated automatically.\n\
-      \032      Conflicting updates are detected and displayed.\n\
-      \032    * Unison works between any pair of machines connected to the\n\
-      \032      internet, communicating over either a direct socket link or\n\
-      \032      tunneling over an encrypted ssh connection. It is careful with\n\
-      \032      network bandwidth, and runs well over slow links such as PPP\n\
-      \032      connections. Transfers of small updates to large files are\n\
-      \032      optimized using a compression protocol similar to rsync.\n\
-      \032    * Unison has a clear and precise specification, described below.\n\
-      \032    * Unison is resilient to failure. It is careful to leave the\n\
-      \032      replicas and its own private structures in a sensible state at all\n\
-      \032      times, even in case of abnormal termination or communication\n\
-      \032      failures.\n\
-      \032    * Unison is free; full source code is available under the GNU Public\n\
-      \032      License.\n\
-      \n\
-      "))
-::
-    ("", ("Preface", 
-     "Preface\n\
-      \n\
-      "))
-::
-    ("people", ("People", 
-     "People\n\
-      \n\
-      \032  Benjamin Pierce (http://www.cis.upenn.edu/~bcpierce/) leads the Unison\n\
-      \032  project. The current version of Unison was designed and implemented by\n\
-      \032  Trevor Jim (http://www.research.att.com/~trevor/), Benjamin Pierce\n\
-      \032  (http://www.cis.upenn.edu/~bcpierce/), and J\233r\244me Vouillon\n\
-      \032  (http://www.pps.jussieu.fr/~vouillon/), with Alan Schmitt\n\
-      \032  (http://alan.petitepomme.net/), Malo Denielou, Zhe Yang\n\
-      \032  (http://www.brics.dk/~zheyang/), Sylvain Gommier, and Matthieu Goulay.\n\
-      \032  The Mac user interface was started by Trevor Jim and enormously\n\
-      \032  improved by Ben Willmore. Our implementation of the rsync\n\
-      \032  (http://samba.org/rsync/) protocol was built by Norman Ramsey\n\
-      \032  (http://www.eecs.harvard.edu/~nr/) and Sylvain Gommier. It is is based\n\
-      \032  on Andrew Tridgell (http://samba.anu.edu.au/~tridge/)'s thesis work\n\
-      \032  (http://samba.anu.edu.au/~tridge/phd_thesis.pdf) and inspired by his\n\
-      \032  rsync (http://samba.org/rsync/) utility. The mirroring and merging\n\
-      \032  functionality was implemented by Sylvain Roy, improved by Malo\n\
-      \032  Denielou, and improved yet further by St\233phane Lescuyer. Jacques\n\
-      \032  Garrigue (http://wwwfun.kurims.kyoto-u.ac.jp/~garrigue/) contributed\n\
-      \032  the original Gtk version of the user interface; the Gtk2 version was\n\
-      \032  built by Stephen Tse. Sundar Balasubramaniam helped build a prototype\n\
-      \032  implementation of an earlier synchronizer in Java. Insik Shin\n\
-      \032  (http://www.cis.upenn.edu/~ishin/) and Insup Lee\n\
-      \032  (http://www.cis.upenn.edu/~lee/) contributed design ideas to this\n\
-      \032  implementation. Cedric Fournet\n\
-      \032  (http://research.microsoft.com/~fournet/) contributed to an even\n\
-      \032  earlier prototype.\n\
-      \n\
-      "))
-::
-    ("lists", ("Mailing Lists and Bug Reporting", 
-     "Mailing Lists and Bug Reporting\n\
-      \n\
-      Mailing Lists:\n\
-      \n\
-      \032  Moderated mailing lists are available for bug reporting, announcements\n\
-      \032  of new versions, discussions among users, and discussions among\n\
-      \032  developers. See\n\
-      \n\
-      \032    http://www.cis.upenn.edu/~bcpierce/unison/lists.html\n\
-      \n\
-      \032  for more information.\n\
-      \n\
-      "))
-::
-    ("status", ("Development Status", 
-     "Development Status\n\
-      \n\
-      \032  Unison is no longer under active development as a research project.\n\
-      \032  (Our research efforts are now focused on a follow-on project called\n\
-      \032  Harmony, described at http://www.cis.upenn.edu/~bcpierce/harmony.) At\n\
-      \032  this point, there is no one whose job it is to maintain Unison, fix\n\
-      \032  bugs, or answer questions.\n\
-      \n\
-      \032  However, the original developers are all still using Unison daily. It\n\
-      \032  will continue to be maintained and supported for the foreseeable\n\
-      \032  future, and we will occasionally release new versions with bug fixes,\n\
-      \032  small improvements, and contributed patches.\n\
-      \n\
-      \032  Reports of bugs affecting correctness or safety are of interest to\n\
-      \032  many people and will generally get high priority. Other bug reports\n\
-      \032  will be looked at as time permits. Bugs should be reported to the\n\
-      \032  users list at unison-users at yahoogroups.com\n\
-      \032  (mailto:unison-users at yahoogroups.com).\n\
-      \n\
-      \032  Feature requests are welcome, but will probably just be added to the\n\
-      \032  ever-growing todo list. They should also be sent to\n\
-      \032  unison-users at yahoogroups.com (mailto:unison-users at yahoogroups.com).\n\
-      \n\
-      \032  Patches are even more welcome. They should be sent to\n\
-      \032  unison-hackers at lists.seas.upenn.edu\n\
-      \032  (mailto:unison-hackers at lists.seas.upenn.edu). (Since safety and\n\
-      \032  robustness are Unison's most important properties, patches will be\n\
-      \032  held to high standards of clear design and clean coding.) If you want\n\
-      \032  to contribute to Unison, start by downloading the developer tarball\n\
-      \032  from the download page. For some details on how the code is organized,\n\
-      \032  etc., see the file CONTRIB.\n\
-      \n\
-      "))
-::
-    ("copying", ("Copying", 
-     "Copying\n\
-      \n\
-      \032  This file is part of Unison.\n\
-      \n\
-      \032  Unison is free software: you can redistribute it and/or modify it\n\
-      \032  under the terms of the GNU General Public License as published by the\n\
-      \032  Free Software Foundation, either version 3 of the License, or (at your\n\
-      \032  option) any later version.\n\
-      \n\
-      \032  Unison is distributed in the hope that it will be useful, but WITHOUT\n\
-      \032  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n\
-      \032  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n\
-      \032  for more details.\n\
-      \n\
-      \032  The GNU Public License can be found at http://www.gnu.org/licenses. A\n\
-      \032  copy is also included in the Unison source distribution in the file\n\
-      \032  COPYING.\n\
-      \n\
-      "))
-::
-    ("ack", ("Acknowledgements", 
-     "Acknowledgements\n\
-      \n\
-      \032  Work on Unison has been supported by the National Science Foundation\n\
-      \032  under grants CCR-9701826 and ITR-0113226, Principles and Practice of\n\
-      \032  Synchronization, and by University of Pennsylvania's Institute for\n\
-      \032  Research in Cognitive Science (IRCS).\n\
-      \n\
-      "))
-::
-    ("install", ("Installation", 
-     "Installation\n\
-      \n\
-      \032  Unison is designed to be easy to install. The following sequence of\n\
-      \032  steps should get you a fully working installation in a few minutes. If\n\
-      \032  you run into trouble, you may find the suggestions on the Frequently\n\
-      \032  Asked Questions page\n\
-      \032  (http://www.cis.upenn.edu/~bcpierce/unison/faq.html) helpful.\n\
-      \032  Pre-built binaries are available for a variety of platforms.\n\
-      \n\
-      \032  Unison can be used with either of two user interfaces:\n\
-      \032   1. a simple textual interface, suitable for dumb terminals (and\n\
-      \032      running from scripts), and\n\
-      \032   2. a more sophisticated grapical interface, based on Gtk2.\n\
-      \n\
-      \032  You will need to install a copy of Unison on every machine that you\n\
-      \032  want to synchronize. However, you only need the version with a\n\
-      \032  graphical user interface (if you want a GUI at all) on the machine\n\
-      \032  where you're actually going to display the interface (the CLIENT\n\
-      \032  machine). Other machines that you synchronize with can get along just\n\
-      \032  fine with the textual version.\n\
-      \n\
-      Downloading Unison\n\
-      \n\
-      \032  The Unison download site lives under\n\
-      \032  http://www.cis.upenn.edu/~bcpierce/unison.\n\
-      \n\
-      \032  If a pre-built binary of Unison is available for the client machine's\n\
-      \032  architecture, just download it and put it somewhere in your search\n\
-      \032  path (if you're going to invoke it from the command line) or on your\n\
-      \032  desktop (if you'll be click-starting it).\n\
-      \n\
-      \032  The executable file for the graphical version (with a name including\n\
-      \032  gtkui) actually provides both interfaces: the graphical one appears by\n\
-      \032  default, while the textual interface can be selected by including -ui\n\
-      \032  text on the command line. The textui executable provides just the\n\
-      \032  textual interface.\n\
-      \n\
-      \032  If you don't see a pre-built executable for your architecture, you'll\n\
-      \032  need to build it yourself. See the section \"Building Unison\" . There\n\
-      \032  are also a small number of contributed ports to other architectures\n\
-      \032  that are not maintained by us. See the Contributed Ports page\n\
-      \032  (http://www.cis.upenn.edu/~bcpierce/unison/download.html) to check\n\
-      \032  what's available.\n\
-      \n\
-      \032  Check to make sure that what you have downloaded is really executable.\n\
-      \032  Either click-start it, or type \"unison -version\" at the command line.\n\
-      \n\
-      \032  Unison can be used in three different modes: with different\n\
-      \032  directories on a single machine, with a remote machine over a direct\n\
-      \032  socket connection, or with a remote machine using ssh for\n\
-      \032  authentication and secure transfer. If you intend to use the last\n\
-      \032  option, you may need to install ssh; see the section \"Installing Ssh\"\n\
-      \032  .\n\
-      \n\
-      Running Unison\n\
-      \n\
-      \032  Once you've got Unison installed on at least one system, read the\n\
-      \032  section \"Tutorial\" of the user manual (or type \"unison -doc tutorial\")\n\
-      \032  for instructions on how to get started.\n\
-      \n\
-      Upgrading\n\
-      \n\
-      \032  Upgrading to a new version of Unison is as simple as throwing away the\n\
-      \032  old binary and installing the new one.\n\
-      \n\
-      \032  Before upgrading, it is a good idea to run the old version one last\n\
-      \032  time, to make sure all your replicas are completely synchronized. A\n\
-      \032  new version of Unison will sometimes introduce a different format for\n\
-      \032  the archive files used to remember information about the previous\n\
-      \032  state of the replicas. In this case, the old archive will be ignored\n\
-      \032  (not deleted -- if you roll back to the previous version of Unison,\n\
-      \032  you will find the old archives intact), which means that any\n\
-      \032  differences between the replicas will show up as conflicts that need\n\
-      \032  to be resolved manually.\n\
-      \n\
-      Building Unison from Scratch\n\
-      \n\
-      \032  If a pre-built image is not available, you will need to compile it\n\
-      \032  from scratch; the sources are available from the same place as the\n\
-      \032  binaries.\n\
-      \n\
-      \032  In principle, Unison should work on any platform to which OCaml has\n\
-      \032  been ported and on which the Unix module is fully implemented. It has\n\
-      \032  been tested on many flavors of Windows (98, NT, 2000, XP) and Unix (OS\n\
-      \032  X, Solaris, Linux, FreeBSD), and on both 32- and 64-bit architectures.\n\
-      \n\
-      Unix\n\
-      \n\
-      \032  You'll need the Objective Caml compiler (version 3.07 or later), which\n\
-      \032  is available from http://caml.inria.fr. Building and installing OCaml\n\
-      \032  on Unix systems is very straightforward; just follow the instructions\n\
-      \032  in the distribution. You'll probably want to build the native-code\n\
-      \032  compiler in addition to the bytecode compiler, as Unison runs much\n\
-      \032  faster when compiled to native code, but this is not absolutely\n\
-      \032  necessary. (Quick start: on many systems, the following sequence of\n\
-      \032  commands will get you a working and installed compiler: first do make\n\
-      \032  world opt, then su to root and do make install.)\n\
-      \n\
-      \032  You'll also need the GNU make utility, standard on many Unix systems.\n\
-      \032  (Type \"make -version\" to check that you've got the GNU version.)\n\
-      \n\
-      \032  Once you've got OCaml installed, grab a copy of the Unison sources,\n\
-      \032  unzip and untar them, change to the new \"unison\" directory, and type\n\
-      \032  \"make UISTYLE=text.\" The result should be an executable file called\n\
-      \032  \"unison\". Type \"./unison\" to make sure the program is executable. You\n\
-      \032  should get back a usage message.\n\
-      \n\
-      \032  If you want to build the graphical user interface, you will need to\n\
-      \032  install two additional things:\n\
-      \032    * The Gtk2 libraries. These areavailable from http://www.gtk.org and\n\
-      \032      are standard on many Unix installations.\n\
-      \032    * The lablgtk2 OCaml library. Grab the developers' tarball from\n\
-      \n\
-      \032    http://wwwfun.kurims.kyoto-u.ac.jp/soft/olabl/lablgtk.html,\n\
-      \032      untar it, and follow the instructions to build and install it.\n\
-      \032      (Quick start: make configure, then make, then make opt, then su\n\
-      \032      and make install.)\n\
-      \n\
-      \032  Now build unison. If your search paths are set up correctly, simply\n\
-      \032  typing make again should build a unison executable with a Gtk2\n\
-      \032  graphical interface. (In previous releases of Unison, it was necessary\n\
-      \032  to add UISTYLE=gtk2 to the 'make' command above. This requirement has\n\
-      \032  been removed: the makefile should detect automatically when lablgtk2\n\
-      \032  is present and set this flag automatically.)\n\
-      \n\
-      \032  Put the unison executable somewhere in your search path, either by\n\
-      \032  adding the Unison directory to your PATH variable or by copying the\n\
-      \032  executable to some standard directory where executables are stored.\n\
-      \n\
-      Windows\n\
-      \n\
-      \032  Although the binary distribution should work on any version of\n\
-      \032  Windows, some people may want to build Unison from scratch on those\n\
-      \032  systems too.\n\
-      \n\
-      Bytecode version:\n\
-      \n\
-      \032  The simpler but slower compilation option to build a Unison executable\n\
-      \032  is to build a bytecode version. You need first install Windows version\n\
-      \032  of the OCaml compiler (version 3.07 or later, available from\n\
-      \032  http://caml.inria.fr). Then grab a copy of Unison sources and type\n\
-      \032      make NATIVE=false\n\
-      \n\
-      \032  to compile the bytecode. The result should be an executable file\n\
-      \032  called unison.exe.\n\
-      \n\
-      Native version:\n\
-      \n\
-      \032  Building a more efficient, native version of Unison on Windows\n\
-      \032  requires a little more work. See the file INSTALL.win32 in the source\n\
-      \032  code distribution.\n\
-      \n\
-      Installation Options\n\
-      \n\
-      \032  The Makefile in the distribution includes several switches that can be\n\
-      \032  used to control how Unison is built. Here are the most useful ones:\n\
-      \032    * Building with NATIVE=true uses the native-code OCaml compiler,\n\
-      \032      yielding an executable that will run quite a bit faster. We use\n\
-      \032      this for building distribution versions.\n\
-      \032    * Building with make DEBUGGING=true generates debugging symbols.\n\
-      \032    * Building with make STATIC=true generates a (mostly) statically\n\
-      \032      linked executable. We use this for building distribution versions,\n\
-      \032      for portability.\n\
-      \n\
-      "))
-::
-    ("tutorial", ("Tutorial", 
-     "Tutorial\n\
-      \n\
-      Preliminaries\n\
-      \n\
-      \032  Unison can be used with either of two user interfaces:\n\
-      \032   1. a straightforward textual interface and\n\
-      \032   2. a more sophisticated graphical interface\n\
-      \n\
-      \032  The textual interface is more convenient for running from scripts and\n\
-      \032  works on dumb terminals; the graphical interface is better for most\n\
-      \032  interactive use. For this tutorial, you can use either. If you are\n\
-      \032  running Unison from the command line, just typing unison will select\n\
-      \032  either the text or the graphical interface, depending on which has\n\
-      \032  been selected as default when the executable you are running was\n\
-      \032  built. You can force the text interface even if graphical is the\n\
-      \032  default by adding -ui text. The other command-line arguments to both\n\
-      \032  versions are identical.\n\
-      \n\
-      \032  The graphical version can also be run directly by clicking on its\n\
-      \032  icon, but this may require a little set-up (see the section\n\
-      \032  \"Click-starting Unison\" ). For this tutorial, we assume that you're\n\
-      \032  starting it from the command line.\n\
-      \n\
-      \032  Unison can synchronize files and directories on a single machine, or\n\
-      \032  between two machines on a network. (The same program runs on both\n\
-      \032  machines; the only difference is which one is responsible for\n\
-      \032  displaying the user interface.) If you're only interested in a\n\
-      \032  single-machine setup, then let's call that machine the CLIENT . If\n\
-      \032  you're synchronizing two machines, let's call them CLIENT and SERVER .\n\
-      \n\
-      Local Usage\n\
-      \n\
-      \032  Let's get the client machine set up first and see how to synchronize\n\
-      \032  two directories on a single machine.\n\
-      \n\
-      \032  Follow the instructions in the section \"Installation\" to either\n\
-      \032  download or build an executable version of Unison, and install it\n\
-      \032  somewhere on your search path. (If you just want to use the textual\n\
-      \032  user interface, download the appropriate textui binary. If you just\n\
-      \032  want to the graphical interface--or if you will use both interfaces\n\
-      \032  [the gtkui binary actually has both compiled in]--then download the\n\
-      \032  gtkui binary.)\n\
-      \n\
-      \032  Create a small test directory a.tmp containing a couple of files\n\
-      \032  and/or subdirectories, e.g.,\n\
-      \032      mkdir a.tmp\n\
-      \032      touch a.tmp/a a.tmp/b\n\
-      \032      mkdir a.tmp/d\n\
-      \032      touch a.tmp/d/f\n\
-      \n\
-      \032  Copy this directory to b.tmp:\n\
-      \032      cp -r a.tmp b.tmp\n\
-      \n\
-      \032  Now try synchronizing a.tmp and b.tmp. (Since they are identical,\n\
-      \032  synchronizing them won't propagate any changes, but Unison will\n\
-      \032  remember the current state of both directories so that it will be able\n\
-      \032  to tell next time what has changed.) Type:\n\
-      \032      unison a.tmp b.tmp\n\
-      \n\
-      \032  Textual Interface:\n\
-      \032    * You should see a message notifying you that all the files are\n\
-      \032      actually equal and then get returned to the command line.\n\
-      \n\
-      \032  Graphical Interface:\n\
-      \032    * You should get a big empty window with a message at the bottom\n\
-      \032      notifying you that all files are identical. Choose the Exit item\n\
-      \032      from the File menu to get back to the command line.\n\
-      \n\
-      \032  Next, make some changes in a.tmp and/or b.tmp. For example:\n\
-      \032       rm a.tmp/a\n\
-      \032       echo \"Hello\" > a.tmp/b\n\
-      \032       echo \"Hello\" > b.tmp/b\n\
-      \032       date > b.tmp/c\n\
-      \032       echo \"Hi there\" > a.tmp/d/h\n\
-      \032       echo \"Hello there\" > b.tmp/d/h\n\
-      \n\
-      \032  Run Unison again:\n\
-      \032      unison a.tmp b.tmp\n\
-      \n\
-      \032  This time, the user interface will display only the files that have\n\
-      \032  changed. If a file has been modified in just one replica, then it will\n\
-      \032  be displayed with an arrow indicating the direction that the change\n\
-      \032  needs to be propagated. For example,\n\
-      \032                <---  new file   c  [f]\n\
-      \n\
-      \032  indicates that the file c has been modified only in the second\n\
-      \032  replica, and that the default action is therefore to propagate the new\n\
-      \032  version to the first replica. To follw Unison's recommendation, press\n\
-      \032  the \"f\" at the prompt.\n\
-      \n\
-      \032  If both replicas are modified and their contents are different, then\n\
-      \032  the changes are in conflict: <-?-> is displayed to indicate that\n\
-      \032  Unison needs guidance on which replica should override the other.\n\
-      \032    new file  <-?->  new file   d/h  []\n\
-      \n\
-      \032  By default, neither version will be propagated and both replicas will\n\
-      \032  remain as they are.\n\
-      \n\
-      \032  If both replicas have been modified but their new contents are the\n\
-      \032  same (as with the file b), then no propagation is necessary and\n\
-      \032  nothing is shown. Unison simply notes that the file is up to date.\n\
-      \n\
-      \032  These display conventions are used by both versions of the user\n\
-      \032  interface. The only difference lies in the way in which Unison's\n\
-      \032  default actions are either accepted or overriden by the user.\n\
-      \n\
-      \032  Textual Interface:\n\
-      \032    * The status of each modified file is displayed, in turn. When the\n\
-      \032      copies of a file in the two replicas are not identical, the user\n\
-      \032      interface will ask for instructions as to how to propagate the\n\
-      \032      change. If some default action is indicated (by an arrow), you can\n\
-      \032      simply press Return to go on to the next changed file. If you want\n\
-      \032      to do something different with this file, press \"<\" or \">\" to\n\
-      \032      force the change to be propagated from right to left or from left\n\
-      \032      to right, or else press \"/\" to skip this file and leave both\n\
-      \032      replicas alone. When it reaches the end of the list of modified\n\
-      \032      files, Unison will ask you one more time whether it should proceed\n\
-      \032      with the updates that have been selected.\n\
-      \032      When Unison stops to wait for input from the user, pressing \"?\"\n\
-      \032      will always give a list of possible responses and their meanings.\n\
-      \n\
-      \032  Graphical Interface:\n\
-      \032    * The main window shows all the files that have been modified in\n\
-      \032      either a.tmp or b.tmp. To override a default action (or to select\n\
-      \032      an action in the case when there is no default), first select the\n\
-      \032      file, either by clicking on its name or by using the up- and\n\
-      \032      down-arrow keys. Then press either the left-arrow or \"<\" key (to\n\
-      \032      cause the version in b.tmp to propagate to a.tmp) or the\n\
-      \032      right-arrow or \">\" key (which makes the a.tmp version override\n\
-      \032      b.tmp).\n\
-      \032      Every keyboard command can also be invoked from the menus at the\n\
-      \032      top of the user interface. (Conversely, each menu item is\n\
-      \032      annotated with its keyboard equivalent, if it has one.)\n\
-      \032      When you are satisfied with the directions for the propagation of\n\
-      \032      changes as shown in the main window, click the \"Go\" button to set\n\
-      \032      them in motion. A check sign will be displayed next to each\n\
-      \032      filename when the file has been dealt with.\n\
-      \n\
-      Remote Usage\n\
-      \n\
-      \032  Next, we'll get Unison set up to synchronize replicas on two different\n\
-      \032  machines.\n\
-      \n\
-      \032  Follow the instructions in the Installation section to download or\n\
-      \032  build an executable version of Unison on the server machine, and\n\
-      \032  install it somewhere on your search path. (It doesn't matter whether\n\
-      \032  you install the textual or graphical version, since the copy of Unison\n\
-      \032  on the server doesn't need to display any user interface at all.)\n\
-      \n\
-      \032  It is important that the version of Unison installed on the server\n\
-      \032  machine is the same as the version of Unison on the client machine.\n\
-      \032  But some flexibility on the version of Unison at the client side can\n\
-      \032  be achieved by using the -addversionno option; see the section\n\
-      \032  \"Preferences\" .\n\
-      \n\
-      \032  Now there is a decision to be made. Unison provides two methods for\n\
-      \032  communicating between the client and the server:\n\
-      \032    * Remote shell method: To use this method, you must have some way of\n\
-      \032      invoking remote commands on the server from the client's command\n\
-      \032      line, using a facility such as ssh. This method is more convenient\n\
-      \032      (since there is no need to manually start a \"unison server\"\n\
-      \032      process on the server) and also more secure (especially if you use\n\
-      \032      ssh).\n\
-      \032    * Socket method: This method requires only that you can get TCP\n\
-      \032      packets from the client to the server and back. A draconian\n\
-      \032      firewall can prevent this, but otherwise it should work anywhere.\n\
-      \n\
-      \032  Decide which of these you want to try, and continue with the section\n\
-      \032  \"Remote Shell Method\" or the section \"Socket Method\" , as appropriate.\n\
-      \n\
-      Remote Shell Method\n\
-      \n\
-      \032  The standard remote shell facility on Unix systems is ssh, which\n\
-      \032  provides the same functionality as the older rsh but much better\n\
-      \032  security. Ssh is available from ftp://ftp.cs.hut.fi/pub/ssh/;\n\
-      \032  up-to-date binaries for some architectures can also be found at\n\
-      \032  ftp://ftp.faqs.org/ssh/contrib. See section [1]A.2 for installation\n\
-      \032  instructions for the Windows version.\n\
-      \n\
-      \032  Running ssh requires some coordination between the client and server\n\
-      \032  machines to establish that the client is allowed to invoke commands on\n\
-      \032  the server; please refer to the or ssh documentation for information\n\
-      \032  on how to set this up. The examples in this section use ssh, but you\n\
-      \032  can substitute rsh for ssh if you wish.\n\
-      \n\
-      \032  First, test that we can invoke Unison on the server from the client.\n\
-      \032  Typing\n\
-      \032       ssh remotehostname unison -version\n\
-      \n\
-      \032  should print the same version information as running\n\
-      \032       unison -version\n\
-      \n\
-      \032  locally on the client. If remote execution fails, then either\n\
-      \032  something is wrong with your ssh setup (e.g., \"permission denied\") or\n\
-      \032  else the search path that's being used when executing commands on the\n\
-      \032  server doesn't contain the unison executable (e.g., \"command not\n\
-      \032  found\").\n\
-      \n\
-      \032  Create a test directory a.tmp in your home directory on the client\n\
-      \032  machine.\n\
-      \n\
-      \032  Test that the local unison client can start and connect to the remote\n\
-      \032  server. Type\n\
-      \032         unison -testServer a.tmp ssh://remotehostname/a.tmp\n\
-      \n\
-      \032  Now cd to your home directory and type:\n\
-      \032         unison a.tmp ssh://remotehostname/a.tmp\n\
-      \n\
-      \032  The result should be that the entire directory a.tmp is propagated\n\
-      \032  from the client to your home directory on the server.\n\
-      \n\
-      \032  After finishing the first synchronization, change a few files and try\n\
-      \032  synchronizing again. You should see similar results as in the local\n\
-      \032  case.\n\
-      \n\
-      \032  If your user name on the server is not the same as on the client, you\n\
-      \032  need to specify it on the command line:\n\
-      \032         unison a.tmp ssh://username@remotehostname/a.tmp\n\
-      \n\
-      \032  Notes:\n\
-      \032    * If you want to put a.tmp some place other than your home directory\n\
-      \032      on the remote host, you can give an absolute path for it by adding\n\
-      \032      an extra slash between remotehostname and the beginning of the\n\
-      \032      path:\n\
-      \032         unison a.tmp ssh://remotehostname//absolute/path/to/a.tmp\n\
-      \032    * You can give an explicit path for the unison executable on the\n\
-      \032      server by using the command-line option \"-servercmd\n\
-      \032      /full/path/name/of/unison\" or adding\n\
-      \032      \"servercmd=/full/path/name/of/unison\" to your profile (see the\n\
-      \032      section \"Profile\" ). Similarly, you can specify a explicit path\n\
-      \032      for the ssh program using the \"-sshcmd\" option. Extra arguments\n\
-      \032      can be passed to ssh by setting the -sshargs preference.\n\
-      \n\
-      Socket Method\n\
-      \n\
-      \032    Warning: The socket method is insecure: not only are the texts of\n\
-      \032    your changes transmitted over the network in unprotected form, it\n\
-      \032    is also possible for anyone in the world to connect to the server\n\
-      \032    process and read out the contents of your filesystem! (Of course,\n\
-      \032    to do this they must understand the protocol that Unison uses to\n\
-      \032    communicate between client and server, but all they need for this\n\
-      \032    is a copy of the Unison sources.) The socket method is provided\n\
-      \032    only for expert users with specific needs; everyone else should use\n\
-      \032    the ssh method.\n\
-      \n\
-      \032  To run Unison over a socket connection, you must start a Unison daemon\n\
-      \032  process on the server. This process runs continuously, waiting for\n\
-      \032  connections over a given socket from client machines running Unison\n\
-      \032  and processing their requests in turn.\n\
-      \n\
-      \032  To start the daemon, type\n\
-      \032      unison -socket NNNN\n\
-      \n\
-      \032  on the server machine, where NNNN is the socket number that the daemon\n\
-      \032  should listen on for connections from clients. (NNNN can be any large\n\
-      \032  number that is not being used by some other program; if NNNN is\n\
-      \032  already in use, Unison will exit with an error message.) Note that\n\
-      \032  paths specified by the client will be interpreted relative to the\n\
-      \032  directory in which you start the server process; this behavior is\n\
-      \032  different from the ssh case, where the path is relative to your home\n\
-      \032  directory on the server.\n\
-      \n\
-      \032  Create a test directory a.tmp in your home directory on the client\n\
-      \032  machine. Now type:\n\
-      \032      unison a.tmp socket://remotehostname:NNNN/a.tmp\n\
-      \n\
-      \032  The result should be that the entire directory a.tmp is propagated\n\
-      \032  from the client to the server (a.tmp will be created on the server in\n\
-      \032  the directory that the server was started from). After finishing the\n\
-      \032  first synchronization, change a few files and try synchronizing again.\n\
-      \032  You should see similar results as in the local case.\n\
-      \n\
-      \032  Since the socket method is not used by many people, its functionality\n\
-      \032  is rather limited. For example, the server can only deal with one\n\
-      \032  client at a time.\n\
-      \n\
-      Using Unison for All Your Files\n\
-      \n\
-      \032  Once you are comfortable with the basic operation of Unison, you may\n\
-      \032  find yourself wanting to use it regularly to synchronize your commonly\n\
-      \032  used files. There are several possible ways of going about this:\n\
-      \032   1. Synchronize your whole home directory, using the Ignore facility\n\
-      \032      (see the section \"Ignore\" ) to avoid synchronizing temporary files\n\
-      \032      and things that only belong on one host.\n\
-      \032   2. Create a subdirectory called shared (or current, or whatever) in\n\
-      \032      your home directory on each host, and put all the files you want\n\
-      \032      to synchronize into this directory.\n\
-      \032   3. Create a subdirectory called shared (or current, or whatever) in\n\
-      \032      your home directory on each host, and put links to all the files\n\
-      \032      you want to synchronize into this directory. Use the follow\n\
-      \032      preference (see the section \"Symbolic Links\" ) to make Unison\n\
-      \032      treat these links as transparent.\n\
-      \032   4. Make your home directory the root of the synchronization, but tell\n\
-      \032      Unison to synchronize only some of the files and subdirectories\n\
-      \032      within it on any given run. This can be accomplished by using the\n\
-      \032      -path switch on the command line:\n\
-      \032      unison /home/username ssh://remotehost//home/username -path shared\n\
-      \032      The -path option can be used as many times as needed, to\n\
-      \032      synchronize several files or subdirectories:\n\
-      \032      unison /home/username ssh://remotehost//home/username \\\n\
-      \032         -path shared \\\n\
-      \032         -path pub \\\n\
-      \032         -path .netscape/bookmarks.html\n\
-      \032      These -path arguments can also be put in your preference file. See\n\
-      \032      the section \"Preferences\" for an example.\n\
-      \n\
-      \032  Most people find that they only need to maintain a profile (or\n\
-      \032  profiles) on one of the hosts that they synchronize, since Unison is\n\
-      \032  always initiated from this host. (For example, if you're synchronizing\n\
-      \032  a laptop with a fileserver, you'll probably always run Unison on the\n\
-      \032  laptop.) This is a bit different from the usual situation with\n\
-      \032  asymmetric mirroring programs like rdist, where the mirroring\n\
-      \032  operation typically needs to be initiated from the machine with the\n\
-      \032  most recent changes. the section \"Profile\" covers the syntax of Unison\n\
-      \032  profiles, together with some sample profiles.\n\
-      \n\
-      \032  Some tips on improving Unison's performance can be found on the\n\
-      \032  Frequently Asked Questions page\n\
-      \032  (http://www.cis.upenn.edu/~bcpierce/unison/faq.html).\n\
-      \n\
-      Using Unison to Synchronize More Than Two Machines\n\
-      \n\
-      \032  Unison is designed for synchronizing pairs of replicas. However, it is\n\
-      \032  possible to use it to keep larger groups of machines in sync by\n\
-      \032  performing multiple pairwise synchronizations.\n\
-      \n\
-      \032  If you need to do this, the most reliable way to set things up is to\n\
-      \032  organize the machines into a \"star topology,\" with one machine\n\
-      \032  designated as the \"hub\" and the rest as \"spokes,\" and with each spoke\n\
-      \032  machine synchronizing only with the hub. The big advantage of the star\n\
-      \032  topology is that it eliminates the possibility of confusing \"spurious\n\
-      \032  conflicts\" arising from the fact that a separate archive is maintained\n\
-      \032  by Unison for every pair of hosts that it synchronizes.\n\
-      \n\
-      Going Further\n\
-      \n\
-      \032  On-line documentation for the various features of Unison can be\n\
-      \032  obtained either by typing\n\
-      \032       unison -doc topics\n\
-      \n\
-      \032  at the command line, or by selecting the Help menu in the graphical\n\
-      \032  user interface. The same information is also available in a typeset\n\
-      \032  User's Manual (HTML or PostScript format) through\n\
-      \032  http://www.cis.upenn.edu/~bcpierce/unison.\n\
-      \n\
-      \032  If you use Unison regularly, you should subscribe to one of the\n\
-      \032  mailing lists, to receive announcements of new versions. See the\n\
-      \032  section \"Mailing Lists\" .\n\
-      \n\
-      "))
-::
-    ("basics", ("Basic Concepts", 
-     "Basic Concepts\n\
-      \n\
-      \032  To understand how Unison works, it is necessary to discuss a few\n\
-      \032  straightforward concepts. These concepts are developed more rigorously\n\
-      \032  and at more length in a number of papers, available at\n\
-      \032  http://www.cis.upenn.edu/~bcpierce/papers. But the informal\n\
-      \032  presentation here should be enough for most users.\n\
-      \n\
-      Roots\n\
-      \n\
-      \032  A replica's root tells Unison where to find a set of files to be\n\
-      \032  synchronized, either on the local machine or on a remote host. For\n\
-      \032  example,\n\
-      \032     relative/path/of/root\n\
-      \n\
-      \032  specifies a local root relative to the directory where Unison is\n\
-      \032  started, while\n\
-      \032     /absolute/path/of/root\n\
-      \n\
-      \032  specifies a root relative to the top of the local filesystem,\n\
-      \032  independent of where Unison is running. Remote roots can begin with\n\
-      \032  ssh://, rsh:// to indicate that the remote server should be started\n\
-      \032  with rsh or ssh:\n\
-      \032     ssh://remotehost//absolute/path/of/root\n\
-      \032     rsh://user@remotehost/relative/path/of/root\n\
-      \n\
-      \032  If the remote server is already running (in the socket mode), then the\n\
-      \032  syntax\n\
-      \032     socket://remotehost:portnum//absolute/path/of/root\n\
-      \032     socket://remotehost:portnum/relative/path/of/root\n\
-      \n\
-      \032  is used to specify the hostname and the port that the client Unison\n\
-      \032  should use to contact it.\n\
-      \n\
-      \032  The syntax for roots is based on that of URIs (described in RFC 2396).\n\
-      \032  The full grammar is:\n\
-      \032 replica ::= [protocol:]//[user@][host][:port][/path]\n\
-      \032          |  path\n\
-      \n\
-      \032 protocol ::= file\n\
-      \032           |  socket\n\
-      \032           |  ssh\n\
-      \032           |  rsh\n\
-      \n\
-      \032 user ::= [-_a-zA-Z0-9]+\n\
-      \n\
-      \032 host ::= [-_a-zA-Z0-9.]+\n\
-      \n\
-      \032 port ::= [0-9]+\n\
-      \n\
-      \032  When path is given without any protocol prefix, the protocol is\n\
-      \032  assumed to be file:. Under Windows, it is possible to synchronize with\n\
-      \032  a remote directory using the file: protocol over the Windows Network\n\
-      \032  Neighborhood. For example,\n\
-      \032      unison foo //host/drive/bar\n\
-      \n\
-      \032  synchronizes the local directory foo with the directory drive:\\bar on\n\
-      \032  the machine host, provided that host is accessible via Network\n\
-      \032  Neighborhood. When the file: protocol is used in this way, there is no\n\
-      \032  need for a Unison server to be running on the remote host. However,\n\
-      \032  running Unison this way is only a good idea if the remote host is\n\
-      \032  reached by a very fast network connection, since the full contents of\n\
-      \032  every file in the remote replica will have to be transferred to the\n\
-      \032  local machine to detect updates.\n\
-      \n\
-      \032  The names of roots are canonized by Unison before it uses them to\n\
-      \032  compute the names of the corresponding archive files, so\n\
-      \032  //saul//home/bcpierce/common and //saul.cis.upenn.edu/common will be\n\
-      \032  recognized as the same replica under different names.\n\
-      \n\
-      Paths\n\
-      \n\
-      \032  A path refers to a point within a set of files being synchronized; it\n\
-      \032  is specified relative to the root of the replica.\n\
-      \n\
-      \032  Formally, a path is just a sequence of names, separated by /. Note\n\
-      \032  that the path separator character is always a forward slash, no matter\n\
-      \032  what operating system Unison is running on. Forward slashes are\n\
-      \032  converted to backslashes as necessary when paths are converted to\n\
-      \032  filenames in the local filesystem on a particular host. (For example,\n\
-      \032  suppose that we run Unison on a Windows system, synchronizing the\n\
-      \032  local root c:\\pierce with the root\n\
-      \032  ssh://saul.cis.upenn.edu/home/bcpierce on a Unix server. Then the path\n\
-      \032  current/todo.txt refers to the file c:\\pierce\\current\\todo.txt on the\n\
-      \032  client and /home/bcpierce/current/todo.txt on the server.)\n\
-      \n\
-      \032  The empty path (i.e., the empty sequence of names) denotes the whole\n\
-      \032  replica. Unison displays the empty path as \"[root].\"\n\
-      \n\
-      \032  If p is a path and q is a path beginning with p, then q is said to be\n\
-      \032  a descendant of p. (Each path is also a descendant of itself.)\n\
-      \n\
-      What is an Update?\n\
-      \n\
-      \032  The contents of a path p in a particular replica could be a file, a\n\
-      \032  directory, a symbolic link, or absent (if p does not refer to anything\n\
-      \032  at all in that replica). More specifically:\n\
-      \032    * If p refers to an ordinary file, then the contents of p are the\n\
-      \032      actual contents of this file (a string of bytes) plus the current\n\
-      \032      permission bits of the file.\n\
-      \032    * If p refers to a symbolic link, then the contents of p are just\n\
-      \032      the string specifying where the link points.\n\
-      \032    * If p refers to a directory, then the contents of p are just the\n\
-      \032      token \"DIRECTORY\" plus the current permission bits of the\n\
-      \032      directory.\n\
-      \032    * If p does not refer to anything in this replica, then the contents\n\
-      \032      of p are the token \"ABSENT.\"\n\
-      \n\
-      \032  Unison keeps a record of the contents of each path after each\n\
-      \032  successful synchronization of that path (i.e., it remembers the\n\
-      \032  contents at the last moment when they were the same in the two\n\
-      \032  replicas).\n\
-      \n\
-      \032  We say that a path is updated (in some replica) if its current\n\
-      \032  contents are different from its contents the last time it was\n\
-      \032  successfully synchronized. Note that whether a path is updated has\n\
-      \032  nothing to do with its last modification time--Unison considers only\n\
-      \032  the contents when determining whether an update has occurred. This\n\
-      \032  means that touching a file without changing its contents will not be\n\
-      \032  recognized as an update. A file can even be changed several times and\n\
-      \032  then changed back to its original contents; as long as Unison is only\n\
-      \032  run at the end of this process, no update will be recognized.\n\
-      \n\
-      \032  What Unison actually calculates is a close approximation to this\n\
-      \032  definition; see the section \"Caveats and Shortcomings\" .\n\
-      \n\
-      What is a Conflict?\n\
-      \n\
-      \032  A path is said to be conflicting if the following conditions all hold:\n\
-      \032   1. it has been updated in one replica,\n\
-      \032   2. it or any of its descendants has been updated in the other\n\
-      \032      replica, and\n\
-      \032   3. its contents in the two replicas are not identical.\n\
-      \n\
-      Reconciliation\n\
-      \n\
-      \032  Unison operates in several distinct stages:\n\
-      \032   1. On each host, it compares its archive file (which records the\n\
-      \032      state of each path in the replica when it was last synchronized)\n\
-      \032      with the current contents of the replica, to determine which paths\n\
-      \032      have been updated.\n\
-      \032   2. It checks for \"false conflicts\" -- paths that have been updated on\n\
-      \032      both replicas, but whose current values are identical. These paths\n\
-      \032      are silently marked as synchronized in the archive files in both\n\
-      \032      replicas.\n\
-      \032   3. It displays all the updated paths to the user. For updates that do\n\
-      \032      not conflict, it suggests a default action (propagating the new\n\
-      \032      contents from the updated replica to the other). Conflicting\n\
-      \032      updates are just displayed. The user is given an opportunity to\n\
-      \032      examine the current state of affairs, change the default actions\n\
-      \032      for nonconflicting updates, and choose actions for conflicting\n\
-      \032      updates.\n\
-      \032   4. It performs the selected actions, one at a time. Each action is\n\
-      \032      performed by first transferring the new contents to a temporary\n\
-      \032      file on the receiving host, then atomically moving them into\n\
-      \032      place.\n\
-      \032   5. It updates its archive files to reflect the new state of the\n\
-      \032      replicas.\n\
-      \n\
-      "))
-::
-    ("failures", ("Invariants", 
-     "Invariants\n\
-      \n\
-      \032  Given the importance and delicacy of the job that it performs, it is\n\
-      \032  important to understand both what a synchronizer does under normal\n\
-      \032  conditions and what can happen under unusual conditions such as system\n\
-      \032  crashes and communication failures.\n\
-      \n\
-      \032  Unison is careful to protect both its internal state and the state of\n\
-      \032  the replicas at every point in this process. Specifically, the\n\
-      \032  following guarantees are enforced:\n\
-      \032    * At every moment, each path in each replica has either (1) its\n\
-      \032      original contents (i.e., no change at all has been made to this\n\
-      \032      path), or (2) its correct final contents (i.e., the value that the\n\
-      \032      user expected to be propagated from the other replica).\n\
-      \032    * At every moment, the information stored on disk about Unison's\n\
-      \032      private state can be either (1) unchanged, or (2) updated to\n\
-      \032      reflect those paths that have been successfully synchronized.\n\
-      \n\
-      \032  The upshot is that it is safe to interrupt Unison at any time, either\n\
-      \032  manually or accidentally. [Caveat: the above is almost true there are\n\
-      \032  occasionally brief periods where it is not (and, because of\n\
-      \032  shortcoming of the Posix filesystem API, cannot be); in particular,\n\
-      \032  when it is copying a file onto a directory or vice versa, it must\n\
-      \032  first move the original contents out of the way. If Unison gets\n\
-      \032  interrupted during one of these periods, some manual cleanup may be\n\
-      \032  required. In this case, a file called DANGER.README will be left in\n\
-      \032  your home directory, containing information about the operation that\n\
-      \032  was interrupted. The next time you try to run Unison, it will notice\n\
-      \032  this file and warn you about it.]\n\
-      \n\
-      \032  If an interruption happens while it is propagating updates, then there\n\
-      \032  may be some paths for which an update has been propagated but which\n\
-      \032  have not been marked as synchronized in Unison's archives. This is no\n\
-      \032  problem: the next time Unison runs, it will detect changes to these\n\
-      \032  paths in both replicas, notice that the contents are now equal, and\n\
-      \032  mark the paths as successfully updated when it writes back its private\n\
-      \032  state at the end of this run.\n\
-      \n\
-      \032  If Unison is interrupted, it may sometimes leave temporary working\n\
-      \032  files (with suffix .tmp) in the replicas. It is safe to delete these\n\
-      \032  files. Also, if the backups flag is set, Unison will leave around old\n\
-      \032  versions of files that it overwrites, with names like\n\
-      \032  file.0.unison.bak. These can be deleted safely when they are no longer\n\
-      \032  wanted.\n\
-      \n\
-      \032  Unison is not bothered by clock skew between the different hosts on\n\
-      \032  which it is running. It only performs comparisons between timestamps\n\
-      \032  obtained from the same host, and the only assumption it makes about\n\
-      \032  them is that the clock on each system always runs forward.\n\
-      \n\
-      \032  If Unison finds that its archive files have been deleted (or that the\n\
-      \032  archive format has changed and they cannot be read, or that they don't\n\
-      \032  exist because this is the first run of Unison on these particular\n\
-      \032  roots), it takes a conservative approach: it behaves as though the\n\
-      \032  replicas had both been completely empty at the point of the last\n\
-      \032  synchronization. The effect of this is that, on the first run, files\n\
-      \032  that exist in only one replica will be propagated to the other, while\n\
-      \032  files that exist in both replicas but are unequal will be marked as\n\
-      \032  conflicting.\n\
-      \n\
-      \032  Touching a file without changing its contents should never affect\n\
-      \032  whether or not Unison does an update. (When running with the fastcheck\n\
-      \032  preference set to true--the default on Unix systems--Unison uses file\n\
-      \032  modtimes for a quick first pass to tell which files have definitely\n\
-      \032  not changed; then, for each file that might have changed, it computes\n\
-      \032  a fingerprint of the file's contents and compares it against the\n\
-      \032  last-synchronized contents. Also, the -times option allows you to\n\
-      \032  synchronize file times, but it does not cause identical files to be\n\
-      \032  changed; Unison will only modify the file times.)\n\
-      \n\
-      \032  It is safe to \"brainwash\" Unison by deleting its archive files on both\n\
-      \032  replicas. The next time it runs, it will assume that all the files it\n\
-      \032  sees in the replicas are new.\n\
-      \n\
-      \032  It is safe to modify files while Unison is working. If Unison\n\
-      \032  discovers that it has propagated an out-of-date change, or that the\n\
-      \032  file it is updating has changed on the target replica, it will signal\n\
-      \032  a failure for that file. Run Unison again to propagate the latest\n\
-      \032  change.\n\
-      \n\
-      \032  Changes to the ignore patterns from the user interface (e.g., using\n\
-      \032  the `i' key) are immediately reflected in the current profile.\n\
-      \n\
-      Caveats and Shortcomings\n\
-      \n\
-      \032  Here are some things to be careful of when using Unison.\n\
-      \032    * In the interests of speed, the update detection algorithm may\n\
-      \032      (depending on which OS architecture that you run Unison on)\n\
-      \032      actually use an approximation to the definition given in the\n\
-      \032      section \"What is an Update?\" .\n\
-      \032      In particular, the Unix implementation does not compare the actual\n\
-      \032      contents of files to their previous contents, but simply looks at\n\
-      \032      each file's inode number and modtime; if neither of these have\n\
-      \032      changed, then it concludes that the file has not been changed.\n\
-      \032      Under normal circumstances, this approximation is safe, in the\n\
-      \032      sense that it may sometimes detect \"false updates\" will never miss\n\
-      \032      a real one. However, it is possible to fool it, for example by\n\
-      \032      using retouch to change a file's modtime back to a time in the\n\
-      \032      past.\n\
-      \032    * If you synchronize between a single-user filesystem and a shared\n\
-      \032      Unix server, you should pay attention to your permission bits: by\n\
-      \032      default, Unison will synchronize permissions verbatim, which may\n\
-      \032      leave group-writable files on the server that could be written\n\
-      \032      over by a lot of people.\n\
-      \032      You can control this by setting your umask on both computers to\n\
-      \032      something like 022, masking out the \"world write\" and \"group\n\
-      \032      write\" permission bits.\n\
-      \032      Unison does not synchronize the setuid and setgid bits, for\n\
-      \032      security.\n\
-      \032    * The graphical user interface is single-threaded. This means that\n\
-      \032      if Unison is performing some long-running operation, the display\n\
-      \032      will not be repainted until it finishes. We recommend not trying\n\
-      \032      to do anything with the user interface while Unison is in the\n\
-      \032      middle of detecting changes or propagating files.\n\
-      \032    * Unison does not understand hard links.\n\
-      \032    * It is important to be a little careful when renaming directories\n\
-      \032      containing \"ignore\"d files.\n\
-      \032      For example, suppose Unison is synchronizing directory A between\n\
-      \032      the two machines called the \"local\" and the \"remote\" machine;\n\
-      \032      suppose directory A contains a subdirectory D; and suppose D on\n\
-      \032      the local machine contains a file or subdirectory P that matches\n\
-      \032      an ignore directive in the profile used to synchronize. Thus path\n\
-      \032      A/D/P exists on the local machine but not on the remote machine.\n\
-      \032      If D is renamed to D' on the remote machine, and this change is\n\
-      \032      propagated to the local machine, all such files or subdirectories\n\
-      \032      P will be deleted. This is because Unison sees the rename as a\n\
-      \032      delete and a separate create: it deletes the old directory\n\
-      \032      (including the ignored files) and creates a new one (not including\n\
-      \032      the ignored files, since they are completely invisible to it).\n\
-      \n\
-      "))
-::
-    ("", ("Reference Guide", 
-     "Reference Guide\n\
-      \n\
-      \032  This section covers the features of Unison in detail.\n\
-      \n\
-      "))
-::
-    ("running", ("Running Unison", 
-     "Running Unison\n\
-      \n\
-      \032  There are several ways to start Unison.\n\
-      \032    * Typing \"unison profile\" on the command line. Unison will look for\n\
-      \032      a file profile.prf in the .unison directory. If this file does not\n\
-      \032      specify a pair of roots, Unison will prompt for them and add them\n\
-      \032      to the information specified by the profile.\n\
-      \032    * Typing \"unison profile root1 root2\" on the command line. In this\n\
-      \032      case, Unison will use profile, which should not contain any root\n\
-      \032      directives.\n\
-      \032    * Typing \"unison root1 root2\" on the command line. This has the same\n\
-      \032      effect as typing \"unison default root1 root2.\"\n\
-      \032    * Typing just \"unison\" (or invoking Unison by clicking on a desktop\n\
-      \032      icon). In this case, Unison will ask for the profile to use for\n\
-      \032      synchronization (or create a new one, if necessary).\n\
-      \n\
-      The .unison Directory\n\
-      \n\
-      \032  Unison stores a variety of information in a private directory on each\n\
-      \032  host. If the environment variable UNISON is defined, then its value\n\
-      \032  will be used as the name of this directory. If UNISON is not defined,\n\
-      \032  then the name of the directory depends on which operating system you\n\
-      \032  are using. In Unix, the default is to use $HOME/.unison. In Windows,\n\
-      \032  if the environment variable USERPROFILE is defined, then the directory\n\
-      \032  will be $USERPROFILE\\.unison; otherwise if HOME is defined, it will be\n\
-      \032  $HOME\\.unison; otherwise, it will be c:\\.unison.\n\
-      \n\
-      \032  The archive file for each replica is found in the .unison directory on\n\
-      \032  that replica's host. Profiles (described below) are always taken from\n\
-      \032  the .unison directory on the client host.\n\
-      \n\
-      \032  Note that Unison maintains a completely different set of archive files\n\
-      \032  for each pair of roots.\n\
-      \n\
-      \032  We do not recommend synchronizing the whole .unison directory, as this\n\
-      \032  will involve frequent propagation of large archive files. It should be\n\
-      \032  safe to do it, though, if you really want to. Synchronizing just the\n\
-      \032  profile files in the .unison directory is definitely OK.\n\
-      \n\
-      Archive Files\n\
-      \n\
-      \032  The name of the archive file on each replica is calculated from\n\
-      \032    * the canonical names of all the hosts (short names like saul are\n\
-      \032      converted into full addresses like saul.cis.upenn.edu),\n\
-      \032    * the paths to the replicas on all the hosts (again, relative\n\
-      \032      pathnames, symbolic links, etc. are converted into full, absolute\n\
-      \032      paths), and\n\
-      \032    * an internal version number that is changed whenever a new Unison\n\
-      \032      release changes the format of the information stored in the\n\
-      \032      archive.\n\
-      \n\
-      \032  This method should work well for most users. However, it is\n\
-      \032  occasionally useful to change the way archive names are generated.\n\
-      \032  Unison provides two ways of doing this.\n\
-      \n\
-      \032  The function that finds the canonical hostname of the local host\n\
-      \032  (which is used, for example, in calculating the name of the archive\n\
-      \032  file used to remember which files have been synchronized) normally\n\
-      \032  uses the gethostname operating system call. However, if the\n\
-      \032  environment variable UNISONLOCALHOSTNAME is set, its value will be\n\
-      \032  used instead. This makes it easier to use Unison in situations where a\n\
-      \032  machine's name changes frequently (e.g., because it is a laptop and\n\
-      \032  gets moved around a lot).\n\
-      \n\
-      \032  A more powerful way of changing archive names is provided by the\n\
-      \032  rootalias preference. The preference file may contain any number of\n\
-      \032  lines of the form:\n\
-      \032   rootalias = //hostnameA//path-to-replicaA -> //hostnameB//path-to-replicaB\n\
-      \n\
-      \032  When calculating the name of the archive files for a given pair of\n\
-      \032  roots, Unison replaces any root that matches the left-hand side of any\n\
-      \032  rootalias rule by the corresponding right-hand side.\n\
-      \n\
-      \032  So, if you need to relocate a root on one of the hosts, you can add a\n\
-      \032  rule of the form:\n\
-      \032   rootalias = //new-hostname//new-path -> //old-hostname//old-path\n\
-      \n\
-      \032  Warning: The rootalias option is dangerous and should only be used if\n\
-      \032  you are sure you know what you're doing. In particular, it should only\n\
-      \032  be used if you are positive that either (1) both the original root and\n\
-      \032  the new alias refer to the same set of files, or (2) the files have\n\
-      \032  been relocated so that the original name is now invalid and will never\n\
-      \032  be used again. (If the original root and the alias refer to different\n\
-      \032  sets of files, Unison's update detector could get confused.) After\n\
-      \032  introducing a new rootalias, it is a good idea to run Unison a few\n\
-      \032  times interactively (with the batch flag off, etc.) and carefully\n\
-      \032  check that things look reasonable--in particular, that update\n\
-      \032  detection is working as expected.\n\
-      \n\
-      Preferences\n\
-      \n\
-      \032  Many details of Unison's behavior are configurable by user-settable\n\
-      \032  \"preferences.\"\n\
-      \n\
-      \032  Some preferences are boolean-valued; these are often called flags.\n\
-      \032  Others take numeric or string arguments, indicated in the preferences\n\
-      \032  list by n or xxx. Most of the string preferences can be given several\n\
-      \032  times; the arguments are accumulated into a list internally.\n\
-      \n\
-      \032  There are two ways to set the values of preferences: temporarily, by\n\
-      \032  providing command-line arguments to a particular run of Unison, or\n\
-      \032  permanently, by adding commands to a profile in the .unison directory\n\
-      \032  on the client host. The order of preferences (either on the command\n\
-      \032  line or in preference files) is not significant. On the command line,\n\
-      \032  preferences and other arguments (the profile name and roots) can be\n\
-      \032  intermixed in any order.\n\
-      \n\
-      \032  To set the value of a preference p from the command line, add an\n\
-      \032  argument -p (for a boolean flag) or -p n or -p xxx (for a numeric or\n\
-      \032  string preference) anywhere on the command line. To set a boolean flag\n\
-      \032  to false on the command line, use -p=false.\n\
-      \n\
-      \032  Here are all the preferences supported by Unison. This list can be\n\
-      \032  obtained by typing unison -help.\n\
-      \n\
-      Usage: unison [options]\n\
-      \032   or unison root1 root2 [options]\n\
-      \032   or unison profilename [options]\n\
-      \n\
-      Basic options:\n\
-      \032-auto              automatically accept default (nonconflicting) actions\n\
-      \032-batch             batch mode: ask no questions at all\n\
-      \032-doc xxx           show documentation ('-doc topics' lists topics)\n\
-      \032-follow xxx        add a pattern to the follow list\n\
-      \032-force xxx         force changes from this replica to the other\n\
-      \032-group             synchronize group attributes\n\
-      \032-ignore xxx        add a pattern to the ignore list\n\
-      \032-ignorenot xxx     add a pattern to the ignorenot list\n\
-      \032-owner             synchronize owner\n\
-      \032-path xxx          path to synchronize\n\
-      \032-perms n           part of the permissions which is synchronized\n\
-      \032-prefer xxx        choose this replica's version for conflicting changes\n\
-      \032-root xxx          root of a replica (should be used exactly twice)\n\
-      \032-silent            print nothing except error messages\n\
-      \032-terse             suppress status messages\n\
-      \032-testserver        exit immediately after the connection to the server\n\
-      \032-times             synchronize modification times\n\
-      \032-version           print version and exit\n\
-      \n\
-      Advanced options:\n\
-      \032-addprefsto xxx    file to add new prefs to\n\
-      \032-addversionno      add version number to name of unison on server\n\
-      \032-backup xxx        add a pattern to the backup list\n\
-      \032-backupcurr xxx    add a pattern to the backupcurr list\n\
-      \032-backupcurrnot xxx add a pattern to the backupcurrnot list\n\
-      \032-backupdir xxx     directory for storing centralized backups\n\
-      \032-backuploc xxx     where backups are stored ('local' or 'central')\n\
-      \032-backupnot xxx     add a pattern to the backupnot list\n\
-      \032-backupprefix xxx  prefix for the names of backup files\n\
-      \032-backups           keep backup copies of all files (see also 'backup')\n\
-      \032-backupsuffix xxx  a suffix to be added to names of backup files\n\
-      \032-confirmbigdel     ask about whole-replica (or path) deletes (default true)\n\
-      \032-confirmmerge      ask for confirmation before commiting results of a merge\n\
-      \032-contactquietly    suppress the 'contacting server' message during startup\n\
-      \032-copyprog xxx      external program for copying large files\n\
-      \032-copyprogrest xxx  variant of copyprog for resuming partial transfers\n\
-      \032-copyquoterem xxx  add quotes to remote file name for copyprog (true/false/def\n\
-      ault)\n\
-      \032-copythreshold n   use copyprog on files bigger than this (if >=0, in Kb)\n\
-      \032-debug xxx         debug module xxx ('all' -> everything, 'verbose' -> more)\n\
-      \032-diff xxx          command for showing differences between files\n\
-      \032-dontchmod         When set, never use the chmod system call\n\
-      \032-dumbtty           do not change terminal settings in text UI\n\
-      \032-fastcheck xxx     do fast update detection (true/false/default)\n\
-      \032-forcepartial xxx  add a pattern to the forcepartial list\n\
-      \032-height n          height (in lines) of main window in graphical interface\n\
-      \032-host xxx          bind the socket to this host name in server socket mode\n\
-      \032-ignorecase xxx    identify upper/lowercase filenames (true/false/default)\n\
-      \032-ignorelocks       ignore locks left over from previous run (dangerous!)\n\
-      \032-immutable xxx     add a pattern to the immutable list\n\
-      \032-immutablenot xxx  add a pattern to the immutablenot list\n\
-      \032-key xxx           define a keyboard shortcut for this profile (in some UIs)\n\
-      \032-killserver        kill server when done (even when using sockets)\n\
-      \032-label xxx         provide a descriptive string label for this profile\n\
-      \032-log               record actions in logfile (default true)\n\
-      \032-logfile xxx       logfile name\n\
-      \032-maxbackups n      number of backed up versions of a file\n\
-      \032-maxthreads n      maximum number of simultaneous file transfers\n\
-      \032-merge xxx         add a pattern to the merge list\n\
-      \032-mountpoint xxx    abort if this path does not exist\n\
-      \032-numericids        don't map uid/gid values by user/group names\n\
-      \032-preferpartial xxx add a pattern to the preferpartial list\n\
-      \032-pretendwin        Use creation times for detecting updates\n\
-      \032-repeat xxx        synchronize repeatedly (text interface only)\n\
-      \032-retry n           re-try failed synchronizations N times (text ui only)\n\
-      \032-rootalias xxx     register alias for canonical root names\n\
-      \032-rsrc xxx          synchronize resource forks (true/false/default)\n\
-      \032-rsync             activate the rsync transfer mode (default true)\n\
-      \032-selftest          run internal tests and exit\n\
-      \032-servercmd xxx     name of unison executable on remote server\n\
-      \032-showarchive       show 'true names' (for rootalias) of roots and archive\n\
-      \032-socket xxx        act as a server on a socket\n\
-      \032-sortbysize        list changed files by size, not name\n\
-      \032-sortfirst xxx     add a pattern to the sortfirst list\n\
-      \032-sortlast xxx      add a pattern to the sortlast list\n\
-      \032-sortnewfirst      list new before changed files\n\
-      \032-sshargs xxx       other arguments (if any) for remote shell command\n\
-      \032-sshcmd xxx        path to the ssh executable\n\
-      \032-ui xxx            select UI ('text' or 'graphic'); command-line only\n\
-      \032-xferbycopying     optimize transfers using local copies (default true)\n\
-      \n\
-      \032  Here, in more detail, is what they do. Many are discussed in greater\n\
-      \032  detail in other sections of the manual.\n\
-      \032  addprefsto xxx\n\
-      \032         By default, new preferences added by Unison (e.g., new ignore\n\
-      \032         clauses) will be appended to whatever preference file Unison\n\
-      \032         was told to load at the beginning of the run. Setting the\n\
-      \032         preference addprefsto filename makes Unison add new preferences\n\
-      \032         to the file named filename instead.\n\
-      \032  addversionno \n\
-      \032         When this flag is set to true, Unison will use\n\
-      \032         unison-currentversionnumber instead of just unison as the\n\
-      \032         remote server command. This allows multiple binaries for\n\
-      \032         different versions of unison to coexist conveniently on the\n\
-      \032         same server: whichever version is run on the client, the same\n\
-      \032         version will be selected on the server.\n\
-      \032  auto \n\
-      \032         When set to true, this flag causes the user interface to skip\n\
-      \032         asking for confirmations on non-conflicting changes. (More\n\
-      \032         precisely, when the user interface is done setting the\n\
-      \032         propagation direction for one entry and is about to move to the\n\
-      \032         next, it will skip over all non-conflicting entries and go\n\
-      \032         directly to the next conflict.)\n\
-      \032  backup xxx\n\
-      \032         Including the preference -backup pathspec causes Unison to keep\n\
-      \032         backup files for each path that matches pathspec. These backup\n\
-      \032         files are kept in the directory specified by the backuplocation\n\
-      \032         preference. The backups are named according to the backupprefix\n\
-      \032         and backupsuffix preferences. The number of versions that are\n\
-      \032         kept is determined by the maxbackups preference.\n\
-      \032         The syntax of pathspec is described in the section \"Path\n\
-      \032         Specification\" .\n\
-      \032  backupcurr xxx\n\
-      \032         Including the preference -backupcurr pathspec causes Unison to\n\
-      \032         keep a backup of the current version of every file matching\n\
-      \032         pathspec. This file will be saved as a backup with version\n\
-      \032         number 000. Such backups can be used as inputs to external\n\
-      \032         merging programs, for instance. See the documentatation for the\n\
-      \032         merge preference. For more details, see the section \"Merging\n\
-      \032         Conflicting Versions\" .\n\
-      \032         The syntax of pathspec is described in the section \"Path\n\
-      \032         Specification\" .\n\
-      \032  backupcurrnot xxx\n\
-      \032         Exceptions to backupcurr, like the ignorenot preference.\n\
-      \032  backupdir xxx\n\
-      \032         If this preference is set, Unison will use it as the name of\n\
-      \032         the directory used to store backup files specified by the\n\
-      \032         backup preference, when backuplocation is set to central. It is\n\
-      \032         checked after the UNISONBACKUPDIR environment variable.\n\
-      \032  backuploc xxx\n\
-      \032         This preference determines whether backups should be kept\n\
-      \032         locally, near the original files, or in a central directory\n\
-      \032         specified by the backupdir preference. If set to local, backups\n\
-      \032         will be kept in the same directory as the original files, and\n\
-      \032         if set to central, backupdir will be used instead.\n\
-      \032  backupnot xxx\n\
-      \032         The values of this preference specify paths or individual files\n\
-      \032         or regular expressions that should not be backed up, even if\n\
-      \032         the backup preference selects them--i.e., it selectively\n\
-      \032         overrides backup. The same caveats apply here as with ignore\n\
-      \032         and t ignorenot.\n\
-      \032  backupprefix xxx\n\
-      \032         When a backup for a file NAME is created, it is stored in a\n\
-      \032         directory specified by backuplocation, in a file called\n\
-      \032         backupprefixNAMEbackupsuffix. backupprefix can include a\n\
-      \032         directory name (causing Unison to keep all backup files for a\n\
-      \032         given directory in a subdirectory with this name), and both\n\
-      \032         backupprefix and backupsuffix can contain the string$VERSION,\n\
-      \032         which will be replaced by the age of the backup (1 for the most\n\
-      \032         recent, 2 for the second most recent, and so on...). This\n\
-      \032         keyword is ignored if it appears in a directory name in the\n\
-      \032         prefix; if it does not appear anywhere in the prefix or the\n\
-      \032         suffix, it will be automatically placed at the beginning of the\n\
-      \032         suffix.\n\
-      \032         One thing to be careful of: If the backuploc preference is set\n\
-      \032         to local, Unison will automatically ignore all files whose\n\
-      \032         prefix and suffix match backupprefix and backupsuffix. So be\n\
-      \032         careful to choose values for these preferences that are\n\
-      \032         sufficiently different from the names of your real files.\n\
-      \032  backups \n\
-      \032         Setting this flag to true is equivalent to setting\n\
-      \032         backuplocation to local and backup to Name *.\n\
-      \032  backupsuffix xxx\n\
-      \032         See backupprefix for full documentation.\n\
-      \032  batch \n\
-      \032         When this is set to true, the user interface will ask no\n\
-      \032         questions at all. Non-conflicting changes will be propagated;\n\
-      \032         conflicts will be skipped.\n\
-      \032  confirmbigdel \n\
-      \032         !When this is set to true, Unison will request an extra\n\
-      \032         confirmation if it appears that the entire replica has been\n\
-      \032         deleted, before propagating the change. If the batch flag is\n\
-      \032         also set, synchronization will be aborted. When the path\n\
-      \032         preference is used, the same confirmation will be requested for\n\
-      \032         top-level paths. (At the moment, this flag only affects the\n\
-      \032         text user interface.) See also the mountpoint preference.\n\
-      \032  confirmmerge \n\
-      \032         Setting this preference causes both the text and graphical\n\
-      \032         interfaces to ask the user if the results of a merge command\n\
-      \032         may be commited to the replica or not. Since the merge command\n\
-      \032         works on temporary files, the user can then cancel all the\n\
-      \032         effects of applying the merge if it turns out that the result\n\
-      \032         is not satisfactory. In batch-mode, this preference has no\n\
-      \032         effect. Default is false.\n\
-      \032  contactquietly \n\
-      \032         If this flag is set, Unison will skip displaying the\n\
-      \032         `Contacting server' message (which some users find annoying)\n\
-      \032         during startup.\n\
-      \032  copyprog xxx\n\
-      \032         A string giving the name of an external program that can be\n\
-      \032         used to copy large files efficiently (plus command-line\n\
-      \032         switches telling it to copy files in-place). The default\n\
-      \032         setting invokes rsync with appropriate options--most users\n\
-      \032         should not need to change it.\n\
-      \032  copyprogrest xxx\n\
-      \032         A variant of copyprog that names an external program that\n\
-      \032         should be used to continue the transfer of a large file that\n\
-      \032         has already been partially transferred. Typically, copyprogrest\n\
-      \032         will just be copyprog with one extra option (e.g., -partial,\n\
-      \032         for rsync). The default setting invokes rsync with appropriate\n\
-      \032         options--most users should not need to change it.\n\
-      \032  copyquoterem xxx\n\
-      \032         When set to true, this flag causes Unison to add an extra layer\n\
-      \032         of quotes to the remote path passed to the external copy\n\
-      \032         program. This is needed by rsync, for example, which internally\n\
-      \032         uses an ssh connection requiring an extra level of quoting for\n\
-      \032         paths containing spaces. When this flag is set to default,\n\
-      \032         extra quotes are added if the value of copyprog contains the\n\
-      \032         string rsync.\n\
-      \032  copythreshold n\n\
-      \032         A number indicating above what filesize (in kilobytes) Unison\n\
-      \032         should use the external copying utility specified by copyprog.\n\
-      \032         Specifying 0 will cause all copies to use the external program;\n\
-      \032         a negative number will prevent any files from using it. The\n\
-      \032         default is -1. See the section \"Making Unison Faster on Large\n\
-      \032         Files\" for more information.\n\
-      \032  debug xxx\n\
-      \032         This preference is used to make Unison print various sorts of\n\
-      \032         information about what it is doing internally on the standard\n\
-      \032         error stream. It can be used many times, each time with the\n\
-      \032         name of a module for which debugging information should be\n\
-      \032         printed. Possible arguments for debug can be found by looking\n\
-      \032         for calls to Util.debug in the sources (using, e.g., grep).\n\
-      \032         Setting -debug all causes information from all modules to be\n\
-      \032         printed (this mode of usage is the first one to try, if you are\n\
-      \032         trying to understand something that Unison seems to be doing\n\
-      \032         wrong); -debug verbose turns on some additional debugging\n\
-      \032         output from some modules (e.g., it will show exactly what bytes\n\
-      \032         are being sent across the network).\n\
-      \032  diff xxx\n\
-      \032         This preference can be used to control the name and\n\
-      \032         command-line arguments of the system utility used to generate\n\
-      \032         displays of file differences. The default is `diff -u CURRENT2\n\
-      \032         CURRENT1'. If the value of this preference contains the\n\
-      \032         substrings CURRENT1 and CURRENT2, these will be replaced by the\n\
-      \032         names of the files to be diffed. If not, the two filenames will\n\
-      \032         be appended to the command. In both cases, the filenames are\n\
-      \032         suitably quoted.\n\
-      \032  doc xxx\n\
-      \032         The command-line argument -doc secname causes unison to display\n\
-      \032         section secname of the manual on the standard output and then\n\
-      \032         exit. Use -doc all to display the whole manual, which includes\n\
-      \032         exactly the same information as the printed and HTML manuals,\n\
-      \032         modulo formatting. Use -doc topics to obtain a list of the\n\
-      \032         names of the various sections that can be printed.\n\
-      \032  dontchmod \n\
-      \032         By default, Unison uses the 'chmod' system call to set the\n\
-      \032         permission bits of files after it has copied them. But in some\n\
-      \032         circumstances (and under some operating systems), the chmod\n\
-      \032         call always fails. Setting this preference completely prevents\n\
-      \032         Unison from ever calling chmod.\n\
-      \032  dumbtty \n\
-      \032         When set to true, this flag makes the text mode user interface\n\
-      \032         avoid trying to change any of the terminal settings. (Normally,\n\
-      \032         Unison puts the terminal in `raw mode', so that it can do\n\
-      \032         things like overwriting the current line.) This is useful, for\n\
-      \032         example, when Unison runs in a shell inside of Emacs.\n\
-      \032         When dumbtty is set, commands to the user interface need to be\n\
-      \032         followed by a carriage return before Unison will execute them.\n\
-      \032         (When it is off, Unison recognizes keystrokes as soon as they\n\
-      \032         are typed.)\n\
-      \032         This preference has no effect on the graphical user interface.\n\
-      \032  dumparchives \n\
-      \032         When this preference is set, Unison will create a file\n\
-      \032         unison.dump on each host, containing a text summary of the\n\
-      \032         archive, immediately after loading it.\n\
-      \032  fastcheck xxx\n\
-      \032         When this preference is set to true, Unison will use the\n\
-      \032         modification time and length of a file as a `pseudo inode\n\
-      \032         number' when scanning replicas for updates, instead of reading\n\
-      \032         the full contents of every file. Under Windows, this may cause\n\
-      \032         Unison to miss propagating an update if the modification time\n\
-      \032         and length of the file are both unchanged by the update.\n\
-      \032         However, Unison will never overwrite such an update with a\n\
-      \032         change from the other replica, since it always does a safe\n\
-      \032         check for updates just before propagating a change. Thus, it is\n\
-      \032         reasonable to use this switch under Windows most of the time\n\
-      \032         and occasionally run Unison once with fastcheck set to false,\n\
-      \032         if you are worried that Unison may have overlooked an update.\n\
-      \032         The default value of the preference is auto, which causes\n\
-      \032         Unison to use fast checking on Unix replicas (where it is safe)\n\
-      \032         and slow checking on Windows replicas. For backward\n\
-      \032         compatibility, yes, no, and default can be used in place of\n\
-      \032         true, false, and auto. See the section \"Fast Checking\" for more\n\
-      \032         information.\n\
-      \032  follow xxx\n\
-      \032         Including the preference -follow pathspec causes Unison to\n\
-      \032         treat symbolic links matching pathspec as `invisible' and\n\
-      \032         behave as if the object pointed to by the link had appeared\n\
-      \032         literally at this position in the replica. See the section\n\
-      \032         \"Symbolic Links\" for more details. The syntax of pathspec> is\n\
-      \032         described in the section \"Path Specification\" .\n\
-      \032  force xxx\n\
-      \032         Including the preference -force root causes Unison to resolve\n\
-      \032         all differences (even non-conflicting changes) in favor of\n\
-      \032         root. This effectively changes Unison from a synchronizer into\n\
-      \032         a mirroring utility.\n\
-      \032         You can also specify -force newer (or -force older) to force\n\
-      \032         Unison to choose the file with the later (earlier) modtime. In\n\
-      \032         this case, the -times preference must also be enabled.\n\
-      \032         This preference is overridden by the forcepartial preference.\n\
-      \032         This preference should be used only if you are sure you know\n\
-      \032         what you are doing!\n\
-      \032  forcepartial xxx\n\
-      \032         Including the preference forcepartial PATHSPEC -> root causes\n\
-      \032         Unison to resolve all differences (even non-conflicting\n\
-      \032         changes) in favor of root for the files in PATHSPEC (see the\n\
-      \032         section \"Path Specification\" for more information). This\n\
-      \032         effectively changes Unison from a synchronizer into a mirroring\n\
-      \032         utility.\n\
-      \032         You can also specify forcepartial PATHSPEC -> newer (or\n\
-      \032         forcepartial PATHSPEC older) to force Unison to choose the file\n\
-      \032         with the later (earlier) modtime. In this case, the -times\n\
-      \032         preference must also be enabled.\n\
-      \032         This preference should be used only if you are sure you know\n\
-      \032         what you are doing!\n\
-      \032  group \n\
-      \032         When this flag is set to true, the group attributes of the\n\
-      \032         files are synchronized. Whether the group names or the group\n\
-      \032         identifiers are synchronizeddepends on the preference numerids.\n\
-      \032  height n\n\
-      \032         Used to set the height (in lines) of the main window in the\n\
-      \032         graphical user interface.\n\
-      \032  ignore xxx\n\
-      \032         Including the preference -ignore pathspec causes Unison to\n\
-      \032         completely ignore paths that match pathspec (as well as their\n\
-      \032         children). This is useful for avoiding synchronizing temporary\n\
-      \032         files, object files, etc. The syntax of pathspec is described\n\
-      \032         in the section \"Path Specification\" , and further details on\n\
-      \032         ignoring paths is found in the section \"Ignoring Paths\" .\n\
-      \032  ignorecase xxx\n\
-      \032         When set to true, this flag causes Unison to treat filenames as\n\
-      \032         case insensitive--i.e., files in the two replicas whose names\n\
-      \032         differ in (upper- and lower-case) `spelling' are treated as the\n\
-      \032         same file. When the flag is set to false, Unison will treat all\n\
-      \032         filenames as case sensitive. Ordinarily, when the flag is set\n\
-      \032         to default, filenames are automatically taken to be\n\
-      \032         case-insensitive if either host is running Windows or OSX. In\n\
-      \032         rare circumstances it is useful to set the flag manually (e.g.\n\
-      \032         when running Unison on a Unix system with a FAT [Windows]\n\
-      \032         volume mounted).\n\
-      \032  ignorelocks \n\
-      \032         When this preference is set, Unison will ignore any lock files\n\
-      \032         that may have been left over from a previous run of Unison that\n\
-      \032         was interrupted while reading or writing archive files; by\n\
-      \032         default, when Unison sees these lock files it will stop and\n\
-      \032         request manual intervention. This option should be set only if\n\
-      \032         you are positive that no other instance of Unison might be\n\
-      \032         concurrently accessing the same archive files (e.g., because\n\
-      \032         there was only one instance of unison running and it has just\n\
-      \032         crashed or you have just killed it). It is probably not a good\n\
-      \032         idea to set this option in a profile: it is intended for\n\
-      \032         command-line use.\n\
-      \032  ignorenot xxx\n\
-      \032         This preference overrides the preference ignore. It gives a\n\
-      \032         list of patterns (in the same format as ignore) for paths that\n\
-      \032         should definitely not be ignored, whether or not they happen to\n\
-      \032         match one of the ignore patterns.\n\
-      \032         Note that the semantics of ignore and ignorenot is a little\n\
-      \032         counter-intuitive. When detecting updates, Unison examines\n\
-      \032         paths in depth-first order, starting from the roots of the\n\
-      \032         replicas and working downwards. Before examining each path, it\n\
-      \032         checks whether it matches ignore and does not match ignorenot;\n\
-      \032         in this case it skips this path and all its descendants. This\n\
-      \032         means that, if some parent of a given path matches an ignore\n\
-      \032         pattern, then it will be skipped even if the path itself\n\
-      \032         matches an ignorenot pattern. In particular, putting ignore =\n\
-      \032         Path * in your profile and then using t ignorenot to select\n\
-      \032         particular paths to be synchronized will not work. Instead, you\n\
-      \032         should use the path preference to choose particular paths to\n\
-      \032         synchronize.\n\
-      \032  immutable xxx\n\
-      \032         This preference specifies paths for directories whose immediate\n\
-      \032         children are all immutable files -- i.e., once a file has been\n\
-      \032         created, its contents never changes. When scanning for updates,\n\
-      \032         Unison does not check whether these files have been modified;\n\
-      \032         this can speed update detection significantly (in particular,\n\
-      \032         for mail directories).\n\
-      \032  immutablenot xxx\n\
-      \032         This preference overrides immutable.\n\
-      \032  key xxx\n\
-      \032         Used in a profile to define a numeric key (0-9) that can be\n\
-      \032         used in the graphical user interface to switch immediately to\n\
-      \032         this profile.\n\
-      \032  killserver \n\
-      \032         When set to true, this flag causes Unison to kill the remote\n\
-      \032         server process when the synchronization is finished. This\n\
-      \032         behavior is the default for ssh connections, so this preference\n\
-      \032         is not normally needed when running over ssh; it is provided so\n\
-      \032         that socket-mode servers can be killed off after a single run\n\
-      \032         of Unison, rather than waiting to accept future connections.\n\
-      \032         (Some users prefer to start a remote socket server for each run\n\
-      \032         of Unison, rather than leaving one running all the time.)\n\
-      \032  label xxx\n\
-      \032         Used in a profile to provide a descriptive string documenting\n\
-      \032         its settings. (This is useful for users that switch between\n\
-      \032         several profiles, especially using the `fast switch' feature of\n\
-      \032         the graphical user interface.)\n\
-      \032  log \n\
-      \032         When this flag is set, Unison will log all changes to the\n\
-      \032         filesystems on a file.\n\
-      \032  logfile xxx\n\
-      \032         By default, logging messages will be appended to the file\n\
-      \032         unison.log in your HOME directory. Set this preference if you\n\
-      \032         prefer another file.\n\
-      \032  maxbackups n\n\
-      \032         This preference specifies the number of backup versions that\n\
-      \032         will be kept by unison, for each path that matches the\n\
-      \032         predicate backup. The default is 2.\n\
-      \032  maxthreads n\n\
-      \032         This preference controls how much concurrency is allowed during\n\
-      \032         the transport phase. Normally, it should be set reasonably high\n\
-      \032         (default is 20) to maximize performance, but when Unison is\n\
-      \032         used over a low-bandwidth link it may be helpful to set it\n\
-      \032         lower (e.g. to 1) so that Unison doesn't soak up all the\n\
-      \032         available bandwidth.\n\
-      \032  merge xxx\n\
-      \032         This preference can be used to run a merge program which will\n\
-      \032         create a new version for each of the files and the backup, with\n\
-      \032         the last backup and the both replicas. Setting the merge\n\
-      \032         preference for a path will also cause this path to be backed\n\
-      \032         up, just like t backup. The syntax of pathspec>cmd is described\n\
-      \032         in the section \"Path Specification\" , and further details on\n\
-      \032         Merging functions are present in the section \"Merging files\" .\n\
-      \032  mountpoint xxx\n\
-      \032         Including the preference -mountpoint PATH causes Unison to\n\
-      \032         double-check, at the end of update detection, that PATH exists\n\
-      \032         and abort if it does not. This is useful when Unison is used to\n\
-      \032         synchronize removable media. This preference can be given more\n\
-      \032         than once. See the section \"Mount Points\" .\n\
-      \032  numericids \n\
-      \032         When this flag is set to true, groups and users are\n\
-      \032         synchronized numerically, rather than by name.\n\
-      \032         The special uid 0 and the special group 0 are never mapped via\n\
-      \032         user/group names even if this preference is not set.\n\
-      \032  owner \n\
-      \032         When this flag is set to true, the owner attributes of the\n\
-      \032         files are synchronized. Whether the owner names or the owner\n\
-      \032         identifiers are synchronizeddepends on the preference\n\
-      \032         extttnumerids.\n\
-      \032  path xxx\n\
-      \032         When no path preference is given, Unison will simply\n\
-      \032         synchronize the two entire replicas, beginning from the given\n\
-      \032         pair of roots. If one or more path preferences are given, then\n\
-      \032         Unison will synchronize only these paths and their children.\n\
-      \032         (This is useful for doing a fast sync of just one directory,\n\
-      \032         for example.) Note that path preferences are intepreted\n\
-      \032         literally--they are not regular expressions.\n\
-      \032  perms n\n\
-      \032         The integer value of this preference is a mask indicating which\n\
-      \032         permission bits should be synchronized. It is set by default to\n\
-      \032         0o1777: all bits but the set-uid and set-gid bits are\n\
-      \032         synchronised (synchronizing theses latter bits can be a\n\
-      \032         security hazard). If you want to synchronize all bits, you can\n\
-      \032         set the value of this preference to -1.\n\
-      \032  prefer xxx\n\
-      \032         Including the preference -prefer root causes Unison always to\n\
-      \032         resolve conflicts in favor of root, rather than asking for\n\
-      \032         guidance from the user. (The syntax of root is the same as for\n\
-      \032         the root preference, plus the special values newer and older.)\n\
-      \032         This preference is overridden by the preferpartial preference.\n\
-      \032         This preference should be used only if you are sure you know\n\
-      \032         what you are doing!\n\
-      \032  preferpartial xxx\n\
-      \032         Including the preference preferpartial PATHSPEC -> root causes\n\
-      \032         Unison always to resolve conflicts in favor of root, rather\n\
-      \032         than asking for guidance from the user, for the files in\n\
-      \032         PATHSPEC (see the section \"Path Specification\" for more\n\
-      \032         information). (The syntax of root is the same as for the root\n\
-      \032         preference, plus the special values newer and older.)\n\
-      \032         This preference should be used only if you are sure you know\n\
-      \032         what you are doing!\n\
-      \032  pretendwin \n\
-      \032         When set to true, this preference makes Unison use\n\
-      \032         Windows-style fast update detection (using file creation times\n\
-      \032         as \"pseudo-inode-numbers\"), even when running on a Unix system.\n\
-      \032         This switch should be used with care, as it is less safe than\n\
-      \032         the standard update detection method, but it can be useful for\n\
-      \032         synchronizing VFAT filesystems (which do not support inode\n\
-      \032         numbers) mounted on Unix systems. The fastcheck option should\n\
-      \032         also be set to true.\n\
-      \032  repeat xxx\n\
-      \032         Setting this preference causes the text-mode interface to\n\
-      \032         synchronize repeatedly, rather than doing it just once and\n\
-      \032         stopping. If the argument is a number, Unison will pause for\n\
-      \032         that many seconds before beginning again.\n\
-      \032  retry n\n\
-      \032         Setting this preference causes the text-mode interface to try\n\
-      \032         again to synchronize updated paths where synchronization fails.\n\
-      \032         Each such path will be tried N times.\n\
-      \032  root xxx\n\
-      \032         Each use of this preference names the root of one of the\n\
-      \032         replicas for Unison to synchronize. Exactly two roots are\n\
-      \032         needed, so normal modes of usage are either to give two values\n\
-      \032         for root in the profile, or to give no values in the profile\n\
-      \032         and provide two on the command line. Details of the syntax of\n\
-      \032         roots can be found in the section \"Roots\" .\n\
-      \032         The two roots can be given in either order; Unison will sort\n\
-      \032         them into a canonical order before doing anything else. It also\n\
-      \032         tries to `canonize' the machine names and paths that appear in\n\
-      \032         the roots, so that, if Unison is invoked later with a slightly\n\
-      \032         different name for the same root, it will be able to locate the\n\
-      \032         correct archives.\n\
-      \032  rootalias xxx\n\
-      \032         When calculating the name of the archive files for a given pair\n\
-      \032         of roots, Unison replaces any roots matching the left-hand side\n\
-      \032         of any rootalias rule by the corresponding right-hand side.\n\
-      \032  rshargs xxx\n\
-      \032         The string value of this preference will be passed as\n\
-      \032         additional arguments (besides the host name and the name of the\n\
-      \032         Unison executable on the remote system) to the rsh command used\n\
-      \032         to invoke the remote server.\n\
-      \032  rshcmd xxx\n\
-      \032         This preference can be used to explicitly set the name of the\n\
-      \032         rsh executable (e.g., giving a full path name), if necessary.\n\
-      \032  rsrc xxx\n\
-      \032         When set to true, this flag causes Unison to synchronize\n\
-      \032         resource forks and HFS meta-data. On filesystems that do not\n\
-      \032         natively support resource forks, this data is stored in\n\
-      \032         Carbon-compatible ._ AppleDouble files. When the flag is set to\n\
-      \032         false, Unison will not synchronize these data. Ordinarily, the\n\
-      \032         flag is set to default, and these data are automatically\n\
-      \032         synchronized if either host is running OSX. In rare\n\
-      \032         circumstances it is useful to set the flag manually.\n\
-      \032  rsync \n\
-      \032         Unison uses the 'rsync algorithm' for 'diffs-only' transfer of\n\
-      \032         updates to large files. Setting this flag to false makes Unison\n\
-      \032         use whole-file transfers instead. Under normal circumstances,\n\
-      \032         there is no reason to do this, but if you are having trouble\n\
-      \032         with repeated 'rsync failure' errors, setting it to false\n\
-      \032         should permit you to synchronize the offending files.\n\
-      \032  selftest \n\
-      \032         Run internal tests and exit. This option is mostly for\n\
-      \032         developers and must be used carefully: in particular, it will\n\
-      \032         delete the contents of both roots, so that it can install its\n\
-      \032         own files for testing. This flag only makes sense on the\n\
-      \032         command line. When it is provided, no preference file is read:\n\
-      \032         all preferences must be specified on thecommand line. Also,\n\
-      \032         since the self-test procedure involves overwriting the roots\n\
-      \032         and backup directory, the names of the roots and of the\n\
-      \032         backupdir preference must include the string \"test\" or else the\n\
-      \032         tests will be aborted. (If these are not given on the command\n\
-      \032         line, dummy subdirectories in the current directory will be\n\
-      \032         created automatically.)\n\
-      \032  servercmd xxx\n\
-      \032         This preference can be used to explicitly set the name of the\n\
-      \032         Unison executable on the remote server (e.g., giving a full\n\
-      \032         path name), if necessary.\n\
-      \032  showarchive \n\
-      \032         When this preference is set, Unison will print out the 'true\n\
-      \032         names'of the roots, in the same form as is expected by the\n\
-      \032         rootaliaspreference.\n\
-      \032  silent \n\
-      \032         When this preference is set to true, the textual user interface\n\
-      \032         will print nothing at all, except in the case of errors.\n\
-      \032         Setting silent to true automatically sets the batch preference\n\
-      \032         to true.\n\
-      \032  sortbysize \n\
-      \032         When this flag is set, the user interface will list changed\n\
-      \032         files by size (smallest first) rather than by name. This is\n\
-      \032         useful, for example, for synchronizing over slow links, since\n\
-      \032         it puts very large files at the end of the list where they will\n\
-      \032         not prevent smaller files from being transferred quickly.\n\
-      \032         This preference (as well as the other sorting flags, but not\n\
-      \032         the sorting preferences that require patterns as arguments) can\n\
-      \032         be set interactively and temporarily using the 'Sort' menu in\n\
-      \032         the graphical user interface.\n\
-      \032  sortfirst xxx\n\
-      \032         Each argument to sortfirst is a pattern pathspec, which\n\
-      \032         describes a set of paths. Files matching any of these patterns\n\
-      \032         will be listed first in the user interface. The syntax of\n\
-      \032         pathspec is described in the section \"Path Specification\" .\n\
-      \032  sortlast xxx\n\
-      \032         Similar to sortfirst, except that files matching one of these\n\
-      \032         patterns will be listed at the very end.\n\
-      \032  sortnewfirst \n\
-      \032         When this flag is set, the user interface will list newly\n\
-      \032         created files before all others. This is useful, for example,\n\
-      \032         for checking that newly created files are not `junk', i.e.,\n\
-      \032         ones that should be ignored or deleted rather than\n\
-      \032         synchronized.\n\
-      \032  sshargs xxx\n\
-      \032         The string value of this preference will be passed as\n\
-      \032         additional arguments (besides the host name and the name of the\n\
-      \032         Unison executable on the remote system) to the ssh command used\n\
-      \032         to invoke the remote server.\n\
-      \032  sshcmd xxx\n\
-      \032         This preference can be used to explicitly set the name of the\n\
-      \032         ssh executable (e.g., giving a full path name), if necessary.\n\
-      \032  sshversion xxx\n\
-      \032         This preference can be used to control which version of ssh\n\
-      \032         should be used to connect to the server. Legal values are 1 and\n\
-      \032         2, which will cause unison to try to use ssh1 orssh2 instead of\n\
-      \032         just ssh to invoke ssh. The default value is empty, which will\n\
-      \032         make unison use whatever version of ssh is installed as the\n\
-      \032         default `ssh' command.\n\
-      \032  terse \n\
-      \032         When this preference is set to true, the user interface will\n\
-      \032         not print status messages.\n\
-      \032  testserver \n\
-      \032         Setting this flag on the command line causes Unison to attempt\n\
-      \032         to connect to the remote server and, if successful, print a\n\
-      \032         message and immediately exit. Useful for debugging installation\n\
-      \032         problems. Should not be set in preference files.\n\
-      \032  times \n\
-      \032         When this flag is set to true, file modification times (but not\n\
-      \032         directory modtimes) are propagated.\n\
-      \032  ui xxx\n\
-      \032         This preference selects either the graphical or the textual\n\
-      \032         user interface. Legal values are graphic or text.\n\
-      \032         Because this option is processed specially during Unison's\n\
-      \032         start-up sequence, it can only be used on the command line. In\n\
-      \032         preference files it has no effect.\n\
-      \032         If the Unison executable was compiled with only a textual\n\
-      \032         interface, this option has no effect. (The pre-compiled\n\
-      \032         binaries are all compiled with both interfaces available.)\n\
-      \032  version \n\
-      \032         Print the current version number and exit. (This option only\n\
-      \032         makes sense on the command line.)\n\
-      \032  xferbycopying \n\
-      \032         When this preference is set, Unison will try to avoid\n\
-      \032         transferring file contents across the network by recognizing\n\
-      \032         when a file with the required contents already exists in the\n\
-      \032         target replica. This usually allows file moves to be propagated\n\
-      \032         very quickly. The default value istrue.\n\
-      \n\
-      Profiles\n\
-      \n\
-      \032  A profile is a text file that specifies permanent settings for roots,\n\
-      \032  paths, ignore patterns, and other preferences, so that they do not\n\
-      \032  need to be typed at the command line every time Unison is run.\n\
-      \032  Profiles should reside in the .unison directory on the client machine.\n\
-      \032  If Unison is started with just one argument name on the command line,\n\
-      \032  it looks for a profile called name.prf in the .unison directory. If it\n\
-      \032  is started with no arguments, it scans the .unison directory for files\n\
-      \032  whose names end in .prf and offers a menu (provided that the Unison\n\
-      \032  executable is compiled with the graphical user interface). If a file\n\
-      \032  named default.prf is found, its settings will be offered as the\n\
-      \032  default choices.\n\
-      \n\
-      \032  To set the value of a preference p permanently, add to the appropriate\n\
-      \032  profile a line of the form\n\
-      \032       p = true\n\
-      \n\
-      \032  for a boolean flag or\n\
-      \032       p = <value>\n\
-      \n\
-      \032  for a preference of any other type.\n\
-      \n\
-      \032  Whitespaces around p and xxx are ignored. A profile may also include\n\
-      \032  blank lines and lines beginning with #; both are ignored.\n\
-      \n\
-      \032  When Unison starts, it first reads the profile and then the command\n\
-      \032  line, so command-line options will override settings from the profile.\n\
-      \n\
-      \032  Profiles may also include lines of the form include name, which will\n\
-      \032  cause the file name (or name.prf, if name does not exist in the\n\
-      \032  .unison directory) to be read at the point, and included as if its\n\
-      \032  contents, instead of the include line, was part of the profile.\n\
-      \032  Include lines allows settings common to several profiles to be stored\n\
-      \032  in one place.\n\
-      \n\
-      \032  A profile may include a preference `label = desc' to provide a\n\
-      \032  description of the options selected in this profile. The string desc\n\
-      \032  is listed along with the profile name in the profile selection dialog,\n\
-      \032  and displayed in the top-right corner of the main Unison window in the\n\
-      \032  graphical user interface.\n\
-      \n\
-      \032  The graphical user-interface also supports one-key shortcuts for\n\
-      \032  commonly used profiles. If a profile contains a preference of the form\n\
-      \032  `key = n', where n is a single digit, then pressing this digit key\n\
-      \032  will cause Unison to immediately switch to this profile and begin\n\
-      \032  synchronization again from scratch. In this case, all actions that\n\
-      \032  have been selected for a set of changes currently being displayed will\n\
-      \032  be discarded.\n\
-      \n\
-      Sample Profiles\n\
-      \n\
-      A Minimal Profile\n\
-      \n\
-      \032  Here is a very minimal profile file, such as might be found in\n\
-      \032  .unison/default.prf:\n\
-      \032   # Roots of the synchronization\n\
-      \032   root = /home/bcpierce\n\
-      \032   root = ssh://saul//home/bcpierce\n\
-      \n\
-      \032   # Paths to synchronize\n\
-      \032   path = current\n\
-      \032   path = common\n\
-      \032   path = .netscape/bookmarks.html\n\
-      \n\
-      A Basic Profile\n\
-      \n\
-      \032  Here is a more sophisticated profile, illustrating some other useful\n\
-      \032  features.\n\
-      \032   # Roots of the synchronization\n\
-      \032   root = /home/bcpierce\n\
-      \032   root = ssh://saul//home/bcpierce\n\
-      \n\
-      \032   # Paths to synchronize\n\
-      \032   path = current\n\
-      \032   path = common\n\
-      \032   path = .netscape/bookmarks.html\n\
-      \n\
-      \032   # Some regexps specifying names and paths to ignore\n\
-      \032   ignore = Name temp.*\n\
-      \032   ignore = Name *~\n\
-      \032   ignore = Name .*~\n\
-      \032   ignore = Path */pilot/backup/Archive_*\n\
-      \032   ignore = Name *.o\n\
-      \032   ignore = Name *.tmp\n\
-      \n\
-      \032   # Window height\n\
-      \032   height = 37\n\
-      \n\
-      \032   # Keep a backup copy of every file in a central location\n\
-      \032   backuplocation = central\n\
-      \032   backupdir = /home/bcpierce/backups\n\
-      \032   backup = Name *\n\
-      \032   backupprefix = $VERSION.\n\
-      \032   backupsuffix =\n\
-      \n\
-      \032   # Use this command for displaying diffs\n\
-      \032   diff = diff -y -W 79 --suppress-common-lines\n\
-      \n\
-      \032   # Log actions to the terminal\n\
-      \032   log = true\n\
-      \n\
-      A Power-User Profile\n\
-      \n\
-      \032  When Unison is used with large replicas, it is often convenient to be\n\
-      \032  able to synchronize just a part of the replicas on a given run (this\n\
-      \032  saves the time of detecting updates in the other parts). This can be\n\
-      \032  accomplished by splitting up the profile into several parts -- a\n\
-      \032  common part containing most of the preference settings, plus one\n\
-      \032  \"top-level\" file for each set of paths that need to be synchronized.\n\
-      \032  (The include mechanism can also be used to allow the same set of\n\
-      \032  preference settings to be used with different roots.)\n\
-      \n\
-      \032  The collection of profiles implementing this scheme might look as\n\
-      \032  follows. The file default.prf is empty except for an include\n\
-      \032  directive:\n\
-      \032   # Include the contents of the file common\n\
-      \032   include common\n\
-      \n\
-      \032  Note that the name of the common file is common, not common.prf; this\n\
-      \032  prevents Unison from offering common as one of the list of profiles in\n\
-      \032  the opening dialog (in the graphical UI).\n\
-      \n\
-      \032  The file common contains the real preferences:\n\
-      \032   # Roots of the synchronization\n\
-      \032   root = /home/bcpierce\n\
-      \032   root = ssh://saul//home/bcpierce\n\
-      \n\
-      \032   # (... other preferences ...)\n\
-      \n\
-      \032   # If any new preferences are added by Unison (e.g. 'ignore'\n\
-      \032   # preferences added via the graphical UI), then store them in the\n\
-      \032   # file 'common' rathen than in the top-level preference file\n\
-      \032   addprefsto = common\n\
-      \n\
-      \032   # Names and paths to ignore:\n\
-      \032   ignore = Name temp.*\n\
-      \032   ignore = Name *~\n\
-      \032   ignore = Name .*~\n\
-      \032   ignore = Path */pilot/backup/Archive_*\n\
-      \032   ignore = Name *.o\n\
-      \032   ignore = Name *.tmp\n\
-      \n\
-      \032  Note that there are no path preferences in common. This means that,\n\
-      \032  when we invoke Unison with the default profile (e.g., by typing\n\
-      \032  'unison default' or just 'unison' on the command line), the whole\n\
-      \032  replicas will be synchronized. (If we never want to synchronize the\n\
-      \032  whole replicas, then default.prf would instead include settings for\n\
-      \032  all the paths that are usually synchronized.)\n\
-      \n\
-      \032  To synchronize just part of the replicas, Unison is invoked with an\n\
-      \032  alternate preference file--e.g., doing 'unison workingset', where the\n\
-      \032  preference file workingset.prf contains\n\
-      \032   path = current/papers\n\
-      \032   path = Mail/inbox\n\
-      \032   path = Mail/drafts\n\
-      \032   include common\n\
-      \n\
-      \032  causes Unison to synchronize just the listed subdirectories.\n\
-      \n\
-      \032  The key preference can be used in combination with the graphical UI to\n\
-      \032  quickly switch between different sets of paths. For example, if the\n\
-      \032  file mail.prf contains\n\
-      \032   path = Mail\n\
-      \032   batch = true\n\
-      \032   key = 2\n\
-      \032   include common\n\
-      \n\
-      \032  then pressing 2 will cause Unison to look for updates in the Mail\n\
-      \032  subdirectory and (because the batch flag is set) immediately propagate\n\
-      \032  any that it finds.\n\
-      \n\
-      Keeping Backups\n\
-      \n\
-      \032  When Unison overwrites a file or directory by propagating a new\n\
-      \032  version from the other replica, it can keep the old version around as\n\
-      \032  a backup. There are several preferences that control precisely where\n\
-      \032  these backups are stored and how they are named.\n\
-      \n\
-      \032  To enable backups, you must give one or more backup preferences. Each\n\
-      \032  of these has the form\n\
-      \032   backup = <pathspec>\n\
-      \n\
-      \032  where <pathspec> has the same form as for the ignore preference. For\n\
-      \032  example,\n\
-      \032   backup = Name *\n\
-      \n\
-      \032  causes Unison to keep backups of all files and directories. The\n\
-      \032  backupnot preference can be used to give a few exceptions: it\n\
-      \032  specifies which files and directories should not be backed up, even if\n\
-      \032  they match the backup pathspec.\n\
-      \n\
-      \032  It is important to note that the pathspec is matched against the path\n\
-      \032  that is being updated by Unison, not its descendants. For example, if\n\
-      \032  you set backup = Name *.txt and then delete a whole directory named\n\
-      \032  foo containing some text files, these files will not be backed up\n\
-      \032  because Unison will just check that foo does not match *.txt.\n\
-      \032  Similarly, if the directory itself happened to be called foo.txt, then\n\
-      \032  the whole directory and all the files in it will be backed up,\n\
-      \032  regardless of their names.\n\
-      \n\
-      \032  Backup files can be stored either centrally or locally. This behavior\n\
-      \032  is controlled by the preference backuplocation, whose value must be\n\
-      \032  either central or local. (The default is central.)\n\
-      \n\
-      \032  When backups are stored locally, they are kept in the same directory\n\
-      \032  as the original.\n\
-      \n\
-      \032  When backups are stored centrally, the directory used to hold them is\n\
-      \032  controlled by the preference backupdir and the environment variable\n\
-      \032  UNISONBACKUPDIR. (The environment variable is checked first.) If\n\
-      \032  neither of these are set, then the directory .unison/backup in the\n\
-      \032  user's home directory is used.\n\
-      \n\
-      \032  The preference maxbackups controls how many previous versions of each\n\
-      \032  file are kept (including the current version).\n\
-      \n\
-      \032  By default, backup files are named .bak.VERSION.FILENAME, where\n\
-      \032  FILENAME is the original filename and VERSION is the backup number (1\n\
-      \032  for the most recent, 2 for the next most recent, etc.). This can be\n\
-      \032  changed by setting the preferences backupprefix and/or backupsuffix.\n\
-      \032  If desired, backupprefix may include a directory prefix; this can be\n\
-      \032  used with backuplocation = local to put all backup files for each\n\
-      \032  directory into a single subdirectory. For example, setting\n\
-      \032   backuplocation = local\n\
-      \032   backupprefix = .unison/$VERSION.\n\
-      \032   backupsuffix =\n\
-      \n\
-      \032  will put all backups in a local subdirectory named .unison. Also, note\n\
-      \032  that the string $VERSION in either backupprefix or backupsuffix (it\n\
-      \032  must appear in one or the other) is replaced by the version number.\n\
-      \032  This can be used, for example, to ensure that backup files retain the\n\
-      \032  same extension as the originals.\n\
-      \n\
-      \032  For backward compatibility, the backups preference is also supported.\n\
-      \032  It simply means backup = Name * and backuplocation = local.\n\
-      \n\
-      Merging Conflicting Versions\n\
-      \n\
-      \032  Unison can invoke external programs to merge conflicting versions of a\n\
-      \032  file. The preference merge controls this process.\n\
-      \n\
-      \032  The merge preference may be given once or several times in a\n\
-      \032  preference file (it can also be given on the command line, of course,\n\
-      \032  but this tends to be awkward because of the spaces and special\n\
-      \032  characters involved). Each instance of the preference looks like this:\n\
-      \032   merge = <PATHSPEC> -> <MERGECMD>\n\
-      \n\
-      \032  The <PATHSPEC> here has exactly the same format as for the ignore\n\
-      \032  preference (see the section \"Path specification\" ). For example, using\n\
-      \032  \"Name *.txt\" as the <PATHSPEC> tells Unison that this command should\n\
-      \032  be used whenever a file with extension .txt needs to be merged.\n\
-      \n\
-      \032  Many external merging programs require as inputs not just the two\n\
-      \032  files that need to be merged, but also a file containing the last\n\
-      \032  synchronized version. You can ask Unison to keep a copy of the last\n\
-      \032  synchronized version for some files using the backupcurrent\n\
-      \032  preference. This preference is used in exactly the same way as backup\n\
-      \032  and its meaning is similar, except that it causes backups to be kept\n\
-      \032  of the current contents of each file after it has been synchronized by\n\
-      \032  Unison, rather than the previous contents that Unison overwrote. These\n\
-      \032  backups are kept on both replicas in the same place as ordinary backup\n\
-      \032  files--i.e. according to the backuplocation and backupdir preferences.\n\
-      \032  They are named like the original files if backupslocation is set to\n\
-      \032  'central' and otherwise, Unison uses the backupprefix and backupsuffix\n\
-      \032  preferences and assumes a version number 000 for these backups.\n\
-      \n\
-      \032  The <MERGECMD> part of the preference specifies what external command\n\
-      \032  should be invoked to merge files at paths matching the <PATHSPEC>.\n\
-      \032  Within this string, several special substrings are recognized; these\n\
-      \032  will be substituted with appropriate values before invoking a\n\
-      \032  sub-shell to execute the command.\n\
-      \032    * CURRENT1 is replaced by the name of (a temporary copy of) the\n\
-      \032      local variant of the file.\n\
-      \032    * CURRENT2 is replaced by the name of a temporary file, into which\n\
-      \032      the contents of the remote variant of the file have been\n\
-      \032      transferred by Unison prior to performing the merge.\n\
-      \032    * CURRENTARCH is replaced by the name of the backed up copy of the\n\
-      \032      original version of the file (i.e., the file saved by Unison if\n\
-      \032      the current filename matches the path specifications for the\n\
-      \032      backupcurrent preference, as explained above), if one exists. If\n\
-      \032      no archive exists and CURRENTARCH appears in the merge command,\n\
-      \032      then an error is signalled.\n\
-      \032    * CURRENTARCHOPT is replaced by the name of the backed up copy of\n\
-      \032      the original version of the file (i.e., its state at the end of\n\
-      \032      the last successful run of Unison), if one exists, or the empty\n\
-      \032      string if no archive exists.\n\
-      \032    * NEW is replaced by the name of a temporary file that Unison\n\
-      \032      expects to be written by the merge program when it finishes,\n\
-      \032      giving the desired new contents of the file.\n\
-      \032    * PATH is replaced by the path (relative to the roots of the\n\
-      \032      replicas) of the file being merged.\n\
-      \032    * NEW1 and NEW2 are replaced by the names of temporary files that\n\
-      \032      Unison expects to be written by the merge program when it is only\n\
-      \032      able to partially merge the originals; in this case, NEW1 will be\n\
-      \032      written back to the local replica and NEW2 to the remote replica;\n\
-      \032      NEWARCH, if present, will be used as the \"last common state\" of\n\
-      \032      the replicas. (These three options are provided for later\n\
-      \032      compatibility with the Harmony data synchronizer.)\n\
-      \n\
-      \032  To accomodate the wide variety of programs that users might want to\n\
-      \032  use for merging, Unison checks for several possible situations when\n\
-      \032  the merge program exits:\n\
-      \032    * If the merge program exits with a non-zero status, then merge is\n\
-      \032      considered to have failed and the replicas are not changed.\n\
-      \032    * If the file NEW has been created, it is written back to both\n\
-      \032      replicas (and stored in the backup directory). Similarly, if just\n\
-      \032      the file NEW1 has been created, it is written back to both\n\
-      \032      replicas.\n\
-      \032    * If neither NEW nor NEW1 have been created, then Unison examines\n\
-      \032      the temporary files CURRENT1 and CURRENT2 that were given as\n\
-      \032      inputs to the merge program. If either has been changed (or both\n\
-      \032      have been changed in identical ways), then its new contents are\n\
-      \032      written back to both replicas. If either CURRENT1 or CURRENT2 has\n\
-      \032      been deleted, then the contents of the other are written back to\n\
-      \032      both replicas.\n\
-      \032    * If the files NEW1, NEW2, and NEWARCH have all been created, they\n\
-      \032      are written back to the local replica, remote replica, and backup\n\
-      \032      directory, respectively. If the files NEW1, NEW2 have been\n\
-      \032      created, but NEWARCH has not, then these files are written back to\n\
-      \032      the local replica and remote replica, respectively. Also, if NEW1\n\
-      \032      and NEW2 have identical contents, then the same contents are\n\
-      \032      stored as a backup (if the backupcurrent preference is set for\n\
-      \032      this path) to reflect the fact that the path is currently in sync.\n\
-      \032    * If NEW1 and NEW2 (resp. CURRENT1 and CURRENT2) are created (resp.\n\
-      \032      overwritten) with different contents but the merge command did not\n\
-      \032      fail (i.e., it exited with status code 0), then we copy NEW1\n\
-      \032      (resp. CURRENT1) to the other replica and to the archive.\n\
-      \032      This behavior is a design choice made to handle the case where a\n\
-      \032      merge command only synchronizes some specific contents between two\n\
-      \032      files, skipping some irrelevant information (order between\n\
-      \032      entries, for instance). We assume that, if the merge command exits\n\
-      \032      normally, then the two resulting files are \"as good as equal.\"\n\
-      \032      (The reason we copy one on top of the other is to avoid Unison\n\
-      \032      detecting that the files are unequal the next time it is run and\n\
-      \032      trying again to merge them when, in fact, the merge program has\n\
-      \032      already made them as similar as it is able to.)\n\
-      \n\
-      \032  If the confirmmerge preference is set and Unison is not run in batch\n\
-      \032  mode, then Unison will always ask for confirmation before actually\n\
-      \032  committing the results of the merge to the replicas.\n\
-      \n\
-      \032  A large number of external merging programs are available. For\n\
-      \032  example, on Unix systems setting the merge preference to\n\
-      \032   merge = Name *.txt -> diff3 -m CURRENT1 CURRENTARCH CURRENT2\n\
-      \032                           > NEW || echo \"differences detected\"\n\
-      \n\
-      \032  will tell Unison to use the external diff3 program for merging.\n\
-      \032  Alternatively, users of emacs may find the following settings\n\
-      \032  convenient:\n\
-      \032   merge = Name *.txt -> emacs -q --eval '(ediff-merge-files-with-ancestor\n\
-      \032                            \"CURRENT1\" \"CURRENT2\" \"CURRENTARCH\" nil \"NEW\")'\n\
-      \n\
-      \032  (These commands are displayed here on two lines to avoid running off\n\
-      \032  the edge of the page. In your preference file, each command should be\n\
-      \032  written on a single line.)\n\
-      \n\
-      \032  Users running emacs under windows may find something like this useful:\n\
-      \032  merge = Name * -> C:\\Progra~1\\Emacs\\emacs\\bin\\emacs.exe -q --eval\n\
-      \032                           \"(ediff-files \"\"\"CURRENT1\"\"\" \"\"\"CURRENT2\"\"\")\"\n\
-      \n\
-      \032  Users running Mac OS X (you may need the Developer Tools installed to\n\
-      \032  get the opendiff utility) may prefer\n\
-      \032   merge = Name *.txt -> opendiff CURRENT1 CURRENT2 -ancestor CURRENTARCH -mer\n\
-      ge NEW\n\
-      \n\
-      \032  Here is a slightly more involved hack. The opendiff program can\n\
-      \032  operate either with or without an archive file. A merge command of\n\
-      \032  this form\n\
-      \032   merge = Name *.txt ->\n\
-      \032             if [ CURRENTARCHOPTx = x ];\n\
-      \032             then opendiff CURRENT1 CURRENT2 -merge NEW;\n\
-      \032             else opendiff CURRENT1 CURRENT2 -ancestor CURRENTARCHOPT -merge N\n\
-      EW;\n\
-      \032             fi\n\
-      \n\
-      \032  (still all on one line in the preference file!) will test whether an\n\
-      \032  archive file exists and use the appropriate variant of the arguments\n\
-      \032  to opendiff.\n\
-      \n\
-      \032  Ordinarily, external merge programs are only invoked when Unison is\n\
-      \032  not running in batch mode. To specify an external merge program that\n\
-      \032  should be used no matter the setting of the batch flag, use the\n\
-      \032  mergebatch preference instead of merge.\n\
-      \n\
-      \032    Please post suggestions for other useful values of the merge\n\
-      \032    preference to the unison-users mailing list--we'd like to give\n\
-      \032    several examples here. \n\
-      \n\
-      The User Interface\n\
-      \n\
-      \032  Both the textual and the graphical user interfaces are intended to be\n\
-      \032  mostly self-explanatory. Here are just a few tricks:\n\
-      \032    * By default, when running on Unix the textual user interface will\n\
-      \032      try to put the terminal into the \"raw mode\" so that it reads the\n\
-      \032      input a character at a time rather than a line at a time. (This\n\
-      \032      means you can type just the single keystroke \">\" to tell Unison to\n\
-      \032      propagate a file from left to right, rather than \"> Enter.\")\n\
-      \032      There are some situations, though, where this will not work -- for\n\
-      \032      example, when Unison is running in a shell window inside Emacs.\n\
-      \032      Setting the dumbtty preference will force Unison to leave the\n\
-      \032      terminal alone and process input a line at a time.\n\
-      \n\
-      Exit code\n\
-      \n\
-      \032  When running in the textual mode, Unison returns an exit status, which\n\
-      \032  describes whether, and at which level, the synchronization was\n\
-      \032  successful. The exit status could be useful when Unison is invoked\n\
-      \032  from a script. Currently, there are four possible values for the exit\n\
-      \032  status:\n\
-      \032    * 0: successful synchronization; everything is up-to-date now.\n\
-      \032    * 1: some files were skipped, but all file transfers were\n\
-      \032      successful.\n\
-      \032    * 2: non-fatal failures occurred during file transfer.\n\
-      \032    * 3: a fatal error occurred, or the execution was interrupted.\n\
-      \n\
-      \032  The graphical interface does not return any useful information through\n\
-      \032  the exit status.\n\
-      \n\
-      Path specification\n\
-      \n\
-      \032  Several Unison preferences (e.g., ignore/ignorenot, follow,\n\
-      \032  sortfirst/sortlast, backup, merge, etc.) specify individual paths or\n\
-      \032  sets of paths. These preferences share a common syntax based on\n\
-      \032  regular-expressions. Each preference is associated with a list of path\n\
-      \032  patterns; the paths specified are those that match any one of the path\n\
-      \032  pattern.\n\
-      \032    * Pattern preferences can be given on the command line, or, more\n\
-      \032      often, stored in profiles, using the same syntax as other\n\
-      \032      preferences. For example, a profile line of the form\n\
-      \032            ignore = pattern\n\
-      \032      adds pattern to the list of patterns to be ignored.\n\
-      \032    * Each pattern can have one of three forms. The most general form is\n\
-      \032      a Posix extended regular expression introduced by the keyword\n\
-      \032      Regex. (The collating sequences and character classes of full\n\
-      \032      Posix regexps are not currently supported).\n\
-      \032                Regex regexp\n\
-      \032      For convenience, two other styles of pattern are also recognized:\n\
-      \032                Name name\n\
-      \032      matches any path in which the last component matches name, while\n\
-      \032                Path path\n\
-      \032      matches exactly the path path. The name and path arguments of the\n\
-      \032      latter forms of patterns are not regular expressions. Instead,\n\
-      \032      standard \"globbing\" conventions can be used in name and path:\n\
-      \032         + a * matches any sequence of characters not including / (and\n\
-      \032           not beginning with ., when used at the beginning of a name)\n\
-      \032         + a ? matches any single character except / (and leading .)\n\
-      \032         + [xyz] matches any character from the set {x, y, z }\n\
-      \032         + {a,bb,ccc} matches any one of a, bb, or ccc.\n\
-      \032    * The path separator in path patterns is always the forward-slash\n\
-      \032      character \"/\" -- even when the client or server is running under\n\
-      \032      Windows, where the normal separator character is a backslash. This\n\
-      \032      makes it possible to use the same set of path patterns for both\n\
-      \032      Unix and Windows file systems.\n\
-      \n\
-      \032  Some examples of path patterns appear in the section \"Ignoring Paths\"\n\
-      \032  .\n\
-      \n\
-      Ignoring Paths\n\
-      \n\
-      \032  Most users of Unison will find that their replicas contain lots of\n\
-      \032  files that they don't ever want to synchronize -- temporary files,\n\
-      \032  very large files, old stuff, architecture-specific binaries, etc. They\n\
-      \032  can instruct Unison to ignore these paths using patterns introduced in\n\
-      \032  the section \"Path Patterns\" .\n\
-      \n\
-      \032  For example, the following pattern will make Unison ignore any path\n\
-      \032  containing the name CVS or a name ending in .cmo:\n\
-      \032            ignore = Name {CVS,*.cmo}\n\
-      \n\
-      \032  The next pattern makes Unison ignore the path a/b:\n\
-      \032            ignore = Path a/b\n\
-      \n\
-      \032  Path patterns do not skip filesnames beginning with . (as Name\n\
-      \032  patterns do). For example,\n\
-      \032            ignore = Path */tmp\n\
-      \n\
-      \032  will include .foo/tmp in the set of ignore directories, as it is a\n\
-      \032  path, not a name, that is ignored.\n\
-      \n\
-      \032  The following pattern makes Unison ignore any path beginning with a/b\n\
-      \032  and ending with a name ending by .ml.\n\
-      \032            ignore = Regex a/b/.*\\.ml\n\
-      \n\
-      \032  Note that regular expression patterns are \"anchored\": they must match\n\
-      \032  the whole path, not just a substring of the path.\n\
-      \n\
-      \032  Here are a few extra points regarding the ignore preference.\n\
-      \032    * If a directory is ignored, all its descendents will be too.\n\
-      \032    * The user interface provides some convenient commands for adding\n\
-      \032      new patterns to be ignored. To ignore a particular file, select it\n\
-      \032      and press \"i\". To ignore all files with the same extension, select\n\
-      \032      it and press \"E\" (with the shift key). To ignore all files with\n\
-      \032      the same name, no matter what directory they appear in, select it\n\
-      \032      and press \"N\". These new patterns become permanent: they are\n\
-      \032      immediately added to the current profile on disk.\n\
-      \032    * If you use the include directive to include a common collection of\n\
-      \032      preferences in several top-level preference files, you will\n\
-      \032      probably also want to set the addprefsto preference to the name of\n\
-      \032      this file. This will cause any new ignore patterns that you add\n\
-      \032      from inside Unison to be appended to this file, instead of\n\
-      \032      whichever top-level preference file you started Unison with.\n\
-      \032    * Ignore patterns can also be specified on the command line, if you\n\
-      \032      like (this is probably not very useful), using an option like\n\
-      \032      -ignore 'Name temp.txt'.\n\
-      \032    * Be careful about renaming directories containing ignored files.\n\
-      \032      Because Unison understands the rename as a delete plus a create,\n\
-      \032      any ignored files in the directory will be lost (since they are\n\
-      \032      invisible to Unison and therefore they do not get recreated in the\n\
-      \032      new version of the directory).\n\
-      \032    * There is also an ignorenot preference, which specifies a set of\n\
-      \032      patterns for paths that should not be ignored, even if they match\n\
-      \032      an ignore pattern. However, the interaction of these two sets of\n\
-      \032      patterns can be a little tricky. Here is exactly how it works:\n\
-      \032         + Unison starts detecting updates from the root of the\n\
-      \032           replicas--i.e., from the empty path. If the empty path\n\
-      \032           matches an ignore pattern and does not match an ignorenot\n\
-      \032           pattern, then the whole replica will be ignored. (For this\n\
-      \032           reason, it is not a good idea to include Name * as an ignore\n\
-      \032           pattern. If you want to ignore everything except a certain\n\
-      \032           set of files, use Name ?*.)\n\
-      \032         + If the root is a directory, Unison continues looking for\n\
-      \032           updates in all the immediate children of the root. Again, if\n\
-      \032           the name of some child matches an ignore pattern and does not\n\
-      \032           match an ignorenot pattern, then this whole path including\n\
-      \032           everything below it will be ignored.\n\
-      \032         + If any of the non-ignored children are directories, then the\n\
-      \032           process continues recursively.\n\
-      \n\
-      Symbolic Links\n\
-      \n\
-      \032  Ordinarily, Unison treats symbolic links in Unix replicas as \"opaque\":\n\
-      \032  it considers the contents of the link to be just the string specifying\n\
-      \032  where the link points, and it will propagate changes in this string to\n\
-      \032  the other replica.\n\
-      \n\
-      \032  It is sometimes useful to treat a symbolic link \"transparently,\"\n\
-      \032  acting as though whatever it points to were physically in the replica\n\
-      \032  at the point where the symbolic link appears. To tell Unison to treat\n\
-      \032  a link in this manner, add a line of the form\n\
-      \032            follow = pathspec\n\
-      \n\
-      \032  to the profile, where pathspec is a path pattern as described in the\n\
-      \032  section \"Path Patterns\" .\n\
-      \n\
-      \032  Windows file systems do not support symbolic links; Unison will refuse\n\
-      \032  to propagate an opaque symbolic link from Unix to Windows and flag the\n\
-      \032  path as erroneous. When a Unix replica is to be synchronized with a\n\
-      \032  Windows system, all symbolic links should match either an ignore\n\
-      \032  pattern or a follow pattern.\n\
-      \n\
-      Permissions\n\
-      \n\
-      \032  Synchronizing the permission bits of files is slightly tricky when two\n\
-      \032  different filesytems are involved (e.g., when synchronizing a Windows\n\
-      \032  client and a Unix server). In detail, here's how it works:\n\
-      \032    * When the permission bits of an existing file or directory are\n\
-      \032      changed, the values of those bits that make sense on both\n\
-      \032      operating systems will be propagated to the other replica. The\n\
-      \032      other bits will not be changed.\n\
-      \032    * When a newly created file is propagated to a remote replica, the\n\
-      \032      permission bits that make sense in both operating systems are also\n\
-      \032      propagated. The values of the other bits are set to default values\n\
-      \032      (they are taken from the current umask, if the receiving host is a\n\
-      \032      Unix system).\n\
-      \032    * For security reasons, the Unix setuid and setgid bits are not\n\
-      \032      propagated.\n\
-      \032    * The Unix owner and group ids are not propagated. (What would this\n\
-      \032      mean, in general?) All files are created with the owner and group\n\
-      \032      of the server process.\n\
-      \n\
-      Cross-Platform Synchronization\n\
-      \n\
-      \032  If you use Unison to synchronize files between Windows and Unix\n\
-      \032  systems, there are a few special issues to be aware of.\n\
-      \n\
-      \032  Case conflicts. In Unix, filenames are case sensitive: foo and FOO can\n\
-      \032  refer to different files. In Windows, on the other hand, filenames are\n\
-      \032  not case sensitive: foo and FOO can only refer to the same file. This\n\
-      \032  means that a Unix foo and FOO cannot be synchronized onto a Windows\n\
-      \032  system -- Windows won't allow two different files to have the \"same\"\n\
-      \032  name. Unison detects this situation for you, and reports that it\n\
-      \032  cannot synchronize the files.\n\
-      \n\
-      \032  You can deal with a case conflict in a couple of ways. If you need to\n\
-      \032  have both files on the Windows system, your only choice is to rename\n\
-      \032  one of the Unix files to avoid the case conflict, and re-synchronize.\n\
-      \032  If you don't need the files on the Windows system, you can simply\n\
-      \032  disregard Unison's warning message, and go ahead with the\n\
-      \032  synchronization; Unison won't touch those files. If you don't want to\n\
-      \032  see the warning on each synchronization, you can tell Unison to ignore\n\
-      \032  the files (see the section \"Ignore\" ).\n\
-      \n\
-      \032  Illegal filenames. Unix allows some filenames that are illegal in\n\
-      \032  Windows. For example, colons (`:') are not allowed in Windows\n\
-      \032  filenames, but they are legal in Unix filenames. This means that a\n\
-      \032  Unix file foo:bar can't be synchronized to a Windows system. As with\n\
-      \032  case conflicts, Unison detects this situation for you, and you have\n\
-      \032  the same options: you can either rename the Unix file and\n\
-      \032  re-synchronize, or you can ignore it.\n\
-      \n\
-      Slow Links\n\
-      \n\
-      \032  Unison is built to run well even over relatively slow links such as\n\
-      \032  modems and DSL connections.\n\
-      \n\
-      \032  Unison uses the \"rsync protocol\" designed by Andrew Tridgell and Paul\n\
-      \032  Mackerras to greatly speed up transfers of large files in which only\n\
-      \032  small changes have been made. More information about the rsync\n\
-      \032  protocol can be found at the rsync web site\n\
-      \032  (http://samba.anu.edu.au/rsync/).\n\
-      \n\
-      \032  If you are using Unison with ssh, you may get some speed improvement\n\
-      \032  by enabling ssh's compression feature. Do this by adding the option\n\
-      \032  \"-rshargs -C\" to the command line or \"rshargs = -C\" to your profile.\n\
-      \n\
-      Making Unison Faster on Large Files\n\
-      \n\
-      \032  Unison's built-in implementation of the rsync algorithm makes\n\
-      \032  transferring updates to existing files pretty fast. However, for\n\
-      \032  whole-file copies of newly created files, the built-in transfer method\n\
-      \032  is not highly optimized. Also, if Unison is interrupted in the middle\n\
-      \032  of transferring a large file, it will attempt to retransfer the whole\n\
-      \032  thing on the next run.\n\
-      \n\
-      \032  These shortcomings can be addressed with a little extra work by\n\
-      \032  telling Unison to use an external file copying utility for whole-file\n\
-      \032  transfers. The recommended one is the standalone rsync tool, which is\n\
-      \032  available by default on most Unix systems and can easily be installed\n\
-      \032  on Windows systems using Cygwin.\n\
-      \n\
-      \032  If you have rsync installed on both hosts, you can make Unison use it\n\
-      \032  simply by setting the copythreshold flag to something non-negative. If\n\
-      \032  you set it to 0, Unison will use the external copy utility for all\n\
-      \032  whole-file transfers. (This is probably slower than letting Unison\n\
-      \032  copy small files by itself, but can be useful for testing.) If you set\n\
-      \032  it to a larger value, Unison will use the external utility for all\n\
-      \032  files larger than this size (which is given in kilobytes, so setting\n\
-      \032  it to 1000 will cause the external tool to be used for all transfers\n\
-      \032  larger than a megabyte).\n\
-      \n\
-      \032  If you want to use a different external copy utility, set both the\n\
-      \032  copyprog and copyprogpartial preferences--the former is used for the\n\
-      \032  first transfer of a file, while the latter is used when Unison sees a\n\
-      \032  partially transferred temp file on the receiving host. Be careful\n\
-      \032  here: Your external tool needs to be instructed to copy files in place\n\
-      \032  (otherwise if the transfer is interrupted Unison will not notice that\n\
-      \032  some of the data has already been transferred, the next time it\n\
-      \032  tries). The default values are:\n\
-      \032  copyprog      =   rsync --inplace --compress\n\
-      \032  copyprogrest  =   rsync --partial --inplace --compress\n\
-      \n\
-      \032  You may also need to set the copyquoterem preference. When it is set\n\
-      \032  to true, this causes Unison to add an extra layer of quotes to the\n\
-      \032  remote path passed to the external copy program. This is is needed by\n\
-      \032  rsync, for example, which internally uses an ssh connection, requiring\n\
-      \032  an extra level of quoting for paths containing spaces. When this flag\n\
-      \032  is set to default, extra quotes are added if the value of copyprog\n\
-      \032  contains the string rsync. The default value is default, naturally.\n\
-      \n\
-      \032  If a directory transfer is interrupted, the next run of Unison will\n\
-      \032  automatically skip any files that were completely transferred before\n\
-      \032  the interruption. (This behavior is always on: it does not depend on\n\
-      \032  the setting of the copythreshold preference.) Note, though, that the\n\
-      \032  new directory will not appear in the destination filesystem until\n\
-      \032  everything has been transferred--partially transferred directories are\n\
-      \032  kept in a temporary location (with names like .unison.DIRNAME....)\n\
-      \032  until the transfer is complete.\n\
-      \n\
-      Fast Update Detection\n\
-      \n\
-      \032  If your replicas are large and at least one of them is on a Windows\n\
-      \032  system, you may find that Unison's default method for detecting\n\
-      \032  changes (which involves scanning the full contents of every file on\n\
-      \032  every sync--the only completely safe way to do it under Windows) is\n\
-      \032  too slow. Unison provides a preference fastcheck that, when set to\n\
-      \032  true, causes it to use file creation times as 'pseudo inode numbers'\n\
-      \032  when scanning replicas for updates, instead of reading the full\n\
-      \032  contents of every file.\n\
-      \n\
-      \032  When fastcheck is set to no, Unison will perform slow\n\
-      \032  checking--re-scanning the contents of each file on each\n\
-      \032  synchronization--on all replicas. When fastcheck is set to default\n\
-      \032  (which, naturally, is the default), Unison will use fast checks on\n\
-      \032  Unix replicas and slow checks on Windows replicas.\n\
-      \n\
-      \032  This strategy may cause Unison to miss propagating an update if the\n\
-      \032  modification time and length of the file are both unchanged by the\n\
-      \032  update. However, Unison will never overwrite such an update with a\n\
-      \032  change from the other replica, since it always does a safe check for\n\
-      \032  updates just before propagating a change. Thus, it is reasonable to\n\
-      \032  use this switch most of the time and occasionally run Unison once with\n\
-      \032  fastcheck set to no, if you are worried that Unison may have\n\
-      \032  overlooked an update.\n\
-      \n\
-      \032  Fastcheck is (always) automatically disabled for files with extension\n\
-      \032  .xls or .mpp, to prevent Unison from being confused by the habits of\n\
-      \032  certain programs (Excel, in particular) of updating files without\n\
-      \032  changing their modification times.\n\
-      \n\
-      Mount Points and Removable Media\n\
-      \n\
-      \032  Using Unison removable media such as USB drives can be dangerous\n\
-      \032  unless you are careful. If you synchronize a directory that is stored\n\
-      \032  on removable media when the media is not present, it will look to\n\
-      \032  Unison as though the whole directory has been deleted, and it will\n\
-      \032  proceed to delete the directory from the other replica--probably not\n\
-      \032  what you want!\n\
-      \n\
-      \032  To prevent accidents, Unison provides a preference called mountpoint.\n\
-      \032  Including a line like\n\
-      \032            mountpoint = foo\n\
-      \n\
-      \032  in your preference file will cause Unison to check, after it finishes\n\
-      \032  detecting updates, that something actually exists at the path foo on\n\
-      \032  both replicas; if it does not, the Unison run will abort.\n\
-      \n\
-      Click-starting Unison\n\
-      \n\
-      \032  On Windows NT/2k/XP systems, the graphical version of Unison can be\n\
-      \032  invoked directly by clicking on its icon. On Windows 95/98 systems,\n\
-      \032  click-starting also works, as long as you are not using ssh. Due to an\n\
-      \032  incompatibility with ocaml and Windows 95/98 that is not under our\n\
-      \032  control, you must start Unison from a DOS window in Windows 95/98 if\n\
-      \032  you want to use ssh.\n\
-      \n\
-      \032  When you click on the Unison icon, two windows will be created:\n\
-      \032  Unison's regular window, plus a console window, which is used only for\n\
-      \032  giving your password to ssh (if you do not use ssh to connect, you can\n\
-      \032  ignore this window). When your password is requested, you'll need to\n\
-      \032  activate the console window (e.g., by clicking in it) before typing.\n\
-      \032  If you start Unison from a DOS window, Unison's regular window will\n\
-      \032  appear and you will type your password in the DOS window you were\n\
-      \032  using.\n\
-      \n\
-      \032  To use Unison in this mode, you must first create a profile (see the\n\
-      \032  section \"Profile\" ). Use your favorite editor for this.\n\
-      \n\
-      "))
-::
-    ("ssh", ("Installing Ssh", 
-     "Installing Ssh\n\
-      \n\
-      \032  Warning: These instructions may be out of date. More current\n\
-      \032  information can be found the Unison Wiki\n\
-      \032  (http://alliance.seas.upenn.edu/ bcpierce/wiki/index.php?n=Main.Unison\n\
-      \032  FAQOSSpecific).\n\
-      \n\
-      \032  Your local host will need just an ssh client; the remote host needs an\n\
-      \032  ssh server (or daemon), which is available on Unix systems. Unison is\n\
-      \032  known to work with ssh version 1.2.27 (Unix) and version 1.2.14\n\
-      \032  (Windows); other versions may or may not work.\n\
-      \n\
-      Unix\n\
-      \n\
-      \032  Most modern Unix installations come with ssh pre-installed.\n\
-      \n\
-      Windows\n\
-      \n\
-      \032  Many Windows implementations of ssh only provide graphical interfaces,\n\
-      \032  but Unison requires an ssh client that it can invoke with a\n\
-      \032  command-line interface. A suitable version of ssh can be installed as\n\
-      \032  follows.\n\
-      \032   1. Download an ssh executable.\n\
-      \032      Warning: there are many implementations and ports of ssh for\n\
-      \032      Windows, and not all of them will work with Unison. We have gotten\n\
-      \032      Unison to work with Cygwin's port of openssh, and we suggest you\n\
-      \032      try that one first. Here's how to install it:\n\
-      \032        a. First, create a new folder on your desktop to hold temporary\n\
-      \032           installation files. It can have any name you like, but in\n\
-      \032           these instructions we'll assume that you call it Foo.\n\
-      \032        b. Direct your web browser to www.cygwin.com, and click on the\n\
-      \032           \"Install now!\" link. This will download a file, setup.exe;\n\
-      \032           save it in the directory Foo. The file setup.exe is a small\n\
-      \032           program that will download the actual install files from the\n\
-      \032           Internet when you run it.\n\
-      \032        c. Start setup.exe (by double-clicking). This brings up a series\n\
-      \032           of dialogs that you will have to go through. Select \"Install\n\
-      \032           from Internet.\" For \"Local Package Directory\" select the\n\
-      \032           directory Foo. For \"Select install root directory\" we\n\
-      \032           recommend that you use the default, C:\\cygwin. The next\n\
-      \032           dialog asks you to select the way that you want to connect to\n\
-      \032           the network to download the installation files; we have used\n\
-      \032           \"Use IE5 Settings\" successfully, but you may need to make a\n\
-      \032           different selection depending on your networking setup. The\n\
-      \032           next dialog gives a list of mirrors; select one close to you.\n\
-      \032           Next you are asked to select which packages to install. The\n\
-      \032           default settings in this dialog download a lot of packages\n\
-      \032           that are not strictly necessary to run Unison with ssh. If\n\
-      \032           you don't want to install a package, click on it until \"skip\"\n\
-      \032           is shown. For a minimum installation, select only the\n\
-      \032           packages \"cygwin\" and \"openssh,\" which come to about 1900KB;\n\
-      \032           the full installation is much larger.\n\
-      \n\
-      \032    Note that you are plan to build unison using the free CygWin GNU C\n\
-      \032    compiler, you need to install essential development packages such\n\
-      \032    as \"gcc\", \"make\", \"fileutil\", etc; we refer to the file\n\
-      \032    \"INSTALL.win32-cygwin-gnuc\" in the source distribution for further\n\
-      \032    details. \n\
-      \032           After the packages are downloaded and installed, the next\n\
-      \032           dialog allows you to choose whether to \"Create Desktop Icon\"\n\
-      \032           and \"Add to Start Menu.\" You make the call.\n\
-      \032        d. You can now delete the directory Foo and its contents.\n\
-      \032      Some people have reported problems using Cygwin's ssh with Unison.\n\
-      \032      If you have trouble, you might try this one instead:\n\
-      \032 http://opensores.thebunker.net/pub/mirrors/ssh/contrib/ssh-1.2.14-win32bin.zi\n\
-      p\n\
-      \032   2. You must set the environment variables HOME and PATH. Ssh will\n\
-      \032      create a directory .ssh in the directory given by HOME, so that it\n\
-      \032      has a place to keep data like your public and private keys. PATH\n\
-      \032      must be set to include the Cygwin bin directory, so that Unison\n\
-      \032      can find the ssh executable.\n\
-      \032         + On Windows 95/98, add the lines\n\
-      \032   set PATH=%PATH%;<SSHDIR>\n\
-      \032   set HOME=<HOMEDIR>\n\
-      \032           to the file C:\\AUTOEXEC.BAT, where <HOMEDIR> is the directory\n\
-      \032           where you want ssh to create its .ssh directory, and <SSHDIR>\n\
-      \032           is the directory where the executable ssh.exe is stored; if\n\
-      \032           you've installed Cygwin in the default location, this is\n\
-      \032           C:\\cygwin\\bin. You will have to reboot your computer to take\n\
-      \032           the changes into account.\n\
-      \032         + On Windows NT/2k/XP, open the environment variables dialog\n\
-      \032           box:\n\
-      \032              o Windows NT: My Computer/Properties/Environment\n\
-      \032              o Windows 2k: My Computer/Properties/Advanced/Environment\n\
-      \032                variables\n\
-      \032           then select Path and edit its value by appending ;<SSHDIR> to\n\
-      \032           it, where <SSHDIR> is the full name of the directory that\n\
-      \032           includes the ssh executable; if you've installed Cygwin in\n\
-      \032           the default location, this is C:\\cygwin\\bin.\n\
-      \032   3. Test ssh from a DOS shell by typing\n\
-      \032     ssh <remote host> -l <login name>\n\
-      \032      You should get a prompt for your password on <remote host>,\n\
-      \032      followed by a working connection.\n\
-      \032   4. Note that ssh-keygen may not work (fails with \"gethostname: no\n\
-      \032      such file or directory\") on some systems. This is OK: you can use\n\
-      \032      ssh with your regular password for the remote system.\n\
-      \032   5. You should now be able to use Unison with an ssh connection. If\n\
-      \032      you are logged in with a different user name on the local and\n\
-      \032      remote hosts, provide your remote user name when providing the\n\
-      \032      remote root (i.e., //username at host/path...).\n\
-      \n\
-      "))
-::
-    ("news", ("Changes in Version 2.32.7", 
-     "Changes in Version 2.32.7\n\
-      \n\
-      \032  Changes since 2.31:\n\
-      \032    * Small user interface changes\n\
-      \032         + Small change to text UI \"scanning...\" messages, to print just\n\
-      \032           directories (hopefully making it clearer that individual\n\
-      \032           files are not necessarily being fingerprinted).\n\
-      \032    * Minor fixes and improvements:\n\
-      \032         + Ignore one hour differences when deciding whether a file may\n\
-      \032           have been updated. This avoids slow update detection after\n\
-      \032           daylight saving time changes under Windows. This makes Unison\n\
-      \032           slightly more likely to miss an update, but it should be safe\n\
-      \032           enough.\n\
-      \032         + Fix a small bug that was affecting mainly windows users. We\n\
-      \032           need to commit the archives at the end of the sync even if\n\
-      \032           there are no updates to propagate because some files (in\n\
-      \032           fact, if we've just switched to DST on windows, a LOT of\n\
-      \032           files) might have new modtimes in the archive. (Changed the\n\
-      \032           text UI only. It's less clear where to change the GUI.)\n\
-      \032         + Don't delete the temp file when a transfer fails due to a\n\
-      \032           fingerprint mismatch (so that we can have a look and see\n\
-      \032           why!) We've also added more debugging code togive more\n\
-      \032           informative error messages when we encounter the dreaded and\n\
-      \032           longstanding \"assert failed during file transfer\" bug\n\
-      \n\
-      \032  Changes since 2.27:\n\
-      \032    * If Unison is interrupted during a directory transfer, it will now\n\
-      \032      leave the partially transferred directory intact in a temporary\n\
-      \032      location. (This maintains the invariant that new files/directories\n\
-      \032      are transferred either completely or not at all.) The next time\n\
-      \032      Unison is run, it will continue filling in this temporary\n\
-      \032      directory, skipping transferring files that it finds are already\n\
-      \032      there.\n\
-      \032    * We've added experimental support for invoking an external file\n\
-      \032      transfer tool for whole-file copies instead of Unison's built-in\n\
-      \032      transfer protocol. Three new preferences have been added:\n\
-      \032         + copyprog is a string giving the name (and command-line\n\
-      \032           switches, if needed) of an external program that can be used\n\
-      \032           to copy large files efficiently. By default, rsync is\n\
-      \032           invoked, but other tools such as scp can be used instead by\n\
-      \032           changing the value of this preference. (Although this is not\n\
-      \032           its primary purpose, rsync is actually a pretty fast way of\n\
-      \032           copying files that don't already exist on the receiving\n\
-      \032           host.) For files that do already exist on (but that have been\n\
-      \032           changed in one replica), Unison will always use its built-in\n\
-      \032           implementation of the rsync algorithm.\n\
-      \032         + Added a \"copyprogrest\" preference, so that we can give\n\
-      \032           different command lines for invoking the external copy\n\
-      \032           utility depending on whether a partially transferred file\n\
-      \032           already exists or not. (Rsync doesn't seem to care about\n\
-      \032           this, but other utilities may.)\n\
-      \032         + copythreshold is an integer (-1 by default), indicating above\n\
-      \032           what filesize (in megabytes) Unison should use the external\n\
-      \032           copying utility specified by copyprog. Specifying 0 will\n\
-      \032           cause ALL copies to use the external program; a negative\n\
-      \032           number will prevent any files from using it. (Default is -1.)\n\
-      \032      Thanks to Alan Schmitt for a huge amount of hacking and to an\n\
-      \032      anonymous sponsor for suggesting and underwriting this extension.\n\
-      \032    * Small improvements:\n\
-      \032         + Added a new preference, dontchmod. By default, Unison uses\n\
-      \032           the chmod system call to set the permission bits of files\n\
-      \032           after it has copied them. But in some circumstances (and\n\
-      \032           under some operating systems), the chmod call always fails.\n\
-      \032           Setting this preference completely prevents Unison from ever\n\
-      \032           calling chmod.\n\
-      \032         + Don't ignore files that look like backup files if the\n\
-      \032           backuplocation preference is set to central\n\
-      \032         + Shortened the names of several preferences. The old names are\n\
-      \032           also still supported, for backwards compatibility, but they\n\
-      \032           do not appear in the documentation.\n\
-      \032         + Lots of little documentation tidying. (In particular,\n\
-      \032           preferences are separated into Basic and Advanced! This\n\
-      \032           should hopefully make Unison a little more approachable for\n\
-      \032           new users.\n\
-      \032         + Unison can sometimes fail to transfer a file, giving the\n\
-      \032           unhelpful message \"Destination updated during\n\
-      \032           synchronization\" even though the file has not been changed.\n\
-      \032           This can be caused by programs that change either the file's\n\
-      \032           contents or the file's extended attributes without changing\n\
-      \032           its modification time. It's not clear what is the best fix\n\
-      \032           for this - it is not Unison's fault, but it makes Unison's\n\
-      \032           behavior puzzling - but at least Unison can be more helpful\n\
-      \032           about suggesting a workaround (running once with fastcheck\n\
-      \032           set to false). The failure message has been changed to give\n\
-      \032           this advice.\n\
-      \032         + Many improvements to the OS X GUI (thanks to Alan Schmitt and\n\
-      \032           Craig Federighi), including a very nice new \"nested\n\
-      \032           directory\" display style and per-file progress bars.\n\
-      \032    * Very preliminary support for triggering Unison from an external\n\
-      \032      filesystem-watching utility. The current implementation is very\n\
-      \032      simple, not efficient, and almost completely untested--not ready\n\
-      \032      for real users. But if someone wants to help improve it (e.g., by\n\
-      \032      writing a filesystem watcher for your favorite OS), please make\n\
-      \032      yourself known!\n\
-      \032      On the Unison side, the new behavior is very simple:\n\
-      \032         + use the text UI\n\
-      \032         + start Unison with the command-line flag \"-repeat FOO\", where\n\
-      \032           FOO is name of a file where Unison should look for\n\
-      \032           notifications of changes\n\
-      \032         + when it starts up, Unison will read the whole contents of\n\
-      \032           this file (on both hosts), which should be a\n\
-      \032           newline-separated list of paths (relative to the root of the\n\
-      \032           synchronization) and synchronize just these paths, as if it\n\
-      \032           had been started with the \"-path=xxx\" option for each one of\n\
-      \032           them\n\
-      \032         + when it finishes, it will sleep for a few seconds and then\n\
-      \032           examine the watchfile again; if anything has been added, it\n\
-      \032           will read the new paths, synchronize them, and go back to\n\
-      \032           sleep\n\
-      \032         + that's it!\n\
-      \032      To use this to drive Unison \"incrementally,\" just start it in this\n\
-      \032      mode and start up a tool (on each host) to watch for new changes\n\
-      \032      to the filesystem and append the appropriate paths to the\n\
-      \032      watchfile. Hopefully such tools should not be too hard to write.\n\
-      \032    * Bug fixes:\n\
-      \032         + Fixed a bug that was causing new files to be created with\n\
-      \032           permissions 0x600 instead of using a reasonable default (like\n\
-      \032           0x644), if the 'perms' flag was set to 0. (Bug reported by\n\
-      \032           Ben Crowell.)\n\
-      \032         + Follow maxthreads preference when transferring directories.\n\
-      \n\
-      \032  Changes since 2.17:\n\
-      \032    * Major rewrite and cleanup of the whole Mac OS X graphical user\n\
-      \032      interface by Craig Federighi. Thanks, Craig!!!\n\
-      \032    * Small fix to ctime (non-)handling in update detection under\n\
-      \032      windows with fastcheck.\n\
-      \032    * Several small fixes to the GTK2 UI to make it work better under\n\
-      \032      Windows [thanks to Karl M for these].\n\
-      \032    * The backup functionality has been completely rewritten. The\n\
-      \032      external interface has not changed, but numerous bugs, irregular\n\
-      \032      behaviors, and cross-platform inconsistencies have been corrected.\n\
-      \032    * The Unison project now accepts donations via PayPal. If you'd like\n\
-      \032      to donate, you can find a link to the donation page on the Unison\n\
-      \032      home page (http://www.cis.upenn.edu/ bcpierce/unison/lists.html).\n\
-      \032    * Some important safety improvements:\n\
-      \032         + Added a new mountpoint preference, which can be used to\n\
-      \032           specify a path that must exist in both replicas at the end of\n\
-      \032           update detection (otherwise Unison aborts). This can be used\n\
-      \032           to avoid potentially dangerous situations when Unison is used\n\
-      \032           with removable media such as external hard drives and compact\n\
-      \032           flash cards.\n\
-      \032         + The confirmation of \"big deletes\" is now controlled by a\n\
-      \032           boolean preference confirmbigdeletes. Default is true, which\n\
-      \032           gives the same behavior as previously. (This functionality is\n\
-      \032           at least partly superceded by the mountpoint preference, but\n\
-      \032           it has been left in place in case it is useful to some\n\
-      \032           people.)\n\
-      \032         + If Unison is asked to \"follow\" a symbolic link but there is\n\
-      \032           nothing at the other end of the link, it will now flag this\n\
-      \032           path as an error, rather than treating the symlink itself as\n\
-      \032           missing or deleted. This avoids a potentially dangerous\n\
-      \032           situation where a followed symlink points to an external\n\
-      \032           filesystem that might be offline when Unison is run\n\
-      \032           (whereupon Unison would cheerfully delete the corresponding\n\
-      \032           files in the other replica!).\n\
-      \032    * Smaller changes:\n\
-      \032         + Added forcepartial and preferpartial preferences, which\n\
-      \032           behave like force and prefer but can be specified on a\n\
-      \032           per-path basis. [Thanks to Alan Schmitt for this.]\n\
-      \032         + A bare-bones self test feature was added, which runs unison\n\
-      \032           through some of its paces and checks that the results are as\n\
-      \032           expected. The coverage of the tests is still very limited,\n\
-      \032           but the facility has already been very useful in debugging\n\
-      \032           the new backup functionality (especially in exposing some\n\
-      \032           subtle cross-platform issues).\n\
-      \032         + Refined debugging code so that the verbosity of individual\n\
-      \032           modules can be controlled separately. Instead of just putting\n\
-      \032           '-debug verbose' on the command line, you can put '-debug\n\
-      \032           update+', which causes all the extra messages in the Update\n\
-      \032           module, but not other modules, to be printed. Putting '-debug\n\
-      \032           verbose' causes all modules to print with maximum verbosity.\n\
-      \032         + Removed mergebatch preference. (It never seemed very useful,\n\
-      \032           and its semantics were confusing.)\n\
-      \032         + Rewrote some of the merging functionality, for better\n\
-      \032           cooperation with external Harmony instances.\n\
-      \032         + Changed the temp file prefix from .# to .unison.\n\
-      \032         + Compressed the output from the text user interface\n\
-      \032           (particularly when run with the -terse flag) to make it\n\
-      \032           easier to interpret the results when Unison is run several\n\
-      \032           times in succession from a script.\n\
-      \032         + Diff and merge functions now work under Windows.\n\
-      \032         + Changed the order of arguments to the default diff command\n\
-      \032           (so that the + and - annotations in diff's output are\n\
-      \032           reversed).\n\
-      \032         + Added .mpp files to the \"never fastcheck\" list (like .xls\n\
-      \032           files).\n\
-      \032    * Many small bugfixes, including:\n\
-      \032         + Fixed a longstanding bug regarding fastcheck and daylight\n\
-      \032           saving time under Windows when Unison is set up to\n\
-      \032           synchronize modification times. (Modification times cannot be\n\
-      \032           updated in the archive in this case, so we have to ignore one\n\
-      \032           hour differences.)\n\
-      \032         + Fixed a bug that would occasionally cause the archives to be\n\
-      \032           left in non-identical states on the two hosts after\n\
-      \032           synchronization.\n\
-      \032         + Fixed a bug that prevented Unison from communicating\n\
-      \032           correctly between 32- and 64-bit architectures.\n\
-      \032         + On windows, file creation times are no longer used as a proxy\n\
-      \032           for inode numbers. (This is unfortunate, as it makes\n\
-      \032           fastcheck a little less safe. But it turns out that file\n\
-      \032           creation times are not reliable under Windows: if a file is\n\
-      \032           removed and a new file is created in its place, the new one\n\
-      \032           will sometimes be given the same creation date as the old\n\
-      \032           one!)\n\
-      \032         + Set read-only file to R/W on OSX before attempting to change\n\
-      \032           other attributes.\n\
-      \032         + Fixed bug resulting in spurious \"Aborted\" errors during\n\
-      \032           transport (thanks to Jerome Vouillon)\n\
-      \032         + Enable diff if file contents have changed in one replica, but\n\
-      \032           only properties in the other.\n\
-      \032         + Removed misleading documentation for 'repeat' preference.\n\
-      \032         + Fixed a bug in merging code where Unison could sometimes\n\
-      \032           deadlock with the external merge program, if the latter\n\
-      \032           produced large amounts of output.\n\
-      \032         + Workaround for a bug compiling gtk2 user interface against\n\
-      \032           current versions of gtk2+ libraries.\n\
-      \032         + Added a better error message for \"ambiguous paths\".\n\
-      \032         + Squashed a longstanding bug that would cause file transfer to\n\
-      \032           fail with the message \"Failed: Error in readWrite: Is a\n\
-      \032           directory.\"\n\
-      \032         + Replaced symlinks with copies of their targets in the Growl\n\
-      \032           framework in src/uimac. This should make the sources easier\n\
-      \032           to check out from the svn repository on WinXP systems.\n\
-      \032         + Added a workaround (suggested by Karl M.) for the problem\n\
-      \032           discussed on the unison users mailing list where, on the\n\
-      \032           Windows platform, the server would hang when transferring\n\
-      \032           files. I conjecture that the problem has to do with the RPC\n\
-      \032           mechanism, which was used to make a call back from the server\n\
-      \032           to the client (inside the Trace.log function) so that the log\n\
-      \032           message would be appended to the log file on the client. The\n\
-      \032           workaround is to dump these messages (about when\n\
-      \032           xferbycopying shortcuts are applied and whether they succeed)\n\
-      \032           just to the standard output of the Unison process, not to the\n\
-      \032           log file.\n\
-      \n\
-      \032  Changes since 2.13.0:\n\
-      \032    * The features for performing backups and for invoking external\n\
-      \032      merge programs have been completely rewritten by Stephane Lescuyer\n\
-      \032      (thanks, Stephane!). The user-visible functionality should not\n\
-      \032      change, but the internals have been rationalized and there are a\n\
-      \032      number of new features. See the manual (in particular, the\n\
-      \032      description of the backupXXX preferences) for details.\n\
-      \032    * Incorporated patches for ipv6 support, contributed by Samuel\n\
-      \032      Thibault. (Note that, due to a bug in the released OCaml 3.08.3\n\
-      \032      compiler, this code will not actually work with ipv6 unless\n\
-      \032      compiled with the CVS version of the OCaml compiler, where the bug\n\
-      \032      has been fixed; however, ipv4 should continue to work normally.)\n\
-      \032    * OSX interface:\n\
-      \032         + Incorporated Ben Willmore's cool new icon for the Mac UI.\n\
-      \032    * Small fixes:\n\
-      \032         + Fixed off by one error in month numbers (in printed dates)\n\
-      \032           reported by Bob Burger\n\
-      \n\
-      \032  Changes since 2.12.0:\n\
-      \032    * New convention for release numbering: Releases will continue to be\n\
-      \032      given numbers of the form X.Y.Z, but, from now on, just the major\n\
-      \032      version number (X.Y) will be considered significant when checking\n\
-      \032      compatibility between client and server versions. The third\n\
-      \032      component of the version number will be used only to identify\n\
-      \032      \"patch levels\" of releases.\n\
-      \032      This change goes hand in hand with a change to the procedure for\n\
-      \032      making new releases. Candidate releases will initially be given\n\
-      \032      \"beta release\" status when they are announced for public\n\
-      \032      consumption. Any bugs that are discovered will be fixed in a\n\
-      \032      separate branch of the source repository (without changing the\n\
-      \032      major version number) and new tarballs re-released as needed. When\n\
-      \032      this process converges, the patched beta version will be dubbed\n\
-      \032      stable.\n\
-      \032    * Warning (failure in batch mode) when one path is completely\n\
-      \032      emptied. This prevents Unison from deleting everything on one\n\
-      \032      replica when the other disappear.\n\
-      \032    * Fix diff bug (where no difference is shown the first time the diff\n\
-      \032      command is given).\n\
-      \032    * User interface changes:\n\
-      \032         + Improved workaround for button focus problem (GTK2 UI)\n\
-      \032         + Put leading zeroes in date fields\n\
-      \032         + More robust handling of character encodings in GTK2 UI\n\
-      \032         + Changed format of modification time displays, from modified\n\
-      \032           at hh:mm:ss on dd MMM, yyyy to modified on yyyy-mm-dd\n\
-      \032           hh:mm:ss\n\
-      \032         + Changed time display to include seconds (so that people on\n\
-      \032           FAT filesystems will not be confused when Unison tries to\n\
-      \032           update a file time to an odd number of seconds and the\n\
-      \032           filesystem truncates it to an even number!)\n\
-      \032         + Use the diff \"-u\" option by default when showing differences\n\
-      \032           between files (the output is more readable)\n\
-      \032         + In text mode, pipe the diff output to a pager if the\n\
-      \032           environment variable PAGER is set\n\
-      \032         + Bug fixes and cleanups in ssh password prompting. Now works\n\
-      \032           with the GTK2 UI under Linux. (Hopefully the Mac OS X one is\n\
-      \032           not broken!)\n\
-      \032         + Include profile name in the GTK2 window name\n\
-      \032         + Added bindings ',' (same as '<') and '.' (same as '>') in the\n\
-      \032           GTK2 UI\n\
-      \032    * Mac GUI:\n\
-      \032         + actions like < and > scroll to the next item as necessary.\n\
-      \032         + Restart has a menu item and keyboard shortcut (command-R).\n\
-      \032         + Added a command-line tool for Mac OS X. It can be installed\n\
-      \032           from the Unison menu.\n\
-      \032         + New icon.\n\
-      \032         + Handle the \"help\" command-line argument properly.\n\
-      \032         + Handle profiles given on the command line properly.\n\
-      \032         + When a profile has been selected, the profile dialog is\n\
-      \032           replaced by a \"connecting\" message while the connection is\n\
-      \032           being made. This gives better feedback.\n\
-      \032         + Size of left and right columns is now large enough so that\n\
-      \032           \"PropsChanged\" is not cut off.\n\
-      \032    * Minor changes:\n\
-      \032         + Disable multi-threading when both roots are local\n\
-      \032         + Improved error handling code. In particular, make sure all\n\
-      \032           files are closed in case of a transient failure\n\
-      \032         + Under Windows, use $UNISON for home directory as a last\n\
-      \032           resort (it was wrongly moved before $HOME and $USERPROFILE in\n\
-      \032           Unison 2.12.0)\n\
-      \032         + Reopen the logfile if its name changes (profile change)\n\
-      \032         + Double-check that permissions and modification times have\n\
-      \032           been properly set: there are some combination of OS and\n\
-      \032           filesystem on which setting them can fail in a silent way.\n\
-      \032         + Check for bad Windows filenames for pure Windows\n\
-      \032           synchronization also (not just cross architecture\n\
-      \032           synchronization). This way, filenames containing backslashes,\n\
-      \032           which are not correctly handled by unison, are rejected right\n\
-      \032           away.\n\
-      \032         + Attempt to resolve issues with synchronizing modification\n\
-      \032           times of read-only files under Windows\n\
-      \032         + Ignore chmod failures when deleting files\n\
-      \032         + Ignore trailing dots in filenames in case insensitive mode\n\
-      \032         + Proper quoting of paths, files and extensions ignored using\n\
-      \032           the UI\n\
-      \032         + The strings CURRENT1 and CURRENT2 are now correctly\n\
-      \032           substitued when they occur in the diff preference\n\
-      \032         + Improvements to syncing resource forks between Macs via a\n\
-      \032           non-Mac system.\n\
-      \n\
-      \032  Changes since 2.10.2:\n\
-      \032    * INCOMPATIBLE CHANGE: Archive format has changed.\n\
-      \032    * Source code availability: The Unison sources are now managed using\n\
-      \032      Subversion. One nice side-effect is that anonymous checkout is now\n\
-      \032      possible, like this:\n\
-      \032       svn co https://cvs.cis.upenn.edu:3690/svnroot/unison/\n\
-      \032      We will also continue to export a \"developer tarball\" of the\n\
-      \032      current (modulo one day) sources in the web export directory. To\n\
-      \032      receive commit logs for changes to the sources, subscribe to the\n\
-      \032      unison-hackers list\n\
-      \032      (http://www.cis.upenn.edu/ bcpierce/unison/lists.html).\n\
-      \032    * Text user interface:\n\
-      \032         + Substantial reworking of the internal logic of the text UI to\n\
-      \032           make it a bit easier to modify.\n\
-      \032         + The dumbtty flag in the text UI is automatically set to true\n\
-      \032           if the client is running on a Unix system and the EMACS\n\
-      \032           environment variable is set to anything other than the empty\n\
-      \032           string.\n\
-      \032    * Native OS X gui:\n\
-      \032         + Added a synchronize menu item with keyboard shortcut\n\
-      \032         + Added a merge menu item, still needs to be debugged\n\
-      \032         + Fixes to compile for Panther\n\
-      \032         + Miscellaneous improvements and bugfixes\n\
-      \032    * Small changes:\n\
-      \032         + Changed the filename checking code to apply to Windows only,\n\
-      \032           instead of OS X as well.\n\
-      \032         + Finder flags now synchronized\n\
-      \032         + Fallback in copy.ml for filesystem that do not support O_EXCL\n\
-      \032         + Changed buffer size for local file copy (was highly\n\
-      \032           inefficient with synchronous writes)\n\
-      \032         + Ignore chmod failure when deleting a directory\n\
-      \032         + Fixed assertion failure when resolving a conflict content\n\
-      \032           change / permission changes in favor of the content change.\n\
-      \032         + Workaround for transferring large files using rsync.\n\
-      \032         + Use buffered I/O for files (this is the only way to open\n\
-      \032           files in binary mode under Cygwin).\n\
-      \032         + On non-Cygwin Windows systems, the UNISON environment\n\
-      \032           variable is now checked first to determine where to look for\n\
-      \032           Unison's archive and preference files, followed by HOME and\n\
-      \032           USERPROFILE in that order. On Unix and Cygwin systems, HOME\n\
-      \032           is used.\n\
-      \032         + Generalized diff preference so that it can be given either as\n\
-      \032           just the command name to be used for calculating diffs or\n\
-      \032           else a whole command line, containing the strings CURRENT1\n\
-      \032           and CURRENT2, which will be replaced by the names of the\n\
-      \032           files to be diff'ed before the command is called.\n\
-      \032         + Recognize password prompts in some newer versions of ssh.\n\
-      \n\
-      \032  Changes since 2.9.20:\n\
-      \032    * INCOMPATIBLE CHANGE: Archive format has changed.\n\
-      \032    * Major functionality changes:\n\
-      \032         + Major tidying and enhancement of 'merge' functionality. The\n\
-      \032           main user-visible change is that the external merge program\n\
-      \032           may either write the merged output to a single new file, as\n\
-      \032           before, or it may modify one or both of its input files, or\n\
-      \032           it may write two new files. In the latter cases, its\n\
-      \032           modifications will be copied back into place on both the\n\
-      \032           local and the remote host, and (if the two files are now\n\
-      \032           equal) the archive will be updated appropriately. More\n\
-      \032           information can be found in the user manual. Thanks to Malo\n\
-      \032           Denielou and Alan Schmitt for these improvements.\n\
-      \032           Warning: the new merging functionality is not completely\n\
-      \032           compatible with old versions! Check the manual for details.\n\
-      \032         + Files larger than 2Gb are now supported.\n\
-      \032         + Added preliminary (and still somewhat experimental) support\n\
-      \032           for the Apple OS X operating system.\n\
-      \032              o Resource forks should be transferred correctly. (See the\n\
-      \032                manual for details of how this works when synchronizing\n\
-      \032                HFS with non-HFS volumes.) Synchronization of file type\n\
-      \032                and creator information is also supported.\n\
-      \032              o On OSX systems, the name of the directory for storing\n\
-      \032                Unison's archives, preference files, etc., is now\n\
-      \032                determined as follows:\n\
-      \032                   # if ~/.unison exists, use it\n\
-      \032                   # otherwise, use ~/Library/Application\n\
-      \032                     Support/Unison, creating it if necessary.\n\
-      \032              o A preliminary native-Cocoa user interface is under\n\
-      \032                construction. This still needs some work, and some users\n\
-      \032                experience unpredictable crashes, so it is only for\n\
-      \032                hackers for now. Run make with UISTYLE=mac to build this\n\
-      \032                interface.\n\
-      \032    * Minor functionality changes:\n\
-      \032         + Added an ignorelocks preference, which forces Unison to\n\
-      \032           override left-over archive locks. (Setting this preference is\n\
-      \032           dangerous! Use it only if you are positive you know what you\n\
-      \032           are doing.)\n\
-      \032         + Added a new preference assumeContentsAreImmutable. If a\n\
-      \032           directory matches one of the patterns set in this preference,\n\
-      \032           then update detection is skipped for files in this directory.\n\
-      \032           (The purpose is to speed update detection for cases like Mail\n\
-      \032           folders, which contain lots and lots of immutable files.)\n\
-      \032           Also a preference assumeContentsAreImmutableNot, which\n\
-      \032           overrides the first, similarly to ignorenot. (Later\n\
-      \032           amendment: these preferences are now called immutable and\n\
-      \032           immutablenot.)\n\
-      \032         + The ignorecase flag has been changed from a boolean to a\n\
-      \032           three-valued preference. The default setting, called default,\n\
-      \032           checks the operating systems running on the client and server\n\
-      \032           and ignores filename case if either of them is OSX or\n\
-      \032           Windows. Setting ignorecase to true or false overrides this\n\
-      \032           behavior. If you have been setting ignorecase on the command\n\
-      \032           line using -ignorecase=true or -ignorecase=false, you will\n\
-      \032           need to change to -ignorecase true or -ignorecase false.\n\
-      \032         + a new preference, 'repeat', for the text user interface\n\
-      \032           (only). If 'repeat' is set to a number, then, after it\n\
-      \032           finishes synchronizing, Unison will wait for that many\n\
-      \032           seconds and then start over, continuing this way until it is\n\
-      \032           killed from outside. Setting repeat to true will\n\
-      \032           automatically set the batch preference to true.\n\
-      \032         + Excel files are now handled specially, so that the fastcheck\n\
-      \032           optimization is skipped even if the fastcheck flag is set.\n\
-      \032           (Excel does some naughty things with modtimes, making this\n\
-      \032           optimization unreliable and leading to failures during change\n\
-      \032           propagation.)\n\
-      \032         + The ignorecase flag has been changed from a boolean to a\n\
-      \032           three-valued preference. The default setting, called\n\
-      \032           'default', checks the operating systems running on the client\n\
-      \032           and server and ignores filename case if either of them is OSX\n\
-      \032           or Windows. Setting ignorecase to 'true' or 'false' overrides\n\
-      \032           this behavior.\n\
-      \032         + Added a new preference, 'repeat', for the text user interface\n\
-      \032           (only, at the moment). If 'repeat' is set to a number, then,\n\
-      \032           after it finishes synchronizing, Unison will wait for that\n\
-      \032           many seconds and then start over, continuing this way until\n\
-      \032           it is killed from outside. Setting repeat to true will\n\
-      \032           automatically set the batch preference to true.\n\
-      \032         + The 'rshargs' preference has been split into 'rshargs' and\n\
-      \032           'sshargs' (mainly to make the documentation clearer). In\n\
-      \032           fact, 'rshargs' is no longer mentioned in the documentation\n\
-      \032           at all, since pretty much everybody uses ssh now anyway.\n\
-      \032    * Documentation\n\
-      \032         + The web pages have been completely redesigned and\n\
-      \032           reorganized. (Thanks to Alan Schmitt for help with this.)\n\
-      \032    * User interface improvements\n\
-      \032         + Added a GTK2 user interface, capable (among other things) of\n\
-      \032           displaying filenames in any locale encoding. Kudos to Stephen\n\
-      \032           Tse for contributing this code!\n\
-      \032         + The text UI now prints a list of failed and skipped transfers\n\
-      \032           at the end of synchronization.\n\
-      \032         + Restarting update detection from the graphical UI will reload\n\
-      \032           the current profile (which in particular will reset the -path\n\
-      \032           preference, in case it has been narrowed by using the\n\
-      \032           \"Recheck unsynchronized items\" command).\n\
-      \032         + Several small improvements to the text user interface,\n\
-      \032           including a progress display.\n\
-      \032    * Bug fixes (too numerous to count, actually, but here are some):\n\
-      \032         + The maxthreads preference works now.\n\
-      \032         + Fixed bug where warning message about uname returning an\n\
-      \032           unrecognized result was preventing connection to server. (The\n\
-      \032           warning is no longer printed, and all systems where 'uname'\n\
-      \032           returns anything other than 'Darwin' are assumed not to be\n\
-      \032           running OS X.)\n\
-      \032         + Fixed a problem on OS X that caused some valid file names\n\
-      \032           (e.g., those including colons) to be considered invalid.\n\
-      \032         + Patched Path.followLink to follow links under cygwin in\n\
-      \032           addition to Unix (suggested by Matt Swift).\n\
-      \032         + Small change to the storeRootsName function, suggested by\n\
-      \032           bliviero at ichips.intel.com, to fix a problem in unison with\n\
-      \032           the `rootalias' option, which allows you to tell unison that\n\
-      \032           two roots contain the same files. Rootalias was being applied\n\
-      \032           after the hosts were sorted, so it wouldn't work properly in\n\
-      \032           all cases.\n\
-      \032         + Incorporated a fix by Dmitry Bely for setting utimes of\n\
-      \032           read-only files on Win32 systems.\n\
-      \032    * Installation / portability:\n\
-      \032         + Unison now compiles with OCaml version 3.07 and later out of\n\
-      \032           the box.\n\
-      \032         + Makefile.OCaml fixed to compile out of the box under OpenBSD.\n\
-      \032         + a few additional ports (e.g. OpenBSD, Zaurus/IPAQ) are now\n\
-      \032           mentioned in the documentation\n\
-      \032         + Unison can now be installed easily on OSX systems using the\n\
-      \032           Fink package manager\n\
-      \n\
-      \032  Changes since 2.9.1:\n\
-      \032    * Added a preference maxthreads that can be used to limit the number\n\
-      \032      of simultaneous file transfers.\n\
-      \032    * Added a backupdir preference, which controls where backup files\n\
-      \032      are stored.\n\
-      \032    * Basic support added for OSX. In particular, Unison now recognizes\n\
-      \032      when one of the hosts being synchronized is running OSX and\n\
-      \032      switches to a case-insensitive treatment of filenames (i.e., 'foo'\n\
-      \032      and 'FOO' are considered to be the same file). (OSX is not yet\n\
-      \032      fully working, however: in particular, files with resource forks\n\
-      \032      will not be synchronized correctly.)\n\
-      \032    * The same hash used to form the archive name is now also added to\n\
-      \032      the names of the temp files created during file transfer. The\n\
-      \032      reason for this is that, during update detection, we are going to\n\
-      \032      silently delete any old temp files that we find along the way, and\n\
-      \032      we want to prevent ourselves from deleting temp files belonging to\n\
-      \032      other instances of Unison that may be running in parallel, e.g.\n\
-      \032      synchronizing with a different host. Thanks to Ruslan Ermilov for\n\
-      \032      this suggestion.\n\
-      \032    * Several small user interface improvements\n\
-      \032    * Documentation\n\
-      \032         + FAQ and bug reporting instructions have been split out as\n\
-      \032           separate HTML pages, accessible directly from the unison web\n\
-      \032           page.\n\
-      \032         + Additions to FAQ, in particular suggestions about performance\n\
-      \032           tuning.\n\
-      \032    * Makefile\n\
-      \032         + Makefile.OCaml now sets UISTYLE=text or UISTYLE=gtk\n\
-      \032           automatically, depending on whether it finds lablgtk\n\
-      \032           installed\n\
-      \032         + Unison should now compile \"out of the box\" under OSX\n\
-      \n\
-      \032  Changes since 2.8.1:\n\
-      \032    * Changing profile works again under Windows\n\
-      \032    * File movement optimization: Unison now tries to use local copy\n\
-      \032      instead of transfer for moved or copied files. It is controled by\n\
-      \032      a boolean option \"xferbycopying\".\n\
-      \032    * Network statistics window (transfer rate, amount of data\n\
-      \032      transferred). [NB: not available in Windows-Cygwin version.]\n\
-      \032    * symlinks work under the cygwin version (which is dynamically\n\
-      \032      linked).\n\
-      \032    * Fixed potential deadlock when synchronizing between Windows and\n\
-      \032      Unix\n\
-      \032    * Small improvements:\n\
-      \032         + If neither the USERPROFILE nor the HOME environment variables\n\
-      \032           are set, then Unison will put its temporary commit log\n\
-      \032           (called DANGER.README) into the directory named by the UNISON\n\
-      \032           environment variable, if any; otherwise it will use C:.\n\
-      \032         + alternative set of values for fastcheck: yes = true; no =\n\
-      \032           false; default = auto.\n\
-      \032         + -silent implies -contactquietly\n\
-      \032    * Source code:\n\
-      \032         + Code reorganization and tidying. (Started breaking up some of\n\
-      \032           the basic utility modules so that the non-unison-specific\n\
-      \032           stuff can be made available for other projects.)\n\
-      \032         + several Makefile and docs changes (for release);\n\
-      \032         + further comments in \"update.ml\";\n\
-      \032         + connection information is not stored in global variables\n\
-      \032           anymore.\n\
-      \n\
-      \032  Changes since 2.7.78:\n\
-      \032    * Small bugfix to textual user interface under Unix (to avoid\n\
-      \032      leaving the terminal in a bad state where it would not echo inputs\n\
-      \032      after Unison exited).\n\
-      \n\
-      \032  Changes since 2.7.39:\n\
-      \032    * Improvements to the main web page (stable and beta version docs\n\
-      \032      are now both accessible).\n\
-      \032    * User manual revised.\n\
-      \032    * Added some new preferences:\n\
-      \032         + \"sshcmd\" and \"rshcmd\" for specifying paths to ssh and rsh\n\
-      \032           programs.\n\
-      \032         + \"contactquietly\" for suppressing the \"contacting server\"\n\
-      \032           message during Unison startup (under the graphical UI).\n\
-      \032    * Bug fixes:\n\
-      \032         + Fixed small bug in UI that neglected to change the displayed\n\
-      \032           column headers if loading a new profile caused the roots to\n\
-      \032           change.\n\
-      \032         + Fixed a bug that would put the text UI into an infinite loop\n\
-      \032           if it encountered a conflict when run in batch mode.\n\
-      \032         + Added some code to try to fix the display of non-Ascii\n\
-      \032           characters in filenames on Windows systems in the GTK UI.\n\
-      \032           (This code is currently untested--if you're one of the people\n\
-      \032           that had reported problems with display of non-ascii\n\
-      \032           filenames, we'd appreciate knowing if this actually fixes\n\
-      \032           things.)\n\
-      \032         + `-prefer/-force newer' works properly now. (The bug was\n\
-      \032           reported by Sebastian Urbaniak and Sean Fulton.)\n\
-      \032    * User interface and Unison behavior:\n\
-      \032         + Renamed `Proceed' to `Go' in the graphical UI.\n\
-      \032         + Added exit status for the textual user interface.\n\
-      \032         + Paths that are not synchronized because of conflicts or\n\
-      \032           errors during update detection are now noted in the log file.\n\
-      \032         + [END] messages in log now use a briefer format\n\
-      \032         + Changed the text UI startup sequence so that ./unison -ui\n\
-      \032           text will use the default profile instead of failing.\n\
-      \032         + Made some improvements to the error messages.\n\
-      \032         + Added some debugging messages to remote.ml.\n\
-      \n\
-      \032  Changes since 2.7.7:\n\
-      \032    * Incorporated, once again, a multi-threaded transport sub-system.\n\
-      \032      It transfers several files at the same time, thereby making much\n\
-      \032      more effective use of available network bandwidth. Unlike the\n\
-      \032      earlier attempt, this time we do not rely on the native thread\n\
-      \032      library of OCaml. Instead, we implement a light-weight,\n\
-      \032      non-preemptive multi-thread library in OCaml directly. This\n\
-      \032      version appears stable.\n\
-      \032      Some adjustments to unison are made to accommodate the\n\
-      \032      multi-threaded version. These include, in particular, changes to\n\
-      \032      the user interface and logging, for example:\n\
-      \032         + Two log entries for each transferring task, one for the\n\
-      \032           beginning, one for the end.\n\
-      \032         + Suppressed warning messages against removing temp files left\n\
-      \032           by a previous unison run, because warning does not work\n\
-      \032           nicely under multi-threading. The temp file names are made\n\
-      \032           less likely to coincide with the name of a file created by\n\
-      \032           the user. They take the form\n\
-      \032           .#<filename>.<serial>.unison.tmp. [N.b. This was later\n\
-      \032           changed to .unison.<filename>.<serial>.unison.tmp.]\n\
-      \032    * Added a new command to the GTK user interface: pressing 'f' causes\n\
-      \032      Unison to start a new update detection phase, using as paths just\n\
-      \032      those paths that have been detected as changed and not yet marked\n\
-      \032      as successfully completed. Use this command to quickly restart\n\
-      \032      Unison on just the set of paths still needing attention after a\n\
-      \032      previous run.\n\
-      \032    * Made the ignorecase preference user-visible, and changed the\n\
-      \032      initialization code so that it can be manually set to true, even\n\
-      \032      if neither host is running Windows. (This may be useful, e.g.,\n\
-      \032      when using Unison running on a Unix system with a FAT volume\n\
-      \032      mounted.)\n\
-      \032    * Small improvements and bug fixes:\n\
-      \032         + Errors in preference files now generate fatal errors rather\n\
-      \032           than warnings at startup time. (I.e., you can't go on from\n\
-      \032           them.) Also, we fixed a bug that was preventing these\n\
-      \032           warnings from appearing in the text UI, so some users who\n\
-      \032           have been running (unsuspectingly) with garbage in their\n\
-      \032           prefs files may now get error reports.\n\
-      \032         + Error reporting for preference files now provides file name\n\
-      \032           and line number.\n\
-      \032         + More intelligible message in the case of identical change to\n\
-      \032           the same files: \"Nothing to do: replicas have been changed\n\
-      \032           only in identical ways since last sync.\"\n\
-      \032         + Files with prefix '.#' excluded when scanning for preference\n\
-      \032           files.\n\
-      \032         + Rsync instructions are send directly instead of first\n\
-      \032           marshaled.\n\
-      \032         + Won't try forever to get the fingerprint of a continuously\n\
-      \032           changing file: unison will give up after certain number of\n\
-      \032           retries.\n\
-      \032         + Other bug fixes, including the one reported by Peter Selinger\n\
-      \032           (force=older preference not working).\n\
-      \032    * Compilation:\n\
-      \032         + Upgraded to the new OCaml 3.04 compiler, with the LablGtk\n\
-      \032           1.2.3 library (patched version used for compiling under\n\
-      \032           Windows).\n\
-      \032         + Added the option to compile unison on the Windows platform\n\
-      \032           with Cygwin GNU C compiler. This option only supports\n\
-      \032           building dynamically linked unison executables.\n\
-      \n\
-      \032  Changes since 2.7.4:\n\
-      \032    * Fixed a silly (but debilitating) bug in the client startup\n\
-      \032      sequence.\n\
-      \n\
-      \032  Changes since 2.7.1:\n\
-      \032    * Added addprefsto preference, which (when set) controls which\n\
-      \032      preference file new preferences (e.g. new ignore patterns) are\n\
-      \032      added to.\n\
-      \032    * Bug fix: read the initial connection header one byte at a time, so\n\
-      \032      that we don't block if the header is shorter than expected. (This\n\
-      \032      bug did not affect normal operation -- it just made it hard to\n\
-      \032      tell when you were trying to use Unison incorrectly with an old\n\
-      \032      version of the server, since it would hang instead of giving an\n\
-      \032      error message.)\n\
-      \n\
-      \032  Changes since 2.6.59:\n\
-      \032    * Changed fastcheck from a boolean to a string preference. Its legal\n\
-      \032      values are yes (for a fast check), no (for a safe check), or\n\
-      \032      default (for a fast check--which also happens to be safe--when\n\
-      \032      running on Unix and a safe check when on Windows). The default is\n\
-      \032      default.\n\
-      \032    * Several preferences have been renamed for consistency. All\n\
-      \032      preference names are now spelled out in lowercase. For backward\n\
-      \032      compatibility, the old names still work, but they are not\n\
-      \032      mentioned in the manual any more.\n\
-      \032    * The temp files created by the 'diff' and 'merge' commands are now\n\
-      \032      named by prepending a new prefix to the file name, rather than\n\
-      \032      appending a suffix. This should avoid confusing diff/merge\n\
-      \032      programs that depend on the suffix to guess the type of the file\n\
-      \032      contents.\n\
-      \032    * We now set the keepalive option on the server socket, to make sure\n\
-      \032      that the server times out if the communication link is\n\
-      \032      unexpectedly broken.\n\
-      \032    * Bug fixes:\n\
-      \032         + When updating small files, Unison now closes the destination\n\
-      \032           file.\n\
-      \032         + File permissions are properly updated when the file is behind\n\
-      \032           a followed link.\n\
-      \032         + Several other small fixes.\n\
-      \n\
-      \032  Changes since 2.6.38:\n\
-      \032    * Major Windows performance improvement!\n\
-      \032      We've added a preference fastcheck that makes Unison look only at\n\
-      \032      a file's creation time and last-modified time to check whether it\n\
-      \032      has changed. This should result in a huge speedup when checking\n\
-      \032      for updates in large replicas.\n\
-      \032      When this switch is set, Unison will use file creation times as\n\
-      \032      'pseudo inode numbers' when scanning Windows replicas for updates,\n\
-      \032      instead of reading the full contents of every file. This may cause\n\
-      \032      Unison to miss propagating an update if the create time,\n\
-      \032      modification time, and length of the file are all unchanged by the\n\
-      \032      update (this is not easy to achieve, but it can be done). However,\n\
-      \032      Unison will never overwrite such an update with a change from the\n\
-      \032      other replica, since it always does a safe check for updates just\n\
-      \032      before propagating a change. Thus, it is reasonable to use this\n\
-      \032      switch most of the time and occasionally run Unison once with\n\
-      \032      fastcheck set to false, if you are worried that Unison may have\n\
-      \032      overlooked an update.\n\
-      \032      Warning: This change is has not yet been thoroughly field-tested.\n\
-      \032      If you set the fastcheck preference, pay careful attention to what\n\
-      \032      Unison is doing.\n\
-      \032    * New functionality: centralized backups and merging\n\
-      \032         + This version incorporates two pieces of major new\n\
-      \032           functionality, implemented by Sylvain Roy during a summer\n\
-      \032           internship at Penn: a centralized backup facility that keeps\n\
-      \032           a full backup of (selected files in) each replica, and a\n\
-      \032           merging feature that allows Unison to invoke an external\n\
-      \032           file-merging tool to resolve conflicting changes to\n\
-      \032           individual files.\n\
-      \032         + Centralized backups:\n\
-      \032              o Unison now maintains full backups of the\n\
-      \032                last-synchronized versions of (some of) the files in\n\
-      \032                each replica; these function both as backups in the\n\
-      \032                usual sense and as the \"common version\" when invoking\n\
-      \032                external merge programs.\n\
-      \032              o The backed up files are stored in a directory\n\
-      \032                /.unison/backup on each host. (The name of this\n\
-      \032                directory can be changed by setting the environment\n\
-      \032                variable UNISONBACKUPDIR.)\n\
-      \032              o The predicate backup controls which files are actually\n\
-      \032                backed up: giving the preference 'backup = Path *'\n\
-      \032                causes backing up of all files.\n\
-      \032              o Files are added to the backup directory whenever unison\n\
-      \032                updates its archive. This means that\n\
-      \032                   # When unison reconstructs its archive from scratch\n\
-      \032                     (e.g., because of an upgrade, or because the\n\
-      \032                     archive files have been manually deleted), all\n\
-      \032                     files will be backed up.\n\
-      \032                   # Otherwise, each file will be backed up the first\n\
-      \032                     time unison propagates an update for it.\n\
-      \032              o The preference backupversions controls how many previous\n\
-      \032                versions of each file are kept. The default is 2 (i.e.,\n\
-      \032                the last synchronized version plus one backup).\n\
-      \032              o For backward compatibility, the backups preference is\n\
-      \032                also still supported, but backup is now preferred.\n\
-      \032              o It is OK to manually delete files from the backup\n\
-      \032                directory (or to throw away the directory itself).\n\
-      \032                Before unison uses any of these files for anything\n\
-      \032                important, it checks that its fingerprint matches the\n\
-      \032                one that it expects.\n\
-      \032         + Merging:\n\
-      \032              o Both user interfaces offer a new 'merge' command,\n\
-      \032                invoked by pressing 'm' (with a changed file selected).\n\
-      \032              o The actual merging is performed by an external program.\n\
-      \032                The preferences merge and merge2 control how this\n\
-      \032                program is invoked. If a backup exists for this file\n\
-      \032                (see the backup preference), then the merge preference\n\
-      \032                is used for this purpose; otherwise merge2 is used. In\n\
-      \032                both cases, the value of the preference should be a\n\
-      \032                string representing the command that should be passed to\n\
-      \032                a shell to invoke the merge program. Within this string,\n\
-      \032                the special substrings CURRENT1, CURRENT2, NEW, and OLD\n\
-      \032                may appear at any point. Unison will substitute these as\n\
-      \032                follows before invoking the command:\n\
-      \032                   # CURRENT1 is replaced by the name of the local copy\n\
-      \032                     of the file;\n\
-      \032                   # CURRENT2 is replaced by the name of a temporary\n\
-      \032                     file, into which the contents of the remote copy of\n\
-      \032                     the file have been transferred by Unison prior to\n\
-      \032                     performing the merge;\n\
-      \032                   # NEW is replaced by the name of a temporary file\n\
-      \032                     that Unison expects to be written by the merge\n\
-      \032                     program when it finishes, giving the desired new\n\
-      \032                     contents of the file; and\n\
-      \032                   # OLD is replaced by the name of the backed up copy\n\
-      \032                     of the original version of the file (i.e., its\n\
-      \032                     state at the end of the last successful run of\n\
-      \032                     Unison), if one exists (applies only to merge, not\n\
-      \032                     merge2).\n\
-      \032                For example, on Unix systems setting the merge\n\
-      \032                preference to\n\
-      \032  merge = diff3 -m CURRENT1 OLD CURRENT2 > NEW\n\
-      \032                will tell Unison to use the external diff3 program for\n\
-      \032                merging.\n\
-      \032                A large number of external merging programs are\n\
-      \032                available. For example, emacs users may find the\n\
-      \032                following convenient:\n\
-      \032   merge2 = emacs -q --eval '(ediff-merge-files \"CURRENT1\" \"CURRENT2\"\n\
-      \032              nil \"NEW\")'\n\
-      \032   merge = emacs -q --eval '(ediff-merge-files-with-ancestor\n\
-      \032              \"CURRENT1\" \"CURRENT2\" \"OLD\" nil \"NEW\")'\n\
-      \032                (These commands are displayed here on two lines to avoid\n\
-      \032                running off the edge of the page. In your preference\n\
-      \032                file, each should be written on a single line.)\n\
-      \032              o If the external program exits without leaving any file\n\
-      \032                at the path NEW, Unison considers the merge to have\n\
-      \032                failed. If the merge program writes a file called NEW\n\
-      \032                but exits with a non-zero status code, then Unison\n\
-      \032                considers the merge to have succeeded but to have\n\
-      \032                generated conflicts. In this case, it attempts to invoke\n\
-      \032                an external editor so that the user can resolve the\n\
-      \032                conflicts. The value of the editor preference controls\n\
-      \032                what editor is invoked by Unison. The default is emacs.\n\
-      \032              o Please send us suggestions for other useful values of\n\
-      \032                the merge2 and merge preferences - we'd like to give\n\
-      \032                several examples in the manual.\n\
-      \032    * Smaller changes:\n\
-      \032         + When one preference file includes another, unison no longer\n\
-      \032           adds the suffix '.prf' to the included file by default. If a\n\
-      \032           file with precisely the given name exists in the .unison\n\
-      \032           directory, it will be used; otherwise Unison will add .prf,\n\
-      \032           as it did before. (This change means that included preference\n\
-      \032           files can be named blah.include instead of blah.prf, so that\n\
-      \032           unison will not offer them in its 'choose a preference file'\n\
-      \032           dialog.)\n\
-      \032         + For Linux systems, we now offer both a statically linked and\n\
-      \032           a dynamically linked executable. The static one is larger,\n\
-      \032           but will probably run on more systems, since it doesn't\n\
-      \032           depend on the same versions of dynamically linked library\n\
-      \032           modules being available.\n\
-      \032         + Fixed the force and prefer preferences, which were getting\n\
-      \032           the propagation direction exactly backwards.\n\
-      \032         + Fixed a bug in the startup code that would cause unison to\n\
-      \032           crash when the default profile (~/.unison/default.prf) does\n\
-      \032           not exist.\n\
-      \032         + Fixed a bug where, on the run when a profile is first\n\
-      \032           created, Unison would confusingly display the roots in\n\
-      \032           reverse order in the user interface.\n\
-      \032    * For developers:\n\
-      \032         + We've added a module dependency diagram to the source\n\
-      \032           distribution, in src/DEPENDENCIES.ps, to help new prospective\n\
-      \032           developers with navigating the code.\n\
-      \n\
-      \032  Changes since 2.6.11:\n\
-      \032    * INCOMPATIBLE CHANGE: Archive format has changed.\n\
-      \032    * INCOMPATIBLE CHANGE: The startup sequence has been completely\n\
-      \032      rewritten and greatly simplified. The main user-visible change is\n\
-      \032      that the defaultpath preference has been removed. Its effect can\n\
-      \032      be approximated by using multiple profiles, with include\n\
-      \032      directives to incorporate common settings. All uses of defaultpath\n\
-      \032      in existing profiles should be changed to path.\n\
-      \032      Another change in startup behavior that will affect some users is\n\
-      \032      that it is no longer possible to specify roots both in the profile\n\
-      \032      and on the command line.\n\
-      \032      You can achieve a similar effect, though, by breaking your profile\n\
-      \032      into two:\n\
-      \n\
-      \032 default.prf =\n\
-      \032     root = blah\n\
-      \032     root = foo\n\
-      \032     include common\n\
-      \n\
-      \032 common.prf =\n\
-      \032     <everything else>\n\
-      \032      Now do\n\
-      \032 unison common root1 root2\n\
-      \032      when you want to specify roots explicitly.\n\
-      \032    * The -prefer and -force options have been extended to allow users\n\
-      \032      to specify that files with more recent modtimes should be\n\
-      \032      propagated, writing either -prefer newer or -force newer. (For\n\
-      \032      symmetry, Unison will also accept -prefer older or -force older.)\n\
-      \032      The -force older/newer options can only be used when -times is\n\
-      \032      also set.\n\
-      \032      The graphical user interface provides access to these facilities\n\
-      \032      on a one-off basis via the Actions menu.\n\
-      \032    * Names of roots can now be \"aliased\" to allow replicas to be\n\
-      \032      relocated without changing the name of the archive file where\n\
-      \032      Unison stores information between runs. (This feature is for\n\
-      \032      experts only. See the \"Archive Files\" section of the manual for\n\
-      \032      more information.)\n\
-      \032    * Graphical user-interface:\n\
-      \032         + A new command is provided in the Synchronization menu for\n\
-      \032           switching to a new profile without restarting Unison from\n\
-      \032           scratch.\n\
-      \032         + The GUI also supports one-key shortcuts for commonly used\n\
-      \032           profiles. If a profile contains a preference of the form 'key\n\
-      \032           = n', where n is a single digit, then pressing this key will\n\
-      \032           cause Unison to immediately switch to this profile and begin\n\
-      \032           synchronization again from scratch. (Any actions that may\n\
-      \032           have been selected for a set of changes currently being\n\
-      \032           displayed will be discarded.)\n\
-      \032         + Each profile may include a preference 'label = <string>'\n\
-      \032           giving a descriptive string that described the options\n\
-      \032           selected in this profile. The string is listed along with the\n\
-      \032           profile name in the profile selection dialog, and displayed\n\
-      \032           in the top-right corner of the main Unison window.\n\
-      \032    * Minor:\n\
-      \032         + Fixed a bug that would sometimes cause the 'diff' display to\n\
-      \032           order the files backwards relative to the main user\n\
-      \032           interface. (Thanks to Pascal Brisset for this fix.)\n\
-      \032         + On Unix systems, the graphical version of Unison will check\n\
-      \032           the DISPLAY variable and, if it is not set, automatically\n\
-      \032           fall back to the textual user interface.\n\
-      \032         + Synchronization paths (path preferences) are now matched\n\
-      \032           against the ignore preferences. So if a path is both\n\
-      \032           specified in a path preference and ignored, it will be\n\
-      \032           skipped.\n\
-      \032         + Numerous other bugfixes and small improvements.\n\
-      \n\
-      \032  Changes since 2.6.1:\n\
-      \032    * The synchronization of modification times has been disabled for\n\
-      \032      directories.\n\
-      \032    * Preference files may now include lines of the form include <name>,\n\
-      \032      which will cause name.prf to be read at that point.\n\
-      \032    * The synchronization of permission between Windows and Unix now\n\
-      \032      works properly.\n\
-      \032    * A binding CYGWIN=binmode in now added to the environment so that\n\
-      \032      the Cygwin port of OpenSSH works properly in a non-Cygwin context.\n\
-      \032    * The servercmd and addversionno preferences can now be used\n\
-      \032      together: -addversionno appends an appropriate -NNN to the server\n\
-      \032      command, which is found by using the value of the -servercmd\n\
-      \032      preference if there is one, or else just unison.\n\
-      \032    * Both '-pref=val' and '-pref val' are now allowed for boolean\n\
-      \032      values. (The former can be used to set a preference to false.)\n\
-      \032    * Lot of small bugs fixed.\n\
-      \n\
-      \032  Changes since 2.5.31:\n\
-      \032    * The log preference is now set to true by default, since the log\n\
-      \032      file seems useful for most users.\n\
-      \032    * Several miscellaneous bugfixes (most involving symlinks).\n\
-      \n\
-      \032  Changes since 2.5.25:\n\
-      \032    * INCOMPATIBLE CHANGE: Archive format has changed (again).\n\
-      \032    * Several significant bugs introduced in 2.5.25 have been fixed.\n\
-      \n\
-      \032  Changes since 2.5.1:\n\
-      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
-      \032      synchronize your replicas before upgrading, to avoid spurious\n\
-      \032      conflicts. The first sync after upgrading will be slow.\n\
-      \032    * New functionality:\n\
-      \032         + Unison now synchronizes file modtimes, user-ids, and\n\
-      \032           group-ids.\n\
-      \032           These new features are controlled by a set of new\n\
-      \032           preferences, all of which are currently false by default.\n\
-      \032              o When the times preference is set to true, file\n\
-      \032                modification times are propaged. (Because the\n\
-      \032                representations of time may not have the same\n\
-      \032                granularity on both replicas, Unison may not always be\n\
-      \032                able to make the modtimes precisely equal, but it will\n\
-      \032                get them as close as the operating systems involved\n\
-      \032                allow.)\n\
-      \032              o When the owner preference is set to true, file ownership\n\
-      \032                information is synchronized.\n\
-      \032              o When the group preference is set to true, group\n\
-      \032                information is synchronized.\n\
-      \032              o When the numericIds preference is set to true, owner and\n\
-      \032                group information is synchronized numerically. By\n\
-      \032                default, owner and group numbers are converted to names\n\
-      \032                on each replica and these names are synchronized. (The\n\
-      \032                special user id 0 and the special group 0 are never\n\
-      \032                mapped via user/group names even if this preference is\n\
-      \032                not set.)\n\
-      \032         + Added an integer-valued preference perms that can be used to\n\
-      \032           control the propagation of permission bits. The value of this\n\
-      \032           preference is a mask indicating which permission bits should\n\
-      \032           be synchronized. It is set by default to 0o1777: all bits but\n\
-      \032           the set-uid and set-gid bits are synchronised (synchronizing\n\
-      \032           theses latter bits can be a security hazard). If you want to\n\
-      \032           synchronize all bits, you can set the value of this\n\
-      \032           preference to -1.\n\
-      \032         + Added a log preference (default false), which makes Unison\n\
-      \032           keep a complete record of the changes it makes to the\n\
-      \032           replicas. By default, this record is written to a file called\n\
-      \032           unison.log in the user's home directory (the value of the\n\
-      \032           HOME environment variable). If you want it someplace else,\n\
-      \032           set the logfile preference to the full pathname you want\n\
-      \032           Unison to use.\n\
-      \032         + Added an ignorenot preference that maintains a set of\n\
-      \032           patterns for paths that should definitely not be ignored,\n\
-      \032           whether or not they match an ignore pattern. (That is, a path\n\
-      \032           will now be ignored iff it matches an ignore pattern and does\n\
-      \032           not match any ignorenot patterns.)\n\
-      \032    * User-interface improvements:\n\
-      \032         + Roots are now displayed in the user interface in the same\n\
-      \032           order as they were given on the command line or in the\n\
-      \032           preferences file.\n\
-      \032         + When the batch preference is set, the graphical user\n\
-      \032           interface no longer waits for user confirmation when it\n\
-      \032           displays a warning message: it simply pops up an advisory\n\
-      \032           window with a Dismiss button at the bottom and keeps on\n\
-      \032           going.\n\
-      \032         + Added a new preference for controlling how many status\n\
-      \032           messages are printed during update detection: statusdepth\n\
-      \032           controls the maximum depth for paths on the local machine\n\
-      \032           (longer paths are not displayed, nor are non-directory\n\
-      \032           paths). The value should be an integer; default is 1.\n\
-      \032         + Removed the trace and silent preferences. They did not seem\n\
-      \032           very useful, and there were too many preferences for\n\
-      \032           controlling output in various ways.\n\
-      \032         + The text UI now displays just the default command (the one\n\
-      \032           that will be used if the user just types <return>) instead of\n\
-      \032           all available commands. Typing ? will print the full list of\n\
-      \032           possibilities.\n\
-      \032         + The function that finds the canonical hostname of the local\n\
-      \032           host (which is used, for example, in calculating the name of\n\
-      \032           the archive file used to remember which files have been\n\
-      \032           synchronized) normally uses the gethostname operating system\n\
-      \032           call. However, if the environment variable\n\
-      \032           UNISONLOCALHOSTNAME is set, its value will now be used\n\
-      \032           instead. This makes it easier to use Unison in situations\n\
-      \032           where a machine's name changes frequently (e.g., because it\n\
-      \032           is a laptop and gets moved around a lot).\n\
-      \032         + File owner and group are now displayed in the \"detail window\"\n\
-      \032           at the bottom of the screen, when unison is configured to\n\
-      \032           synchronize them.\n\
-      \032    * For hackers:\n\
-      \032         + Updated to Jacques Garrigue's new version of lablgtk, which\n\
-      \032           means we can throw away our local patched version.\n\
-      \032           If you're compiling the GTK version of unison from sources,\n\
-      \032           you'll need to update your copy of lablgtk to the developers\n\
-      \032           release. (Warning: installing lablgtk under Windows is\n\
-      \032           currently a bit challenging.)\n\
-      \032         + The TODO.txt file (in the source distribution) has been\n\
-      \032           cleaned up and reorganized. The list of pending tasks should\n\
-      \032           be much easier to make sense of, for people that may want to\n\
-      \032           contribute their programming energies. There is also a\n\
-      \032           separate file BUGS.txt for open bugs.\n\
-      \032         + The Tk user interface has been removed (it was not being\n\
-      \032           maintained and no longer compiles).\n\
-      \032         + The debug preference now prints quite a bit of additional\n\
-      \032           information that should be useful for identifying sources of\n\
-      \032           problems.\n\
-      \032         + The version number of the remote server is now checked right\n\
-      \032           away during the connection setup handshake, rather than\n\
-      \032           later. (Somebody sent a bug report of a server crash that\n\
-      \032           turned out to come from using inconsistent versions: better\n\
-      \032           to check this earlier and in a way that can't crash either\n\
-      \032           client or server.)\n\
-      \032         + Unison now runs correctly on 64-bit architectures (e.g. Alpha\n\
-      \032           linux). We will not be distributing binaries for these\n\
-      \032           architectures ourselves (at least for a while) but if someone\n\
-      \032           would like to make them available, we'll be glad to provide a\n\
-      \032           link to them.\n\
-      \032    * Bug fixes:\n\
-      \032         + Pattern matching (e.g. for ignore) is now case-insensitive\n\
-      \032           when Unison is in case-insensitive mode (i.e., when one of\n\
-      \032           the replicas is on a windows machine).\n\
-      \032         + Some people had trouble with mysterious failures during\n\
-      \032           propagation of updates, where files would be falsely reported\n\
-      \032           as having changed during synchronization. This should be\n\
-      \032           fixed.\n\
-      \032         + Numerous smaller fixes.\n\
-      \n\
-      \032  Changes since 2.4.1:\n\
-      \032    * Added a number of 'sorting modes' for the user interface. By\n\
-      \032      default, conflicting changes are displayed at the top, and the\n\
-      \032      rest of the entries are sorted in alphabetical order. This\n\
-      \032      behavior can be changed in the following ways:\n\
-      \032         + Setting the sortnewfirst preference to true causes newly\n\
-      \032           created files to be displayed before changed files.\n\
-      \032         + Setting sortbysize causes files to be displayed in increasing\n\
-      \032           order of size.\n\
-      \032         + Giving the preference sortfirst=<pattern> (where <pattern> is\n\
-      \032           a path descriptor in the same format as 'ignore' and 'follow'\n\
-      \032           patterns, causes paths matching this pattern to be displayed\n\
-      \032           first.\n\
-      \032         + Similarly, giving the preference sortlast=<pattern> causes\n\
-      \032           paths matching this pattern to be displayed last.\n\
-      \032      The sorting preferences are described in more detail in the user\n\
-      \032      manual. The sortnewfirst and sortbysize flags can also be accessed\n\
-      \032      from the 'Sort' menu in the grpahical user interface.\n\
-      \032    * Added two new preferences that can be used to change unison's\n\
-      \032      fundamental behavior to make it more like a mirroring tool instead\n\
-      \032      of a synchronizer.\n\
-      \032         + Giving the preference prefer with argument <root> (by adding\n\
-      \032           -prefer <root> to the command line or prefer=<root>) to your\n\
-      \032           profile) means that, if there is a conflict, the contents of\n\
-      \032           <root> should be propagated to the other replica (with no\n\
-      \032           questions asked). Non-conflicting changes are treated as\n\
-      \032           usual.\n\
-      \032         + Giving the preference force with argument <root> will make\n\
-      \032           unison resolve all differences in favor of the given root,\n\
-      \032           even if it was the other replica that was changed.\n\
-      \032      These options should be used with care! (More information is\n\
-      \032      available in the manual.)\n\
-      \032    * Small changes:\n\
-      \032         + Changed default answer to 'Yes' in all two-button dialogs in\n\
-      \032           the graphical interface (this seems more intuitive).\n\
-      \032         + The rsync preference has been removed (it was used to\n\
-      \032           activate rsync compression for file transfers, but rsync\n\
-      \032           compression is now enabled by default).\n\
-      \032         + In the text user interface, the arrows indicating which\n\
-      \032           direction changes are being propagated are printed\n\
-      \032           differently when the user has overridded Unison's default\n\
-      \032           recommendation (====> instead of ---->). This matches the\n\
-      \032           behavior of the graphical interface, which displays such\n\
-      \032           arrows in a different color.\n\
-      \032         + Carriage returns (Control-M's) are ignored at the ends of\n\
-      \032           lines in profiles, for Windows compatibility.\n\
-      \032         + All preferences are now fully documented in the user manual.\n\
-      \n\
-      \032  Changes since 2.3.12:\n\
-      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
-      \032      synchronize your replicas before upgrading, to avoid spurious\n\
-      \032      conflicts. The first sync after upgrading will be slow.\n\
-      \032    * New/improved functionality:\n\
-      \032         + A new preference -sortbysize controls the order in which\n\
-      \032           changes are displayed to the user: when it is set to true,\n\
-      \032           the smallest changed files are displayed first. (The default\n\
-      \032           setting is false.)\n\
-      \032         + A new preference -sortnewfirst causes newly created files to\n\
-      \032           be listed before other updates in the user interface.\n\
-      \032         + We now allow the ssh protocol to specify a port.\n\
-      \032         + Incompatible change: The unison: protocol is deprecated, and\n\
-      \032           we added file: and socket:. You may have to modify your\n\
-      \032           profiles in the .unison directory. If a replica is specified\n\
-      \032           without an explicit protocol, we now assume it refers to a\n\
-      \032           file. (Previously \"//saul/foo\" meant to use SSH to connect to\n\
-      \032           saul, then access the foo directory. Now it means to access\n\
-      \032           saul via a remote file mechanism such as samba; the old\n\
-      \032           effect is now achieved by writing ssh://saul/foo.)\n\
-      \032         + Changed the startup sequence for the case where roots are\n\
-      \032           given but no profile is given on the command line. The new\n\
-      \032           behavior is to use the default profile (creating it if it\n\
-      \032           does not exist), and temporarily override its roots. The\n\
-      \032           manual claimed that this case would work by reading no\n\
-      \032           profile at all, but AFAIK this was never true.\n\
-      \032         + In all user interfaces, files with conflicts are always\n\
-      \032           listed first\n\
-      \032         + A new preference 'sshversion' can be used to control which\n\
-      \032           version of ssh should be used to connect to the server. Legal\n\
-      \032           values are 1 and 2. (Default is empty, which will make unison\n\
-      \032           use whatever version of ssh is installed as the default 'ssh'\n\
-      \032           command.)\n\
-      \032         + The situation when the permissions of a file was updated the\n\
-      \032           same on both side is now handled correctly (we used to report\n\
-      \032           a spurious conflict)\n\
-      \032    * Improvements for the Windows version:\n\
-      \032         + The fact that filenames are treated case-insensitively under\n\
-      \032           Windows should now be handled correctly. The exact behavior\n\
-      \032           is described in the cross-platform section of the manual.\n\
-      \032         + It should be possible to synchronize with Windows shares,\n\
-      \032           e.g., //host/drive/path.\n\
-      \032         + Workarounds to the bug in syncing root directories in\n\
-      \032           Windows. The most difficult thing to fix is an ocaml bug:\n\
-      \032           Unix.opendir fails on c: in some versions of Windows.\n\
-      \032    * Improvements to the GTK user interface (the Tk interface is no\n\
-      \032      longer being maintained):\n\
-      \032         + The UI now displays actions differently (in blue) when they\n\
-      \032           have been explicitly changed by the user from Unison's\n\
-      \032           default recommendation.\n\
-      \032         + More colorful appearance.\n\
-      \032         + The initial profile selection window works better.\n\
-      \032         + If any transfers failed, a message to this effect is\n\
-      \032           displayed along with 'Synchronization complete' at the end of\n\
-      \032           the transfer phase (in case they may have scrolled off the\n\
-      \032           top).\n\
-      \032         + Added a global progress meter, displaying the percentage of\n\
-      \032           total bytes that have been transferred so far.\n\
-      \032    * Improvements to the text user interface:\n\
-      \032         + The file details will be displayed automatically when a\n\
-      \032           conflict is been detected.\n\
-      \032         + when a warning is generated (e.g. for a temporary file left\n\
-      \032           over from a previous run of unison) Unison will no longer\n\
-      \032           wait for a response if it is running in -batch mode.\n\
-      \032         + The UI now displays a short list of possible inputs each time\n\
-      \032           it waits for user interaction.\n\
-      \032         + The UI now quits immediately (rather than looping back and\n\
-      \032           starting the interaction again) if the user presses 'q' when\n\
-      \032           asked whether to propagate changes.\n\
-      \032         + Pressing 'g' in the text user interface will proceed\n\
-      \032           immediately with propagating updates, without asking any more\n\
-      \032           questions.\n\
-      \032    * Documentation and installation changes:\n\
-      \032         + The manual now includes a FAQ, plus sections on common\n\
-      \032           problems and on tricks contributed by users.\n\
-      \032         + Both the download page and the download directory explicitly\n\
-      \032           say what are the current stable and beta-test version\n\
-      \032           numbers.\n\
-      \032         + The OCaml sources for the up-to-the-minute developers'\n\
-      \032           version (not guaranteed to be stable, or even to compile, at\n\
-      \032           any given time!) are now available from the download page.\n\
-      \032         + Added a subsection to the manual describing cross-platform\n\
-      \032           issues (case conflicts, illegal filenames)\n\
-      \032    * Many small bug fixes and random improvements.\n\
-      \n\
-      \032  Changes since 2.3.1:\n\
-      \032    * Several bug fixes. The most important is a bug in the rsync module\n\
-      \032      that would occasionally cause change propagation to fail with a\n\
-      \032      'rename' error.\n\
-      \n\
-      \032  Changes since 2.2:\n\
-      \032    * The multi-threaded transport system is now disabled by default.\n\
-      \032      (It is not stable enough yet.)\n\
-      \032    * Various bug fixes.\n\
-      \032    * A new experimental feature:\n\
-      \032      The final component of a -path argument may now be the wildcard\n\
-      \032      specifier *. When Unison sees such a path, it expands this path on\n\
-      \032      the client into into the corresponding list of paths by listing\n\
-      \032      the contents of that directory.\n\
-      \032      Note that if you use wildcard paths from the command line, you\n\
-      \032      will probably need to use quotes or a backslash to prevent the *\n\
-      \032      from being interpreted by your shell.\n\
-      \032      If both roots are local, the contents of the first one will be\n\
-      \032      used for expanding wildcard paths. (Nb: this is the first one\n\
-      \032      after the canonization step - i.e., the one that is listed first\n\
-      \032      in the user interface - not the one listed first on the command\n\
-      \032      line or in the preferences file.)\n\
-      \n\
-      \032  Changes since 2.1:\n\
-      \032    * The transport subsystem now includes an implementation by Sylvain\n\
-      \032      Gommier and Norman Ramsey of Tridgell and Mackerras's rsync\n\
-      \032      protocol. This protocol achieves much faster transfers when only a\n\
-      \032      small part of a large file has been changed by sending just diffs.\n\
-      \032      This feature is mainly helpful for transfers over slow links--on\n\
-      \032      fast local area networks it can actually degrade performance--so\n\
-      \032      we have left it off by default. Start unison with the -rsync\n\
-      \032      option (or put rsync=true in your preferences file) to turn it on.\n\
-      \032    * \"Progress bars\" are now diplayed during remote file transfers,\n\
-      \032      showing what percentage of each file has been transferred so far.\n\
-      \032    * The version numbering scheme has changed. New releases will now be\n\
-      \032      have numbers like 2.2.30, where the second component is\n\
-      \032      incremented on every significant public release and the third\n\
-      \032      component is the \"patch level.\"\n\
-      \032    * Miscellaneous improvements to the GTK-based user interface.\n\
-      \032    * The manual is now available in PDF format.\n\
-      \032    * We are experimenting with using a multi-threaded transport\n\
-      \032      subsystem to transfer several files at the same time, making much\n\
-      \032      more effective use of available network bandwidth. This feature is\n\
-      \032      not completely stable yet, so by default it is disabled in the\n\
-      \032      release version of Unison.\n\
-      \032      If you want to play with the multi-threaded version, you'll need\n\
-      \032      to recompile Unison from sources (as described in the\n\
-      \032      documentation), setting the THREADS flag in Makefile.OCaml to\n\
-      \032      true. Make sure that your OCaml compiler has been installed with\n\
-      \032      the -with-pthreads configuration option. (You can verify this by\n\
-      \032      checking whether the file threads/threads.cma in the OCaml\n\
-      \032      standard library directory contains the string -lpthread near the\n\
-      \032      end.)\n\
-      \n\
-      \032  Changes since 1.292:\n\
-      \032    * Reduced memory footprint (this is especially important during the\n\
-      \032      first run of unison, where it has to gather information about all\n\
-      \032      the files in both repositories).\n\
-      \032    * Fixed a bug that would cause the socket server under NT to fail\n\
-      \032      after the client exits.\n\
-      \032    * Added a SHIFT modifier to the Ignore menu shortcut keys in GTK\n\
-      \032      interface (to avoid hitting them accidentally).\n\
-      \n\
-      \032  Changes since 1.231:\n\
-      \032    * Tunneling over ssh is now supported in the Windows version. See\n\
-      \032      the installation section of the manual for detailed instructions.\n\
-      \032    * The transport subsystem now includes an implementation of the\n\
-      \032      rsync protocol, built by Sylvain Gommier and Norman Ramsey. This\n\
-      \032      protocol achieves much faster transfers when only a small part of\n\
-      \032      a large file has been changed by sending just diffs. The rsync\n\
-      \032      feature is off by default in the current version. Use the -rsync\n\
-      \032      switch to turn it on. (Nb. We still have a lot of tuning to do:\n\
-      \032      you may not notice much speedup yet.)\n\
-      \032    * We're experimenting with a multi-threaded transport subsystem,\n\
-      \032      written by Jerome Vouillon. The downloadable binaries are still\n\
-      \032      single-threaded: if you want to try the multi-threaded version,\n\
-      \032      you'll need to recompile from sources. (Say make THREADS=true.)\n\
-      \032      Native thread support from the compiler is required. Use the\n\
-      \032      option -threads N to select the maximal number of concurrent\n\
-      \032      threads (default is 5). Multi-threaded and single-threaded\n\
-      \032      clients/servers can interoperate.\n\
-      \032    * A new GTK-based user interface is now available, thanks to Jacques\n\
-      \032      Garrigue. The Tk user interface still works, but we'll be shifting\n\
-      \032      development effort to the GTK interface from now on.\n\
-      \032    * OCaml 3.00 is now required for compiling Unison from sources. The\n\
-      \032      modules uitk and myfileselect have been changed to use labltk\n\
-      \032      instead of camltk. To compile the Tk interface in Windows, you\n\
-      \032      must have ocaml-3.00 and tk8.3. When installing tk8.3, put it in\n\
-      \032      c:\\Tcl rather than the suggested c:\\Program Files\\Tcl, and be sure\n\
-      \032      to install the headers and libraries (which are not installed by\n\
-      \032      default).\n\
-      \032    * Added a new -addversionno switch, which causes unison to use\n\
-      \032      unison-<currentversionnumber> instead of just unison as the remote\n\
-      \032      server command. This allows multiple versions of unison to coexist\n\
-      \032      conveniently on the same server: whichever version is run on the\n\
-      \032      client, the same version will be selected on the server.\n\
-      \n\
-      \032  Changes since 1.219:\n\
-      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
-      \032      synchronize your replicas before upgrading, to avoid spurious\n\
-      \032      conflicts. The first sync after upgrading will be slow.\n\
-      \032    * This version fixes several annoying bugs, including:\n\
-      \032         + Some cases where propagation of file permissions was not\n\
-      \032           working.\n\
-      \032         + umask is now ignored when creating directories\n\
-      \032         + directories are create writable, so that a read-only\n\
-      \032           directory and its contents can be propagated.\n\
-      \032         + Handling of warnings generated by the server.\n\
-      \032         + Synchronizing a path whose parent is not a directory on both\n\
-      \032           sides is now flagged as erroneous.\n\
-      \032         + Fixed some bugs related to symnbolic links and nonexistant\n\
-      \032           roots.\n\
-      \032              o When a change (deletion or new contents) is propagated\n\
-      \032                onto a 'follow'ed symlink, the file pointed to by the\n\
-      \032                link is now changed. (We used to change the link itself,\n\
-      \032                which doesn't fit our assertion that 'follow' means the\n\
-      \032                link is completely invisible)\n\
-      \032              o When one root did not exist, propagating the other root\n\
-      \032                on top of it used to fail, becuase unison could not\n\
-      \032                calculate the working directory into which to write\n\
-      \032                changes. This should be fixed.\n\
-      \032    * A human-readable timestamp has been added to Unison's archive\n\
-      \032      files.\n\
-      \032    * The semantics of Path and Name regular expressions now correspond\n\
-      \032      better.\n\
-      \032    * Some minor improvements to the text UI (e.g. a command for going\n\
-      \032      back to previous items)\n\
-      \032    * The organization of the export directory has changed -- should be\n\
-      \032      easier to find / download things now.\n\
-      \n\
-      \032  Changes since 1.200:\n\
-      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
-      \032      synchronize your replicas before upgrading, to avoid spurious\n\
-      \032      conflicts. The first sync after upgrading will be slow.\n\
-      \032    * This version has not been tested extensively on Windows.\n\
-      \032    * Major internal changes designed to make unison safer to run at the\n\
-      \032      same time as the replicas are being changed by the user.\n\
-      \032    * Internal performance improvements.\n\
-      \n\
-      \032  Changes since 1.190:\n\
-      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
-      \032      synchronize your replicas before upgrading, to avoid spurious\n\
-      \032      conflicts. The first sync after upgrading will be slow.\n\
-      \032    * A number of internal functions have been changed to reduce the\n\
-      \032      amount of memory allocation, especially during the first\n\
-      \032      synchronization. This should help power users with very big\n\
-      \032      replicas.\n\
-      \032    * Reimplementation of low-level remote procedure call stuff, in\n\
-      \032      preparation for adding rsync-like smart file transfer in a later\n\
-      \032      release.\n\
-      \032    * Miscellaneous bug fixes.\n\
-      \n\
-      \032  Changes since 1.180:\n\
-      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
-      \032      synchronize your replicas before upgrading, to avoid spurious\n\
-      \032      conflicts. The first sync after upgrading will be slow.\n\
-      \032    * Fixed some small bugs in the interpretation of ignore patterns.\n\
-      \032    * Fixed some problems that were preventing the Windows version from\n\
-      \032      working correctly when click-started.\n\
-      \032    * Fixes to treatment of file permissions under Windows, which were\n\
-      \032      causing spurious reports of different permissions when\n\
-      \032      synchronizing between windows and unix systems.\n\
-      \032    * Fixed one more non-tail-recursive list processing function, which\n\
-      \032      was causing stack overflows when synchronizing very large\n\
-      \032      replicas.\n\
-      \n\
-      \032  Changes since 1.169:\n\
-      \032    * The text user interface now provides commands for ignoring files.\n\
-      \032    * We found and fixed some more non-tail-recursive list processing\n\
-      \032      functions. Some power users have reported success with very large\n\
-      \032      replicas.\n\
-      \032    * INCOMPATIBLE CHANGE: Files ending in .tmp are no longer ignored\n\
-      \032      automatically. If you want to ignore such files, put an\n\
-      \032      appropriate ignore pattern in your profile.\n\
-      \032    * INCOMPATIBLE CHANGE: The syntax of ignore and follow patterns has\n\
-      \032      changed. Instead of putting a line of the form\n\
-      \032                ignore = <regexp>\n\
-      \032      in your profile (.unison/default.prf), you should put:\n\
-      \032                ignore = Regexp <regexp>\n\
-      \032      Moreover, two other styles of pattern are also recognized:\n\
-      \032                ignore = Name <name>\n\
-      \032      matches any path in which one component matches <name>, while\n\
-      \032                ignore = Path <path>\n\
-      \032      matches exactly the path <path>.\n\
-      \032      Standard \"globbing\" conventions can be used in <name> and <path>:\n\
-      \032         + a ? matches any single character except /\n\
-      \032         + a * matches any sequence of characters not including /\n\
-      \032         + [xyz] matches any character from the set {x, y, z }\n\
-      \032         + {a,bb,ccc} matches any one of a, bb, or ccc.\n\
-      \032      See the user manual for some examples.\n\
-      \n\
-      \032  Changes since 1.146:\n\
-      \032    * Some users were reporting stack overflows when synchronizing huge\n\
-      \032      directories. We found and fixed some non-tail-recursive list\n\
-      \032      processing functions, which we hope will solve the problem. Please\n\
-      \032      give it a try and let us know.\n\
-      \032    * Major additions to the documentation.\n\
-      \n\
-      \032  Changes since 1.142:\n\
-      \032    * Major internal tidying and many small bugfixes.\n\
-      \032    * Major additions to the user manual.\n\
-      \032    * Unison can now be started with no arguments - it will prompt\n\
-      \032      automatically for the name of a profile file containing the roots\n\
-      \032      to be synchronized. This makes it possible to start the graphical\n\
-      \032      UI from a desktop icon.\n\
-      \032    * Fixed a small bug where the text UI on NT was raising a 'no such\n\
-      \032      signal' exception.\n\
-      \n\
-      \032  Changes since 1.139:\n\
-      \032    * The precompiled windows binary in the last release was compiled\n\
-      \032      with an old OCaml compiler, causing propagation of permissions not\n\
-      \032      to work (and perhaps leading to some other strange behaviors we've\n\
-      \032      heard reports about). This has been corrected. If you're using\n\
-      \032      precompiled binaries on Windows, please upgrade.\n\
-      \032    * Added a -debug command line flag, which controls debugging of\n\
-      \032      various modules. Say -debug XXX to enable debug tracing for module\n\
-      \032      XXX, or -debug all to turn on absolutely everything.\n\
-      \032    * Fixed a small bug where the text UI on NT was raising a 'no such\n\
-      \032      signal' exception.\n\
-      \n\
-      \032  Changes since 1.111:\n\
-      \032    * INCOMPATIBLE CHANGE: The names and formats of the preference files\n\
-      \032      in the .unison directory have changed. In particular:\n\
-      \032         + the file \"prefs\" should be renamed to default.prf\n\
-      \032         + the contents of the file \"ignore\" should be merged into\n\
-      \032           default.prf. Each line of the form REGEXP in ignore should\n\
-      \032           become a line of the form ignore = REGEXP in default.prf.\n\
-      \032    * Unison now handles permission bits and symbolic links. See the\n\
-      \032      manual for details.\n\
-      \032    * You can now have different preference files in your .unison\n\
-      \032      directory. If you start unison like this\n\
-      \032            unison profilename\n\
-      \032      (i.e. with just one \"anonymous\" command-line argument), then the\n\
-      \032      file ~/.unison/profilename.prf will be loaded instead of\n\
-      \032      default.prf.\n\
-      \032    * Some improvements to terminal handling in the text user interface\n\
-      \032    * Added a switch -killServer that terminates the remote server\n\
-      \032      process when the unison client is shutting down, even when using\n\
-      \032      sockets for communication. (By default, a remote server created\n\
-      \032      using ssh/rsh is terminated automatically, while a socket server\n\
-      \032      is left running.)\n\
-      \032    * When started in 'socket server' mode, unison prints 'server\n\
-      \032      started' on stderr when it is ready to accept connections. (This\n\
-      \032      may be useful for scripts that want to tell when a socket-mode\n\
-      \032      server has finished initalization.)\n\
-      \032    * We now make a nightly mirror of our current internal development\n\
-      \032      tree, in case anyone wants an up-to-the-minute version to hack\n\
-      \032      around with.\n\
-      \032    * Added a file CONTRIB with some suggestions for how to help us make\n\
-      \032      Unison better.\n\
-      \n\
-      "))
-::
-    ("", ("Junk", 
-     "Junk\n\
-      \032    _________________________________________________________________\n\
-      \n\
-      \032    This document was translated from L^AT[E]X by [2]H^EV^EA.\n\
-      \n\
-      References\n\
-      \n\
-      \032  1. file://localhost/Users/bcpierce/current/unison/trunk/doc/temp.html#ssh-win\n\
-      \032  2. http://pauillac.inria.fr/~maranget/hevea/index.html\n\
-      "))
-::
-    [];;
-

Copied: branches/2.40/src/strings.ml (from rev 411, trunk/src/strings.ml)
===================================================================
--- branches/2.40/src/strings.ml	                        (rev 0)
+++ branches/2.40/src/strings.ml	2010-02-20 23:23:17 UTC (rev 412)
@@ -0,0 +1,4322 @@
+(* DO NOT MODIFY.
+   This file has been automatically generated, see docs.ml. *)
+
+let docs =
+    ("about", ("About Unison", 
+     "Unison File Synchronizer\n\
+      Version 2.40.1\n\
+      \n\
+      "))
+::
+    ("", ("Overview", 
+     "Overview\n\
+      \n\
+      \032  Unison is a file-synchronization tool for Unix and Windows. It allows\n\
+      \032  two replicas of a collection of files and directories to be stored on\n\
+      \032  different hosts (or different disks on the same host), modified\n\
+      \032  separately, and then brought up to date by propagating the changes in\n\
+      \032  each replica to the other.\n\
+      \n\
+      \032  Unison shares a number of features with tools such as configuration\n\
+      \032  management packages (CVS (http://www.cyclic.com/), PRCS\n\
+      \032  (http://www.XCF.Berkeley.EDU/~jmacd/prcs.html), etc.), distributed\n\
+      \032  filesystems (Coda (http://www.coda.cs.cmu.edu/), etc.),\n\
+      \032  uni-directional mirroring utilities (rsync\n\
+      \032  (http://samba.anu.edu.au/rsync/), etc.), and other synchronizers\n\
+      \032  (Intellisync (http://www.pumatech.com), Reconcile\n\
+      \032  (http://www.merl.com/reports/TR99-14/), etc). However, there are\n\
+      \032  several points where it differs:\n\
+      \032    * Unison runs on both Windows (95, 98, NT, 2k, and XP) and Unix\n\
+      \032      (OSX, Solaris, Linux, etc.) systems. Moreover, Unison works across\n\
+      \032      platforms, allowing you to synchronize a Windows laptop with a\n\
+      \032      Unix server, for example.\n\
+      \032    * Unlike a distributed filesystem, Unison is a user-level program:\n\
+      \032      there is no need to modify the kernel or to have superuser\n\
+      \032      privileges on either host.\n\
+      \032    * Unlike simple mirroring or backup utilities, Unison can deal with\n\
+      \032      updates to both replicas of a distributed directory structure.\n\
+      \032      Updates that do not conflict are propagated automatically.\n\
+      \032      Conflicting updates are detected and displayed.\n\
+      \032    * Unison works between any pair of machines connected to the\n\
+      \032      internet, communicating over either a direct socket link or\n\
+      \032      tunneling over an encrypted ssh connection. It is careful with\n\
+      \032      network bandwidth, and runs well over slow links such as PPP\n\
+      \032      connections. Transfers of small updates to large files are\n\
+      \032      optimized using a compression protocol similar to rsync.\n\
+      \032    * Unison has a clear and precise specification, described below.\n\
+      \032    * Unison is resilient to failure. It is careful to leave the\n\
+      \032      replicas and its own private structures in a sensible state at all\n\
+      \032      times, even in case of abnormal termination or communication\n\
+      \032      failures.\n\
+      \032    * Unison is free; full source code is available under the GNU Public\n\
+      \032      License.\n\
+      \n\
+      "))
+::
+    ("", ("Preface", 
+     "Preface\n\
+      \n\
+      "))
+::
+    ("people", ("People", 
+     "People\n\
+      \n\
+      \032  Benjamin Pierce (http://www.cis.upenn.edu/~bcpierce/) leads the Unison\n\
+      \032  project. The current version of Unison was designed and implemented by\n\
+      \032  Trevor Jim (http://www.research.att.com/~trevor/), Benjamin Pierce\n\
+      \032  (http://www.cis.upenn.edu/~bcpierce/), and J\233r\244me Vouillon\n\
+      \032  (http://www.pps.jussieu.fr/~vouillon/), with Alan Schmitt\n\
+      \032  (http://alan.petitepomme.net/), Malo Denielou, Zhe Yang\n\
+      \032  (http://www.brics.dk/~zheyang/), Sylvain Gommier, and Matthieu Goulay.\n\
+      \032  The Mac user interface was started by Trevor Jim and enormously\n\
+      \032  improved by Ben Willmore. Our implementation of the rsync\n\
+      \032  (http://samba.org/rsync/) protocol was built by Norman Ramsey\n\
+      \032  (http://www.eecs.harvard.edu/~nr/) and Sylvain Gommier. It is is based\n\
+      \032  on Andrew Tridgell (http://samba.anu.edu.au/~tridge/)'s thesis work\n\
+      \032  (http://samba.anu.edu.au/~tridge/phd_thesis.pdf) and inspired by his\n\
+      \032  rsync (http://samba.org/rsync/) utility. The mirroring and merging\n\
+      \032  functionality was implemented by Sylvain Roy, improved by Malo\n\
+      \032  Denielou, and improved yet further by St\233phane Lescuyer. Jacques\n\
+      \032  Garrigue (http://wwwfun.kurims.kyoto-u.ac.jp/~garrigue/) contributed\n\
+      \032  the original Gtk version of the user interface; the Gtk2 version was\n\
+      \032  built by Stephen Tse. Sundar Balasubramaniam helped build a prototype\n\
+      \032  implementation of an earlier synchronizer in Java. Insik Shin\n\
+      \032  (http://www.cis.upenn.edu/~ishin/) and Insup Lee\n\
+      \032  (http://www.cis.upenn.edu/~lee/) contributed design ideas to this\n\
+      \032  implementation. Cedric Fournet\n\
+      \032  (http://research.microsoft.com/~fournet/) contributed to an even\n\
+      \032  earlier prototype.\n\
+      \n\
+      "))
+::
+    ("lists", ("Mailing Lists and Bug Reporting", 
+     "Mailing Lists and Bug Reporting\n\
+      \n\
+      Mailing Lists:\n\
+      \n\
+      \032  Moderated mailing lists are available for bug reporting, announcements\n\
+      \032  of new versions, discussions among users, and discussions among\n\
+      \032  developers. See\n\
+      \n\
+      \032    http://www.cis.upenn.edu/~bcpierce/unison/lists.html\n\
+      \n\
+      \032  for more information.\n\
+      \n\
+      "))
+::
+    ("status", ("Development Status", 
+     "Development Status\n\
+      \n\
+      \032  Unison is no longer under active development as a research project.\n\
+      \032  (Our research efforts are now focused on a follow-on project called\n\
+      \032  Harmony, described at http://www.cis.upenn.edu/~bcpierce/harmony.) At\n\
+      \032  this point, there is no one whose job it is to maintain Unison, fix\n\
+      \032  bugs, or answer questions.\n\
+      \n\
+      \032  However, the original developers are all still using Unison daily. It\n\
+      \032  will continue to be maintained and supported for the foreseeable\n\
+      \032  future, and we will occasionally release new versions with bug fixes,\n\
+      \032  small improvements, and contributed patches.\n\
+      \n\
+      \032  Reports of bugs affecting correctness or safety are of interest to\n\
+      \032  many people and will generally get high priority. Other bug reports\n\
+      \032  will be looked at as time permits. Bugs should be reported to the\n\
+      \032  users list at unison-users at yahoogroups.com\n\
+      \032  (mailto:unison-users at yahoogroups.com).\n\
+      \n\
+      \032  Feature requests are welcome, but will probably just be added to the\n\
+      \032  ever-growing todo list. They should also be sent to\n\
+      \032  unison-users at yahoogroups.com (mailto:unison-users at yahoogroups.com).\n\
+      \n\
+      \032  Patches are even more welcome. They should be sent to\n\
+      \032  unison-hackers at lists.seas.upenn.edu\n\
+      \032  (mailto:unison-hackers at lists.seas.upenn.edu). (Since safety and\n\
+      \032  robustness are Unison's most important properties, patches will be\n\
+      \032  held to high standards of clear design and clean coding.) If you want\n\
+      \032  to contribute to Unison, start by downloading the developer tarball\n\
+      \032  from the download page. For some details on how the code is organized,\n\
+      \032  etc., see the file CONTRIB.\n\
+      \n\
+      "))
+::
+    ("copying", ("Copying", 
+     "Copying\n\
+      \n\
+      \032  This file is part of Unison.\n\
+      \n\
+      \032  Unison is free software: you can redistribute it and/or modify it\n\
+      \032  under the terms of the GNU General Public License as published by the\n\
+      \032  Free Software Foundation, either version 3 of the License, or (at your\n\
+      \032  option) any later version.\n\
+      \n\
+      \032  Unison is distributed in the hope that it will be useful, but WITHOUT\n\
+      \032  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n\
+      \032  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\n\
+      \032  for more details.\n\
+      \n\
+      \032  The GNU Public License can be found at http://www.gnu.org/licenses. A\n\
+      \032  copy is also included in the Unison source distribution in the file\n\
+      \032  COPYING.\n\
+      \n\
+      "))
+::
+    ("ack", ("Acknowledgements", 
+     "Acknowledgements\n\
+      \n\
+      \032  Work on Unison has been supported by the National Science Foundation\n\
+      \032  under grants CCR-9701826 and ITR-0113226, Principles and Practice of\n\
+      \032  Synchronization, and by University of Pennsylvania's Institute for\n\
+      \032  Research in Cognitive Science (IRCS).\n\
+      \n\
+      "))
+::
+    ("install", ("Installation", 
+     "Installation\n\
+      \n\
+      \032  Unison is designed to be easy to install. The following sequence of\n\
+      \032  steps should get you a fully working installation in a few minutes. If\n\
+      \032  you run into trouble, you may find the suggestions on the Frequently\n\
+      \032  Asked Questions page\n\
+      \032  (http://www.cis.upenn.edu/~bcpierce/unison/faq.html) helpful.\n\
+      \032  Pre-built binaries are available for a variety of platforms.\n\
+      \n\
+      \032  Unison can be used with either of two user interfaces:\n\
+      \032   1. a simple textual interface, suitable for dumb terminals (and\n\
+      \032      running from scripts), and\n\
+      \032   2. a more sophisticated grapical interface, based on Gtk2.\n\
+      \n\
+      \032  You will need to install a copy of Unison on every machine that you\n\
+      \032  want to synchronize. However, you only need the version with a\n\
+      \032  graphical user interface (if you want a GUI at all) on the machine\n\
+      \032  where you're actually going to display the interface (the CLIENT\n\
+      \032  machine). Other machines that you synchronize with can get along just\n\
+      \032  fine with the textual version.\n\
+      \n\
+      Downloading Unison\n\
+      \n\
+      \032  The Unison download site lives under\n\
+      \032  http://www.cis.upenn.edu/~bcpierce/unison.\n\
+      \n\
+      \032  If a pre-built binary of Unison is available for the client machine's\n\
+      \032  architecture, just download it and put it somewhere in your search\n\
+      \032  path (if you're going to invoke it from the command line) or on your\n\
+      \032  desktop (if you'll be click-starting it).\n\
+      \n\
+      \032  The executable file for the graphical version (with a name including\n\
+      \032  gtkui) actually provides both interfaces: the graphical one appears by\n\
+      \032  default, while the textual interface can be selected by including -ui\n\
+      \032  text on the command line. The textui executable provides just the\n\
+      \032  textual interface.\n\
+      \n\
+      \032  If you don't see a pre-built executable for your architecture, you'll\n\
+      \032  need to build it yourself. See the section \"Building Unison\" . There\n\
+      \032  are also a small number of contributed ports to other architectures\n\
+      \032  that are not maintained by us. See the Contributed Ports page\n\
+      \032  (http://www.cis.upenn.edu/~bcpierce/unison/download.html) to check\n\
+      \032  what's available.\n\
+      \n\
+      \032  Check to make sure that what you have downloaded is really executable.\n\
+      \032  Either click-start it, or type \"unison -version\" at the command line.\n\
+      \n\
+      \032  Unison can be used in three different modes: with different\n\
+      \032  directories on a single machine, with a remote machine over a direct\n\
+      \032  socket connection, or with a remote machine using ssh for\n\
+      \032  authentication and secure transfer. If you intend to use the last\n\
+      \032  option, you may need to install ssh; see the section \"Installing Ssh\"\n\
+      \032  .\n\
+      \n\
+      Running Unison\n\
+      \n\
+      \032  Once you've got Unison installed on at least one system, read the\n\
+      \032  section \"Tutorial\" of the user manual (or type \"unison -doc tutorial\")\n\
+      \032  for instructions on how to get started.\n\
+      \n\
+      Upgrading\n\
+      \n\
+      \032  Upgrading to a new version of Unison is as simple as throwing away the\n\
+      \032  old binary and installing the new one.\n\
+      \n\
+      \032  Before upgrading, it is a good idea to run the old version one last\n\
+      \032  time, to make sure all your replicas are completely synchronized. A\n\
+      \032  new version of Unison will sometimes introduce a different format for\n\
+      \032  the archive files used to remember information about the previous\n\
+      \032  state of the replicas. In this case, the old archive will be ignored\n\
+      \032  (not deleted -- if you roll back to the previous version of Unison,\n\
+      \032  you will find the old archives intact), which means that any\n\
+      \032  differences between the replicas will show up as conflicts that need\n\
+      \032  to be resolved manually.\n\
+      \n\
+      Building Unison from Scratch\n\
+      \n\
+      \032  If a pre-built image is not available, you will need to compile it\n\
+      \032  from scratch; the sources are available from the same place as the\n\
+      \032  binaries.\n\
+      \n\
+      \032  In principle, Unison should work on any platform to which OCaml has\n\
+      \032  been ported and on which the Unix module is fully implemented. It has\n\
+      \032  been tested on many flavors of Windows (98, NT, 2000, XP) and Unix (OS\n\
+      \032  X, Solaris, Linux, FreeBSD), and on both 32- and 64-bit architectures.\n\
+      \n\
+      Unix\n\
+      \n\
+      \032  You'll need the Objective Caml compiler (version 3.07 or later), which\n\
+      \032  is available from http://caml.inria.fr. Building and installing OCaml\n\
+      \032  on Unix systems is very straightforward; just follow the instructions\n\
+      \032  in the distribution. You'll probably want to build the native-code\n\
+      \032  compiler in addition to the bytecode compiler, as Unison runs much\n\
+      \032  faster when compiled to native code, but this is not absolutely\n\
+      \032  necessary. (Quick start: on many systems, the following sequence of\n\
+      \032  commands will get you a working and installed compiler: first do make\n\
+      \032  world opt, then su to root and do make install.)\n\
+      \n\
+      \032  You'll also need the GNU make utility, standard on many Unix systems.\n\
+      \032  (Type \"make -version\" to check that you've got the GNU version.)\n\
+      \n\
+      \032  Once you've got OCaml installed, grab a copy of the Unison sources,\n\
+      \032  unzip and untar them, change to the new \"unison\" directory, and type\n\
+      \032  \"make UISTYLE=text.\" The result should be an executable file called\n\
+      \032  \"unison\". Type \"./unison\" to make sure the program is executable. You\n\
+      \032  should get back a usage message.\n\
+      \n\
+      \032  If you want to build the graphical user interface, you will need to\n\
+      \032  install two additional things:\n\
+      \032    * The Gtk2 libraries. These areavailable from http://www.gtk.org and\n\
+      \032      are standard on many Unix installations.\n\
+      \032    * The lablgtk2 OCaml library. Grab the developers' tarball from\n\
+      \n\
+      \032    http://wwwfun.kurims.kyoto-u.ac.jp/soft/olabl/lablgtk.html,\n\
+      \032      untar it, and follow the instructions to build and install it.\n\
+      \032      (Quick start: make configure, then make, then make opt, then su\n\
+      \032      and make install.)\n\
+      \n\
+      \032  Now build unison. If your search paths are set up correctly, simply\n\
+      \032  typing make again should build a unison executable with a Gtk2\n\
+      \032  graphical interface. (In previous releases of Unison, it was necessary\n\
+      \032  to add UISTYLE=gtk2 to the 'make' command above. This requirement has\n\
+      \032  been removed: the makefile should detect automatically when lablgtk2\n\
+      \032  is present and set this flag automatically.)\n\
+      \n\
+      \032  Put the unison executable somewhere in your search path, either by\n\
+      \032  adding the Unison directory to your PATH variable or by copying the\n\
+      \032  executable to some standard directory where executables are stored.\n\
+      \n\
+      Windows\n\
+      \n\
+      \032  Although the binary distribution should work on any version of\n\
+      \032  Windows, some people may want to build Unison from scratch on those\n\
+      \032  systems too.\n\
+      \n\
+      Bytecode version:\n\
+      \n\
+      \032  The simpler but slower compilation option to build a Unison executable\n\
+      \032  is to build a bytecode version. You need first install Windows version\n\
+      \032  of the OCaml compiler (version 3.07 or later, available from\n\
+      \032  http://caml.inria.fr). Then grab a copy of Unison sources and type\n\
+      \032      make NATIVE=false\n\
+      \n\
+      \032  to compile the bytecode. The result should be an executable file\n\
+      \032  called unison.exe.\n\
+      \n\
+      Native version:\n\
+      \n\
+      \032  Building a more efficient, native version of Unison on Windows\n\
+      \032  requires a little more work. See the file INSTALL.win32 in the source\n\
+      \032  code distribution.\n\
+      \n\
+      Installation Options\n\
+      \n\
+      \032  The Makefile in the distribution includes several switches that can be\n\
+      \032  used to control how Unison is built. Here are the most useful ones:\n\
+      \032    * Building with NATIVE=true uses the native-code OCaml compiler,\n\
+      \032      yielding an executable that will run quite a bit faster. We use\n\
+      \032      this for building distribution versions.\n\
+      \032    * Building with make DEBUGGING=true generates debugging symbols.\n\
+      \032    * Building with make STATIC=true generates a (mostly) statically\n\
+      \032      linked executable. We use this for building distribution versions,\n\
+      \032      for portability.\n\
+      \n\
+      "))
+::
+    ("tutorial", ("Tutorial", 
+     "Tutorial\n\
+      \n\
+      Preliminaries\n\
+      \n\
+      \032  Unison can be used with either of two user interfaces:\n\
+      \032   1. a straightforward textual interface and\n\
+      \032   2. a more sophisticated graphical interface\n\
+      \n\
+      \032  The textual interface is more convenient for running from scripts and\n\
+      \032  works on dumb terminals; the graphical interface is better for most\n\
+      \032  interactive use. For this tutorial, you can use either. If you are\n\
+      \032  running Unison from the command line, just typing unison will select\n\
+      \032  either the text or the graphical interface, depending on which has\n\
+      \032  been selected as default when the executable you are running was\n\
+      \032  built. You can force the text interface even if graphical is the\n\
+      \032  default by adding -ui text. The other command-line arguments to both\n\
+      \032  versions are identical.\n\
+      \n\
+      \032  The graphical version can also be run directly by clicking on its\n\
+      \032  icon, but this may require a little set-up (see the section\n\
+      \032  \"Click-starting Unison\" ). For this tutorial, we assume that you're\n\
+      \032  starting it from the command line.\n\
+      \n\
+      \032  Unison can synchronize files and directories on a single machine, or\n\
+      \032  between two machines on a network. (The same program runs on both\n\
+      \032  machines; the only difference is which one is responsible for\n\
+      \032  displaying the user interface.) If you're only interested in a\n\
+      \032  single-machine setup, then let's call that machine the CLIENT . If\n\
+      \032  you're synchronizing two machines, let's call them CLIENT and SERVER .\n\
+      \n\
+      Local Usage\n\
+      \n\
+      \032  Let's get the client machine set up first and see how to synchronize\n\
+      \032  two directories on a single machine.\n\
+      \n\
+      \032  Follow the instructions in the section \"Installation\" to either\n\
+      \032  download or build an executable version of Unison, and install it\n\
+      \032  somewhere on your search path. (If you just want to use the textual\n\
+      \032  user interface, download the appropriate textui binary. If you just\n\
+      \032  want to the graphical interface--or if you will use both interfaces\n\
+      \032  [the gtkui binary actually has both compiled in]--then download the\n\
+      \032  gtkui binary.)\n\
+      \n\
+      \032  Create a small test directory a.tmp containing a couple of files\n\
+      \032  and/or subdirectories, e.g.,\n\
+      \032      mkdir a.tmp\n\
+      \032      touch a.tmp/a a.tmp/b\n\
+      \032      mkdir a.tmp/d\n\
+      \032      touch a.tmp/d/f\n\
+      \n\
+      \032  Copy this directory to b.tmp:\n\
+      \032      cp -r a.tmp b.tmp\n\
+      \n\
+      \032  Now try synchronizing a.tmp and b.tmp. (Since they are identical,\n\
+      \032  synchronizing them won't propagate any changes, but Unison will\n\
+      \032  remember the current state of both directories so that it will be able\n\
+      \032  to tell next time what has changed.) Type:\n\
+      \032      unison a.tmp b.tmp\n\
+      \n\
+      \032  (You may need to add -ui text, depending how your unison binary was\n\
+      \032  built.)\n\
+      \n\
+      \032  Textual Interface:\n\
+      \032    * You should see a message notifying you that all the files are\n\
+      \032      actually equal and then get returned to the command line.\n\
+      \n\
+      \032  Graphical Interface:\n\
+      \032    * You should get a big empty window with a message at the bottom\n\
+      \032      notifying you that all files are identical. Choose the Exit item\n\
+      \032      from the File menu to get back to the command line.\n\
+      \n\
+      \032  Next, make some changes in a.tmp and/or b.tmp. For example:\n\
+      \032       rm a.tmp/a\n\
+      \032       echo \"Hello\" > a.tmp/b\n\
+      \032       echo \"Hello\" > b.tmp/b\n\
+      \032       date > b.tmp/c\n\
+      \032       echo \"Hi there\" > a.tmp/d/h\n\
+      \032       echo \"Hello there\" > b.tmp/d/h\n\
+      \n\
+      \032  Run Unison again:\n\
+      \032      unison a.tmp b.tmp\n\
+      \n\
+      \032  This time, the user interface will display only the files that have\n\
+      \032  changed. If a file has been modified in just one replica, then it will\n\
+      \032  be displayed with an arrow indicating the direction that the change\n\
+      \032  needs to be propagated. For example,\n\
+      \032                <---  new file   c  [f]\n\
+      \n\
+      \032  indicates that the file c has been modified only in the second\n\
+      \032  replica, and that the default action is therefore to propagate the new\n\
+      \032  version to the first replica. To follow Unison's recommendation, press\n\
+      \032  the \"f\" at the prompt.\n\
+      \n\
+      \032  If both replicas are modified and their contents are different, then\n\
+      \032  the changes are in conflict: <-?-> is displayed to indicate that\n\
+      \032  Unison needs guidance on which replica should override the other.\n\
+      \032    new file  <-?->  new file   d/h  []\n\
+      \n\
+      \032  By default, neither version will be propagated and both replicas will\n\
+      \032  remain as they are.\n\
+      \n\
+      \032  If both replicas have been modified but their new contents are the\n\
+      \032  same (as with the file b), then no propagation is necessary and\n\
+      \032  nothing is shown. Unison simply notes that the file is up to date.\n\
+      \n\
+      \032  These display conventions are used by both versions of the user\n\
+      \032  interface. The only difference lies in the way in which Unison's\n\
+      \032  default actions are either accepted or overridden by the user.\n\
+      \n\
+      \032  Textual Interface:\n\
+      \032    * The status of each modified file is displayed, in turn. When the\n\
+      \032      copies of a file in the two replicas are not identical, the user\n\
+      \032      interface will ask for instructions as to how to propagate the\n\
+      \032      change. If some default action is indicated (by an arrow), you can\n\
+      \032      simply press Return to go on to the next changed file. If you want\n\
+      \032      to do something different with this file, press \"<\" or \">\" to\n\
+      \032      force the change to be propagated from right to left or from left\n\
+      \032      to right, or else press \"/\" to skip this file and leave both\n\
+      \032      replicas alone. When it reaches the end of the list of modified\n\
+      \032      files, Unison will ask you one more time whether it should proceed\n\
+      \032      with the updates that have been selected.\n\
+      \032      When Unison stops to wait for input from the user, pressing \"?\"\n\
+      \032      will always give a list of possible responses and their meanings.\n\
+      \n\
+      \032  Graphical Interface:\n\
+      \032    * The main window shows all the files that have been modified in\n\
+      \032      either a.tmp or b.tmp. To override a default action (or to select\n\
+      \032      an action in the case when there is no default), first select the\n\
+      \032      file, either by clicking on its name or by using the up- and\n\
+      \032      down-arrow keys. Then press either the left-arrow or \"<\" key (to\n\
+      \032      cause the version in b.tmp to propagate to a.tmp) or the\n\
+      \032      right-arrow or \">\" key (which makes the a.tmp version override\n\
+      \032      b.tmp).\n\
+      \032      Every keyboard command can also be invoked from the menus at the\n\
+      \032      top of the user interface. (Conversely, each menu item is\n\
+      \032      annotated with its keyboard equivalent, if it has one.)\n\
+      \032      When you are satisfied with the directions for the propagation of\n\
+      \032      changes as shown in the main window, click the \"Go\" button to set\n\
+      \032      them in motion. A check sign will be displayed next to each\n\
+      \032      filename when the file has been dealt with.\n\
+      \n\
+      Remote Usage\n\
+      \n\
+      \032  Next, we'll get Unison set up to synchronize replicas on two different\n\
+      \032  machines.\n\
+      \n\
+      \032  Follow the instructions in the Installation section to download or\n\
+      \032  build an executable version of Unison on the server machine, and\n\
+      \032  install it somewhere on your search path. (It doesn't matter whether\n\
+      \032  you install the textual or graphical version, since the copy of Unison\n\
+      \032  on the server doesn't need to display any user interface at all.)\n\
+      \n\
+      \032  It is important that the version of Unison installed on the server\n\
+      \032  machine is the same as the version of Unison on the client machine.\n\
+      \032  But some flexibility on the version of Unison at the client side can\n\
+      \032  be achieved by using the -addversionno option; see the section\n\
+      \032  \"Preferences\" .\n\
+      \n\
+      \032  Now there is a decision to be made. Unison provides two methods for\n\
+      \032  communicating between the client and the server:\n\
+      \032    * Remote shell method: To use this method, you must have some way of\n\
+      \032      invoking remote commands on the server from the client's command\n\
+      \032      line, using a facility such as ssh. This method is more convenient\n\
+      \032      (since there is no need to manually start a \"unison server\"\n\
+      \032      process on the server) and also more secure (especially if you use\n\
+      \032      ssh).\n\
+      \032    * Socket method: This method requires only that you can get TCP\n\
+      \032      packets from the client to the server and back. A draconian\n\
+      \032      firewall can prevent this, but otherwise it should work anywhere.\n\
+      \n\
+      \032  Decide which of these you want to try, and continue with the section\n\
+      \032  \"Remote Shell Method\" or the section \"Socket Method\" , as appropriate.\n\
+      \n\
+      Remote Shell Method\n\
+      \n\
+      \032  The standard remote shell facility on Unix systems is ssh, which\n\
+      \032  provides the same functionality as the older rsh but much better\n\
+      \032  security. Ssh is available from ftp://ftp.cs.hut.fi/pub/ssh/;\n\
+      \032  up-to-date binaries for some architectures can also be found at\n\
+      \032  ftp://ftp.faqs.org/ssh/contrib. See section [1]A.2 for installation\n\
+      \032  instructions for the Windows version.\n\
+      \n\
+      \032  Running ssh requires some coordination between the client and server\n\
+      \032  machines to establish that the client is allowed to invoke commands on\n\
+      \032  the server; please refer to the or ssh documentation for information\n\
+      \032  on how to set this up. The examples in this section use ssh, but you\n\
+      \032  can substitute rsh for ssh if you wish.\n\
+      \n\
+      \032  First, test that we can invoke Unison on the server from the client.\n\
+      \032  Typing\n\
+      \032       ssh remotehostname unison -version\n\
+      \n\
+      \032  should print the same version information as running\n\
+      \032       unison -version\n\
+      \n\
+      \032  locally on the client. If remote execution fails, then either\n\
+      \032  something is wrong with your ssh setup (e.g., \"permission denied\") or\n\
+      \032  else the search path that's being used when executing commands on the\n\
+      \032  server doesn't contain the unison executable (e.g., \"command not\n\
+      \032  found\").\n\
+      \n\
+      \032  Create a test directory a.tmp in your home directory on the client\n\
+      \032  machine.\n\
+      \n\
+      \032  Test that the local unison client can start and connect to the remote\n\
+      \032  server. Type\n\
+      \032         unison -testServer a.tmp ssh://remotehostname/a.tmp\n\
+      \n\
+      \032  Now cd to your home directory and type:\n\
+      \032         unison a.tmp ssh://remotehostname/a.tmp\n\
+      \n\
+      \032  The result should be that the entire directory a.tmp is propagated\n\
+      \032  from the client to your home directory on the server.\n\
+      \n\
+      \032  After finishing the first synchronization, change a few files and try\n\
+      \032  synchronizing again. You should see similar results as in the local\n\
+      \032  case.\n\
+      \n\
+      \032  If your user name on the server is not the same as on the client, you\n\
+      \032  need to specify it on the command line:\n\
+      \032         unison a.tmp ssh://username@remotehostname/a.tmp\n\
+      \n\
+      \032  Notes:\n\
+      \032    * If you want to put a.tmp some place other than your home directory\n\
+      \032      on the remote host, you can give an absolute path for it by adding\n\
+      \032      an extra slash between remotehostname and the beginning of the\n\
+      \032      path:\n\
+      \032         unison a.tmp ssh://remotehostname//absolute/path/to/a.tmp\n\
+      \032    * You can give an explicit path for the unison executable on the\n\
+      \032      server by using the command-line option \"-servercmd\n\
+      \032      /full/path/name/of/unison\" or adding\n\
+      \032      \"servercmd=/full/path/name/of/unison\" to your profile (see the\n\
+      \032      section \"Profile\" ). Similarly, you can specify a explicit path\n\
+      \032      for the ssh program using the \"-sshcmd\" option. Extra arguments\n\
+      \032      can be passed to ssh by setting the -sshargs preference.\n\
+      \n\
+      Socket Method\n\
+      \n\
+      \032    Warning: The socket method is insecure: not only are the texts of\n\
+      \032    your changes transmitted over the network in unprotected form, it\n\
+      \032    is also possible for anyone in the world to connect to the server\n\
+      \032    process and read out the contents of your filesystem! (Of course,\n\
+      \032    to do this they must understand the protocol that Unison uses to\n\
+      \032    communicate between client and server, but all they need for this\n\
+      \032    is a copy of the Unison sources.) The socket method is provided\n\
+      \032    only for expert users with specific needs; everyone else should use\n\
+      \032    the ssh method.\n\
+      \n\
+      \032  To run Unison over a socket connection, you must start a Unison daemon\n\
+      \032  process on the server. This process runs continuously, waiting for\n\
+      \032  connections over a given socket from client machines running Unison\n\
+      \032  and processing their requests in turn.\n\
+      \n\
+      \032  To start the daemon, type\n\
+      \032      unison -socket NNNN\n\
+      \n\
+      \032  on the server machine, where NNNN is the socket number that the daemon\n\
+      \032  should listen on for connections from clients. (NNNN can be any large\n\
+      \032  number that is not being used by some other program; if NNNN is\n\
+      \032  already in use, Unison will exit with an error message.) Note that\n\
+      \032  paths specified by the client will be interpreted relative to the\n\
+      \032  directory in which you start the server process; this behavior is\n\
+      \032  different from the ssh case, where the path is relative to your home\n\
+      \032  directory on the server.\n\
+      \n\
+      \032  Create a test directory a.tmp in your home directory on the client\n\
+      \032  machine. Now type:\n\
+      \032      unison a.tmp socket://remotehostname:NNNN/a.tmp\n\
+      \n\
+      \032  The result should be that the entire directory a.tmp is propagated\n\
+      \032  from the client to the server (a.tmp will be created on the server in\n\
+      \032  the directory that the server was started from). After finishing the\n\
+      \032  first synchronization, change a few files and try synchronizing again.\n\
+      \032  You should see similar results as in the local case.\n\
+      \n\
+      \032  Since the socket method is not used by many people, its functionality\n\
+      \032  is rather limited. For example, the server can only deal with one\n\
+      \032  client at a time.\n\
+      \n\
+      Using Unison for All Your Files\n\
+      \n\
+      \032  Once you are comfortable with the basic operation of Unison, you may\n\
+      \032  find yourself wanting to use it regularly to synchronize your commonly\n\
+      \032  used files. There are several possible ways of going about this:\n\
+      \032   1. Synchronize your whole home directory, using the Ignore facility\n\
+      \032      (see the section \"Ignore\" ) to avoid synchronizing temporary files\n\
+      \032      and things that only belong on one host.\n\
+      \032   2. Create a subdirectory called shared (or current, or whatever) in\n\
+      \032      your home directory on each host, and put all the files you want\n\
+      \032      to synchronize into this directory.\n\
+      \032   3. Create a subdirectory called shared (or current, or whatever) in\n\
+      \032      your home directory on each host, and put links to all the files\n\
+      \032      you want to synchronize into this directory. Use the follow\n\
+      \032      preference (see the section \"Symbolic Links\" ) to make Unison\n\
+      \032      treat these links as transparent.\n\
+      \032   4. Make your home directory the root of the synchronization, but tell\n\
+      \032      Unison to synchronize only some of the files and subdirectories\n\
+      \032      within it on any given run. This can be accomplished by using the\n\
+      \032      -path switch on the command line:\n\
+      \032      unison /home/username ssh://remotehost//home/username -path shared\n\
+      \032      The -path option can be used as many times as needed, to\n\
+      \032      synchronize several files or subdirectories:\n\
+      \032      unison /home/username ssh://remotehost//home/username \\\n\
+      \032         -path shared \\\n\
+      \032         -path pub \\\n\
+      \032         -path .netscape/bookmarks.html\n\
+      \032      These -path arguments can also be put in your preference file. See\n\
+      \032      the section \"Preferences\" for an example.\n\
+      \n\
+      \032  Most people find that they only need to maintain a profile (or\n\
+      \032  profiles) on one of the hosts that they synchronize, since Unison is\n\
+      \032  always initiated from this host. (For example, if you're synchronizing\n\
+      \032  a laptop with a fileserver, you'll probably always run Unison on the\n\
+      \032  laptop.) This is a bit different from the usual situation with\n\
+      \032  asymmetric mirroring programs like rdist, where the mirroring\n\
+      \032  operation typically needs to be initiated from the machine with the\n\
+      \032  most recent changes. the section \"Profile\" covers the syntax of Unison\n\
+      \032  profiles, together with some sample profiles.\n\
+      \n\
+      \032  Some tips on improving Unison's performance can be found on the\n\
+      \032  Frequently Asked Questions page\n\
+      \032  (http://www.cis.upenn.edu/~bcpierce/unison/faq.html).\n\
+      \n\
+      Using Unison to Synchronize More Than Two Machines\n\
+      \n\
+      \032  Unison is designed for synchronizing pairs of replicas. However, it is\n\
+      \032  possible to use it to keep larger groups of machines in sync by\n\
+      \032  performing multiple pairwise synchronizations.\n\
+      \n\
+      \032  If you need to do this, the most reliable way to set things up is to\n\
+      \032  organize the machines into a \"star topology,\" with one machine\n\
+      \032  designated as the \"hub\" and the rest as \"spokes,\" and with each spoke\n\
+      \032  machine synchronizing only with the hub. The big advantage of the star\n\
+      \032  topology is that it eliminates the possibility of confusing \"spurious\n\
+      \032  conflicts\" arising from the fact that a separate archive is maintained\n\
+      \032  by Unison for every pair of hosts that it synchronizes.\n\
+      \n\
+      Going Further\n\
+      \n\
+      \032  On-line documentation for the various features of Unison can be\n\
+      \032  obtained either by typing\n\
+      \032       unison -doc topics\n\
+      \n\
+      \032  at the command line, or by selecting the Help menu in the graphical\n\
+      \032  user interface. The same information is also available in a typeset\n\
+      \032  User's Manual (HTML or PostScript format) through\n\
+      \032  http://www.cis.upenn.edu/~bcpierce/unison.\n\
+      \n\
+      \032  If you use Unison regularly, you should subscribe to one of the\n\
+      \032  mailing lists, to receive announcements of new versions. See the\n\
+      \032  section \"Mailing Lists\" .\n\
+      \n\
+      "))
+::
+    ("basics", ("Basic Concepts", 
+     "Basic Concepts\n\
+      \n\
+      \032  To understand how Unison works, it is necessary to discuss a few\n\
+      \032  straightforward concepts. These concepts are developed more rigorously\n\
+      \032  and at more length in a number of papers, available at\n\
+      \032  http://www.cis.upenn.edu/~bcpierce/papers. But the informal\n\
+      \032  presentation here should be enough for most users.\n\
+      \n\
+      Roots\n\
+      \n\
+      \032  A replica's root tells Unison where to find a set of files to be\n\
+      \032  synchronized, either on the local machine or on a remote host. For\n\
+      \032  example,\n\
+      \032     relative/path/of/root\n\
+      \n\
+      \032  specifies a local root relative to the directory where Unison is\n\
+      \032  started, while\n\
+      \032     /absolute/path/of/root\n\
+      \n\
+      \032  specifies a root relative to the top of the local filesystem,\n\
+      \032  independent of where Unison is running. Remote roots can begin with\n\
+      \032  ssh://, rsh:// to indicate that the remote server should be started\n\
+      \032  with rsh or ssh:\n\
+      \032     ssh://remotehost//absolute/path/of/root\n\
+      \032     rsh://user@remotehost/relative/path/of/root\n\
+      \n\
+      \032  If the remote server is already running (in the socket mode), then the\n\
+      \032  syntax\n\
+      \032     socket://remotehost:portnum//absolute/path/of/root\n\
+      \032     socket://remotehost:portnum/relative/path/of/root\n\
+      \n\
+      \032  is used to specify the hostname and the port that the client Unison\n\
+      \032  should use to contact it.\n\
+      \n\
+      \032  The syntax for roots is based on that of URIs (described in RFC 2396).\n\
+      \032  The full grammar is:\n\
+      \032 replica ::= [protocol:]//[user@][host][:port][/path]\n\
+      \032          |  path\n\
+      \n\
+      \032 protocol ::= file\n\
+      \032           |  socket\n\
+      \032           |  ssh\n\
+      \032           |  rsh\n\
+      \n\
+      \032 user ::= [-_a-zA-Z0-9]+\n\
+      \n\
+      \032 host ::= [-_a-zA-Z0-9.]+\n\
+      \n\
+      \032 port ::= [0-9]+\n\
+      \n\
+      \032  When path is given without any protocol prefix, the protocol is\n\
+      \032  assumed to be file:. Under Windows, it is possible to synchronize with\n\
+      \032  a remote directory using the file: protocol over the Windows Network\n\
+      \032  Neighborhood. For example,\n\
+      \032      unison foo //host/drive/bar\n\
+      \n\
+      \032  synchronizes the local directory foo with the directory drive:\\bar on\n\
+      \032  the machine host, provided that host is accessible via Network\n\
+      \032  Neighborhood. When the file: protocol is used in this way, there is no\n\
+      \032  need for a Unison server to be running on the remote host. However,\n\
+      \032  running Unison this way is only a good idea if the remote host is\n\
+      \032  reached by a very fast network connection, since the full contents of\n\
+      \032  every file in the remote replica will have to be transferred to the\n\
+      \032  local machine to detect updates.\n\
+      \n\
+      \032  The names of roots are canonized by Unison before it uses them to\n\
+      \032  compute the names of the corresponding archive files, so\n\
+      \032  //saul//home/bcpierce/common and //saul.cis.upenn.edu/common will be\n\
+      \032  recognized as the same replica under different names.\n\
+      \n\
+      Paths\n\
+      \n\
+      \032  A path refers to a point within a set of files being synchronized; it\n\
+      \032  is specified relative to the root of the replica.\n\
+      \n\
+      \032  Formally, a path is just a sequence of names, separated by /. Note\n\
+      \032  that the path separator character is always a forward slash, no matter\n\
+      \032  what operating system Unison is running on. Forward slashes are\n\
+      \032  converted to backslashes as necessary when paths are converted to\n\
+      \032  filenames in the local filesystem on a particular host. (For example,\n\
+      \032  suppose that we run Unison on a Windows system, synchronizing the\n\
+      \032  local root c:\\pierce with the root\n\
+      \032  ssh://saul.cis.upenn.edu/home/bcpierce on a Unix server. Then the path\n\
+      \032  current/todo.txt refers to the file c:\\pierce\\current\\todo.txt on the\n\
+      \032  client and /home/bcpierce/current/todo.txt on the server.)\n\
+      \n\
+      \032  The empty path (i.e., the empty sequence of names) denotes the whole\n\
+      \032  replica. Unison displays the empty path as \"[root].\"\n\
+      \n\
+      \032  If p is a path and q is a path beginning with p, then q is said to be\n\
+      \032  a descendant of p. (Each path is also a descendant of itself.)\n\
+      \n\
+      What is an Update?\n\
+      \n\
+      \032  The contents of a path p in a particular replica could be a file, a\n\
+      \032  directory, a symbolic link, or absent (if p does not refer to anything\n\
+      \032  at all in that replica). More specifically:\n\
+      \032    * If p refers to an ordinary file, then the contents of p are the\n\
+      \032      actual contents of this file (a string of bytes) plus the current\n\
+      \032      permission bits of the file.\n\
+      \032    * If p refers to a symbolic link, then the contents of p are just\n\
+      \032      the string specifying where the link points.\n\
+      \032    * If p refers to a directory, then the contents of p are just the\n\
+      \032      token \"DIRECTORY\" plus the current permission bits of the\n\
+      \032      directory.\n\
+      \032    * If p does not refer to anything in this replica, then the contents\n\
+      \032      of p are the token \"ABSENT.\"\n\
+      \n\
+      \032  Unison keeps a record of the contents of each path after each\n\
+      \032  successful synchronization of that path (i.e., it remembers the\n\
+      \032  contents at the last moment when they were the same in the two\n\
+      \032  replicas).\n\
+      \n\
+      \032  We say that a path is updated (in some replica) if its current\n\
+      \032  contents are different from its contents the last time it was\n\
+      \032  successfully synchronized. Note that whether a path is updated has\n\
+      \032  nothing to do with its last modification time--Unison considers only\n\
+      \032  the contents when determining whether an update has occurred. This\n\
+      \032  means that touching a file without changing its contents will not be\n\
+      \032  recognized as an update. A file can even be changed several times and\n\
+      \032  then changed back to its original contents; as long as Unison is only\n\
+      \032  run at the end of this process, no update will be recognized.\n\
+      \n\
+      \032  What Unison actually calculates is a close approximation to this\n\
+      \032  definition; see the section \"Caveats and Shortcomings\" .\n\
+      \n\
+      What is a Conflict?\n\
+      \n\
+      \032  A path is said to be conflicting if the following conditions all hold:\n\
+      \032   1. it has been updated in one replica,\n\
+      \032   2. it or any of its descendants has been updated in the other\n\
+      \032      replica, and\n\
+      \032   3. its contents in the two replicas are not identical.\n\
+      \n\
+      Reconciliation\n\
+      \n\
+      \032  Unison operates in several distinct stages:\n\
+      \032   1. On each host, it compares its archive file (which records the\n\
+      \032      state of each path in the replica when it was last synchronized)\n\
+      \032      with the current contents of the replica, to determine which paths\n\
+      \032      have been updated.\n\
+      \032   2. It checks for \"false conflicts\" -- paths that have been updated on\n\
+      \032      both replicas, but whose current values are identical. These paths\n\
+      \032      are silently marked as synchronized in the archive files in both\n\
+      \032      replicas.\n\
+      \032   3. It displays all the updated paths to the user. For updates that do\n\
+      \032      not conflict, it suggests a default action (propagating the new\n\
+      \032      contents from the updated replica to the other). Conflicting\n\
+      \032      updates are just displayed. The user is given an opportunity to\n\
+      \032      examine the current state of affairs, change the default actions\n\
+      \032      for nonconflicting updates, and choose actions for conflicting\n\
+      \032      updates.\n\
+      \032   4. It performs the selected actions, one at a time. Each action is\n\
+      \032      performed by first transferring the new contents to a temporary\n\
+      \032      file on the receiving host, then atomically moving them into\n\
+      \032      place.\n\
+      \032   5. It updates its archive files to reflect the new state of the\n\
+      \032      replicas.\n\
+      \n\
+      "))
+::
+    ("failures", ("Invariants", 
+     "Invariants\n\
+      \n\
+      \032  Given the importance and delicacy of the job that it performs, it is\n\
+      \032  important to understand both what a synchronizer does under normal\n\
+      \032  conditions and what can happen under unusual conditions such as system\n\
+      \032  crashes and communication failures.\n\
+      \n\
+      \032  Unison is careful to protect both its internal state and the state of\n\
+      \032  the replicas at every point in this process. Specifically, the\n\
+      \032  following guarantees are enforced:\n\
+      \032    * At every moment, each path in each replica has either (1) its\n\
+      \032      original contents (i.e., no change at all has been made to this\n\
+      \032      path), or (2) its correct final contents (i.e., the value that the\n\
+      \032      user expected to be propagated from the other replica).\n\
+      \032    * At every moment, the information stored on disk about Unison's\n\
+      \032      private state can be either (1) unchanged, or (2) updated to\n\
+      \032      reflect those paths that have been successfully synchronized.\n\
+      \n\
+      \032  The upshot is that it is safe to interrupt Unison at any time, either\n\
+      \032  manually or accidentally. [Caveat: the above is almost true there are\n\
+      \032  occasionally brief periods where it is not (and, because of\n\
+      \032  shortcoming of the Posix filesystem API, cannot be); in particular,\n\
+      \032  when it is copying a file onto a directory or vice versa, it must\n\
+      \032  first move the original contents out of the way. If Unison gets\n\
+      \032  interrupted during one of these periods, some manual cleanup may be\n\
+      \032  required. In this case, a file called DANGER.README will be left in\n\
+      \032  your home directory, containing information about the operation that\n\
+      \032  was interrupted. The next time you try to run Unison, it will notice\n\
+      \032  this file and warn you about it.]\n\
+      \n\
+      \032  If an interruption happens while it is propagating updates, then there\n\
+      \032  may be some paths for which an update has been propagated but which\n\
+      \032  have not been marked as synchronized in Unison's archives. This is no\n\
+      \032  problem: the next time Unison runs, it will detect changes to these\n\
+      \032  paths in both replicas, notice that the contents are now equal, and\n\
+      \032  mark the paths as successfully updated when it writes back its private\n\
+      \032  state at the end of this run.\n\
+      \n\
+      \032  If Unison is interrupted, it may sometimes leave temporary working\n\
+      \032  files (with suffix .tmp) in the replicas. It is safe to delete these\n\
+      \032  files. Also, if the backups flag is set, Unison will leave around old\n\
+      \032  versions of files that it overwrites, with names like\n\
+      \032  file.0.unison.bak. These can be deleted safely when they are no longer\n\
+      \032  wanted.\n\
+      \n\
+      \032  Unison is not bothered by clock skew between the different hosts on\n\
+      \032  which it is running. It only performs comparisons between timestamps\n\
+      \032  obtained from the same host, and the only assumption it makes about\n\
+      \032  them is that the clock on each system always runs forward.\n\
+      \n\
+      \032  If Unison finds that its archive files have been deleted (or that the\n\
+      \032  archive format has changed and they cannot be read, or that they don't\n\
+      \032  exist because this is the first run of Unison on these particular\n\
+      \032  roots), it takes a conservative approach: it behaves as though the\n\
+      \032  replicas had both been completely empty at the point of the last\n\
+      \032  synchronization. The effect of this is that, on the first run, files\n\
+      \032  that exist in only one replica will be propagated to the other, while\n\
+      \032  files that exist in both replicas but are unequal will be marked as\n\
+      \032  conflicting.\n\
+      \n\
+      \032  Touching a file without changing its contents should never affect\n\
+      \032  whether or not Unison does an update. (When running with the fastcheck\n\
+      \032  preference set to true--the default on Unix systems--Unison uses file\n\
+      \032  modtimes for a quick first pass to tell which files have definitely\n\
+      \032  not changed; then, for each file that might have changed, it computes\n\
+      \032  a fingerprint of the file's contents and compares it against the\n\
+      \032  last-synchronized contents. Also, the -times option allows you to\n\
+      \032  synchronize file times, but it does not cause identical files to be\n\
+      \032  changed; Unison will only modify the file times.)\n\
+      \n\
+      \032  It is safe to \"brainwash\" Unison by deleting its archive files on both\n\
+      \032  replicas. The next time it runs, it will assume that all the files it\n\
+      \032  sees in the replicas are new.\n\
+      \n\
+      \032  It is safe to modify files while Unison is working. If Unison\n\
+      \032  discovers that it has propagated an out-of-date change, or that the\n\
+      \032  file it is updating has changed on the target replica, it will signal\n\
+      \032  a failure for that file. Run Unison again to propagate the latest\n\
+      \032  change.\n\
+      \n\
+      \032  Changes to the ignore patterns from the user interface (e.g., using\n\
+      \032  the `i' key) are immediately reflected in the current profile.\n\
+      \n\
+      Caveats and Shortcomings\n\
+      \n\
+      \032  Here are some things to be careful of when using Unison.\n\
+      \032    * In the interests of speed, the update detection algorithm may\n\
+      \032      (depending on which OS architecture that you run Unison on)\n\
+      \032      actually use an approximation to the definition given in the\n\
+      \032      section \"What is an Update?\" .\n\
+      \032      In particular, the Unix implementation does not compare the actual\n\
+      \032      contents of files to their previous contents, but simply looks at\n\
+      \032      each file's inode number and modtime; if neither of these have\n\
+      \032      changed, then it concludes that the file has not been changed.\n\
+      \032      Under normal circumstances, this approximation is safe, in the\n\
+      \032      sense that it may sometimes detect \"false updates\" will never miss\n\
+      \032      a real one. However, it is possible to fool it, for example by\n\
+      \032      using retouch to change a file's modtime back to a time in the\n\
+      \032      past.\n\
+      \032    * If you synchronize between a single-user filesystem and a shared\n\
+      \032      Unix server, you should pay attention to your permission bits: by\n\
+      \032      default, Unison will synchronize permissions verbatim, which may\n\
+      \032      leave group-writable files on the server that could be written\n\
+      \032      over by a lot of people.\n\
+      \032      You can control this by setting your umask on both computers to\n\
+      \032      something like 022, masking out the \"world write\" and \"group\n\
+      \032      write\" permission bits.\n\
+      \032      Unison does not synchronize the setuid and setgid bits, for\n\
+      \032      security.\n\
+      \032    * The graphical user interface is single-threaded. This means that\n\
+      \032      if Unison is performing some long-running operation, the display\n\
+      \032      will not be repainted until it finishes. We recommend not trying\n\
+      \032      to do anything with the user interface while Unison is in the\n\
+      \032      middle of detecting changes or propagating files.\n\
+      \032    * Unison does not understand hard links.\n\
+      \032    * It is important to be a little careful when renaming directories\n\
+      \032      containing \"ignore\"d files.\n\
+      \032      For example, suppose Unison is synchronizing directory A between\n\
+      \032      the two machines called the \"local\" and the \"remote\" machine;\n\
+      \032      suppose directory A contains a subdirectory D; and suppose D on\n\
+      \032      the local machine contains a file or subdirectory P that matches\n\
+      \032      an ignore directive in the profile used to synchronize. Thus path\n\
+      \032      A/D/P exists on the local machine but not on the remote machine.\n\
+      \032      If D is renamed to D' on the remote machine, and this change is\n\
+      \032      propagated to the local machine, all such files or subdirectories\n\
+      \032      P will be deleted. This is because Unison sees the rename as a\n\
+      \032      delete and a separate create: it deletes the old directory\n\
+      \032      (including the ignored files) and creates a new one (not including\n\
+      \032      the ignored files, since they are completely invisible to it).\n\
+      \n\
+      "))
+::
+    ("", ("Reference Guide", 
+     "Reference Guide\n\
+      \n\
+      \032  This section covers the features of Unison in detail.\n\
+      \n\
+      "))
+::
+    ("running", ("Running Unison", 
+     "Running Unison\n\
+      \n\
+      \032  There are several ways to start Unison.\n\
+      \032    * Typing \"unison profile\" on the command line. Unison will look for\n\
+      \032      a file profile.prf in the .unison directory. If this file does not\n\
+      \032      specify a pair of roots, Unison will prompt for them and add them\n\
+      \032      to the information specified by the profile.\n\
+      \032    * Typing \"unison profile root1 root2\" on the command line. In this\n\
+      \032      case, Unison will use profile, which should not contain any root\n\
+      \032      directives.\n\
+      \032    * Typing \"unison root1 root2\" on the command line. This has the same\n\
+      \032      effect as typing \"unison default root1 root2.\"\n\
+      \032    * Typing just \"unison\" (or invoking Unison by clicking on a desktop\n\
+      \032      icon). In this case, Unison will ask for the profile to use for\n\
+      \032      synchronization (or create a new one, if necessary).\n\
+      \n\
+      The .unison Directory\n\
+      \n\
+      \032  Unison stores a variety of information in a private directory on each\n\
+      \032  host. If the environment variable UNISON is defined, then its value\n\
+      \032  will be used as the name of this directory. If UNISON is not defined,\n\
+      \032  then the name of the directory depends on which operating system you\n\
+      \032  are using. In Unix, the default is to use $HOME/.unison. In Windows,\n\
+      \032  if the environment variable USERPROFILE is defined, then the directory\n\
+      \032  will be $USERPROFILE\\.unison; otherwise if HOME is defined, it will be\n\
+      \032  $HOME\\.unison; otherwise, it will be c:\\.unison.\n\
+      \n\
+      \032  The archive file for each replica is found in the .unison directory on\n\
+      \032  that replica's host. Profiles (described below) are always taken from\n\
+      \032  the .unison directory on the client host.\n\
+      \n\
+      \032  Note that Unison maintains a completely different set of archive files\n\
+      \032  for each pair of roots.\n\
+      \n\
+      \032  We do not recommend synchronizing the whole .unison directory, as this\n\
+      \032  will involve frequent propagation of large archive files. It should be\n\
+      \032  safe to do it, though, if you really want to. Synchronizing just the\n\
+      \032  profile files in the .unison directory is definitely OK.\n\
+      \n\
+      Archive Files\n\
+      \n\
+      \032  The name of the archive file on each replica is calculated from\n\
+      \032    * the canonical names of all the hosts (short names like saul are\n\
+      \032      converted into full addresses like saul.cis.upenn.edu),\n\
+      \032    * the paths to the replicas on all the hosts (again, relative\n\
+      \032      pathnames, symbolic links, etc. are converted into full, absolute\n\
+      \032      paths), and\n\
+      \032    * an internal version number that is changed whenever a new Unison\n\
+      \032      release changes the format of the information stored in the\n\
+      \032      archive.\n\
+      \n\
+      \032  This method should work well for most users. However, it is\n\
+      \032  occasionally useful to change the way archive names are generated.\n\
+      \032  Unison provides two ways of doing this.\n\
+      \n\
+      \032  The function that finds the canonical hostname of the local host\n\
+      \032  (which is used, for example, in calculating the name of the archive\n\
+      \032  file used to remember which files have been synchronized) normally\n\
+      \032  uses the gethostname operating system call. However, if the\n\
+      \032  environment variable UNISONLOCALHOSTNAME is set, its value will be\n\
+      \032  used instead. This makes it easier to use Unison in situations where a\n\
+      \032  machine's name changes frequently (e.g., because it is a laptop and\n\
+      \032  gets moved around a lot).\n\
+      \n\
+      \032  A more powerful way of changing archive names is provided by the\n\
+      \032  rootalias preference. The preference file may contain any number of\n\
+      \032  lines of the form:\n\
+      \032   rootalias = //hostnameA//path-to-replicaA -> //hostnameB/path-to-replicaB\n\
+      \n\
+      \032  When calculating the name of the archive files for a given pair of\n\
+      \032  roots, Unison replaces any root that matches the left-hand side of any\n\
+      \032  rootalias rule by the corresponding right-hand side.\n\
+      \n\
+      \032  So, if you need to relocate a root on one of the hosts, you can add a\n\
+      \032  rule of the form:\n\
+      \032   rootalias = //new-hostname//new-path -> //old-hostname/old-path\n\
+      \n\
+      \032  Note that root aliases are case-sensitive, even on case-insensitive\n\
+      \032  file systems.\n\
+      \n\
+      \032  Warning: The rootalias option is dangerous and should only be used if\n\
+      \032  you are sure you know what you're doing. In particular, it should only\n\
+      \032  be used if you are positive that either (1) both the original root and\n\
+      \032  the new alias refer to the same set of files, or (2) the files have\n\
+      \032  been relocated so that the original name is now invalid and will never\n\
+      \032  be used again. (If the original root and the alias refer to different\n\
+      \032  sets of files, Unison's update detector could get confused.) After\n\
+      \032  introducing a new rootalias, it is a good idea to run Unison a few\n\
+      \032  times interactively (with the batch flag off, etc.) and carefully\n\
+      \032  check that things look reasonable--in particular, that update\n\
+      \032  detection is working as expected.\n\
+      \n\
+      Preferences\n\
+      \n\
+      \032  Many details of Unison's behavior are configurable by user-settable\n\
+      \032  \"preferences.\"\n\
+      \n\
+      \032  Some preferences are boolean-valued; these are often called flags.\n\
+      \032  Others take numeric or string arguments, indicated in the preferences\n\
+      \032  list by n or xxx. Most of the string preferences can be given several\n\
+      \032  times; the arguments are accumulated into a list internally.\n\
+      \n\
+      \032  There are two ways to set the values of preferences: temporarily, by\n\
+      \032  providing command-line arguments to a particular run of Unison, or\n\
+      \032  permanently, by adding commands to a profile in the .unison directory\n\
+      \032  on the client host. The order of preferences (either on the command\n\
+      \032  line or in preference files) is not significant. On the command line,\n\
+      \032  preferences and other arguments (the profile name and roots) can be\n\
+      \032  intermixed in any order.\n\
+      \n\
+      \032  To set the value of a preference p from the command line, add an\n\
+      \032  argument -p (for a boolean flag) or -p n or -p xxx (for a numeric or\n\
+      \032  string preference) anywhere on the command line. To set a boolean flag\n\
+      \032  to false on the command line, use -p=false.\n\
+      \n\
+      \032  Here are all the preferences supported by Unison. This list can be\n\
+      \032  obtained by typing unison -help.\n\
+      \n\
+      Usage: unison [options]\n\
+      \032   or unison root1 root2 [options]\n\
+      \032   or unison profilename [options]\n\
+      \n\
+      Basic options:\n\
+      \032-auto              automatically accept default (nonconflicting) actions\n\
+      \032-batch             batch mode: ask no questions at all\n\
+      \032-doc xxx           show documentation ('-doc topics' lists topics)\n\
+      \032-group             synchronize group attributes\n\
+      \032-ignore xxx        add a pattern to the ignore list\n\
+      \032-ignorenot xxx     add a pattern to the ignorenot list\n\
+      \032-nocreation xxx    prevent file creations on one replica\n\
+      \032-nodeletion xxx    prevent file deletions on one replica\n\
+      \032-noupdate xxx      prevent file updates and deletions on one replica\n\
+      \032-owner             synchronize owner\n\
+      \032-path xxx          path to synchronize\n\
+      \032-perms n           part of the permissions which is synchronized\n\
+      \032-root xxx          root of a replica (should be used exactly twice)\n\
+      \032-silent            print nothing except error messages\n\
+      \032-terse             suppress status messages\n\
+      \032-testserver        exit immediately after the connection to the server\n\
+      \032-times             synchronize modification times\n\
+      \032-version           print version and exit\n\
+      \n\
+      Advanced options:\n\
+      \032-addprefsto xxx    file to add new prefs to\n\
+      \032-addversionno      add version number to name of unison on server\n\
+      \032-backup xxx        add a pattern to the backup list\n\
+      \032-backupcurr xxx    add a pattern to the backupcurr list\n\
+      \032-backupcurrnot xxx add a pattern to the backupcurrnot list\n\
+      \032-backupdir xxx     directory for storing centralized backups\n\
+      \032-backuploc xxx     where backups are stored ('local' or 'central')\n\
+      \032-backupnot xxx     add a pattern to the backupnot list\n\
+      \032-backupprefix xxx  prefix for the names of backup files\n\
+      \032-backups           keep backup copies of all files (see also 'backup')\n\
+      \032-backupsuffix xxx  a suffix to be added to names of backup files\n\
+      \032-confirmbigdel     ask about whole-replica (or path) deletes (default true)\n\
+      \032-confirmmerge      ask for confirmation before commiting results of a merge\n\
+      \032-contactquietly    suppress the 'contacting server' message during startup\n\
+      \032-copymax n         maximum number of simultaneous copyprog transfers\n\
+      \032-copyprog xxx      external program for copying large files\n\
+      \032-copyprogrest xxx  variant of copyprog for resuming partial transfers\n\
+      \032-copyquoterem xxx  add quotes to remote file name for copyprog (true/false/def\n\
+      ault)\n\
+      \032-copythreshold n   use copyprog on files bigger than this (if >=0, in Kb)\n\
+      \032-debug xxx         debug module xxx ('all' -> everything, 'verbose' -> more)\n\
+      \032-diff xxx          set command for showing differences between files\n\
+      \032-dontchmod         when set, never use the chmod system call\n\
+      \032-dumbtty           do not change terminal settings in text UI (default true)\n\
+      \032-fastcheck xxx     do fast update detection (true/false/default)\n\
+      \032-follow xxx        add a pattern to the follow list\n\
+      \032-force xxx         force changes from this replica to the other\n\
+      \032-forcepartial xxx  add a pattern to the forcepartial list\n\
+      \032-halfduplex        force half-duplex communication with the server\n\
+      \032-height n          height (in lines) of main window in graphical interface\n\
+      \032-host xxx          bind the socket to this host name in server socket mode\n\
+      \032-ignorearchives    ignore existing archive files\n\
+      \032-ignorecase xxx    identify upper/lowercase filenames (true/false/default)\n\
+      \032-ignoreinodenumbers ignore inode number changes when detecting updates\n\
+      \032-ignorelocks       ignore locks left over from previous run (dangerous!)\n\
+      \032-immutable xxx     add a pattern to the immutable list\n\
+      \032-immutablenot xxx  add a pattern to the immutablenot list\n\
+      \032-key xxx           define a keyboard shortcut for this profile (in some UIs)\n\
+      \032-killserver        kill server when done (even when using sockets)\n\
+      \032-label xxx         provide a descriptive string label for this profile\n\
+      \032-links xxx         allow the synchronization of symbolic links (true/false/def\n\
+      ault)\n\
+      \032-log               record actions in logfile (default true)\n\
+      \032-logfile xxx       logfile name\n\
+      \032-maxbackups n      number of backed up versions of a file\n\
+      \032-maxerrors n       maximum number of errors before a directory transfer is abo\n\
+      rted\n\
+      \032-maxthreads n      maximum number of simultaneous file transfers\n\
+      \032-merge xxx         add a pattern to the merge list\n\
+      \032-mountpoint xxx    abort if this path does not exist\n\
+      \032-nocreationpartial xxx add a pattern to the nocreationpartial list\n\
+      \032-nodeletionpartial xxx add a pattern to the nodeletionpartial list\n\
+      \032-noupdatepartial xxx add a pattern to the noupdatepartial list\n\
+      \032-numericids        don't map uid/gid values by user/group names\n\
+      \032-prefer xxx        choose this replica's version for conflicting changes\n\
+      \032-preferpartial xxx add a pattern to the preferpartial list\n\
+      \032-repeat xxx        synchronize repeatedly (text interface only)\n\
+      \032-retry n           re-try failed synchronizations N times (text ui only)\n\
+      \032-rootalias xxx     register alias for canonical root names\n\
+      \032-rsrc xxx          synchronize resource forks (true/false/default)\n\
+      \032-rsync             activate the rsync transfer mode (default true)\n\
+      \032-selftest          run internal tests and exit\n\
+      \032-servercmd xxx     name of unison executable on remote server\n\
+      \032-showarchive       show 'true names' (for rootalias) of roots and archive\n\
+      \032-socket xxx        act as a server on a socket\n\
+      \032-sortbysize        list changed files by size, not name\n\
+      \032-sortfirst xxx     add a pattern to the sortfirst list\n\
+      \032-sortlast xxx      add a pattern to the sortlast list\n\
+      \032-sortnewfirst      list new before changed files\n\
+      \032-sshargs xxx       other arguments (if any) for remote shell command\n\
+      \032-sshcmd xxx        path to the ssh executable\n\
+      \032-stream            use a streaming protocol for transferring file contents (de\n\
+      fault true)\n\
+      \032-ui xxx            select UI ('text' or 'graphic'); command-line only\n\
+      \032-unicode xxx       assume Unicode encoding in case insensitive mode\n\
+      \032-xferbycopying     optimize transfers using local copies (default true)\n\
+      \n\
+      \032  Here, in more detail, is what they do. Many are discussed in greater\n\
+      \032  detail in other sections of the manual.\n\
+      \032  addprefsto xxx\n\
+      \032         By default, new preferences added by Unison (e.g., new ignore\n\
+      \032         clauses) will be appended to whatever preference file Unison\n\
+      \032         was told to load at the beginning of the run. Setting the\n\
+      \032         preference addprefsto filename makes Unison add new preferences\n\
+      \032         to the file named filename instead.\n\
+      \032  addversionno \n\
+      \032         When this flag is set to true, Unison will use\n\
+      \032         unison-currentversionnumber instead of just unison as the\n\
+      \032         remote server command. This allows multiple binaries for\n\
+      \032         different versions of unison to coexist conveniently on the\n\
+      \032         same server: whichever version is run on the client, the same\n\
+      \032         version will be selected on the server.\n\
+      \032  auto \n\
+      \032         When set to true, this flag causes the user interface to skip\n\
+      \032         asking for confirmations on non-conflicting changes. (More\n\
+      \032         precisely, when the user interface is done setting the\n\
+      \032         propagation direction for one entry and is about to move to the\n\
+      \032         next, it will skip over all non-conflicting entries and go\n\
+      \032         directly to the next conflict.)\n\
+      \032  backup xxx\n\
+      \032         Including the preference -backup pathspec causes Unison to keep\n\
+      \032         backup files for each path that matches pathspec. These backup\n\
+      \032         files are kept in the directory specified by the backuplocation\n\
+      \032         preference. The backups are named according to the backupprefix\n\
+      \032         and backupsuffix preferences. The number of versions that are\n\
+      \032         kept is determined by the maxbackups preference.\n\
+      \032         The syntax of pathspec is described in the section \"Path\n\
+      \032         Specification\" .\n\
+      \032  backupcurr xxx\n\
+      \032         Including the preference -backupcurr pathspec causes Unison to\n\
+      \032         keep a backup of the current version of every file matching\n\
+      \032         pathspec. This file will be saved as a backup with version\n\
+      \032         number 000. Such backups can be used as inputs to external\n\
+      \032         merging programs, for instance. See the documentatation for the\n\
+      \032         merge preference. For more details, see the section \"Merging\n\
+      \032         Conflicting Versions\" .\n\
+      \032         The syntax of pathspec is described in the section \"Path\n\
+      \032         Specification\" .\n\
+      \032  backupcurrnot xxx\n\
+      \032         Exceptions to backupcurr, like the ignorenot preference.\n\
+      \032  backupdir xxx\n\
+      \032         If this preference is set, Unison will use it as the name of\n\
+      \032         the directory used to store backup files specified by the\n\
+      \032         backup preference, when backuplocation is set to central. It is\n\
+      \032         checked after the UNISONBACKUPDIR environment variable.\n\
+      \032  backuploc xxx\n\
+      \032         This preference determines whether backups should be kept\n\
+      \032         locally, near the original files, or in a central directory\n\
+      \032         specified by the backupdir preference. If set to local, backups\n\
+      \032         will be kept in the same directory as the original files, and\n\
+      \032         if set to central, backupdir will be used instead.\n\
+      \032  backupnot xxx\n\
+      \032         The values of this preference specify paths or individual files\n\
+      \032         or regular expressions that should not be backed up, even if\n\
+      \032         the backup preference selects them--i.e., it selectively\n\
+      \032         overrides backup. The same caveats apply here as with ignore\n\
+      \032         and ignorenot.\n\
+      \032  backupprefix xxx\n\
+      \032         When a backup for a file NAME is created, it is stored in a\n\
+      \032         directory specified by backuplocation, in a file called\n\
+      \032         backupprefixNAMEbackupsuffix. backupprefix can include a\n\
+      \032         directory name (causing Unison to keep all backup files for a\n\
+      \032         given directory in a subdirectory with this name), and both\n\
+      \032         backupprefix and backupsuffix can contain the string$VERSION,\n\
+      \032         which will be replaced by the age of the backup (1 for the most\n\
+      \032         recent, 2 for the second most recent, and so on...). This\n\
+      \032         keyword is ignored if it appears in a directory name in the\n\
+      \032         prefix; if it does not appear anywhere in the prefix or the\n\
+      \032         suffix, it will be automatically placed at the beginning of the\n\
+      \032         suffix.\n\
+      \032         One thing to be careful of: If the backuploc preference is set\n\
+      \032         to local, Unison will automatically ignore all files whose\n\
+      \032         prefix and suffix match backupprefix and backupsuffix. So be\n\
+      \032         careful to choose values for these preferences that are\n\
+      \032         sufficiently different from the names of your real files.\n\
+      \032  backups \n\
+      \032         Setting this flag to true is equivalent to setting\n\
+      \032         backuplocation to local and backup to Name *.\n\
+      \032  backupsuffix xxx\n\
+      \032         See backupprefix for full documentation.\n\
+      \032  batch \n\
+      \032         When this is set to true, the user interface will ask no\n\
+      \032         questions at all. Non-conflicting changes will be propagated;\n\
+      \032         conflicts will be skipped.\n\
+      \032  confirmbigdel \n\
+      \032         When this is set to true, Unison will request an extra\n\
+      \032         confirmation if it appears that the entire replica has been\n\
+      \032         deleted, before propagating the change. If the batch flag is\n\
+      \032         also set, synchronization will be aborted. When the path\n\
+      \032         preference is used, the same confirmation will be requested for\n\
+      \032         top-level paths. (At the moment, this flag only affects the\n\
+      \032         text user interface.) See also the mountpoint preference.\n\
+      \032  confirmmerge \n\
+      \032         Setting this preference causes both the text and graphical\n\
+      \032         interfaces to ask the user if the results of a merge command\n\
+      \032         may be commited to the replica or not. Since the merge command\n\
+      \032         works on temporary files, the user can then cancel all the\n\
+      \032         effects of applying the merge if it turns out that the result\n\
+      \032         is not satisfactory. In batch-mode, this preference has no\n\
+      \032         effect. Default is false.\n\
+      \032  contactquietly \n\
+      \032         If this flag is set, Unison will skip displaying the\n\
+      \032         `Contacting server' message (which some users find annoying)\n\
+      \032         during startup.\n\
+      \032  copymax n\n\
+      \032         A number indicating how many instances of the external copying\n\
+      \032         utility Unison is allowed to run simultaneously (default to 1).\n\
+      \032  copyprog xxx\n\
+      \032         A string giving the name of an external program that can be\n\
+      \032         used to copy large files efficiently (plus command-line\n\
+      \032         switches telling it to copy files in-place). The default\n\
+      \032         setting invokes rsync with appropriate options--most users\n\
+      \032         should not need to change it.\n\
+      \032  copyprogrest xxx\n\
+      \032         A variant of copyprog that names an external program that\n\
+      \032         should be used to continue the transfer of a large file that\n\
+      \032         has already been partially transferred. Typically, copyprogrest\n\
+      \032         will just be copyprog with one extra option (e.g., -partial,\n\
+      \032         for rsync). The default setting invokes rsync with appropriate\n\
+      \032         options--most users should not need to change it.\n\
+      \032  copyquoterem xxx\n\
+      \032         When set to true, this flag causes Unison to add an extra layer\n\
+      \032         of quotes to the remote path passed to the external copy\n\
+      \032         program. This is needed by rsync, for example, which internally\n\
+      \032         uses an ssh connection requiring an extra level of quoting for\n\
+      \032         paths containing spaces. When this flag is set to default,\n\
+      \032         extra quotes are added if the value of copyprog contains the\n\
+      \032         string rsync.\n\
+      \032  copythreshold n\n\
+      \032         A number indicating above what filesize (in kilobytes) Unison\n\
+      \032         should use the external copying utility specified by copyprog.\n\
+      \032         Specifying 0 will cause all copies to use the external program;\n\
+      \032         a negative number will prevent any files from using it. The\n\
+      \032         default is -1. See the section \"Making Unison Faster on Large\n\
+      \032         Files\" for more information.\n\
+      \032  debug xxx\n\
+      \032         This preference is used to make Unison print various sorts of\n\
+      \032         information about what it is doing internally on the standard\n\
+      \032         error stream. It can be used many times, each time with the\n\
+      \032         name of a module for which debugging information should be\n\
+      \032         printed. Possible arguments for debug can be found by looking\n\
+      \032         for calls to Util.debug in the sources (using, e.g., grep).\n\
+      \032         Setting -debug all causes information from all modules to be\n\
+      \032         printed (this mode of usage is the first one to try, if you are\n\
+      \032         trying to understand something that Unison seems to be doing\n\
+      \032         wrong); -debug verbose turns on some additional debugging\n\
+      \032         output from some modules (e.g., it will show exactly what bytes\n\
+      \032         are being sent across the network).\n\
+      \032  diff xxx\n\
+      \032         This preference can be used to control the name and\n\
+      \032         command-line arguments of the system utility used to generate\n\
+      \032         displays of file differences. The default is `diff -u CURRENT2\n\
+      \032         CURRENT1'. If the value of this preference contains the\n\
+      \032         substrings CURRENT1 and CURRENT2, these will be replaced by the\n\
+      \032         names of the files to be diffed. If not, the two filenames will\n\
+      \032         be appended to the command. In both cases, the filenames are\n\
+      \032         suitably quoted.\n\
+      \032  doc xxx\n\
+      \032         The command-line argument -doc secname causes unison to display\n\
+      \032         section secname of the manual on the standard output and then\n\
+      \032         exit. Use -doc all to display the whole manual, which includes\n\
+      \032         exactly the same information as the printed and HTML manuals,\n\
+      \032         modulo formatting. Use -doc topics to obtain a list of the\n\
+      \032         names of the various sections that can be printed.\n\
+      \032  dontchmod \n\
+      \032         By default, Unison uses the 'chmod' system call to set the\n\
+      \032         permission bits of files after it has copied them. But in some\n\
+      \032         circumstances (and under some operating systems), the chmod\n\
+      \032         call always fails. Setting this preference completely prevents\n\
+      \032         Unison from ever calling chmod.\n\
+      \032  dumbtty \n\
+      \032         When set to true, this flag makes the text mode user interface\n\
+      \032         avoid trying to change any of the terminal settings. (Normally,\n\
+      \032         Unison puts the terminal in `raw mode', so that it can do\n\
+      \032         things like overwriting the current line.) This is useful, for\n\
+      \032         example, when Unison runs in a shell inside of Emacs.\n\
+      \032         When dumbtty is set, commands to the user interface need to be\n\
+      \032         followed by a carriage return before Unison will execute them.\n\
+      \032         (When it is off, Unison recognizes keystrokes as soon as they\n\
+      \032         are typed.)\n\
+      \032         This preference has no effect on the graphical user interface.\n\
+      \032  dumparchives \n\
+      \032         When this preference is set, Unison will create a file\n\
+      \032         unison.dump on each host, containing a text summary of the\n\
+      \032         archive, immediately after loading it.\n\
+      \032  fastcheck xxx\n\
+      \032         When this preference is set to true, Unison will use the\n\
+      \032         modification time and length of a file as a `pseudo inode\n\
+      \032         number' when scanning replicas for updates, instead of reading\n\
+      \032         the full contents of every file. Under Windows, this may cause\n\
+      \032         Unison to miss propagating an update if the modification time\n\
+      \032         and length of the file are both unchanged by the update.\n\
+      \032         However, Unison will never overwrite such an update with a\n\
+      \032         change from the other replica, since it always does a safe\n\
+      \032         check for updates just before propagating a change. Thus, it is\n\
+      \032         reasonable to use this switch under Windows most of the time\n\
+      \032         and occasionally run Unison once with fastcheck set to false,\n\
+      \032         if you are worried that Unison may have overlooked an update.\n\
+      \032         For backward compatibility, yes, no, and default can be used in\n\
+      \032         place of true, false, and auto. See the section \"Fast Checking\"\n\
+      \032         for more information.\n\
+      \032  follow xxx\n\
+      \032         Including the preference -follow pathspec causes Unison to\n\
+      \032         treat symbolic links matching pathspec as `invisible' and\n\
+      \032         behave as if the object pointed to by the link had appeared\n\
+      \032         literally at this position in the replica. See the section\n\
+      \032         \"Symbolic Links\" for more details. The syntax of pathspec is\n\
+      \032         described in the section \"Path Specification\" .\n\
+      \032  force xxx\n\
+      \032         Including the preference -force root causes Unison to resolve\n\
+      \032         all differences (even non-conflicting changes) in favor of\n\
+      \032         root. This effectively changes Unison from a synchronizer into\n\
+      \032         a mirroring utility.\n\
+      \032         You can also specify -force newer (or -force older) to force\n\
+      \032         Unison to choose the file with the later (earlier) modtime. In\n\
+      \032         this case, the -times preference must also be enabled.\n\
+      \032         This preference is overridden by the forcepartial preference.\n\
+      \032         This preference should be used only if you are sure you know\n\
+      \032         what you are doing!\n\
+      \032  forcepartial xxx\n\
+      \032         Including the preference forcepartial = PATHSPEC -> root causes\n\
+      \032         Unison to resolve all differences (even non-conflicting\n\
+      \032         changes) in favor of root for the files in PATHSPEC (see the\n\
+      \032         section \"Path Specification\" for more information). This\n\
+      \032         effectively changes Unison from a synchronizer into a mirroring\n\
+      \032         utility.\n\
+      \032         You can also specify forcepartial PATHSPEC -> newer (or\n\
+      \032         forcepartial PATHSPEC older) to force Unison to choose the file\n\
+      \032         with the later (earlier) modtime. In this case, the -times\n\
+      \032         preference must also be enabled.\n\
+      \032         This preference should be used only if you are sure you know\n\
+      \032         what you are doing!\n\
+      \032  group \n\
+      \032         When this flag is set to true, the group attributes of the\n\
+      \032         files are synchronized. Whether the group names or the group\n\
+      \032         identifiers are synchronized depends on the preference\n\
+      \032         numerids.\n\
+      \032  halfduplex \n\
+      \032         When this flag is set to true, Unison network communication is\n\
+      \032         forced to be half duplex (the client and the server never\n\
+      \032         simultaneously emit data). If you experience unstabilities with\n\
+      \032         your network link, this may help. The communication is always\n\
+      \032         half-duplex when synchronizing with a Windows machine due to a\n\
+      \032         limitation of Unison current implementation that could result\n\
+      \032         in a deadlock.\n\
+      \032  height n\n\
+      \032         Used to set the height (in lines) of the main window in the\n\
+      \032         graphical user interface.\n\
+      \032  ignore xxx\n\
+      \032         Including the preference -ignore pathspec causes Unison to\n\
+      \032         completely ignore paths that match pathspec (as well as their\n\
+      \032         children). This is useful for avoiding synchronizing temporary\n\
+      \032         files, object files, etc. The syntax of pathspec is described\n\
+      \032         in the section \"Path Specification\" , and further details on\n\
+      \032         ignoring paths is found in the section \"Ignoring Paths\" .\n\
+      \032  ignorearchives \n\
+      \032         When this preference is set, Unison will ignore any existing\n\
+      \032         archive files and behave as though it were being run for the\n\
+      \032         first time on these replicas. It is not a good idea to set this\n\
+      \032         option in a profile: it is intended for command-line use.\n\
+      \032  ignorecase xxx\n\
+      \032         When set to true, this flag causes Unison to treat filenames as\n\
+      \032         case insensitive--i.e., files in the two replicas whose names\n\
+      \032         differ in (upper- and lower-case) `spelling' are treated as the\n\
+      \032         same file. When the flag is set to false, Unison will treat all\n\
+      \032         filenames as case sensitive. Ordinarily, when the flag is set\n\
+      \032         to default, filenames are automatically taken to be\n\
+      \032         case-insensitive if either host is running Windows or OSX. In\n\
+      \032         rare circumstances it is useful to set the flag manually (e.g.\n\
+      \032         when running Unison on a Unix system with a FAT [Windows]\n\
+      \032         volume mounted).\n\
+      \032  ignoreinodenumbers \n\
+      \032         When set to true, this preference makes Unison not take\n\
+      \032         advantage of inode numbers during fast update detection. This\n\
+      \032         switch should be used with care, as it is less safe than the\n\
+      \032         standard update detection method, but it can be useful for\n\
+      \032         synchronizing VFAT filesystems (which do not support inode\n\
+      \032         numbers) mounted on Unix systems.\n\
+      \032  ignorelocks \n\
+      \032         When this preference is set, Unison will ignore any lock files\n\
+      \032         that may have been left over from a previous run of Unison that\n\
+      \032         was interrupted while reading or writing archive files; by\n\
+      \032         default, when Unison sees these lock files it will stop and\n\
+      \032         request manual intervention. This option should be set only if\n\
+      \032         you are positive that no other instance of Unison might be\n\
+      \032         concurrently accessing the same archive files (e.g., because\n\
+      \032         there was only one instance of unison running and it has just\n\
+      \032         crashed or you have just killed it). It is probably not a good\n\
+      \032         idea to set this option in a profile: it is intended for\n\
+      \032         command-line use.\n\
+      \032  ignorenot xxx\n\
+      \032         This preference overrides the preference ignore. It gives a\n\
+      \032         list of patterns (in the same format as ignore) for paths that\n\
+      \032         should definitely not be ignored, whether or not they happen to\n\
+      \032         match one of the ignore patterns.\n\
+      \032         Note that the semantics of ignore and ignorenot is a little\n\
+      \032         counter-intuitive. When detecting updates, Unison examines\n\
+      \032         paths in depth-first order, starting from the roots of the\n\
+      \032         replicas and working downwards. Before examining each path, it\n\
+      \032         checks whether it matches ignore and does not match ignorenot;\n\
+      \032         in this case it skips this path and all its descendants. This\n\
+      \032         means that, if some parent of a given path matches an ignore\n\
+      \032         pattern, then it will be skipped even if the path itself\n\
+      \032         matches an ignorenot pattern. In particular, putting ignore =\n\
+      \032         Path * in your profile and then using ignorenot to select\n\
+      \032         particular paths to be synchronized will not work. Instead, you\n\
+      \032         should use the path preference to choose particular paths to\n\
+      \032         synchronize.\n\
+      \032  immutable xxx\n\
+      \032         This preference specifies paths for directories whose immediate\n\
+      \032         children are all immutable files -- i.e., once a file has been\n\
+      \032         created, its contents never changes. When scanning for updates,\n\
+      \032         Unison does not check whether these files have been modified;\n\
+      \032         this can speed update detection significantly (in particular,\n\
+      \032         for mail directories).\n\
+      \032  immutablenot xxx\n\
+      \032         This preference overrides immutable.\n\
+      \032  key xxx\n\
+      \032         Used in a profile to define a numeric key (0-9) that can be\n\
+      \032         used in the graphical user interface to switch immediately to\n\
+      \032         this profile.\n\
+      \032  killserver \n\
+      \032         When set to true, this flag causes Unison to kill the remote\n\
+      \032         server process when the synchronization is finished. This\n\
+      \032         behavior is the default for ssh connections, so this preference\n\
+      \032         is not normally needed when running over ssh; it is provided so\n\
+      \032         that socket-mode servers can be killed off after a single run\n\
+      \032         of Unison, rather than waiting to accept future connections.\n\
+      \032         (Some users prefer to start a remote socket server for each run\n\
+      \032         of Unison, rather than leaving one running all the time.)\n\
+      \032  label xxx\n\
+      \032         Used in a profile to provide a descriptive string documenting\n\
+      \032         its settings. (This is useful for users that switch between\n\
+      \032         several profiles, especially using the `fast switch' feature of\n\
+      \032         the graphical user interface.)\n\
+      \032  links xxx\n\
+      \032         When set to true, this flag causes Unison to synchronize\n\
+      \032         symbolic links. When the flag is set to false, symbolic links\n\
+      \032         will result in an error during update detection. Ordinarily,\n\
+      \032         when the flag is set to default, symbolic links are\n\
+      \032         synchronized except when one of the hosts is running Windows.\n\
+      \032         In rare circumstances it is useful to set the flag manually\n\
+      \032         (e.g. when running Unison on a Unix system with a FAT [Windows]\n\
+      \032         volume mounted).\n\
+      \032  log \n\
+      \032         When this flag is set, Unison will log all changes to the\n\
+      \032         filesystems on a file.\n\
+      \032  logfile xxx\n\
+      \032         By default, logging messages will be appended to the file\n\
+      \032         unison.log in your HOME directory. Set this preference if you\n\
+      \032         prefer another file.\n\
+      \032  maxbackups n\n\
+      \032         This preference specifies the number of backup versions that\n\
+      \032         will be kept by unison, for each path that matches the\n\
+      \032         predicate backup. The default is 2.\n\
+      \032  maxerrors n\n\
+      \032         This preference controls after how many errors Unison aborts a\n\
+      \032         directory transfer. Setting it to a large number allows Unison\n\
+      \032         to transfer most of a directory even when some files fail to be\n\
+      \032         copied. The default is 1. If the preference is set too high,\n\
+      \032         Unison may take a long time to abort in case of repeated\n\
+      \032         failures (for instance, when the disk is full).\n\
+      \032  maxthreads n\n\
+      \032         This preference controls how much concurrency is allowed during\n\
+      \032         the transport phase. Normally, it should be set reasonably high\n\
+      \032         to maximize performance, but when Unison is used over a\n\
+      \032         low-bandwidth link it may be helpful to set it lower (e.g. to\n\
+      \032         1) so that Unison doesn't soak up all the available bandwidth.\n\
+      \032         The default is the special value 0, which mean 20 threads when\n\
+      \032         file content streaming is desactivated and 1000 threads when it\n\
+      \032         is activated.\n\
+      \032  merge xxx\n\
+      \032         This preference can be used to run a merge program which will\n\
+      \032         create a new version for each of the files and the backup, with\n\
+      \032         the last backup and the both replicas. Setting the merge\n\
+      \032         preference for a path will also cause this path to be backed\n\
+      \032         up, just like t backup. The syntax of pathspec>cmd is described\n\
+      \032         in the section \"Path Specification\" , and further details on\n\
+      \032         Merging functions are present in the section \"Merging files\" .\n\
+      \032  mountpoint xxx\n\
+      \032         Including the preference -mountpoint PATH causes Unison to\n\
+      \032         double-check, at the end of update detection, that PATH exists\n\
+      \032         and abort if it does not. This is useful when Unison is used to\n\
+      \032         synchronize removable media. This preference can be given more\n\
+      \032         than once. See the section \"Mount Points\" .\n\
+      \032  nocreation xxx\n\
+      \032         Including the preference -nocreation root prevents Unison from\n\
+      \032         performing any file creation on root root.\n\
+      \032         This preference can be included twice, once for each root, if\n\
+      \032         you want to prevent any creation.\n\
+      \032  nocreationpartial xxx\n\
+      \032         Including the preference nocreationpartial = PATHSPEC -> root\n\
+      \032         prevents Unison from performing any file creation in PATHSPEC\n\
+      \032         on root root (see the section \"Path Specification\" for more\n\
+      \032         information).\n\
+      \032  nodeletion xxx\n\
+      \032         Including the preference -nodeletion root prevents Unison from\n\
+      \032         performing any file deletion on root root.\n\
+      \032         This preference can be included twice, once for each root, if\n\
+      \032         you want to prevent any creation.\n\
+      \032  nodeletionpartial xxx\n\
+      \032         Including the preference nodeletionpartial = PATHSPEC -> root\n\
+      \032         prevents Unison from performing any file deletion in PATHSPEC\n\
+      \032         on root root (see the section \"Path Specification\" for more\n\
+      \032         information).\n\
+      \032  noupdate xxx\n\
+      \032         Including the preference -noupdate root prevents Unison from\n\
+      \032         performing any file update or deletion on root root.\n\
+      \032         This preference can be included twice, once for each root, if\n\
+      \032         you want to prevent any update.\n\
+      \032  noupdatepartial xxx\n\
+      \032         Including the preference noupdatepartial = PATHSPEC -> root\n\
+      \032         prevents Unison from performing any file update or deletion in\n\
+      \032         PATHSPEC on root root (see the section \"Path Specification\" for\n\
+      \032         more information).\n\
+      \032  numericids \n\
+      \032         When this flag is set to true, groups and users are\n\
+      \032         synchronized numerically, rather than by name.\n\
+      \032         The special uid 0 and the special group 0 are never mapped via\n\
+      \032         user/group names even if this preference is not set.\n\
+      \032  owner \n\
+      \032         When this flag is set to true, the owner attributes of the\n\
+      \032         files are synchronized. Whether the owner names or the owner\n\
+      \032         identifiers are synchronizeddepends on the preference numerids.\n\
+      \032  path xxx\n\
+      \032         When no path preference is given, Unison will simply\n\
+      \032         synchronize the two entire replicas, beginning from the given\n\
+      \032         pair of roots. If one or more path preferences are given, then\n\
+      \032         Unison will synchronize only these paths and their children.\n\
+      \032         (This is useful for doing a fast sync of just one directory,\n\
+      \032         for example.) Note that path preferences are intepreted\n\
+      \032         literally--they are not regular expressions.\n\
+      \032  perms n\n\
+      \032         The integer value of this preference is a mask indicating which\n\
+      \032         permission bits should be synchronized. It is set by default to\n\
+      \032         0o1777: all bits but the set-uid and set-gid bits are\n\
+      \032         synchronised (synchronizing theses latter bits can be a\n\
+      \032         security hazard). If you want to synchronize all bits, you can\n\
+      \032         set the value of this preference to -1.\n\
+      \032  prefer xxx\n\
+      \032         Including the preference -prefer root causes Unison always to\n\
+      \032         resolve conflicts in favor of root, rather than asking for\n\
+      \032         guidance from the user. (The syntax of root is the same as for\n\
+      \032         the root preference, plus the special values newer and older.)\n\
+      \032         This preference is overridden by the preferpartial preference.\n\
+      \032         This preference should be used only if you are sure you know\n\
+      \032         what you are doing!\n\
+      \032  preferpartial xxx\n\
+      \032         Including the preference preferpartial = PATHSPEC -> root\n\
+      \032         causes Unison always to resolve conflicts in favor of root,\n\
+      \032         rather than asking for guidance from the user, for the files in\n\
+      \032         PATHSPEC (see the section \"Path Specification\" for more\n\
+      \032         information). (The syntax of root is the same as for the root\n\
+      \032         preference, plus the special values newer and older.)\n\
+      \032         This preference should be used only if you are sure you know\n\
+      \032         what you are doing!\n\
+      \032  repeat xxx\n\
+      \032         Setting this preference causes the text-mode interface to\n\
+      \032         synchronize repeatedly, rather than doing it just once and\n\
+      \032         stopping. If the argument is a number, Unison will pause for\n\
+      \032         that many seconds before beginning again.\n\
+      \032  retry n\n\
+      \032         Setting this preference causes the text-mode interface to try\n\
+      \032         again to synchronize updated paths where synchronization fails.\n\
+      \032         Each such path will be tried N times.\n\
+      \032  root xxx\n\
+      \032         Each use of this preference names the root of one of the\n\
+      \032         replicas for Unison to synchronize. Exactly two roots are\n\
+      \032         needed, so normal modes of usage are either to give two values\n\
+      \032         for root in the profile, or to give no values in the profile\n\
+      \032         and provide two on the command line. Details of the syntax of\n\
+      \032         roots can be found in the section \"Roots\" .\n\
+      \032         The two roots can be given in either order; Unison will sort\n\
+      \032         them into a canonical order before doing anything else. It also\n\
+      \032         tries to `canonize' the machine names and paths that appear in\n\
+      \032         the roots, so that, if Unison is invoked later with a slightly\n\
+      \032         different name for the same root, it will be able to locate the\n\
+      \032         correct archives.\n\
+      \032  rootalias xxx\n\
+      \032         When calculating the name of the archive files for a given pair\n\
+      \032         of roots, Unison replaces any roots matching the left-hand side\n\
+      \032         of any rootalias rule by the corresponding right-hand side.\n\
+      \032  rshargs xxx\n\
+      \032         The string value of this preference will be passed as\n\
+      \032         additional arguments (besides the host name and the name of the\n\
+      \032         Unison executable on the remote system) to the rsh command used\n\
+      \032         to invoke the remote server.\n\
+      \032  rshcmd xxx\n\
+      \032         This preference can be used to explicitly set the name of the\n\
+      \032         rsh executable (e.g., giving a full path name), if necessary.\n\
+      \032  rsrc xxx\n\
+      \032         When set to true, this flag causes Unison to synchronize\n\
+      \032         resource forks and HFS meta-data. On filesystems that do not\n\
+      \032         natively support resource forks, this data is stored in\n\
+      \032         Carbon-compatible ._ AppleDouble files. When the flag is set to\n\
+      \032         false, Unison will not synchronize these data. Ordinarily, the\n\
+      \032         flag is set to default, and these data are automatically\n\
+      \032         synchronized if either host is running OSX. In rare\n\
+      \032         circumstances it is useful to set the flag manually.\n\
+      \032  rsync \n\
+      \032         Unison uses the 'rsync algorithm' for 'diffs-only' transfer of\n\
+      \032         updates to large files. Setting this flag to false makes Unison\n\
+      \032         use whole-file transfers instead. Under normal circumstances,\n\
+      \032         there is no reason to do this, but if you are having trouble\n\
+      \032         with repeated 'rsync failure' errors, setting it to false\n\
+      \032         should permit you to synchronize the offending files.\n\
+      \032  selftest \n\
+      \032         Run internal tests and exit. This option is mostly for\n\
+      \032         developers and must be used carefully: in particular, it will\n\
+      \032         delete the contents of both roots, so that it can install its\n\
+      \032         own files for testing. This flag only makes sense on the\n\
+      \032         command line. When it is provided, no preference file is read:\n\
+      \032         all preferences must be specified on thecommand line. Also,\n\
+      \032         since the self-test procedure involves overwriting the roots\n\
+      \032         and backup directory, the names of the roots and of the\n\
+      \032         backupdir preference must include the string \"test\" or else the\n\
+      \032         tests will be aborted. (If these are not given on the command\n\
+      \032         line, dummy subdirectories in the current directory will be\n\
+      \032         created automatically.)\n\
+      \032  servercmd xxx\n\
+      \032         This preference can be used to explicitly set the name of the\n\
+      \032         Unison executable on the remote server (e.g., giving a full\n\
+      \032         path name), if necessary.\n\
+      \032  showarchive \n\
+      \032         When this preference is set, Unison will print out the 'true\n\
+      \032         names'of the roots, in the same form as is expected by the\n\
+      \032         rootaliaspreference.\n\
+      \032  silent \n\
+      \032         When this preference is set to true, the textual user interface\n\
+      \032         will print nothing at all, except in the case of errors.\n\
+      \032         Setting silent to true automatically sets the batch preference\n\
+      \032         to true.\n\
+      \032  sortbysize \n\
+      \032         When this flag is set, the user interface will list changed\n\
+      \032         files by size (smallest first) rather than by name. This is\n\
+      \032         useful, for example, for synchronizing over slow links, since\n\
+      \032         it puts very large files at the end of the list where they will\n\
+      \032         not prevent smaller files from being transferred quickly.\n\
+      \032         This preference (as well as the other sorting flags, but not\n\
+      \032         the sorting preferences that require patterns as arguments) can\n\
+      \032         be set interactively and temporarily using the 'Sort' menu in\n\
+      \032         the graphical user interface.\n\
+      \032  sortfirst xxx\n\
+      \032         Each argument to sortfirst is a pattern pathspec, which\n\
+      \032         describes a set of paths. Files matching any of these patterns\n\
+      \032         will be listed first in the user interface. The syntax of\n\
+      \032         pathspec is described in the section \"Path Specification\" .\n\
+      \032  sortlast xxx\n\
+      \032         Similar to sortfirst, except that files matching one of these\n\
+      \032         patterns will be listed at the very end.\n\
+      \032  sortnewfirst \n\
+      \032         When this flag is set, the user interface will list newly\n\
+      \032         created files before all others. This is useful, for example,\n\
+      \032         for checking that newly created files are not `junk', i.e.,\n\
+      \032         ones that should be ignored or deleted rather than\n\
+      \032         synchronized.\n\
+      \032  sshargs xxx\n\
+      \032         The string value of this preference will be passed as\n\
+      \032         additional arguments (besides the host name and the name of the\n\
+      \032         Unison executable on the remote system) to the ssh command used\n\
+      \032         to invoke the remote server.\n\
+      \032  sshcmd xxx\n\
+      \032         This preference can be used to explicitly set the name of the\n\
+      \032         ssh executable (e.g., giving a full path name), if necessary.\n\
+      \032  sshversion xxx\n\
+      \032         This preference can be used to control which version of ssh\n\
+      \032         should be used to connect to the server. Legal values are 1 and\n\
+      \032         2, which will cause unison to try to use ssh1 orssh2 instead of\n\
+      \032         just ssh to invoke ssh. The default value is empty, which will\n\
+      \032         make unison use whatever version of ssh is installed as the\n\
+      \032         default `ssh' command.\n\
+      \032  stream \n\
+      \032         When this preference is set, Unison will use an experimental\n\
+      \032         streaming protocol for transferring file contents more\n\
+      \032         efficiently. The default value is true.\n\
+      \032  terse \n\
+      \032         When this preference is set to true, the user interface will\n\
+      \032         not print status messages.\n\
+      \032  testserver \n\
+      \032         Setting this flag on the command line causes Unison to attempt\n\
+      \032         to connect to the remote server and, if successful, print a\n\
+      \032         message and immediately exit. Useful for debugging installation\n\
+      \032         problems. Should not be set in preference files.\n\
+      \032  times \n\
+      \032         When this flag is set to true, file modification times (but not\n\
+      \032         directory modtimes) are propagated.\n\
+      \032  ui xxx\n\
+      \032         This preference selects either the graphical or the textual\n\
+      \032         user interface. Legal values are graphic or text.\n\
+      \032         Because this option is processed specially during Unison's\n\
+      \032         start-up sequence, it can only be used on the command line. In\n\
+      \032         preference files it has no effect.\n\
+      \032         If the Unison executable was compiled with only a textual\n\
+      \032         interface, this option has no effect. (The pre-compiled\n\
+      \032         binaries are all compiled with both interfaces available.)\n\
+      \032  unicode xxx\n\
+      \032         When set to true, this flag causes Unison to perform case\n\
+      \032         insensitive file comparisons assuming Unicode encoding\n\
+      \032  version \n\
+      \032         Print the current version number and exit. (This option only\n\
+      \032         makes sense on the command line.)\n\
+      \032  xferbycopying \n\
+      \032         When this preference is set, Unison will try to avoid\n\
+      \032         transferring file contents across the network by recognizing\n\
+      \032         when a file with the required contents already exists in the\n\
+      \032         target replica. This usually allows file moves to be propagated\n\
+      \032         very quickly. The default value istrue.\n\
+      \n\
+      Profiles\n\
+      \n\
+      \032  A profile is a text file that specifies permanent settings for roots,\n\
+      \032  paths, ignore patterns, and other preferences, so that they do not\n\
+      \032  need to be typed at the command line every time Unison is run.\n\
+      \032  Profiles should reside in the .unison directory on the client machine.\n\
+      \032  If Unison is started with just one argument name on the command line,\n\
+      \032  it looks for a profile called name.prf in the .unison directory. If it\n\
+      \032  is started with no arguments, it scans the .unison directory for files\n\
+      \032  whose names end in .prf and offers a menu (provided that the Unison\n\
+      \032  executable is compiled with the graphical user interface). If a file\n\
+      \032  named default.prf is found, its settings will be offered as the\n\
+      \032  default choices.\n\
+      \n\
+      \032  To set the value of a preference p permanently, add to the appropriate\n\
+      \032  profile a line of the form\n\
+      \032       p = true\n\
+      \n\
+      \032  for a boolean flag or\n\
+      \032       p = <value>\n\
+      \n\
+      \032  for a preference of any other type.\n\
+      \n\
+      \032  Whitespaces around p and xxx are ignored. A profile may also include\n\
+      \032  blank lines and lines beginning with #; both are ignored.\n\
+      \n\
+      \032  When Unison starts, it first reads the profile and then the command\n\
+      \032  line, so command-line options will override settings from the profile.\n\
+      \n\
+      \032  Profiles may also include lines of the form include name, which will\n\
+      \032  cause the file name (or name.prf, if name does not exist in the\n\
+      \032  .unison directory) to be read at the point, and included as if its\n\
+      \032  contents, instead of the include line, was part of the profile.\n\
+      \032  Include lines allows settings common to several profiles to be stored\n\
+      \032  in one place.\n\
+      \n\
+      \032  A profile may include a preference `label = desc' to provide a\n\
+      \032  description of the options selected in this profile. The string desc\n\
+      \032  is listed along with the profile name in the profile selection dialog,\n\
+      \032  and displayed in the top-right corner of the main Unison window in the\n\
+      \032  graphical user interface.\n\
+      \n\
+      \032  The graphical user-interface also supports one-key shortcuts for\n\
+      \032  commonly used profiles. If a profile contains a preference of the form\n\
+      \032  `key = n', where n is a single digit, then pressing this digit key\n\
+      \032  will cause Unison to immediately switch to this profile and begin\n\
+      \032  synchronization again from scratch. In this case, all actions that\n\
+      \032  have been selected for a set of changes currently being displayed will\n\
+      \032  be discarded.\n\
+      \n\
+      Sample Profiles\n\
+      \n\
+      A Minimal Profile\n\
+      \n\
+      \032  Here is a very minimal profile file, such as might be found in\n\
+      \032  .unison/default.prf:\n\
+      \032   # Roots of the synchronization\n\
+      \032   root = /home/bcpierce\n\
+      \032   root = ssh://saul//home/bcpierce\n\
+      \n\
+      \032   # Paths to synchronize\n\
+      \032   path = current\n\
+      \032   path = common\n\
+      \032   path = .netscape/bookmarks.html\n\
+      \n\
+      A Basic Profile\n\
+      \n\
+      \032  Here is a more sophisticated profile, illustrating some other useful\n\
+      \032  features.\n\
+      \032   # Roots of the synchronization\n\
+      \032   root = /home/bcpierce\n\
+      \032   root = ssh://saul//home/bcpierce\n\
+      \n\
+      \032   # Paths to synchronize\n\
+      \032   path = current\n\
+      \032   path = common\n\
+      \032   path = .netscape/bookmarks.html\n\
+      \n\
+      \032   # Some regexps specifying names and paths to ignore\n\
+      \032   ignore = Name temp.*\n\
+      \032   ignore = Name *~\n\
+      \032   ignore = Name .*~\n\
+      \032   ignore = Path */pilot/backup/Archive_*\n\
+      \032   ignore = Name *.o\n\
+      \032   ignore = Name *.tmp\n\
+      \n\
+      \032   # Window height\n\
+      \032   height = 37\n\
+      \n\
+      \032   # Keep a backup copy of every file in a central location\n\
+      \032   backuplocation = central\n\
+      \032   backupdir = /home/bcpierce/backups\n\
+      \032   backup = Name *\n\
+      \032   backupprefix = $VERSION.\n\
+      \032   backupsuffix =\n\
+      \n\
+      \032   # Use this command for displaying diffs\n\
+      \032   diff = diff -y -W 79 --suppress-common-lines\n\
+      \n\
+      \032   # Log actions to the terminal\n\
+      \032   log = true\n\
+      \n\
+      A Power-User Profile\n\
+      \n\
+      \032  When Unison is used with large replicas, it is often convenient to be\n\
+      \032  able to synchronize just a part of the replicas on a given run (this\n\
+      \032  saves the time of detecting updates in the other parts). This can be\n\
+      \032  accomplished by splitting up the profile into several parts -- a\n\
+      \032  common part containing most of the preference settings, plus one\n\
+      \032  \"top-level\" file for each set of paths that need to be synchronized.\n\
+      \032  (The include mechanism can also be used to allow the same set of\n\
+      \032  preference settings to be used with different roots.)\n\
+      \n\
+      \032  The collection of profiles implementing this scheme might look as\n\
+      \032  follows. The file default.prf is empty except for an include\n\
+      \032  directive:\n\
+      \032   # Include the contents of the file common\n\
+      \032   include common\n\
+      \n\
+      \032  Note that the name of the common file is common, not common.prf; this\n\
+      \032  prevents Unison from offering common as one of the list of profiles in\n\
+      \032  the opening dialog (in the graphical UI).\n\
+      \n\
+      \032  The file common contains the real preferences:\n\
+      \032   # Roots of the synchronization\n\
+      \032   root = /home/bcpierce\n\
+      \032   root = ssh://saul//home/bcpierce\n\
+      \n\
+      \032   # (... other preferences ...)\n\
+      \n\
+      \032   # If any new preferences are added by Unison (e.g. 'ignore'\n\
+      \032   # preferences added via the graphical UI), then store them in the\n\
+      \032   # file 'common' rathen than in the top-level preference file\n\
+      \032   addprefsto = common\n\
+      \n\
+      \032   # Names and paths to ignore:\n\
+      \032   ignore = Name temp.*\n\
+      \032   ignore = Name *~\n\
+      \032   ignore = Name .*~\n\
+      \032   ignore = Path */pilot/backup/Archive_*\n\
+      \032   ignore = Name *.o\n\
+      \032   ignore = Name *.tmp\n\
+      \n\
+      \032  Note that there are no path preferences in common. This means that,\n\
+      \032  when we invoke Unison with the default profile (e.g., by typing\n\
+      \032  'unison default' or just 'unison' on the command line), the whole\n\
+      \032  replicas will be synchronized. (If we never want to synchronize the\n\
+      \032  whole replicas, then default.prf would instead include settings for\n\
+      \032  all the paths that are usually synchronized.)\n\
+      \n\
+      \032  To synchronize just part of the replicas, Unison is invoked with an\n\
+      \032  alternate preference file--e.g., doing 'unison workingset', where the\n\
+      \032  preference file workingset.prf contains\n\
+      \032   path = current/papers\n\
+      \032   path = Mail/inbox\n\
+      \032   path = Mail/drafts\n\
+      \032   include common\n\
+      \n\
+      \032  causes Unison to synchronize just the listed subdirectories.\n\
+      \n\
+      \032  The key preference can be used in combination with the graphical UI to\n\
+      \032  quickly switch between different sets of paths. For example, if the\n\
+      \032  file mail.prf contains\n\
+      \032   path = Mail\n\
+      \032   batch = true\n\
+      \032   key = 2\n\
+      \032   include common\n\
+      \n\
+      \032  then pressing 2 will cause Unison to look for updates in the Mail\n\
+      \032  subdirectory and (because the batch flag is set) immediately propagate\n\
+      \032  any that it finds.\n\
+      \n\
+      Keeping Backups\n\
+      \n\
+      \032  When Unison overwrites a file or directory by propagating a new\n\
+      \032  version from the other replica, it can keep the old version around as\n\
+      \032  a backup. There are several preferences that control precisely where\n\
+      \032  these backups are stored and how they are named.\n\
+      \n\
+      \032  To enable backups, you must give one or more backup preferences. Each\n\
+      \032  of these has the form\n\
+      \032   backup = <pathspec>\n\
+      \n\
+      \032  where <pathspec> has the same form as for the ignore preference. For\n\
+      \032  example,\n\
+      \032   backup = Name *\n\
+      \n\
+      \032  causes Unison to keep backups of all files and directories. The\n\
+      \032  backupnot preference can be used to give a few exceptions: it\n\
+      \032  specifies which files and directories should not be backed up, even if\n\
+      \032  they match the backup pathspec.\n\
+      \n\
+      \032  It is important to note that the pathspec is matched against the path\n\
+      \032  that is being updated by Unison, not its descendants. For example, if\n\
+      \032  you set backup = Name *.txt and then delete a whole directory named\n\
+      \032  foo containing some text files, these files will not be backed up\n\
+      \032  because Unison will just check that foo does not match *.txt.\n\
+      \032  Similarly, if the directory itself happened to be called foo.txt, then\n\
+      \032  the whole directory and all the files in it will be backed up,\n\
+      \032  regardless of their names.\n\
+      \n\
+      \032  Backup files can be stored either centrally or locally. This behavior\n\
+      \032  is controlled by the preference backuplocation, whose value must be\n\
+      \032  either central or local. (The default is central.)\n\
+      \n\
+      \032  When backups are stored locally, they are kept in the same directory\n\
+      \032  as the original.\n\
+      \n\
+      \032  When backups are stored centrally, the directory used to hold them is\n\
+      \032  controlled by the preference backupdir and the environment variable\n\
+      \032  UNISONBACKUPDIR. (The environment variable is checked first.) If\n\
+      \032  neither of these are set, then the directory .unison/backup in the\n\
+      \032  user's home directory is used.\n\
+      \n\
+      \032  The preference maxbackups controls how many previous versions of each\n\
+      \032  file are kept (including the current version).\n\
+      \n\
+      \032  By default, backup files are named .bak.VERSION.FILENAME, where\n\
+      \032  FILENAME is the original filename and VERSION is the backup number (1\n\
+      \032  for the most recent, 2 for the next most recent, etc.). This can be\n\
+      \032  changed by setting the preferences backupprefix and/or backupsuffix.\n\
+      \032  If desired, backupprefix may include a directory prefix; this can be\n\
+      \032  used with backuplocation = local to put all backup files for each\n\
+      \032  directory into a single subdirectory. For example, setting\n\
+      \032   backuplocation = local\n\
+      \032   backupprefix = .unison/$VERSION.\n\
+      \032   backupsuffix =\n\
+      \n\
+      \032  will put all backups in a local subdirectory named .unison. Also, note\n\
+      \032  that the string $VERSION in either backupprefix or backupsuffix (it\n\
+      \032  must appear in one or the other) is replaced by the version number.\n\
+      \032  This can be used, for example, to ensure that backup files retain the\n\
+      \032  same extension as the originals.\n\
+      \n\
+      \032  For backward compatibility, the backups preference is also supported.\n\
+      \032  It simply means backup = Name * and backuplocation = local.\n\
+      \n\
+      Merging Conflicting Versions\n\
+      \n\
+      \032  Unison can invoke external programs to merge conflicting versions of a\n\
+      \032  file. The preference merge controls this process.\n\
+      \n\
+      \032  The merge preference may be given once or several times in a\n\
+      \032  preference file (it can also be given on the command line, of course,\n\
+      \032  but this tends to be awkward because of the spaces and special\n\
+      \032  characters involved). Each instance of the preference looks like this:\n\
+      \032   merge = <PATHSPEC> -> <MERGECMD>\n\
+      \n\
+      \032  The <PATHSPEC> here has exactly the same format as for the ignore\n\
+      \032  preference (see the section \"Path specification\" ). For example, using\n\
+      \032  \"Name *.txt\" as the <PATHSPEC> tells Unison that this command should\n\
+      \032  be used whenever a file with extension .txt needs to be merged.\n\
+      \n\
+      \032  Many external merging programs require as inputs not just the two\n\
+      \032  files that need to be merged, but also a file containing the last\n\
+      \032  synchronized version. You can ask Unison to keep a copy of the last\n\
+      \032  synchronized version for some files using the backupcurrent\n\
+      \032  preference. This preference is used in exactly the same way as backup\n\
+      \032  and its meaning is similar, except that it causes backups to be kept\n\
+      \032  of the current contents of each file after it has been synchronized by\n\
+      \032  Unison, rather than the previous contents that Unison overwrote. These\n\
+      \032  backups are kept on both replicas in the same place as ordinary backup\n\
+      \032  files--i.e. according to the backuplocation and backupdir preferences.\n\
+      \032  They are named like the original files if backupslocation is set to\n\
+      \032  'central' and otherwise, Unison uses the backupprefix and backupsuffix\n\
+      \032  preferences and assumes a version number 000 for these backups.\n\
+      \n\
+      \032  The <MERGECMD> part of the preference specifies what external command\n\
+      \032  should be invoked to merge files at paths matching the <PATHSPEC>.\n\
+      \032  Within this string, several special substrings are recognized; these\n\
+      \032  will be substituted with appropriate values before invoking a\n\
+      \032  sub-shell to execute the command.\n\
+      \032    * CURRENT1 is replaced by the name of (a temporary copy of) the\n\
+      \032      local variant of the file.\n\
+      \032    * CURRENT2 is replaced by the name of a temporary file, into which\n\
+      \032      the contents of the remote variant of the file have been\n\
+      \032      transferred by Unison prior to performing the merge.\n\
+      \032    * CURRENTARCH is replaced by the name of the backed up copy of the\n\
+      \032      original version of the file (i.e., the file saved by Unison if\n\
+      \032      the current filename matches the path specifications for the\n\
+      \032      backupcurrent preference, as explained above), if one exists. If\n\
+      \032      no archive exists and CURRENTARCH appears in the merge command,\n\
+      \032      then an error is signalled.\n\
+      \032    * CURRENTARCHOPT is replaced by the name of the backed up copy of\n\
+      \032      the original version of the file (i.e., its state at the end of\n\
+      \032      the last successful run of Unison), if one exists, or the empty\n\
+      \032      string if no archive exists.\n\
+      \032    * NEW is replaced by the name of a temporary file that Unison\n\
+      \032      expects to be written by the merge program when it finishes,\n\
+      \032      giving the desired new contents of the file.\n\
+      \032    * PATH is replaced by the path (relative to the roots of the\n\
+      \032      replicas) of the file being merged.\n\
+      \032    * NEW1 and NEW2 are replaced by the names of temporary files that\n\
+      \032      Unison expects to be written by the merge program when it is only\n\
+      \032      able to partially merge the originals; in this case, NEW1 will be\n\
+      \032      written back to the local replica and NEW2 to the remote replica;\n\
+      \032      NEWARCH, if present, will be used as the \"last common state\" of\n\
+      \032      the replicas. (These three options are provided for later\n\
+      \032      compatibility with the Harmony data synchronizer.)\n\
+      \n\
+      \032  To accomodate the wide variety of programs that users might want to\n\
+      \032  use for merging, Unison checks for several possible situations when\n\
+      \032  the merge program exits:\n\
+      \032    * If the merge program exits with a non-zero status, then merge is\n\
+      \032      considered to have failed and the replicas are not changed.\n\
+      \032    * If the file NEW has been created, it is written back to both\n\
+      \032      replicas (and stored in the backup directory). Similarly, if just\n\
+      \032      the file NEW1 has been created, it is written back to both\n\
+      \032      replicas.\n\
+      \032    * If neither NEW nor NEW1 have been created, then Unison examines\n\
+      \032      the temporary files CURRENT1 and CURRENT2 that were given as\n\
+      \032      inputs to the merge program. If either has been changed (or both\n\
+      \032      have been changed in identical ways), then its new contents are\n\
+      \032      written back to both replicas. If either CURRENT1 or CURRENT2 has\n\
+      \032      been deleted, then the contents of the other are written back to\n\
+      \032      both replicas.\n\
+      \032    * If the files NEW1, NEW2, and NEWARCH have all been created, they\n\
+      \032      are written back to the local replica, remote replica, and backup\n\
+      \032      directory, respectively. If the files NEW1, NEW2 have been\n\
+      \032      created, but NEWARCH has not, then these files are written back to\n\
+      \032      the local replica and remote replica, respectively. Also, if NEW1\n\
+      \032      and NEW2 have identical contents, then the same contents are\n\
+      \032      stored as a backup (if the backupcurrent preference is set for\n\
+      \032      this path) to reflect the fact that the path is currently in sync.\n\
+      \032    * If NEW1 and NEW2 (resp. CURRENT1 and CURRENT2) are created (resp.\n\
+      \032      overwritten) with different contents but the merge command did not\n\
+      \032      fail (i.e., it exited with status code 0), then we copy NEW1\n\
+      \032      (resp. CURRENT1) to the other replica and to the archive.\n\
+      \032      This behavior is a design choice made to handle the case where a\n\
+      \032      merge command only synchronizes some specific contents between two\n\
+      \032      files, skipping some irrelevant information (order between\n\
+      \032      entries, for instance). We assume that, if the merge command exits\n\
+      \032      normally, then the two resulting files are \"as good as equal.\"\n\
+      \032      (The reason we copy one on top of the other is to avoid Unison\n\
+      \032      detecting that the files are unequal the next time it is run and\n\
+      \032      trying again to merge them when, in fact, the merge program has\n\
+      \032      already made them as similar as it is able to.)\n\
+      \n\
+      \032  If the confirmmerge preference is set and Unison is not run in batch\n\
+      \032  mode, then Unison will always ask for confirmation before actually\n\
+      \032  committing the results of the merge to the replicas.\n\
+      \n\
+      \032  A large number of external merging programs are available. For\n\
+      \032  example, on Unix systems setting the merge preference to\n\
+      \032   merge = Name *.txt -> diff3 -m CURRENT1 CURRENTARCH CURRENT2\n\
+      \032                           > NEW || echo \"differences detected\"\n\
+      \n\
+      \032  will tell Unison to use the external diff3 program for merging.\n\
+      \032  Alternatively, users of emacs may find the following settings\n\
+      \032  convenient:\n\
+      \032   merge = Name *.txt -> emacs -q --eval '(ediff-merge-files-with-ancestor\n\
+      \032                            \"CURRENT1\" \"CURRENT2\" \"CURRENTARCH\" nil \"NEW\")'\n\
+      \n\
+      \032  (These commands are displayed here on two lines to avoid running off\n\
+      \032  the edge of the page. In your preference file, each command should be\n\
+      \032  written on a single line.)\n\
+      \n\
+      \032  Users running emacs under windows may find something like this useful:\n\
+      \032  merge = Name * -> C:\\Progra~1\\Emacs\\emacs\\bin\\emacs.exe -q --eval\n\
+      \032                           \"(ediff-files \"\"\"CURRENT1\"\"\" \"\"\"CURRENT2\"\"\")\"\n\
+      \n\
+      \032  Users running Mac OS X (you may need the Developer Tools installed to\n\
+      \032  get the opendiff utility) may prefer\n\
+      \032   merge = Name *.txt -> opendiff CURRENT1 CURRENT2 -ancestor CURRENTARCH -mer\n\
+      ge NEW\n\
+      \n\
+      \032  Here is a slightly more involved hack. The opendiff program can\n\
+      \032  operate either with or without an archive file. A merge command of\n\
+      \032  this form\n\
+      \032   merge = Name *.txt ->\n\
+      \032             if [ CURRENTARCHOPTx = x ];\n\
+      \032             then opendiff CURRENT1 CURRENT2 -merge NEW;\n\
+      \032             else opendiff CURRENT1 CURRENT2 -ancestor CURRENTARCHOPT -merge N\n\
+      EW;\n\
+      \032             fi\n\
+      \n\
+      \032  (still all on one line in the preference file!) will test whether an\n\
+      \032  archive file exists and use the appropriate variant of the arguments\n\
+      \032  to opendiff.\n\
+      \n\
+      \032  Ordinarily, external merge programs are only invoked when Unison is\n\
+      \032  not running in batch mode. To specify an external merge program that\n\
+      \032  should be used no matter the setting of the batch flag, use the\n\
+      \032  mergebatch preference instead of merge.\n\
+      \n\
+      \032    Please post suggestions for other useful values of the merge\n\
+      \032    preference to the unison-users mailing list--we'd like to give\n\
+      \032    several examples here. \n\
+      \n\
+      The User Interface\n\
+      \n\
+      \032  Both the textual and the graphical user interfaces are intended to be\n\
+      \032  mostly self-explanatory. Here are just a few tricks:\n\
+      \032    * By default, when running on Unix the textual user interface will\n\
+      \032      try to put the terminal into the \"raw mode\" so that it reads the\n\
+      \032      input a character at a time rather than a line at a time. (This\n\
+      \032      means you can type just the single keystroke \">\" to tell Unison to\n\
+      \032      propagate a file from left to right, rather than \"> Enter.\")\n\
+      \032      There are some situations, though, where this will not work -- for\n\
+      \032      example, when Unison is running in a shell window inside Emacs.\n\
+      \032      Setting the dumbtty preference will force Unison to leave the\n\
+      \032      terminal alone and process input a line at a time.\n\
+      \n\
+      Exit code\n\
+      \n\
+      \032  When running in the textual mode, Unison returns an exit status, which\n\
+      \032  describes whether, and at which level, the synchronization was\n\
+      \032  successful. The exit status could be useful when Unison is invoked\n\
+      \032  from a script. Currently, there are four possible values for the exit\n\
+      \032  status:\n\
+      \032    * 0: successful synchronization; everything is up-to-date now.\n\
+      \032    * 1: some files were skipped, but all file transfers were\n\
+      \032      successful.\n\
+      \032    * 2: non-fatal failures occurred during file transfer.\n\
+      \032    * 3: a fatal error occurred, or the execution was interrupted.\n\
+      \n\
+      \032  The graphical interface does not return any useful information through\n\
+      \032  the exit status.\n\
+      \n\
+      Path specification\n\
+      \n\
+      \032  Several Unison preferences (e.g., ignore/ignorenot, follow,\n\
+      \032  sortfirst/sortlast, backup, merge, etc.) specify individual paths or\n\
+      \032  sets of paths. These preferences share a common syntax based on\n\
+      \032  regular-expressions. Each preference is associated with a list of path\n\
+      \032  patterns; the paths specified are those that match any one of the path\n\
+      \032  pattern.\n\
+      \032    * Pattern preferences can be given on the command line, or, more\n\
+      \032      often, stored in profiles, using the same syntax as other\n\
+      \032      preferences. For example, a profile line of the form\n\
+      \032            ignore = pattern\n\
+      \032      adds pattern to the list of patterns to be ignored.\n\
+      \032    * Each pattern can have one of three forms. The most general form is\n\
+      \032      a Posix extended regular expression introduced by the keyword\n\
+      \032      Regex. (The collating sequences and character classes of full\n\
+      \032      Posix regexps are not currently supported).\n\
+      \032                Regex regexp\n\
+      \032      For convenience, two other styles of pattern are also recognized:\n\
+      \032                Name name\n\
+      \032      matches any path in which the last component matches name, while\n\
+      \032                Path path\n\
+      \032      matches exactly the path path. The name and path arguments of the\n\
+      \032      latter forms of patterns are not regular expressions. Instead,\n\
+      \032      standard \"globbing\" conventions can be used in name and path:\n\
+      \032         + a * matches any sequence of characters not including / (and\n\
+      \032           not beginning with ., when used at the beginning of a name)\n\
+      \032         + a ? matches any single character except / (and leading .)\n\
+      \032         + [xyz] matches any character from the set {x, y, z }\n\
+      \032         + {a,bb,ccc} matches any one of a, bb, or ccc.\n\
+      \032    * The path separator in path patterns is always the forward-slash\n\
+      \032      character \"/\" -- even when the client or server is running under\n\
+      \032      Windows, where the normal separator character is a backslash. This\n\
+      \032      makes it possible to use the same set of path patterns for both\n\
+      \032      Unix and Windows file systems.\n\
+      \n\
+      \032  Some examples of path patterns appear in the section \"Ignoring Paths\"\n\
+      \032  .\n\
+      \n\
+      Ignoring Paths\n\
+      \n\
+      \032  Most users of Unison will find that their replicas contain lots of\n\
+      \032  files that they don't ever want to synchronize -- temporary files,\n\
+      \032  very large files, old stuff, architecture-specific binaries, etc. They\n\
+      \032  can instruct Unison to ignore these paths using patterns introduced in\n\
+      \032  the section \"Path Patterns\" .\n\
+      \n\
+      \032  For example, the following pattern will make Unison ignore any path\n\
+      \032  containing the name CVS or a name ending in .cmo:\n\
+      \032            ignore = Name {CVS,*.cmo}\n\
+      \n\
+      \032  The next pattern makes Unison ignore the path a/b:\n\
+      \032            ignore = Path a/b\n\
+      \n\
+      \032  Path patterns do not skip filesnames beginning with . (as Name\n\
+      \032  patterns do). For example,\n\
+      \032            ignore = Path */tmp\n\
+      \n\
+      \032  will include .foo/tmp in the set of ignore directories, as it is a\n\
+      \032  path, not a name, that is ignored.\n\
+      \n\
+      \032  The following pattern makes Unison ignore any path beginning with a/b\n\
+      \032  and ending with a name ending by .ml.\n\
+      \032            ignore = Regex a/b/.*\\.ml\n\
+      \n\
+      \032  Note that regular expression patterns are \"anchored\": they must match\n\
+      \032  the whole path, not just a substring of the path.\n\
+      \n\
+      \032  Here are a few extra points regarding the ignore preference.\n\
+      \032    * If a directory is ignored, all its descendents will be too.\n\
+      \032    * The user interface provides some convenient commands for adding\n\
+      \032      new patterns to be ignored. To ignore a particular file, select it\n\
+      \032      and press \"i\". To ignore all files with the same extension, select\n\
+      \032      it and press \"E\" (with the shift key). To ignore all files with\n\
+      \032      the same name, no matter what directory they appear in, select it\n\
+      \032      and press \"N\". These new patterns become permanent: they are\n\
+      \032      immediately added to the current profile on disk.\n\
+      \032    * If you use the include directive to include a common collection of\n\
+      \032      preferences in several top-level preference files, you will\n\
+      \032      probably also want to set the addprefsto preference to the name of\n\
+      \032      this file. This will cause any new ignore patterns that you add\n\
+      \032      from inside Unison to be appended to this file, instead of\n\
+      \032      whichever top-level preference file you started Unison with.\n\
+      \032    * Ignore patterns can also be specified on the command line, if you\n\
+      \032      like (this is probably not very useful), using an option like\n\
+      \032      -ignore 'Name temp.txt'.\n\
+      \032    * Be careful about renaming directories containing ignored files.\n\
+      \032      Because Unison understands the rename as a delete plus a create,\n\
+      \032      any ignored files in the directory will be lost (since they are\n\
+      \032      invisible to Unison and therefore they do not get recreated in the\n\
+      \032      new version of the directory).\n\
+      \032    * There is also an ignorenot preference, which specifies a set of\n\
+      \032      patterns for paths that should not be ignored, even if they match\n\
+      \032      an ignore pattern. However, the interaction of these two sets of\n\
+      \032      patterns can be a little tricky. Here is exactly how it works:\n\
+      \032         + Unison starts detecting updates from the root of the\n\
+      \032           replicas--i.e., from the empty path. If the empty path\n\
+      \032           matches an ignore pattern and does not match an ignorenot\n\
+      \032           pattern, then the whole replica will be ignored. (For this\n\
+      \032           reason, it is not a good idea to include Name * as an ignore\n\
+      \032           pattern. If you want to ignore everything except a certain\n\
+      \032           set of files, use Name ?*.)\n\
+      \032         + If the root is a directory, Unison continues looking for\n\
+      \032           updates in all the immediate children of the root. Again, if\n\
+      \032           the name of some child matches an ignore pattern and does not\n\
+      \032           match an ignorenot pattern, then this whole path including\n\
+      \032           everything below it will be ignored.\n\
+      \032         + If any of the non-ignored children are directories, then the\n\
+      \032           process continues recursively.\n\
+      \n\
+      Symbolic Links\n\
+      \n\
+      \032  Ordinarily, Unison treats symbolic links in Unix replicas as \"opaque\":\n\
+      \032  it considers the contents of the link to be just the string specifying\n\
+      \032  where the link points, and it will propagate changes in this string to\n\
+      \032  the other replica.\n\
+      \n\
+      \032  It is sometimes useful to treat a symbolic link \"transparently,\"\n\
+      \032  acting as though whatever it points to were physically in the replica\n\
+      \032  at the point where the symbolic link appears. To tell Unison to treat\n\
+      \032  a link in this manner, add a line of the form\n\
+      \032            follow = pathspec\n\
+      \n\
+      \032  to the profile, where pathspec is a path pattern as described in the\n\
+      \032  section \"Path Patterns\" .\n\
+      \n\
+      \032  Windows file systems do not support symbolic links; Unison will refuse\n\
+      \032  to propagate an opaque symbolic link from Unix to Windows and flag the\n\
+      \032  path as erroneous. When a Unix replica is to be synchronized with a\n\
+      \032  Windows system, all symbolic links should match either an ignore\n\
+      \032  pattern or a follow pattern.\n\
+      \n\
+      Permissions\n\
+      \n\
+      \032  Synchronizing the permission bits of files is slightly tricky when two\n\
+      \032  different filesytems are involved (e.g., when synchronizing a Windows\n\
+      \032  client and a Unix server). In detail, here's how it works:\n\
+      \032    * When the permission bits of an existing file or directory are\n\
+      \032      changed, the values of those bits that make sense on both\n\
+      \032      operating systems will be propagated to the other replica. The\n\
+      \032      other bits will not be changed.\n\
+      \032    * When a newly created file is propagated to a remote replica, the\n\
+      \032      permission bits that make sense in both operating systems are also\n\
+      \032      propagated. The values of the other bits are set to default values\n\
+      \032      (they are taken from the current umask, if the receiving host is a\n\
+      \032      Unix system).\n\
+      \032    * For security reasons, the Unix setuid and setgid bits are not\n\
+      \032      propagated.\n\
+      \032    * The Unix owner and group ids are not propagated. (What would this\n\
+      \032      mean, in general?) All files are created with the owner and group\n\
+      \032      of the server process.\n\
+      \n\
+      Cross-Platform Synchronization\n\
+      \n\
+      \032  If you use Unison to synchronize files between Windows and Unix\n\
+      \032  systems, there are a few special issues to be aware of.\n\
+      \n\
+      \032  Case conflicts. In Unix, filenames are case sensitive: foo and FOO can\n\
+      \032  refer to different files. In Windows, on the other hand, filenames are\n\
+      \032  not case sensitive: foo and FOO can only refer to the same file. This\n\
+      \032  means that a Unix foo and FOO cannot be synchronized onto a Windows\n\
+      \032  system -- Windows won't allow two different files to have the \"same\"\n\
+      \032  name. Unison detects this situation for you, and reports that it\n\
+      \032  cannot synchronize the files.\n\
+      \n\
+      \032  You can deal with a case conflict in a couple of ways. If you need to\n\
+      \032  have both files on the Windows system, your only choice is to rename\n\
+      \032  one of the Unix files to avoid the case conflict, and re-synchronize.\n\
+      \032  If you don't need the files on the Windows system, you can simply\n\
+      \032  disregard Unison's warning message, and go ahead with the\n\
+      \032  synchronization; Unison won't touch those files. If you don't want to\n\
+      \032  see the warning on each synchronization, you can tell Unison to ignore\n\
+      \032  the files (see the section \"Ignore\" ).\n\
+      \n\
+      \032  Illegal filenames. Unix allows some filenames that are illegal in\n\
+      \032  Windows. For example, colons (`:') are not allowed in Windows\n\
+      \032  filenames, but they are legal in Unix filenames. This means that a\n\
+      \032  Unix file foo:bar can't be synchronized to a Windows system. As with\n\
+      \032  case conflicts, Unison detects this situation for you, and you have\n\
+      \032  the same options: you can either rename the Unix file and\n\
+      \032  re-synchronize, or you can ignore it.\n\
+      \n\
+      Slow Links\n\
+      \n\
+      \032  Unison is built to run well even over relatively slow links such as\n\
+      \032  modems and DSL connections.\n\
+      \n\
+      \032  Unison uses the \"rsync protocol\" designed by Andrew Tridgell and Paul\n\
+      \032  Mackerras to greatly speed up transfers of large files in which only\n\
+      \032  small changes have been made. More information about the rsync\n\
+      \032  protocol can be found at the rsync web site\n\
+      \032  (http://samba.anu.edu.au/rsync/).\n\
+      \n\
+      \032  If you are using Unison with ssh, you may get some speed improvement\n\
+      \032  by enabling ssh's compression feature. Do this by adding the option\n\
+      \032  \"-rshargs -C\" to the command line or \"rshargs = -C\" to your profile.\n\
+      \n\
+      Making Unison Faster on Large Files\n\
+      \n\
+      \032  Unison's built-in implementation of the rsync algorithm makes\n\
+      \032  transferring updates to existing files pretty fast. However, for\n\
+      \032  whole-file copies of newly created files, the built-in transfer method\n\
+      \032  is not highly optimized. Also, if Unison is interrupted in the middle\n\
+      \032  of transferring a large file, it will attempt to retransfer the whole\n\
+      \032  thing on the next run.\n\
+      \n\
+      \032  These shortcomings can be addressed with a little extra work by\n\
+      \032  telling Unison to use an external file copying utility for whole-file\n\
+      \032  transfers. The recommended one is the standalone rsync tool, which is\n\
+      \032  available by default on most Unix systems and can easily be installed\n\
+      \032  on Windows systems using Cygwin.\n\
+      \n\
+      \032  If you have rsync installed on both hosts, you can make Unison use it\n\
+      \032  simply by setting the copythreshold flag to something non-negative. If\n\
+      \032  you set it to 0, Unison will use the external copy utility for all\n\
+      \032  whole-file transfers. (This is probably slower than letting Unison\n\
+      \032  copy small files by itself, but can be useful for testing.) If you set\n\
+      \032  it to a larger value, Unison will use the external utility for all\n\
+      \032  files larger than this size (which is given in kilobytes, so setting\n\
+      \032  it to 1000 will cause the external tool to be used for all transfers\n\
+      \032  larger than a megabyte).\n\
+      \n\
+      \032  If you want to use a different external copy utility, set both the\n\
+      \032  copyprog and copyprogpartial preferences--the former is used for the\n\
+      \032  first transfer of a file, while the latter is used when Unison sees a\n\
+      \032  partially transferred temp file on the receiving host. Be careful\n\
+      \032  here: Your external tool needs to be instructed to copy files in place\n\
+      \032  (otherwise if the transfer is interrupted Unison will not notice that\n\
+      \032  some of the data has already been transferred, the next time it\n\
+      \032  tries). The default values are:\n\
+      \032  copyprog      =   rsync --inplace --compress\n\
+      \032  copyprogrest  =   rsync --partial --inplace --compress\n\
+      \n\
+      \032  You may also need to set the copyquoterem preference. When it is set\n\
+      \032  to true, this causes Unison to add an extra layer of quotes to the\n\
+      \032  remote path passed to the external copy program. This is is needed by\n\
+      \032  rsync, for example, which internally uses an ssh connection, requiring\n\
+      \032  an extra level of quoting for paths containing spaces. When this flag\n\
+      \032  is set to default, extra quotes are added if the value of copyprog\n\
+      \032  contains the string rsync. The default value is default, naturally.\n\
+      \n\
+      \032  If a directory transfer is interrupted, the next run of Unison will\n\
+      \032  automatically skip any files that were completely transferred before\n\
+      \032  the interruption. (This behavior is always on: it does not depend on\n\
+      \032  the setting of the copythreshold preference.) Note, though, that the\n\
+      \032  new directory will not appear in the destination filesystem until\n\
+      \032  everything has been transferred--partially transferred directories are\n\
+      \032  kept in a temporary location (with names like .unison.DIRNAME....)\n\
+      \032  until the transfer is complete.\n\
+      \n\
+      Fast Update Detection\n\
+      \n\
+      \032  If your replicas are large and at least one of them is on a Windows\n\
+      \032  system, you may find that Unison's default method for detecting\n\
+      \032  changes (which involves scanning the full contents of every file on\n\
+      \032  every sync--the only completely safe way to do it under Windows) is\n\
+      \032  too slow. Unison provides a preference fastcheck that, when set to\n\
+      \032  true, causes it to use file creation times as 'pseudo inode numbers'\n\
+      \032  when scanning replicas for updates, instead of reading the full\n\
+      \032  contents of every file.\n\
+      \n\
+      \032  When fastcheck is set to no, Unison will perform slow\n\
+      \032  checking--re-scanning the contents of each file on each\n\
+      \032  synchronization--on all replicas. When fastcheck is set to default\n\
+      \032  (which, naturally, is the default), Unison will use fast checks on\n\
+      \032  Unix replicas and slow checks on Windows replicas.\n\
+      \n\
+      \032  This strategy may cause Unison to miss propagating an update if the\n\
+      \032  modification time and length of the file are both unchanged by the\n\
+      \032  update. However, Unison will never overwrite such an update with a\n\
+      \032  change from the other replica, since it always does a safe check for\n\
+      \032  updates just before propagating a change. Thus, it is reasonable to\n\
+      \032  use this switch most of the time and occasionally run Unison once with\n\
+      \032  fastcheck set to no, if you are worried that Unison may have\n\
+      \032  overlooked an update.\n\
+      \n\
+      \032  Fastcheck is (always) automatically disabled for files with extension\n\
+      \032  .xls or .mpp, to prevent Unison from being confused by the habits of\n\
+      \032  certain programs (Excel, in particular) of updating files without\n\
+      \032  changing their modification times.\n\
+      \n\
+      Mount Points and Removable Media\n\
+      \n\
+      \032  Using Unison removable media such as USB drives can be dangerous\n\
+      \032  unless you are careful. If you synchronize a directory that is stored\n\
+      \032  on removable media when the media is not present, it will look to\n\
+      \032  Unison as though the whole directory has been deleted, and it will\n\
+      \032  proceed to delete the directory from the other replica--probably not\n\
+      \032  what you want!\n\
+      \n\
+      \032  To prevent accidents, Unison provides a preference called mountpoint.\n\
+      \032  Including a line like\n\
+      \032            mountpoint = foo\n\
+      \n\
+      \032  in your preference file will cause Unison to check, after it finishes\n\
+      \032  detecting updates, that something actually exists at the path foo on\n\
+      \032  both replicas; if it does not, the Unison run will abort.\n\
+      \n\
+      Click-starting Unison\n\
+      \n\
+      \032  On Windows NT/2k/XP systems, the graphical version of Unison can be\n\
+      \032  invoked directly by clicking on its icon. On Windows 95/98 systems,\n\
+      \032  click-starting also works, as long as you are not using ssh. Due to an\n\
+      \032  incompatibility with ocaml and Windows 95/98 that is not under our\n\
+      \032  control, you must start Unison from a DOS window in Windows 95/98 if\n\
+      \032  you want to use ssh.\n\
+      \n\
+      \032  When you click on the Unison icon, two windows will be created:\n\
+      \032  Unison's regular window, plus a console window, which is used only for\n\
+      \032  giving your password to ssh (if you do not use ssh to connect, you can\n\
+      \032  ignore this window). When your password is requested, you'll need to\n\
+      \032  activate the console window (e.g., by clicking in it) before typing.\n\
+      \032  If you start Unison from a DOS window, Unison's regular window will\n\
+      \032  appear and you will type your password in the DOS window you were\n\
+      \032  using.\n\
+      \n\
+      \032  To use Unison in this mode, you must first create a profile (see the\n\
+      \032  section \"Profile\" ). Use your favorite editor for this.\n\
+      \n\
+      "))
+::
+    ("ssh", ("Installing Ssh", 
+     "Installing Ssh\n\
+      \n\
+      \032  Warning: These instructions may be out of date. More current\n\
+      \032  information can be found the Unison Wiki\n\
+      \032  (http://alliance.seas.upenn.edu/ bcpierce/wiki/index.php?n=Main.Unison\n\
+      \032  FAQOSSpecific).\n\
+      \n\
+      \032  Your local host will need just an ssh client; the remote host needs an\n\
+      \032  ssh server (or daemon), which is available on Unix systems. Unison is\n\
+      \032  known to work with ssh version 1.2.27 (Unix) and version 1.2.14\n\
+      \032  (Windows); other versions may or may not work.\n\
+      \n\
+      Unix\n\
+      \n\
+      \032  Most modern Unix installations come with ssh pre-installed.\n\
+      \n\
+      Windows\n\
+      \n\
+      \032  Many Windows implementations of ssh only provide graphical interfaces,\n\
+      \032  but Unison requires an ssh client that it can invoke with a\n\
+      \032  command-line interface. A suitable version of ssh can be installed as\n\
+      \032  follows.\n\
+      \032   1. Download an ssh executable.\n\
+      \032      Warning: there are many implementations and ports of ssh for\n\
+      \032      Windows, and not all of them will work with Unison. We have gotten\n\
+      \032      Unison to work with Cygwin's port of openssh, and we suggest you\n\
+      \032      try that one first. Here's how to install it:\n\
+      \032        a. First, create a new folder on your desktop to hold temporary\n\
+      \032           installation files. It can have any name you like, but in\n\
+      \032           these instructions we'll assume that you call it Foo.\n\
+      \032        b. Direct your web browser to www.cygwin.com, and click on the\n\
+      \032           \"Install now!\" link. This will download a file, setup.exe;\n\
+      \032           save it in the directory Foo. The file setup.exe is a small\n\
+      \032           program that will download the actual install files from the\n\
+      \032           Internet when you run it.\n\
+      \032        c. Start setup.exe (by double-clicking). This brings up a series\n\
+      \032           of dialogs that you will have to go through. Select \"Install\n\
+      \032           from Internet.\" For \"Local Package Directory\" select the\n\
+      \032           directory Foo. For \"Select install root directory\" we\n\
+      \032           recommend that you use the default, C:\\cygwin. The next\n\
+      \032           dialog asks you to select the way that you want to connect to\n\
+      \032           the network to download the installation files; we have used\n\
+      \032           \"Use IE5 Settings\" successfully, but you may need to make a\n\
+      \032           different selection depending on your networking setup. The\n\
+      \032           next dialog gives a list of mirrors; select one close to you.\n\
+      \032           Next you are asked to select which packages to install. The\n\
+      \032           default settings in this dialog download a lot of packages\n\
+      \032           that are not strictly necessary to run Unison with ssh. If\n\
+      \032           you don't want to install a package, click on it until \"skip\"\n\
+      \032           is shown. For a minimum installation, select only the\n\
+      \032           packages \"cygwin\" and \"openssh,\" which come to about 1900KB;\n\
+      \032           the full installation is much larger.\n\
+      \n\
+      \032    Note that you are plan to build unison using the free CygWin GNU C\n\
+      \032    compiler, you need to install essential development packages such\n\
+      \032    as \"gcc\", \"make\", \"fileutil\", etc; we refer to the file\n\
+      \032    \"INSTALL.win32-cygwin-gnuc\" in the source distribution for further\n\
+      \032    details. \n\
+      \032           After the packages are downloaded and installed, the next\n\
+      \032           dialog allows you to choose whether to \"Create Desktop Icon\"\n\
+      \032           and \"Add to Start Menu.\" You make the call.\n\
+      \032        d. You can now delete the directory Foo and its contents.\n\
+      \032      Some people have reported problems using Cygwin's ssh with Unison.\n\
+      \032      If you have trouble, you might try this one instead:\n\
+      \032 http://opensores.thebunker.net/pub/mirrors/ssh/contrib/ssh-1.2.14-win32bin.zi\n\
+      p\n\
+      \032   2. You must set the environment variables HOME and PATH. Ssh will\n\
+      \032      create a directory .ssh in the directory given by HOME, so that it\n\
+      \032      has a place to keep data like your public and private keys. PATH\n\
+      \032      must be set to include the Cygwin bin directory, so that Unison\n\
+      \032      can find the ssh executable.\n\
+      \032         + On Windows 95/98, add the lines\n\
+      \032   set PATH=%PATH%;<SSHDIR>\n\
+      \032   set HOME=<HOMEDIR>\n\
+      \032           to the file C:\\AUTOEXEC.BAT, where <HOMEDIR> is the directory\n\
+      \032           where you want ssh to create its .ssh directory, and <SSHDIR>\n\
+      \032           is the directory where the executable ssh.exe is stored; if\n\
+      \032           you've installed Cygwin in the default location, this is\n\
+      \032           C:\\cygwin\\bin. You will have to reboot your computer to take\n\
+      \032           the changes into account.\n\
+      \032         + On Windows NT/2k/XP, open the environment variables dialog\n\
+      \032           box:\n\
+      \032              o Windows NT: My Computer/Properties/Environment\n\
+      \032              o Windows 2k: My Computer/Properties/Advanced/Environment\n\
+      \032                variables\n\
+      \032           then select Path and edit its value by appending ;<SSHDIR> to\n\
+      \032           it, where <SSHDIR> is the full name of the directory that\n\
+      \032           includes the ssh executable; if you've installed Cygwin in\n\
+      \032           the default location, this is C:\\cygwin\\bin.\n\
+      \032   3. Test ssh from a DOS shell by typing\n\
+      \032     ssh <remote host> -l <login name>\n\
+      \032      You should get a prompt for your password on <remote host>,\n\
+      \032      followed by a working connection.\n\
+      \032   4. Note that ssh-keygen may not work (fails with \"gethostname: no\n\
+      \032      such file or directory\") on some systems. This is OK: you can use\n\
+      \032      ssh with your regular password for the remote system.\n\
+      \032   5. You should now be able to use Unison with an ssh connection. If\n\
+      \032      you are logged in with a different user name on the local and\n\
+      \032      remote hosts, provide your remote user name when providing the\n\
+      \032      remote root (i.e., //username at host/path...).\n\
+      \n\
+      "))
+::
+    ("news", ("Changes in Version 2.40.1", 
+     "Changes in Version 2.40.1\n\
+      \n\
+      \032  Changes since 2.32:\n\
+      \032    * Major enhancement: Unicode support.\n\
+      \032         + Unison should now handle unicode filenames correctly on all\n\
+      \032           platforms.\n\
+      \032         + This functionality is controlled by a new preference unicode.\n\
+      \032         + Unicode mode is now the default when one of the hosts is\n\
+      \032           under Windows or MacOS. This may make upgrades a bit more\n\
+      \032           painful (the archives cannot be reused), but this is a much\n\
+      \032           saner default.\n\
+      \032    * Partial transfer of directories. If an error occurs while\n\
+      \032      transferring a directory, the part transferred so far is copied\n\
+      \032      into place (and the archives are updated accordingly). The\n\
+      \032      \"maxerrors\" preference controls how many transfer error Unison\n\
+      \032      will accept before stopping the transfer of a directory (by\n\
+      \032      default, only one). This makes it possible to transfer most of a\n\
+      \032      directory even if there are some errors. Currently, only the first\n\
+      \032      error is reported by the GUIs.\n\
+      \032      Also, allow partial transfer of a directory when there was an\n\
+      \032      error deep inside this directory during update detection. At the\n\
+      \032      moment, this is only activated with the text and GTK UIs, which\n\
+      \032      have been modified so that they show that the transfer is going to\n\
+      \032      be partial and so that they can display all errors.\n\
+      \032    * Improvement to the code for resuming directory transfers:\n\
+      \032         + if a file was not correctly transferred (or the source has\n\
+      \032           been modified since, with unchanged size), Unison performs a\n\
+      \032           new transfer rather than failing\n\
+      \032         + spurious files are deleted (this can happen if a file is\n\
+      \032           deleted on the source replica before resuming the transfer;\n\
+      \032           not deleting the file would result in it reappearing on the\n\
+      \032           target replica)\n\
+      \032    * Experimental streaming protocol for transferring file contents\n\
+      \032      (can be disabled by setting the directive \"stream\" to false): file\n\
+      \032      contents is transfered asynchronously (without waiting for a\n\
+      \032      response from the destination after each chunk sent) rather than\n\
+      \032      using the synchronous RPC mechanism. As a consequence:\n\
+      \032         + Unison now transfers the contents of a single file at a time\n\
+      \032           (Unison used to transfer several contents simultaneously in\n\
+      \032           order to hide the connection latency.)\n\
+      \032         + the transfer of large files uses the full available bandwidth\n\
+      \032           and is not slowed done due to the connection latency anymore\n\
+      \032         + we get performance improvement for small files as well by\n\
+      \032           scheduling many files simultaneously (as scheduling a file\n\
+      \032           for transfer consume little ressource: it does not mean\n\
+      \032           allocating a large buffer anymore)\n\
+      \032    * Changes to the internal implementation of the rsync algorithm:\n\
+      \032         + use longer blocks for large files (the size of a block is the\n\
+      \032           square root of the size of the file for large files);\n\
+      \032         + transmit less checksum information per block (we still have\n\
+      \032           less than one chance in a hundred million of transferring a\n\
+      \032           file incorrectly, and Unison will catch any transfer error\n\
+      \032           when fingerprinting the whole file)\n\
+      \032         + avoid transfer overhead (which was 4 bytes per block)\n\
+      \032      For a 1G file, the first optimization saves a factor 50 on the\n\
+      \032      amount of data transferred from the target to the source (blocks\n\
+      \032      are 32768 bytes rather than just 700 bytes). The two other\n\
+      \032      optimizations save another factor of 2 (from 24 bytes per block\n\
+      \032      down to 10).\n\
+      \032    * Implemented an on-disk file fingerprint cache to speed-up update\n\
+      \032      detection after a crash: this way, Unison does not have do\n\
+      \032      recompute all the file fingerprints from scratch.\n\
+      \032         + When Unison detects that the archive case-sensitivity mode\n\
+      \032           does not match the current settings, it populates the\n\
+      \032           fingerprint cache using the archive contents. This way,\n\
+      \032           changing the case-sensitivity mode should be reasonably fast.\n\
+      \032    * New preferences \"noupdate=root\", \"nodeletion=root\",\n\
+      \032      \"nocreation=root\" that prevent Unison from performing files\n\
+      \032      updates, deletions or creations on the given root. Also 'partial'\n\
+      \032      versions of 'noupdate', 'nodeletion' and 'nocreation'\n\
+      \032    * Limit the number of simultaneous external copy program (\"copymax\"\n\
+      \032      preference)\n\
+      \032    * New \"links\" preference. When set to false, Unison will report an\n\
+      \032      error on symlinks during update detection. (This is the default\n\
+      \032      when one host is running Windows but not Cygwin.) This is better\n\
+      \032      than failing during propagation.\n\
+      \032    * Added a preference \"halfduplex\" to force half-duplex communication\n\
+      \032      with the server. This may be useful on unreliable links (as a more\n\
+      \032      efficient alternative to \"maxthreads = 1\").\n\
+      \032    * Renamed preference \"pretendwin\" to \"ignoreinodenumbers\" (an alias\n\
+      \032      is kept for backwards compatibility).\n\
+      \032    * Ignore one-second differences when synchronizing modification\n\
+      \032      time. (Technically, this is an incompatible archive format change,\n\
+      \032      but it is backward compatible. To trigger a problem, a user would\n\
+      \032      have to synchronize modification times on a filesystem with a\n\
+      \032      two-second granularity and then downgrade to a previous version of\n\
+      \032      Unison, which does not work well in such a case. Thus, it does not\n\
+      \032      seem worthwhile to increment the archive format number, which\n\
+      \032      would impact all users.)\n\
+      \032    * Do not keep many files simultaneously opened anymore when the\n\
+      \032      rsync algorithm is in use.\n\
+      \032    * Add \"ignorearchives\" preference to ignore existing archives (to\n\
+      \032      avoid forcing users to delete them manually, in situations where\n\
+      \032      one archive has gotten deleted or corrupted).\n\
+      \032    * Mac OS\n\
+      \032         + fixed rsync bug which could result in an \"index out of\n\
+      \032           bounds\" error when transferring resource forks.\n\
+      \032         + Fixed bug which made Unison ignore finder information and\n\
+      \032           resource fork when compiled to 64bit on Mac OSX.\n\
+      \032         + should now be 64 bit clean (the Growl framework is not up to\n\
+      \032           date, though)\n\
+      \032         + Made the bridge between Objective C and Ocaml code GC\n\
+      \032           friendly (it was allocating ML values and putting them in an\n\
+      \032           array which was not registered with the GC)\n\
+      \032         + use darker grey arrows (patch contributed by Eric Y. Kow)\n\
+      \032    * GTK user interface\n\
+      \032         + assistant for creating profiles\n\
+      \032         + profile editor\n\
+      \032         + pop up a summary window when the replicas are not fully\n\
+      \032           synchronized after transport\n\
+      \032         + display estimated remaining time and transfer rate on the\n\
+      \032           progress bar\n\
+      \032         + allow simultaneous selection of several items\n\
+      \032         + Do not reload the preference file before a new update\n\
+      \032           detection if it is unchanged\n\
+      \032         + disabled scrolling to the first unfinished item during\n\
+      \032           transport. It goes way too fast when lot of small files are\n\
+      \032           synchronized, and it makes it impossible to browse the file\n\
+      \032           list during transport.\n\
+      \032         + take into account the \"height\" preference again\n\
+      \032         + the internal list of selected reconciler item was not always\n\
+      \032           in sync with what was displayed (GTK bug?); workaround\n\
+      \032           implemented\n\
+      \032         + Do not display \"Looking for change\" messages during\n\
+      \032           propagation (when checking the targe is unchanged) but only\n\
+      \032           during update detection\n\
+      \032         + Apply patch to fix some crashes in the OSX GUI, thanks to\n\
+      \032           Onne Gorter.\n\
+      \032    * Text UI\n\
+      \032         + During update detection, display status by updating a single\n\
+      \032           line rather than generating a new line of output every so\n\
+      \032           often. Should be less confusing.\n\
+      \032    * Windows\n\
+      \032         + Fastcheck is now the default under Windows. People mostly use\n\
+      \032           NTFS nowadays and the Unicode API provides an equivalent to\n\
+      \032           inode numbers for this filesystem.\n\
+      \032         + Only use long UNC path for accessing replicas (as '..' is not\n\
+      \032           handled with this format of paths, but can be useful)\n\
+      \032         + Windows text UI: now put the console into UTF-8 output mode.\n\
+      \032           This is the right thing to do when in Unicode mode, and is no\n\
+      \032           worse than what we had previously otherwise (the console use\n\
+      \032           some esoteric encoding by default). This only works when\n\
+      \032           using a Unicode font instead of the default raster font.\n\
+      \032         + Don't get the home directory from environment variable HOME\n\
+      \032           under Windows (except for Cygwin binaries): we don't want the\n\
+      \032           behavior of Unison to depends on whether it is run from a\n\
+      \032           Cygwin shell (where HOME is set) or in any other way (where\n\
+      \032           HOME is usually not set).\n\
+      \032    * Miscellaneous fixes and improvements\n\
+      \032         + Made a server waiting on a socket more resilient to\n\
+      \032           unexpected lost connections from the client.\n\
+      \032         + Small patch to property setting code suggested by Ulrich\n\
+      \032           Gernkow.\n\
+      \032         + Several fixes to the change transfer functions (both the\n\
+      \032           internal ones and external transfers using rsync). In\n\
+      \032           particular, limit the number of simultaneous transfer using\n\
+      \032           an rsync (as the rsync algorithm can use a large amount of\n\
+      \032           memory when processing huge files)\n\
+      \032         + Keep track of which file contents are being transferred, and\n\
+      \032           delay the transfer of a file when another file with the same\n\
+      \032           contents is currently being transferred. This way, the second\n\
+      \032           transfer can be skipped and replaced by a local copy.\n\
+      \032         + Experimental update detection optimization: do not read the\n\
+      \032           contents of unchanged directories\n\
+      \032         + When a file transfer fails, turn off fastcheck for this file\n\
+      \032           on the next sync.\n\
+      \032         + Fixed bug with case insensitive mode on a case sensitive\n\
+      \032           filesystem:\n\
+      \032              o if file \"a/a\" is created on one replica and directory\n\
+      \032                \"A\" is created on the other, the file failed to be\n\
+      \032                synchronized the first time Unison is run afterwards, as\n\
+      \032                Unison uses the wrong path \"a/a\" (if Unison is run\n\
+      \032                again, the directories are in the archive, so the right\n\
+      \032                path is used);\n\
+      \032              o if file \"a\" appears on one replica and file \"A\" appears\n\
+      \032                on the other with different contents, Unison was unable\n\
+      \032                to synchronize them.\n\
+      \032         + Improved error reporting when the destination is updated\n\
+      \032           during synchronization: Unison now tells which file has been\n\
+      \032           updated, and how.\n\
+      \032         + Limit the length of temporary file names\n\
+      \032         + Case sensitivity information put in the archive (in a\n\
+      \032           backward compatible way) and checked when the archive is\n\
+      \032           loaded\n\
+      \032         + Got rid of the 16mb marshalling limit by marshalling to a\n\
+      \032           bigarray.\n\
+      \032         + Resume copy of partially transferred files.\n\
+      \n\
+      \032  Changes since 2.31:\n\
+      \032    * Small user interface changes\n\
+      \032         + Small change to text UI \"scanning...\" messages, to print just\n\
+      \032           directories (hopefully making it clearer that individual\n\
+      \032           files are not necessarily being fingerprinted).\n\
+      \032    * Minor fixes and improvements:\n\
+      \032         + Ignore one hour differences when deciding whether a file may\n\
+      \032           have been updated. This avoids slow update detection after\n\
+      \032           daylight saving time changes under Windows. This makes Unison\n\
+      \032           slightly more likely to miss an update, but it should be safe\n\
+      \032           enough.\n\
+      \032         + Fix a small bug that was affecting mainly windows users. We\n\
+      \032           need to commit the archives at the end of the sync even if\n\
+      \032           there are no updates to propagate because some files (in\n\
+      \032           fact, if we've just switched to DST on windows, a LOT of\n\
+      \032           files) might have new modtimes in the archive. (Changed the\n\
+      \032           text UI only. It's less clear where to change the GUI.)\n\
+      \032         + Don't delete the temp file when a transfer fails due to a\n\
+      \032           fingerprint mismatch (so that we can have a look and see\n\
+      \032           why!) We've also added more debugging code togive more\n\
+      \032           informative error messages when we encounter the dreaded and\n\
+      \032           longstanding \"assert failed during file transfer\" bug\n\
+      \032         + Incorrect paths (\"path\" directive) now result in an error\n\
+      \032           update item rather than a fatal error.\n\
+      \032         + Create parent directories (with correct permissions) during\n\
+      \032           transport for paths which point to non-existent locations in\n\
+      \032           the destination replica.\n\
+      \n\
+      \032  Changes since 2.27:\n\
+      \032    * If Unison is interrupted during a directory transfer, it will now\n\
+      \032      leave the partially transferred directory intact in a temporary\n\
+      \032      location. (This maintains the invariant that new files/directories\n\
+      \032      are transferred either completely or not at all.) The next time\n\
+      \032      Unison is run, it will continue filling in this temporary\n\
+      \032      directory, skipping transferring files that it finds are already\n\
+      \032      there.\n\
+      \032    * We've added experimental support for invoking an external file\n\
+      \032      transfer tool for whole-file copies instead of Unison's built-in\n\
+      \032      transfer protocol. Three new preferences have been added:\n\
+      \032         + copyprog is a string giving the name (and command-line\n\
+      \032           switches, if needed) of an external program that can be used\n\
+      \032           to copy large files efficiently. By default, rsync is\n\
+      \032           invoked, but other tools such as scp can be used instead by\n\
+      \032           changing the value of this preference. (Although this is not\n\
+      \032           its primary purpose, rsync is actually a pretty fast way of\n\
+      \032           copying files that don't already exist on the receiving\n\
+      \032           host.) For files that do already exist on (but that have been\n\
+      \032           changed in one replica), Unison will always use its built-in\n\
+      \032           implementation of the rsync algorithm.\n\
+      \032         + Added a \"copyprogrest\" preference, so that we can give\n\
+      \032           different command lines for invoking the external copy\n\
+      \032           utility depending on whether a partially transferred file\n\
+      \032           already exists or not. (Rsync doesn't seem to care about\n\
+      \032           this, but other utilities may.)\n\
+      \032         + copythreshold is an integer (-1 by default), indicating above\n\
+      \032           what filesize (in megabytes) Unison should use the external\n\
+      \032           copying utility specified by copyprog. Specifying 0 will\n\
+      \032           cause ALL copies to use the external program; a negative\n\
+      \032           number will prevent any files from using it. (Default is -1.)\n\
+      \032      Thanks to Alan Schmitt for a huge amount of hacking and to an\n\
+      \032      anonymous sponsor for suggesting and underwriting this extension.\n\
+      \032    * Small improvements:\n\
+      \032         + Added a new preference, dontchmod. By default, Unison uses\n\
+      \032           the chmod system call to set the permission bits of files\n\
+      \032           after it has copied them. But in some circumstances (and\n\
+      \032           under some operating systems), the chmod call always fails.\n\
+      \032           Setting this preference completely prevents Unison from ever\n\
+      \032           calling chmod.\n\
+      \032         + Don't ignore files that look like backup files if the\n\
+      \032           backuplocation preference is set to central\n\
+      \032         + Shortened the names of several preferences. The old names are\n\
+      \032           also still supported, for backwards compatibility, but they\n\
+      \032           do not appear in the documentation.\n\
+      \032         + Lots of little documentation tidying. (In particular,\n\
+      \032           preferences are separated into Basic and Advanced! This\n\
+      \032           should hopefully make Unison a little more approachable for\n\
+      \032           new users.\n\
+      \032         + Unison can sometimes fail to transfer a file, giving the\n\
+      \032           unhelpful message \"Destination updated during\n\
+      \032           synchronization\" even though the file has not been changed.\n\
+      \032           This can be caused by programs that change either the file's\n\
+      \032           contents or the file's extended attributes without changing\n\
+      \032           its modification time. It's not clear what is the best fix\n\
+      \032           for this - it is not Unison's fault, but it makes Unison's\n\
+      \032           behavior puzzling - but at least Unison can be more helpful\n\
+      \032           about suggesting a workaround (running once with fastcheck\n\
+      \032           set to false). The failure message has been changed to give\n\
+      \032           this advice.\n\
+      \032         + Further improvements to the OS X GUI (thanks to Alan Schmitt\n\
+      \032           and Craig Federighi).\n\
+      \032    * Very preliminary support for triggering Unison from an external\n\
+      \032      filesystem-watching utility. The current implementation is very\n\
+      \032      simple, not efficient, and almost completely untested--not ready\n\
+      \032      for real users. But if someone wants to help improve it (e.g., by\n\
+      \032      writing a filesystem watcher for your favorite OS), please make\n\
+      \032      yourself known!\n\
+      \032      On the Unison side, the new behavior is very simple:\n\
+      \032         + use the text UI\n\
+      \032         + start Unison with the command-line flag \"-repeat FOO\", where\n\
+      \032           FOO is name of a file where Unison should look for\n\
+      \032           notifications of changes\n\
+      \032         + when it starts up, Unison will read the whole contents of\n\
+      \032           this file (on both hosts), which should be a\n\
+      \032           newline-separated list of paths (relative to the root of the\n\
+      \032           synchronization) and synchronize just these paths, as if it\n\
+      \032           had been started with the \"-path=xxx\" option for each one of\n\
+      \032           them\n\
+      \032         + when it finishes, it will sleep for a few seconds and then\n\
+      \032           examine the watchfile again; if anything has been added, it\n\
+      \032           will read the new paths, synchronize them, and go back to\n\
+      \032           sleep\n\
+      \032         + that's it!\n\
+      \032      To use this to drive Unison \"incrementally,\" just start it in this\n\
+      \032      mode and start up a tool (on each host) to watch for new changes\n\
+      \032      to the filesystem and append the appropriate paths to the\n\
+      \032      watchfile. Hopefully such tools should not be too hard to write.\n\
+      \032    * Bug fixes:\n\
+      \032         + Fixed a bug that was causing new files to be created with\n\
+      \032           permissions 0x600 instead of using a reasonable default (like\n\
+      \032           0x644), if the 'perms' flag was set to 0. (Bug reported by\n\
+      \032           Ben Crowell.)\n\
+      \032         + Follow maxthreads preference when transferring directories.\n\
+      \n\
+      \032  Changes since 2.17:\n\
+      \032    * Major rewrite and cleanup of the whole Mac OS X graphical user\n\
+      \032      interface by Craig Federighi. Thanks, Craig!!!\n\
+      \032    * Small fix to ctime (non-)handling in update detection under\n\
+      \032      windows with fastcheck.\n\
+      \032    * Several small fixes to the GTK2 UI to make it work better under\n\
+      \032      Windows [thanks to Karl M for these].\n\
+      \032    * The backup functionality has been completely rewritten. The\n\
+      \032      external interface has not changed, but numerous bugs, irregular\n\
+      \032      behaviors, and cross-platform inconsistencies have been corrected.\n\
+      \032    * The Unison project now accepts donations via PayPal. If you'd like\n\
+      \032      to donate, you can find a link to the donation page on the Unison\n\
+      \032      home page (http://www.cis.upenn.edu/ bcpierce/unison/lists.html).\n\
+      \032    * Some important safety improvements:\n\
+      \032         + Added a new mountpoint preference, which can be used to\n\
+      \032           specify a path that must exist in both replicas at the end of\n\
+      \032           update detection (otherwise Unison aborts). This can be used\n\
+      \032           to avoid potentially dangerous situations when Unison is used\n\
+      \032           with removable media such as external hard drives and compact\n\
+      \032           flash cards.\n\
+      \032         + The confirmation of \"big deletes\" is now controlled by a\n\
+      \032           boolean preference confirmbigdeletes. Default is true, which\n\
+      \032           gives the same behavior as previously. (This functionality is\n\
+      \032           at least partly superceded by the mountpoint preference, but\n\
+      \032           it has been left in place in case it is useful to some\n\
+      \032           people.)\n\
+      \032         + If Unison is asked to \"follow\" a symbolic link but there is\n\
+      \032           nothing at the other end of the link, it will now flag this\n\
+      \032           path as an error, rather than treating the symlink itself as\n\
+      \032           missing or deleted. This avoids a potentially dangerous\n\
+      \032           situation where a followed symlink points to an external\n\
+      \032           filesystem that might be offline when Unison is run\n\
+      \032           (whereupon Unison would cheerfully delete the corresponding\n\
+      \032           files in the other replica!).\n\
+      \032    * Smaller changes:\n\
+      \032         + Added forcepartial and preferpartial preferences, which\n\
+      \032           behave like force and prefer but can be specified on a\n\
+      \032           per-path basis. [Thanks to Alan Schmitt for this.]\n\
+      \032         + A bare-bones self test feature was added, which runs unison\n\
+      \032           through some of its paces and checks that the results are as\n\
+      \032           expected. The coverage of the tests is still very limited,\n\
+      \032           but the facility has already been very useful in debugging\n\
+      \032           the new backup functionality (especially in exposing some\n\
+      \032           subtle cross-platform issues).\n\
+      \032         + Refined debugging code so that the verbosity of individual\n\
+      \032           modules can be controlled separately. Instead of just putting\n\
+      \032           '-debug verbose' on the command line, you can put '-debug\n\
+      \032           update+', which causes all the extra messages in the Update\n\
+      \032           module, but not other modules, to be printed. Putting '-debug\n\
+      \032           verbose' causes all modules to print with maximum verbosity.\n\
+      \032         + Removed mergebatch preference. (It never seemed very useful,\n\
+      \032           and its semantics were confusing.)\n\
+      \032         + Rewrote some of the merging functionality, for better\n\
+      \032           cooperation with external Harmony instances.\n\
+      \032         + Changed the temp file prefix from .# to .unison.\n\
+      \032         + Compressed the output from the text user interface\n\
+      \032           (particularly when run with the -terse flag) to make it\n\
+      \032           easier to interpret the results when Unison is run several\n\
+      \032           times in succession from a script.\n\
+      \032         + Diff and merge functions now work under Windows.\n\
+      \032         + Changed the order of arguments to the default diff command\n\
+      \032           (so that the + and - annotations in diff's output are\n\
+      \032           reversed).\n\
+      \032         + Added .mpp files to the \"never fastcheck\" list (like .xls\n\
+      \032           files).\n\
+      \032    * Many small bugfixes, including:\n\
+      \032         + Fixed a longstanding bug regarding fastcheck and daylight\n\
+      \032           saving time under Windows when Unison is set up to\n\
+      \032           synchronize modification times. (Modification times cannot be\n\
+      \032           updated in the archive in this case, so we have to ignore one\n\
+      \032           hour differences.)\n\
+      \032         + Fixed a bug that would occasionally cause the archives to be\n\
+      \032           left in non-identical states on the two hosts after\n\
+      \032           synchronization.\n\
+      \032         + Fixed a bug that prevented Unison from communicating\n\
+      \032           correctly between 32- and 64-bit architectures.\n\
+      \032         + On windows, file creation times are no longer used as a proxy\n\
+      \032           for inode numbers. (This is unfortunate, as it makes\n\
+      \032           fastcheck a little less safe. But it turns out that file\n\
+      \032           creation times are not reliable under Windows: if a file is\n\
+      \032           removed and a new file is created in its place, the new one\n\
+      \032           will sometimes be given the same creation date as the old\n\
+      \032           one!)\n\
+      \032         + Set read-only file to R/W on OSX before attempting to change\n\
+      \032           other attributes.\n\
+      \032         + Fixed bug resulting in spurious \"Aborted\" errors during\n\
+      \032           transport (thanks to Jerome Vouillon)\n\
+      \032         + Enable diff if file contents have changed in one replica, but\n\
+      \032           only properties in the other.\n\
+      \032         + Removed misleading documentation for 'repeat' preference.\n\
+      \032         + Fixed a bug in merging code where Unison could sometimes\n\
+      \032           deadlock with the external merge program, if the latter\n\
+      \032           produced large amounts of output.\n\
+      \032         + Workaround for a bug compiling gtk2 user interface against\n\
+      \032           current versions of gtk2+ libraries.\n\
+      \032         + Added a better error message for \"ambiguous paths\".\n\
+      \032         + Squashed a longstanding bug that would cause file transfer to\n\
+      \032           fail with the message \"Failed: Error in readWrite: Is a\n\
+      \032           directory.\"\n\
+      \032         + Replaced symlinks with copies of their targets in the Growl\n\
+      \032           framework in src/uimac. This should make the sources easier\n\
+      \032           to check out from the svn repository on WinXP systems.\n\
+      \032         + Added a workaround (suggested by Karl M.) for the problem\n\
+      \032           discussed on the unison users mailing list where, on the\n\
+      \032           Windows platform, the server would hang when transferring\n\
+      \032           files. I conjecture that the problem has to do with the RPC\n\
+      \032           mechanism, which was used to make a call back from the server\n\
+      \032           to the client (inside the Trace.log function) so that the log\n\
+      \032           message would be appended to the log file on the client. The\n\
+      \032           workaround is to dump these messages (about when\n\
+      \032           xferbycopying shortcuts are applied and whether they succeed)\n\
+      \032           just to the standard output of the Unison process, not to the\n\
+      \032           log file.\n\
+      \n\
+      \032  Changes since 2.13.0:\n\
+      \032    * The features for performing backups and for invoking external\n\
+      \032      merge programs have been completely rewritten by Stephane Lescuyer\n\
+      \032      (thanks, Stephane!). The user-visible functionality should not\n\
+      \032      change, but the internals have been rationalized and there are a\n\
+      \032      number of new features. See the manual (in particular, the\n\
+      \032      description of the backupXXX preferences) for details.\n\
+      \032    * Incorporated patches for ipv6 support, contributed by Samuel\n\
+      \032      Thibault. (Note that, due to a bug in the released OCaml 3.08.3\n\
+      \032      compiler, this code will not actually work with ipv6 unless\n\
+      \032      compiled with the CVS version of the OCaml compiler, where the bug\n\
+      \032      has been fixed; however, ipv4 should continue to work normally.)\n\
+      \032    * OSX interface:\n\
+      \032         + Incorporated Ben Willmore's cool new icon for the Mac UI.\n\
+      \032    * Small fixes:\n\
+      \032         + Fixed off by one error in month numbers (in printed dates)\n\
+      \032           reported by Bob Burger\n\
+      \n\
+      \032  Changes since 2.12.0:\n\
+      \032    * New convention for release numbering: Releases will continue to be\n\
+      \032      given numbers of the form X.Y.Z, but, from now on, just the major\n\
+      \032      version number (X.Y) will be considered significant when checking\n\
+      \032      compatibility between client and server versions. The third\n\
+      \032      component of the version number will be used only to identify\n\
+      \032      \"patch levels\" of releases.\n\
+      \032      This change goes hand in hand with a change to the procedure for\n\
+      \032      making new releases. Candidate releases will initially be given\n\
+      \032      \"beta release\" status when they are announced for public\n\
+      \032      consumption. Any bugs that are discovered will be fixed in a\n\
+      \032      separate branch of the source repository (without changing the\n\
+      \032      major version number) and new tarballs re-released as needed. When\n\
+      \032      this process converges, the patched beta version will be dubbed\n\
+      \032      stable.\n\
+      \032    * Warning (failure in batch mode) when one path is completely\n\
+      \032      emptied. This prevents Unison from deleting everything on one\n\
+      \032      replica when the other disappear.\n\
+      \032    * Fix diff bug (where no difference is shown the first time the diff\n\
+      \032      command is given).\n\
+      \032    * User interface changes:\n\
+      \032         + Improved workaround for button focus problem (GTK2 UI)\n\
+      \032         + Put leading zeroes in date fields\n\
+      \032         + More robust handling of character encodings in GTK2 UI\n\
+      \032         + Changed format of modification time displays, from modified\n\
+      \032           at hh:mm:ss on dd MMM, yyyy to modified on yyyy-mm-dd\n\
+      \032           hh:mm:ss\n\
+      \032         + Changed time display to include seconds (so that people on\n\
+      \032           FAT filesystems will not be confused when Unison tries to\n\
+      \032           update a file time to an odd number of seconds and the\n\
+      \032           filesystem truncates it to an even number!)\n\
+      \032         + Use the diff \"-u\" option by default when showing differences\n\
+      \032           between files (the output is more readable)\n\
+      \032         + In text mode, pipe the diff output to a pager if the\n\
+      \032           environment variable PAGER is set\n\
+      \032         + Bug fixes and cleanups in ssh password prompting. Now works\n\
+      \032           with the GTK2 UI under Linux. (Hopefully the Mac OS X one is\n\
+      \032           not broken!)\n\
+      \032         + Include profile name in the GTK2 window name\n\
+      \032         + Added bindings ',' (same as '<') and '.' (same as '>') in the\n\
+      \032           GTK2 UI\n\
+      \032    * Mac GUI:\n\
+      \032         + actions like < and > scroll to the next item as necessary.\n\
+      \032         + Restart has a menu item and keyboard shortcut (command-R).\n\
+      \032         + Added a command-line tool for Mac OS X. It can be installed\n\
+      \032           from the Unison menu.\n\
+      \032         + New icon.\n\
+      \032         + Handle the \"help\" command-line argument properly.\n\
+      \032         + Handle profiles given on the command line properly.\n\
+      \032         + When a profile has been selected, the profile dialog is\n\
+      \032           replaced by a \"connecting\" message while the connection is\n\
+      \032           being made. This gives better feedback.\n\
+      \032         + Size of left and right columns is now large enough so that\n\
+      \032           \"PropsChanged\" is not cut off.\n\
+      \032    * Minor changes:\n\
+      \032         + Disable multi-threading when both roots are local\n\
+      \032         + Improved error handling code. In particular, make sure all\n\
+      \032           files are closed in case of a transient failure\n\
+      \032         + Under Windows, use $UNISON for home directory as a last\n\
+      \032           resort (it was wrongly moved before $HOME and $USERPROFILE in\n\
+      \032           Unison 2.12.0)\n\
+      \032         + Reopen the logfile if its name changes (profile change)\n\
+      \032         + Double-check that permissions and modification times have\n\
+      \032           been properly set: there are some combination of OS and\n\
+      \032           filesystem on which setting them can fail in a silent way.\n\
+      \032         + Check for bad Windows filenames for pure Windows\n\
+      \032           synchronization also (not just cross architecture\n\
+      \032           synchronization). This way, filenames containing backslashes,\n\
+      \032           which are not correctly handled by unison, are rejected right\n\
+      \032           away.\n\
+      \032         + Attempt to resolve issues with synchronizing modification\n\
+      \032           times of read-only files under Windows\n\
+      \032         + Ignore chmod failures when deleting files\n\
+      \032         + Ignore trailing dots in filenames in case insensitive mode\n\
+      \032         + Proper quoting of paths, files and extensions ignored using\n\
+      \032           the UI\n\
+      \032         + The strings CURRENT1 and CURRENT2 are now correctly\n\
+      \032           substitued when they occur in the diff preference\n\
+      \032         + Improvements to syncing resource forks between Macs via a\n\
+      \032           non-Mac system.\n\
+      \n\
+      \032  Changes since 2.10.2:\n\
+      \032    * INCOMPATIBLE CHANGE: Archive format has changed.\n\
+      \032    * Source code availability: The Unison sources are now managed using\n\
+      \032      Subversion. One nice side-effect is that anonymous checkout is now\n\
+      \032      possible, like this:\n\
+      \032       svn co https://cvs.cis.upenn.edu:3690/svnroot/unison/\n\
+      \032      We will also continue to export a \"developer tarball\" of the\n\
+      \032      current (modulo one day) sources in the web export directory. To\n\
+      \032      receive commit logs for changes to the sources, subscribe to the\n\
+      \032      unison-hackers list\n\
+      \032      (http://www.cis.upenn.edu/ bcpierce/unison/lists.html).\n\
+      \032    * Text user interface:\n\
+      \032         + Substantial reworking of the internal logic of the text UI to\n\
+      \032           make it a bit easier to modify.\n\
+      \032         + The dumbtty flag in the text UI is automatically set to true\n\
+      \032           if the client is running on a Unix system and the EMACS\n\
+      \032           environment variable is set to anything other than the empty\n\
+      \032           string.\n\
+      \032    * Native OS X gui:\n\
+      \032         + Added a synchronize menu item with keyboard shortcut\n\
+      \032         + Added a merge menu item, still needs to be debugged\n\
+      \032         + Fixes to compile for Panther\n\
+      \032         + Miscellaneous improvements and bugfixes\n\
+      \032    * Small changes:\n\
+      \032         + Changed the filename checking code to apply to Windows only,\n\
+      \032           instead of OS X as well.\n\
+      \032         + Finder flags now synchronized\n\
+      \032         + Fallback in copy.ml for filesystem that do not support O_EXCL\n\
+      \032         + Changed buffer size for local file copy (was highly\n\
+      \032           inefficient with synchronous writes)\n\
+      \032         + Ignore chmod failure when deleting a directory\n\
+      \032         + Fixed assertion failure when resolving a conflict content\n\
+      \032           change / permission changes in favor of the content change.\n\
+      \032         + Workaround for transferring large files using rsync.\n\
+      \032         + Use buffered I/O for files (this is the only way to open\n\
+      \032           files in binary mode under Cygwin).\n\
+      \032         + On non-Cygwin Windows systems, the UNISON environment\n\
+      \032           variable is now checked first to determine where to look for\n\
+      \032           Unison's archive and preference files, followed by HOME and\n\
+      \032           USERPROFILE in that order. On Unix and Cygwin systems, HOME\n\
+      \032           is used.\n\
+      \032         + Generalized diff preference so that it can be given either as\n\
+      \032           just the command name to be used for calculating diffs or\n\
+      \032           else a whole command line, containing the strings CURRENT1\n\
+      \032           and CURRENT2, which will be replaced by the names of the\n\
+      \032           files to be diff'ed before the command is called.\n\
+      \032         + Recognize password prompts in some newer versions of ssh.\n\
+      \n\
+      \032  Changes since 2.9.20:\n\
+      \032    * INCOMPATIBLE CHANGE: Archive format has changed.\n\
+      \032    * Major functionality changes:\n\
+      \032         + Major tidying and enhancement of 'merge' functionality. The\n\
+      \032           main user-visible change is that the external merge program\n\
+      \032           may either write the merged output to a single new file, as\n\
+      \032           before, or it may modify one or both of its input files, or\n\
+      \032           it may write two new files. In the latter cases, its\n\
+      \032           modifications will be copied back into place on both the\n\
+      \032           local and the remote host, and (if the two files are now\n\
+      \032           equal) the archive will be updated appropriately. More\n\
+      \032           information can be found in the user manual. Thanks to Malo\n\
+      \032           Denielou and Alan Schmitt for these improvements.\n\
+      \032           Warning: the new merging functionality is not completely\n\
+      \032           compatible with old versions! Check the manual for details.\n\
+      \032         + Files larger than 2Gb are now supported.\n\
+      \032         + Added preliminary (and still somewhat experimental) support\n\
+      \032           for the Apple OS X operating system.\n\
+      \032              o Resource forks should be transferred correctly. (See the\n\
+      \032                manual for details of how this works when synchronizing\n\
+      \032                HFS with non-HFS volumes.) Synchronization of file type\n\
+      \032                and creator information is also supported.\n\
+      \032              o On OSX systems, the name of the directory for storing\n\
+      \032                Unison's archives, preference files, etc., is now\n\
+      \032                determined as follows:\n\
+      \032                   # if ~/.unison exists, use it\n\
+      \032                   # otherwise, use ~/Library/Application\n\
+      \032                     Support/Unison, creating it if necessary.\n\
+      \032              o A preliminary native-Cocoa user interface is under\n\
+      \032                construction. This still needs some work, and some users\n\
+      \032                experience unpredictable crashes, so it is only for\n\
+      \032                hackers for now. Run make with UISTYLE=mac to build this\n\
+      \032                interface.\n\
+      \032    * Minor functionality changes:\n\
+      \032         + Added an ignorelocks preference, which forces Unison to\n\
+      \032           override left-over archive locks. (Setting this preference is\n\
+      \032           dangerous! Use it only if you are positive you know what you\n\
+      \032           are doing.)\n\
+      \032         + Added a new preference assumeContentsAreImmutable. If a\n\
+      \032           directory matches one of the patterns set in this preference,\n\
+      \032           then update detection is skipped for files in this directory.\n\
+      \032           (The purpose is to speed update detection for cases like Mail\n\
+      \032           folders, which contain lots and lots of immutable files.)\n\
+      \032           Also a preference assumeContentsAreImmutableNot, which\n\
+      \032           overrides the first, similarly to ignorenot. (Later\n\
+      \032           amendment: these preferences are now called immutable and\n\
+      \032           immutablenot.)\n\
+      \032         + The ignorecase flag has been changed from a boolean to a\n\
+      \032           three-valued preference. The default setting, called default,\n\
+      \032           checks the operating systems running on the client and server\n\
+      \032           and ignores filename case if either of them is OSX or\n\
+      \032           Windows. Setting ignorecase to true or false overrides this\n\
+      \032           behavior. If you have been setting ignorecase on the command\n\
+      \032           line using -ignorecase=true or -ignorecase=false, you will\n\
+      \032           need to change to -ignorecase true or -ignorecase false.\n\
+      \032         + a new preference, 'repeat', for the text user interface\n\
+      \032           (only). If 'repeat' is set to a number, then, after it\n\
+      \032           finishes synchronizing, Unison will wait for that many\n\
+      \032           seconds and then start over, continuing this way until it is\n\
+      \032           killed from outside. Setting repeat to true will\n\
+      \032           automatically set the batch preference to true.\n\
+      \032         + Excel files are now handled specially, so that the fastcheck\n\
+      \032           optimization is skipped even if the fastcheck flag is set.\n\
+      \032           (Excel does some naughty things with modtimes, making this\n\
+      \032           optimization unreliable and leading to failures during change\n\
+      \032           propagation.)\n\
+      \032         + The ignorecase flag has been changed from a boolean to a\n\
+      \032           three-valued preference. The default setting, called\n\
+      \032           'default', checks the operating systems running on the client\n\
+      \032           and server and ignores filename case if either of them is OSX\n\
+      \032           or Windows. Setting ignorecase to 'true' or 'false' overrides\n\
+      \032           this behavior.\n\
+      \032         + Added a new preference, 'repeat', for the text user interface\n\
+      \032           (only, at the moment). If 'repeat' is set to a number, then,\n\
+      \032           after it finishes synchronizing, Unison will wait for that\n\
+      \032           many seconds and then start over, continuing this way until\n\
+      \032           it is killed from outside. Setting repeat to true will\n\
+      \032           automatically set the batch preference to true.\n\
+      \032         + The 'rshargs' preference has been split into 'rshargs' and\n\
+      \032           'sshargs' (mainly to make the documentation clearer). In\n\
+      \032           fact, 'rshargs' is no longer mentioned in the documentation\n\
+      \032           at all, since pretty much everybody uses ssh now anyway.\n\
+      \032    * Documentation\n\
+      \032         + The web pages have been completely redesigned and\n\
+      \032           reorganized. (Thanks to Alan Schmitt for help with this.)\n\
+      \032    * User interface improvements\n\
+      \032         + Added a GTK2 user interface, capable (among other things) of\n\
+      \032           displaying filenames in any locale encoding. Kudos to Stephen\n\
+      \032           Tse for contributing this code!\n\
+      \032         + The text UI now prints a list of failed and skipped transfers\n\
+      \032           at the end of synchronization.\n\
+      \032         + Restarting update detection from the graphical UI will reload\n\
+      \032           the current profile (which in particular will reset the -path\n\
+      \032           preference, in case it has been narrowed by using the\n\
+      \032           \"Recheck unsynchronized items\" command).\n\
+      \032         + Several small improvements to the text user interface,\n\
+      \032           including a progress display.\n\
+      \032    * Bug fixes (too numerous to count, actually, but here are some):\n\
+      \032         + The maxthreads preference works now.\n\
+      \032         + Fixed bug where warning message about uname returning an\n\
+      \032           unrecognized result was preventing connection to server. (The\n\
+      \032           warning is no longer printed, and all systems where 'uname'\n\
+      \032           returns anything other than 'Darwin' are assumed not to be\n\
+      \032           running OS X.)\n\
+      \032         + Fixed a problem on OS X that caused some valid file names\n\
+      \032           (e.g., those including colons) to be considered invalid.\n\
+      \032         + Patched Path.followLink to follow links under cygwin in\n\
+      \032           addition to Unix (suggested by Matt Swift).\n\
+      \032         + Small change to the storeRootsName function, suggested by\n\
+      \032           bliviero at ichips.intel.com, to fix a problem in unison with\n\
+      \032           the `rootalias' option, which allows you to tell unison that\n\
+      \032           two roots contain the same files. Rootalias was being applied\n\
+      \032           after the hosts were sorted, so it wouldn't work properly in\n\
+      \032           all cases.\n\
+      \032         + Incorporated a fix by Dmitry Bely for setting utimes of\n\
+      \032           read-only files on Win32 systems.\n\
+      \032    * Installation / portability:\n\
+      \032         + Unison now compiles with OCaml version 3.07 and later out of\n\
+      \032           the box.\n\
+      \032         + Makefile.OCaml fixed to compile out of the box under OpenBSD.\n\
+      \032         + a few additional ports (e.g. OpenBSD, Zaurus/IPAQ) are now\n\
+      \032           mentioned in the documentation\n\
+      \032         + Unison can now be installed easily on OSX systems using the\n\
+      \032           Fink package manager\n\
+      \n\
+      \032  Changes since 2.9.1:\n\
+      \032    * Added a preference maxthreads that can be used to limit the number\n\
+      \032      of simultaneous file transfers.\n\
+      \032    * Added a backupdir preference, which controls where backup files\n\
+      \032      are stored.\n\
+      \032    * Basic support added for OSX. In particular, Unison now recognizes\n\
+      \032      when one of the hosts being synchronized is running OSX and\n\
+      \032      switches to a case-insensitive treatment of filenames (i.e., 'foo'\n\
+      \032      and 'FOO' are considered to be the same file). (OSX is not yet\n\
+      \032      fully working, however: in particular, files with resource forks\n\
+      \032      will not be synchronized correctly.)\n\
+      \032    * The same hash used to form the archive name is now also added to\n\
+      \032      the names of the temp files created during file transfer. The\n\
+      \032      reason for this is that, during update detection, we are going to\n\
+      \032      silently delete any old temp files that we find along the way, and\n\
+      \032      we want to prevent ourselves from deleting temp files belonging to\n\
+      \032      other instances of Unison that may be running in parallel, e.g.\n\
+      \032      synchronizing with a different host. Thanks to Ruslan Ermilov for\n\
+      \032      this suggestion.\n\
+      \032    * Several small user interface improvements\n\
+      \032    * Documentation\n\
+      \032         + FAQ and bug reporting instructions have been split out as\n\
+      \032           separate HTML pages, accessible directly from the unison web\n\
+      \032           page.\n\
+      \032         + Additions to FAQ, in particular suggestions about performance\n\
+      \032           tuning.\n\
+      \032    * Makefile\n\
+      \032         + Makefile.OCaml now sets UISTYLE=text or UISTYLE=gtk\n\
+      \032           automatically, depending on whether it finds lablgtk\n\
+      \032           installed\n\
+      \032         + Unison should now compile \"out of the box\" under OSX\n\
+      \n\
+      \032  Changes since 2.8.1:\n\
+      \032    * Changing profile works again under Windows\n\
+      \032    * File movement optimization: Unison now tries to use local copy\n\
+      \032      instead of transfer for moved or copied files. It is controled by\n\
+      \032      a boolean option \"xferbycopying\".\n\
+      \032    * Network statistics window (transfer rate, amount of data\n\
+      \032      transferred). [NB: not available in Windows-Cygwin version.]\n\
+      \032    * symlinks work under the cygwin version (which is dynamically\n\
+      \032      linked).\n\
+      \032    * Fixed potential deadlock when synchronizing between Windows and\n\
+      \032      Unix\n\
+      \032    * Small improvements:\n\
+      \032         + If neither the USERPROFILE nor the HOME environment variables\n\
+      \032           are set, then Unison will put its temporary commit log\n\
+      \032           (called DANGER.README) into the directory named by the UNISON\n\
+      \032           environment variable, if any; otherwise it will use C:.\n\
+      \032         + alternative set of values for fastcheck: yes = true; no =\n\
+      \032           false; default = auto.\n\
+      \032         + -silent implies -contactquietly\n\
+      \032    * Source code:\n\
+      \032         + Code reorganization and tidying. (Started breaking up some of\n\
+      \032           the basic utility modules so that the non-unison-specific\n\
+      \032           stuff can be made available for other projects.)\n\
+      \032         + several Makefile and docs changes (for release);\n\
+      \032         + further comments in \"update.ml\";\n\
+      \032         + connection information is not stored in global variables\n\
+      \032           anymore.\n\
+      \n\
+      \032  Changes since 2.7.78:\n\
+      \032    * Small bugfix to textual user interface under Unix (to avoid\n\
+      \032      leaving the terminal in a bad state where it would not echo inputs\n\
+      \032      after Unison exited).\n\
+      \n\
+      \032  Changes since 2.7.39:\n\
+      \032    * Improvements to the main web page (stable and beta version docs\n\
+      \032      are now both accessible).\n\
+      \032    * User manual revised.\n\
+      \032    * Added some new preferences:\n\
+      \032         + \"sshcmd\" and \"rshcmd\" for specifying paths to ssh and rsh\n\
+      \032           programs.\n\
+      \032         + \"contactquietly\" for suppressing the \"contacting server\"\n\
+      \032           message during Unison startup (under the graphical UI).\n\
+      \032    * Bug fixes:\n\
+      \032         + Fixed small bug in UI that neglected to change the displayed\n\
+      \032           column headers if loading a new profile caused the roots to\n\
+      \032           change.\n\
+      \032         + Fixed a bug that would put the text UI into an infinite loop\n\
+      \032           if it encountered a conflict when run in batch mode.\n\
+      \032         + Added some code to try to fix the display of non-Ascii\n\
+      \032           characters in filenames on Windows systems in the GTK UI.\n\
+      \032           (This code is currently untested--if you're one of the people\n\
+      \032           that had reported problems with display of non-ascii\n\
+      \032           filenames, we'd appreciate knowing if this actually fixes\n\
+      \032           things.)\n\
+      \032         + `-prefer/-force newer' works properly now. (The bug was\n\
+      \032           reported by Sebastian Urbaniak and Sean Fulton.)\n\
+      \032    * User interface and Unison behavior:\n\
+      \032         + Renamed `Proceed' to `Go' in the graphical UI.\n\
+      \032         + Added exit status for the textual user interface.\n\
+      \032         + Paths that are not synchronized because of conflicts or\n\
+      \032           errors during update detection are now noted in the log file.\n\
+      \032         + [END] messages in log now use a briefer format\n\
+      \032         + Changed the text UI startup sequence so that ./unison -ui\n\
+      \032           text will use the default profile instead of failing.\n\
+      \032         + Made some improvements to the error messages.\n\
+      \032         + Added some debugging messages to remote.ml.\n\
+      \n\
+      \032  Changes since 2.7.7:\n\
+      \032    * Incorporated, once again, a multi-threaded transport sub-system.\n\
+      \032      It transfers several files at the same time, thereby making much\n\
+      \032      more effective use of available network bandwidth. Unlike the\n\
+      \032      earlier attempt, this time we do not rely on the native thread\n\
+      \032      library of OCaml. Instead, we implement a light-weight,\n\
+      \032      non-preemptive multi-thread library in OCaml directly. This\n\
+      \032      version appears stable.\n\
+      \032      Some adjustments to unison are made to accommodate the\n\
+      \032      multi-threaded version. These include, in particular, changes to\n\
+      \032      the user interface and logging, for example:\n\
+      \032         + Two log entries for each transferring task, one for the\n\
+      \032           beginning, one for the end.\n\
+      \032         + Suppressed warning messages against removing temp files left\n\
+      \032           by a previous unison run, because warning does not work\n\
+      \032           nicely under multi-threading. The temp file names are made\n\
+      \032           less likely to coincide with the name of a file created by\n\
+      \032           the user. They take the form\n\
+      \032           .#<filename>.<serial>.unison.tmp. [N.b. This was later\n\
+      \032           changed to .unison.<filename>.<serial>.unison.tmp.]\n\
+      \032    * Added a new command to the GTK user interface: pressing 'f' causes\n\
+      \032      Unison to start a new update detection phase, using as paths just\n\
+      \032      those paths that have been detected as changed and not yet marked\n\
+      \032      as successfully completed. Use this command to quickly restart\n\
+      \032      Unison on just the set of paths still needing attention after a\n\
+      \032      previous run.\n\
+      \032    * Made the ignorecase preference user-visible, and changed the\n\
+      \032      initialization code so that it can be manually set to true, even\n\
+      \032      if neither host is running Windows. (This may be useful, e.g.,\n\
+      \032      when using Unison running on a Unix system with a FAT volume\n\
+      \032      mounted.)\n\
+      \032    * Small improvements and bug fixes:\n\
+      \032         + Errors in preference files now generate fatal errors rather\n\
+      \032           than warnings at startup time. (I.e., you can't go on from\n\
+      \032           them.) Also, we fixed a bug that was preventing these\n\
+      \032           warnings from appearing in the text UI, so some users who\n\
+      \032           have been running (unsuspectingly) with garbage in their\n\
+      \032           prefs files may now get error reports.\n\
+      \032         + Error reporting for preference files now provides file name\n\
+      \032           and line number.\n\
+      \032         + More intelligible message in the case of identical change to\n\
+      \032           the same files: \"Nothing to do: replicas have been changed\n\
+      \032           only in identical ways since last sync.\"\n\
+      \032         + Files with prefix '.#' excluded when scanning for preference\n\
+      \032           files.\n\
+      \032         + Rsync instructions are send directly instead of first\n\
+      \032           marshaled.\n\
+      \032         + Won't try forever to get the fingerprint of a continuously\n\
+      \032           changing file: unison will give up after certain number of\n\
+      \032           retries.\n\
+      \032         + Other bug fixes, including the one reported by Peter Selinger\n\
+      \032           (force=older preference not working).\n\
+      \032    * Compilation:\n\
+      \032         + Upgraded to the new OCaml 3.04 compiler, with the LablGtk\n\
+      \032           1.2.3 library (patched version used for compiling under\n\
+      \032           Windows).\n\
+      \032         + Added the option to compile unison on the Windows platform\n\
+      \032           with Cygwin GNU C compiler. This option only supports\n\
+      \032           building dynamically linked unison executables.\n\
+      \n\
+      \032  Changes since 2.7.4:\n\
+      \032    * Fixed a silly (but debilitating) bug in the client startup\n\
+      \032      sequence.\n\
+      \n\
+      \032  Changes since 2.7.1:\n\
+      \032    * Added addprefsto preference, which (when set) controls which\n\
+      \032      preference file new preferences (e.g. new ignore patterns) are\n\
+      \032      added to.\n\
+      \032    * Bug fix: read the initial connection header one byte at a time, so\n\
+      \032      that we don't block if the header is shorter than expected. (This\n\
+      \032      bug did not affect normal operation -- it just made it hard to\n\
+      \032      tell when you were trying to use Unison incorrectly with an old\n\
+      \032      version of the server, since it would hang instead of giving an\n\
+      \032      error message.)\n\
+      \n\
+      \032  Changes since 2.6.59:\n\
+      \032    * Changed fastcheck from a boolean to a string preference. Its legal\n\
+      \032      values are yes (for a fast check), no (for a safe check), or\n\
+      \032      default (for a fast check--which also happens to be safe--when\n\
+      \032      running on Unix and a safe check when on Windows). The default is\n\
+      \032      default.\n\
+      \032    * Several preferences have been renamed for consistency. All\n\
+      \032      preference names are now spelled out in lowercase. For backward\n\
+      \032      compatibility, the old names still work, but they are not\n\
+      \032      mentioned in the manual any more.\n\
+      \032    * The temp files created by the 'diff' and 'merge' commands are now\n\
+      \032      named by prepending a new prefix to the file name, rather than\n\
+      \032      appending a suffix. This should avoid confusing diff/merge\n\
+      \032      programs that depend on the suffix to guess the type of the file\n\
+      \032      contents.\n\
+      \032    * We now set the keepalive option on the server socket, to make sure\n\
+      \032      that the server times out if the communication link is\n\
+      \032      unexpectedly broken.\n\
+      \032    * Bug fixes:\n\
+      \032         + When updating small files, Unison now closes the destination\n\
+      \032           file.\n\
+      \032         + File permissions are properly updated when the file is behind\n\
+      \032           a followed link.\n\
+      \032         + Several other small fixes.\n\
+      \n\
+      \032  Changes since 2.6.38:\n\
+      \032    * Major Windows performance improvement!\n\
+      \032      We've added a preference fastcheck that makes Unison look only at\n\
+      \032      a file's creation time and last-modified time to check whether it\n\
+      \032      has changed. This should result in a huge speedup when checking\n\
+      \032      for updates in large replicas.\n\
+      \032      When this switch is set, Unison will use file creation times as\n\
+      \032      'pseudo inode numbers' when scanning Windows replicas for updates,\n\
+      \032      instead of reading the full contents of every file. This may cause\n\
+      \032      Unison to miss propagating an update if the create time,\n\
+      \032      modification time, and length of the file are all unchanged by the\n\
+      \032      update (this is not easy to achieve, but it can be done). However,\n\
+      \032      Unison will never overwrite such an update with a change from the\n\
+      \032      other replica, since it always does a safe check for updates just\n\
+      \032      before propagating a change. Thus, it is reasonable to use this\n\
+      \032      switch most of the time and occasionally run Unison once with\n\
+      \032      fastcheck set to false, if you are worried that Unison may have\n\
+      \032      overlooked an update.\n\
+      \032      Warning: This change is has not yet been thoroughly field-tested.\n\
+      \032      If you set the fastcheck preference, pay careful attention to what\n\
+      \032      Unison is doing.\n\
+      \032    * New functionality: centralized backups and merging\n\
+      \032         + This version incorporates two pieces of major new\n\
+      \032           functionality, implemented by Sylvain Roy during a summer\n\
+      \032           internship at Penn: a centralized backup facility that keeps\n\
+      \032           a full backup of (selected files in) each replica, and a\n\
+      \032           merging feature that allows Unison to invoke an external\n\
+      \032           file-merging tool to resolve conflicting changes to\n\
+      \032           individual files.\n\
+      \032         + Centralized backups:\n\
+      \032              o Unison now maintains full backups of the\n\
+      \032                last-synchronized versions of (some of) the files in\n\
+      \032                each replica; these function both as backups in the\n\
+      \032                usual sense and as the \"common version\" when invoking\n\
+      \032                external merge programs.\n\
+      \032              o The backed up files are stored in a directory\n\
+      \032                /.unison/backup on each host. (The name of this\n\
+      \032                directory can be changed by setting the environment\n\
+      \032                variable UNISONBACKUPDIR.)\n\
+      \032              o The predicate backup controls which files are actually\n\
+      \032                backed up: giving the preference 'backup = Path *'\n\
+      \032                causes backing up of all files.\n\
+      \032              o Files are added to the backup directory whenever unison\n\
+      \032                updates its archive. This means that\n\
+      \032                   # When unison reconstructs its archive from scratch\n\
+      \032                     (e.g., because of an upgrade, or because the\n\
+      \032                     archive files have been manually deleted), all\n\
+      \032                     files will be backed up.\n\
+      \032                   # Otherwise, each file will be backed up the first\n\
+      \032                     time unison propagates an update for it.\n\
+      \032              o The preference backupversions controls how many previous\n\
+      \032                versions of each file are kept. The default is 2 (i.e.,\n\
+      \032                the last synchronized version plus one backup).\n\
+      \032              o For backward compatibility, the backups preference is\n\
+      \032                also still supported, but backup is now preferred.\n\
+      \032              o It is OK to manually delete files from the backup\n\
+      \032                directory (or to throw away the directory itself).\n\
+      \032                Before unison uses any of these files for anything\n\
+      \032                important, it checks that its fingerprint matches the\n\
+      \032                one that it expects.\n\
+      \032         + Merging:\n\
+      \032              o Both user interfaces offer a new 'merge' command,\n\
+      \032                invoked by pressing 'm' (with a changed file selected).\n\
+      \032              o The actual merging is performed by an external program.\n\
+      \032                The preferences merge and merge2 control how this\n\
+      \032                program is invoked. If a backup exists for this file\n\
+      \032                (see the backup preference), then the merge preference\n\
+      \032                is used for this purpose; otherwise merge2 is used. In\n\
+      \032                both cases, the value of the preference should be a\n\
+      \032                string representing the command that should be passed to\n\
+      \032                a shell to invoke the merge program. Within this string,\n\
+      \032                the special substrings CURRENT1, CURRENT2, NEW, and OLD\n\
+      \032                may appear at any point. Unison will substitute these as\n\
+      \032                follows before invoking the command:\n\
+      \032                   # CURRENT1 is replaced by the name of the local copy\n\
+      \032                     of the file;\n\
+      \032                   # CURRENT2 is replaced by the name of a temporary\n\
+      \032                     file, into which the contents of the remote copy of\n\
+      \032                     the file have been transferred by Unison prior to\n\
+      \032                     performing the merge;\n\
+      \032                   # NEW is replaced by the name of a temporary file\n\
+      \032                     that Unison expects to be written by the merge\n\
+      \032                     program when it finishes, giving the desired new\n\
+      \032                     contents of the file; and\n\
+      \032                   # OLD is replaced by the name of the backed up copy\n\
+      \032                     of the original version of the file (i.e., its\n\
+      \032                     state at the end of the last successful run of\n\
+      \032                     Unison), if one exists (applies only to merge, not\n\
+      \032                     merge2).\n\
+      \032                For example, on Unix systems setting the merge\n\
+      \032                preference to\n\
+      \032  merge = diff3 -m CURRENT1 OLD CURRENT2 > NEW\n\
+      \032                will tell Unison to use the external diff3 program for\n\
+      \032                merging.\n\
+      \032                A large number of external merging programs are\n\
+      \032                available. For example, emacs users may find the\n\
+      \032                following convenient:\n\
+      \032   merge2 = emacs -q --eval '(ediff-merge-files \"CURRENT1\" \"CURRENT2\"\n\
+      \032              nil \"NEW\")'\n\
+      \032   merge = emacs -q --eval '(ediff-merge-files-with-ancestor\n\
+      \032              \"CURRENT1\" \"CURRENT2\" \"OLD\" nil \"NEW\")'\n\
+      \032                (These commands are displayed here on two lines to avoid\n\
+      \032                running off the edge of the page. In your preference\n\
+      \032                file, each should be written on a single line.)\n\
+      \032              o If the external program exits without leaving any file\n\
+      \032                at the path NEW, Unison considers the merge to have\n\
+      \032                failed. If the merge program writes a file called NEW\n\
+      \032                but exits with a non-zero status code, then Unison\n\
+      \032                considers the merge to have succeeded but to have\n\
+      \032                generated conflicts. In this case, it attempts to invoke\n\
+      \032                an external editor so that the user can resolve the\n\
+      \032                conflicts. The value of the editor preference controls\n\
+      \032                what editor is invoked by Unison. The default is emacs.\n\
+      \032              o Please send us suggestions for other useful values of\n\
+      \032                the merge2 and merge preferences - we'd like to give\n\
+      \032                several examples in the manual.\n\
+      \032    * Smaller changes:\n\
+      \032         + When one preference file includes another, unison no longer\n\
+      \032           adds the suffix '.prf' to the included file by default. If a\n\
+      \032           file with precisely the given name exists in the .unison\n\
+      \032           directory, it will be used; otherwise Unison will add .prf,\n\
+      \032           as it did before. (This change means that included preference\n\
+      \032           files can be named blah.include instead of blah.prf, so that\n\
+      \032           unison will not offer them in its 'choose a preference file'\n\
+      \032           dialog.)\n\
+      \032         + For Linux systems, we now offer both a statically linked and\n\
+      \032           a dynamically linked executable. The static one is larger,\n\
+      \032           but will probably run on more systems, since it doesn't\n\
+      \032           depend on the same versions of dynamically linked library\n\
+      \032           modules being available.\n\
+      \032         + Fixed the force and prefer preferences, which were getting\n\
+      \032           the propagation direction exactly backwards.\n\
+      \032         + Fixed a bug in the startup code that would cause unison to\n\
+      \032           crash when the default profile (~/.unison/default.prf) does\n\
+      \032           not exist.\n\
+      \032         + Fixed a bug where, on the run when a profile is first\n\
+      \032           created, Unison would confusingly display the roots in\n\
+      \032           reverse order in the user interface.\n\
+      \032    * For developers:\n\
+      \032         + We've added a module dependency diagram to the source\n\
+      \032           distribution, in src/DEPENDENCIES.ps, to help new prospective\n\
+      \032           developers with navigating the code.\n\
+      \n\
+      \032  Changes since 2.6.11:\n\
+      \032    * INCOMPATIBLE CHANGE: Archive format has changed.\n\
+      \032    * INCOMPATIBLE CHANGE: The startup sequence has been completely\n\
+      \032      rewritten and greatly simplified. The main user-visible change is\n\
+      \032      that the defaultpath preference has been removed. Its effect can\n\
+      \032      be approximated by using multiple profiles, with include\n\
+      \032      directives to incorporate common settings. All uses of defaultpath\n\
+      \032      in existing profiles should be changed to path.\n\
+      \032      Another change in startup behavior that will affect some users is\n\
+      \032      that it is no longer possible to specify roots both in the profile\n\
+      \032      and on the command line.\n\
+      \032      You can achieve a similar effect, though, by breaking your profile\n\
+      \032      into two:\n\
+      \n\
+      \032 default.prf =\n\
+      \032     root = blah\n\
+      \032     root = foo\n\
+      \032     include common\n\
+      \n\
+      \032 common.prf =\n\
+      \032     <everything else>\n\
+      \032      Now do\n\
+      \032 unison common root1 root2\n\
+      \032      when you want to specify roots explicitly.\n\
+      \032    * The -prefer and -force options have been extended to allow users\n\
+      \032      to specify that files with more recent modtimes should be\n\
+      \032      propagated, writing either -prefer newer or -force newer. (For\n\
+      \032      symmetry, Unison will also accept -prefer older or -force older.)\n\
+      \032      The -force older/newer options can only be used when -times is\n\
+      \032      also set.\n\
+      \032      The graphical user interface provides access to these facilities\n\
+      \032      on a one-off basis via the Actions menu.\n\
+      \032    * Names of roots can now be \"aliased\" to allow replicas to be\n\
+      \032      relocated without changing the name of the archive file where\n\
+      \032      Unison stores information between runs. (This feature is for\n\
+      \032      experts only. See the \"Archive Files\" section of the manual for\n\
+      \032      more information.)\n\
+      \032    * Graphical user-interface:\n\
+      \032         + A new command is provided in the Synchronization menu for\n\
+      \032           switching to a new profile without restarting Unison from\n\
+      \032           scratch.\n\
+      \032         + The GUI also supports one-key shortcuts for commonly used\n\
+      \032           profiles. If a profile contains a preference of the form 'key\n\
+      \032           = n', where n is a single digit, then pressing this key will\n\
+      \032           cause Unison to immediately switch to this profile and begin\n\
+      \032           synchronization again from scratch. (Any actions that may\n\
+      \032           have been selected for a set of changes currently being\n\
+      \032           displayed will be discarded.)\n\
+      \032         + Each profile may include a preference 'label = <string>'\n\
+      \032           giving a descriptive string that described the options\n\
+      \032           selected in this profile. The string is listed along with the\n\
+      \032           profile name in the profile selection dialog, and displayed\n\
+      \032           in the top-right corner of the main Unison window.\n\
+      \032    * Minor:\n\
+      \032         + Fixed a bug that would sometimes cause the 'diff' display to\n\
+      \032           order the files backwards relative to the main user\n\
+      \032           interface. (Thanks to Pascal Brisset for this fix.)\n\
+      \032         + On Unix systems, the graphical version of Unison will check\n\
+      \032           the DISPLAY variable and, if it is not set, automatically\n\
+      \032           fall back to the textual user interface.\n\
+      \032         + Synchronization paths (path preferences) are now matched\n\
+      \032           against the ignore preferences. So if a path is both\n\
+      \032           specified in a path preference and ignored, it will be\n\
+      \032           skipped.\n\
+      \032         + Numerous other bugfixes and small improvements.\n\
+      \n\
+      \032  Changes since 2.6.1:\n\
+      \032    * The synchronization of modification times has been disabled for\n\
+      \032      directories.\n\
+      \032    * Preference files may now include lines of the form include <name>,\n\
+      \032      which will cause name.prf to be read at that point.\n\
+      \032    * The synchronization of permission between Windows and Unix now\n\
+      \032      works properly.\n\
+      \032    * A binding CYGWIN=binmode in now added to the environment so that\n\
+      \032      the Cygwin port of OpenSSH works properly in a non-Cygwin context.\n\
+      \032    * The servercmd and addversionno preferences can now be used\n\
+      \032      together: -addversionno appends an appropriate -NNN to the server\n\
+      \032      command, which is found by using the value of the -servercmd\n\
+      \032      preference if there is one, or else just unison.\n\
+      \032    * Both '-pref=val' and '-pref val' are now allowed for boolean\n\
+      \032      values. (The former can be used to set a preference to false.)\n\
+      \032    * Lot of small bugs fixed.\n\
+      \n\
+      \032  Changes since 2.5.31:\n\
+      \032    * The log preference is now set to true by default, since the log\n\
+      \032      file seems useful for most users.\n\
+      \032    * Several miscellaneous bugfixes (most involving symlinks).\n\
+      \n\
+      \032  Changes since 2.5.25:\n\
+      \032    * INCOMPATIBLE CHANGE: Archive format has changed (again).\n\
+      \032    * Several significant bugs introduced in 2.5.25 have been fixed.\n\
+      \n\
+      \032  Changes since 2.5.1:\n\
+      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
+      \032      synchronize your replicas before upgrading, to avoid spurious\n\
+      \032      conflicts. The first sync after upgrading will be slow.\n\
+      \032    * New functionality:\n\
+      \032         + Unison now synchronizes file modtimes, user-ids, and\n\
+      \032           group-ids.\n\
+      \032           These new features are controlled by a set of new\n\
+      \032           preferences, all of which are currently false by default.\n\
+      \032              o When the times preference is set to true, file\n\
+      \032                modification times are propaged. (Because the\n\
+      \032                representations of time may not have the same\n\
+      \032                granularity on both replicas, Unison may not always be\n\
+      \032                able to make the modtimes precisely equal, but it will\n\
+      \032                get them as close as the operating systems involved\n\
+      \032                allow.)\n\
+      \032              o When the owner preference is set to true, file ownership\n\
+      \032                information is synchronized.\n\
+      \032              o When the group preference is set to true, group\n\
+      \032                information is synchronized.\n\
+      \032              o When the numericIds preference is set to true, owner and\n\
+      \032                group information is synchronized numerically. By\n\
+      \032                default, owner and group numbers are converted to names\n\
+      \032                on each replica and these names are synchronized. (The\n\
+      \032                special user id 0 and the special group 0 are never\n\
+      \032                mapped via user/group names even if this preference is\n\
+      \032                not set.)\n\
+      \032         + Added an integer-valued preference perms that can be used to\n\
+      \032           control the propagation of permission bits. The value of this\n\
+      \032           preference is a mask indicating which permission bits should\n\
+      \032           be synchronized. It is set by default to 0o1777: all bits but\n\
+      \032           the set-uid and set-gid bits are synchronised (synchronizing\n\
+      \032           theses latter bits can be a security hazard). If you want to\n\
+      \032           synchronize all bits, you can set the value of this\n\
+      \032           preference to -1.\n\
+      \032         + Added a log preference (default false), which makes Unison\n\
+      \032           keep a complete record of the changes it makes to the\n\
+      \032           replicas. By default, this record is written to a file called\n\
+      \032           unison.log in the user's home directory (the value of the\n\
+      \032           HOME environment variable). If you want it someplace else,\n\
+      \032           set the logfile preference to the full pathname you want\n\
+      \032           Unison to use.\n\
+      \032         + Added an ignorenot preference that maintains a set of\n\
+      \032           patterns for paths that should definitely not be ignored,\n\
+      \032           whether or not they match an ignore pattern. (That is, a path\n\
+      \032           will now be ignored iff it matches an ignore pattern and does\n\
+      \032           not match any ignorenot patterns.)\n\
+      \032    * User-interface improvements:\n\
+      \032         + Roots are now displayed in the user interface in the same\n\
+      \032           order as they were given on the command line or in the\n\
+      \032           preferences file.\n\
+      \032         + When the batch preference is set, the graphical user\n\
+      \032           interface no longer waits for user confirmation when it\n\
+      \032           displays a warning message: it simply pops up an advisory\n\
+      \032           window with a Dismiss button at the bottom and keeps on\n\
+      \032           going.\n\
+      \032         + Added a new preference for controlling how many status\n\
+      \032           messages are printed during update detection: statusdepth\n\
+      \032           controls the maximum depth for paths on the local machine\n\
+      \032           (longer paths are not displayed, nor are non-directory\n\
+      \032           paths). The value should be an integer; default is 1.\n\
+      \032         + Removed the trace and silent preferences. They did not seem\n\
+      \032           very useful, and there were too many preferences for\n\
+      \032           controlling output in various ways.\n\
+      \032         + The text UI now displays just the default command (the one\n\
+      \032           that will be used if the user just types <return>) instead of\n\
+      \032           all available commands. Typing ? will print the full list of\n\
+      \032           possibilities.\n\
+      \032         + The function that finds the canonical hostname of the local\n\
+      \032           host (which is used, for example, in calculating the name of\n\
+      \032           the archive file used to remember which files have been\n\
+      \032           synchronized) normally uses the gethostname operating system\n\
+      \032           call. However, if the environment variable\n\
+      \032           UNISONLOCALHOSTNAME is set, its value will now be used\n\
+      \032           instead. This makes it easier to use Unison in situations\n\
+      \032           where a machine's name changes frequently (e.g., because it\n\
+      \032           is a laptop and gets moved around a lot).\n\
+      \032         + File owner and group are now displayed in the \"detail window\"\n\
+      \032           at the bottom of the screen, when unison is configured to\n\
+      \032           synchronize them.\n\
+      \032    * For hackers:\n\
+      \032         + Updated to Jacques Garrigue's new version of lablgtk, which\n\
+      \032           means we can throw away our local patched version.\n\
+      \032           If you're compiling the GTK version of unison from sources,\n\
+      \032           you'll need to update your copy of lablgtk to the developers\n\
+      \032           release. (Warning: installing lablgtk under Windows is\n\
+      \032           currently a bit challenging.)\n\
+      \032         + The TODO.txt file (in the source distribution) has been\n\
+      \032           cleaned up and reorganized. The list of pending tasks should\n\
+      \032           be much easier to make sense of, for people that may want to\n\
+      \032           contribute their programming energies. There is also a\n\
+      \032           separate file BUGS.txt for open bugs.\n\
+      \032         + The Tk user interface has been removed (it was not being\n\
+      \032           maintained and no longer compiles).\n\
+      \032         + The debug preference now prints quite a bit of additional\n\
+      \032           information that should be useful for identifying sources of\n\
+      \032           problems.\n\
+      \032         + The version number of the remote server is now checked right\n\
+      \032           away during the connection setup handshake, rather than\n\
+      \032           later. (Somebody sent a bug report of a server crash that\n\
+      \032           turned out to come from using inconsistent versions: better\n\
+      \032           to check this earlier and in a way that can't crash either\n\
+      \032           client or server.)\n\
+      \032         + Unison now runs correctly on 64-bit architectures (e.g. Alpha\n\
+      \032           linux). We will not be distributing binaries for these\n\
+      \032           architectures ourselves (at least for a while) but if someone\n\
+      \032           would like to make them available, we'll be glad to provide a\n\
+      \032           link to them.\n\
+      \032    * Bug fixes:\n\
+      \032         + Pattern matching (e.g. for ignore) is now case-insensitive\n\
+      \032           when Unison is in case-insensitive mode (i.e., when one of\n\
+      \032           the replicas is on a windows machine).\n\
+      \032         + Some people had trouble with mysterious failures during\n\
+      \032           propagation of updates, where files would be falsely reported\n\
+      \032           as having changed during synchronization. This should be\n\
+      \032           fixed.\n\
+      \032         + Numerous smaller fixes.\n\
+      \n\
+      \032  Changes since 2.4.1:\n\
+      \032    * Added a number of 'sorting modes' for the user interface. By\n\
+      \032      default, conflicting changes are displayed at the top, and the\n\
+      \032      rest of the entries are sorted in alphabetical order. This\n\
+      \032      behavior can be changed in the following ways:\n\
+      \032         + Setting the sortnewfirst preference to true causes newly\n\
+      \032           created files to be displayed before changed files.\n\
+      \032         + Setting sortbysize causes files to be displayed in increasing\n\
+      \032           order of size.\n\
+      \032         + Giving the preference sortfirst=<pattern> (where <pattern> is\n\
+      \032           a path descriptor in the same format as 'ignore' and 'follow'\n\
+      \032           patterns, causes paths matching this pattern to be displayed\n\
+      \032           first.\n\
+      \032         + Similarly, giving the preference sortlast=<pattern> causes\n\
+      \032           paths matching this pattern to be displayed last.\n\
+      \032      The sorting preferences are described in more detail in the user\n\
+      \032      manual. The sortnewfirst and sortbysize flags can also be accessed\n\
+      \032      from the 'Sort' menu in the grpahical user interface.\n\
+      \032    * Added two new preferences that can be used to change unison's\n\
+      \032      fundamental behavior to make it more like a mirroring tool instead\n\
+      \032      of a synchronizer.\n\
+      \032         + Giving the preference prefer with argument <root> (by adding\n\
+      \032           -prefer <root> to the command line or prefer=<root>) to your\n\
+      \032           profile) means that, if there is a conflict, the contents of\n\
+      \032           <root> should be propagated to the other replica (with no\n\
+      \032           questions asked). Non-conflicting changes are treated as\n\
+      \032           usual.\n\
+      \032         + Giving the preference force with argument <root> will make\n\
+      \032           unison resolve all differences in favor of the given root,\n\
+      \032           even if it was the other replica that was changed.\n\
+      \032      These options should be used with care! (More information is\n\
+      \032      available in the manual.)\n\
+      \032    * Small changes:\n\
+      \032         + Changed default answer to 'Yes' in all two-button dialogs in\n\
+      \032           the graphical interface (this seems more intuitive).\n\
+      \032         + The rsync preference has been removed (it was used to\n\
+      \032           activate rsync compression for file transfers, but rsync\n\
+      \032           compression is now enabled by default).\n\
+      \032         + In the text user interface, the arrows indicating which\n\
+      \032           direction changes are being propagated are printed\n\
+      \032           differently when the user has overridded Unison's default\n\
+      \032           recommendation (====> instead of ---->). This matches the\n\
+      \032           behavior of the graphical interface, which displays such\n\
+      \032           arrows in a different color.\n\
+      \032         + Carriage returns (Control-M's) are ignored at the ends of\n\
+      \032           lines in profiles, for Windows compatibility.\n\
+      \032         + All preferences are now fully documented in the user manual.\n\
+      \n\
+      \032  Changes since 2.3.12:\n\
+      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
+      \032      synchronize your replicas before upgrading, to avoid spurious\n\
+      \032      conflicts. The first sync after upgrading will be slow.\n\
+      \032    * New/improved functionality:\n\
+      \032         + A new preference -sortbysize controls the order in which\n\
+      \032           changes are displayed to the user: when it is set to true,\n\
+      \032           the smallest changed files are displayed first. (The default\n\
+      \032           setting is false.)\n\
+      \032         + A new preference -sortnewfirst causes newly created files to\n\
+      \032           be listed before other updates in the user interface.\n\
+      \032         + We now allow the ssh protocol to specify a port.\n\
+      \032         + Incompatible change: The unison: protocol is deprecated, and\n\
+      \032           we added file: and socket:. You may have to modify your\n\
+      \032           profiles in the .unison directory. If a replica is specified\n\
+      \032           without an explicit protocol, we now assume it refers to a\n\
+      \032           file. (Previously \"//saul/foo\" meant to use SSH to connect to\n\
+      \032           saul, then access the foo directory. Now it means to access\n\
+      \032           saul via a remote file mechanism such as samba; the old\n\
+      \032           effect is now achieved by writing ssh://saul/foo.)\n\
+      \032         + Changed the startup sequence for the case where roots are\n\
+      \032           given but no profile is given on the command line. The new\n\
+      \032           behavior is to use the default profile (creating it if it\n\
+      \032           does not exist), and temporarily override its roots. The\n\
+      \032           manual claimed that this case would work by reading no\n\
+      \032           profile at all, but AFAIK this was never true.\n\
+      \032         + In all user interfaces, files with conflicts are always\n\
+      \032           listed first\n\
+      \032         + A new preference 'sshversion' can be used to control which\n\
+      \032           version of ssh should be used to connect to the server. Legal\n\
+      \032           values are 1 and 2. (Default is empty, which will make unison\n\
+      \032           use whatever version of ssh is installed as the default 'ssh'\n\
+      \032           command.)\n\
+      \032         + The situation when the permissions of a file was updated the\n\
+      \032           same on both side is now handled correctly (we used to report\n\
+      \032           a spurious conflict)\n\
+      \032    * Improvements for the Windows version:\n\
+      \032         + The fact that filenames are treated case-insensitively under\n\
+      \032           Windows should now be handled correctly. The exact behavior\n\
+      \032           is described in the cross-platform section of the manual.\n\
+      \032         + It should be possible to synchronize with Windows shares,\n\
+      \032           e.g., //host/drive/path.\n\
+      \032         + Workarounds to the bug in syncing root directories in\n\
+      \032           Windows. The most difficult thing to fix is an ocaml bug:\n\
+      \032           Unix.opendir fails on c: in some versions of Windows.\n\
+      \032    * Improvements to the GTK user interface (the Tk interface is no\n\
+      \032      longer being maintained):\n\
+      \032         + The UI now displays actions differently (in blue) when they\n\
+      \032           have been explicitly changed by the user from Unison's\n\
+      \032           default recommendation.\n\
+      \032         + More colorful appearance.\n\
+      \032         + The initial profile selection window works better.\n\
+      \032         + If any transfers failed, a message to this effect is\n\
+      \032           displayed along with 'Synchronization complete' at the end of\n\
+      \032           the transfer phase (in case they may have scrolled off the\n\
+      \032           top).\n\
+      \032         + Added a global progress meter, displaying the percentage of\n\
+      \032           total bytes that have been transferred so far.\n\
+      \032    * Improvements to the text user interface:\n\
+      \032         + The file details will be displayed automatically when a\n\
+      \032           conflict is been detected.\n\
+      \032         + when a warning is generated (e.g. for a temporary file left\n\
+      \032           over from a previous run of unison) Unison will no longer\n\
+      \032           wait for a response if it is running in -batch mode.\n\
+      \032         + The UI now displays a short list of possible inputs each time\n\
+      \032           it waits for user interaction.\n\
+      \032         + The UI now quits immediately (rather than looping back and\n\
+      \032           starting the interaction again) if the user presses 'q' when\n\
+      \032           asked whether to propagate changes.\n\
+      \032         + Pressing 'g' in the text user interface will proceed\n\
+      \032           immediately with propagating updates, without asking any more\n\
+      \032           questions.\n\
+      \032    * Documentation and installation changes:\n\
+      \032         + The manual now includes a FAQ, plus sections on common\n\
+      \032           problems and on tricks contributed by users.\n\
+      \032         + Both the download page and the download directory explicitly\n\
+      \032           say what are the current stable and beta-test version\n\
+      \032           numbers.\n\
+      \032         + The OCaml sources for the up-to-the-minute developers'\n\
+      \032           version (not guaranteed to be stable, or even to compile, at\n\
+      \032           any given time!) are now available from the download page.\n\
+      \032         + Added a subsection to the manual describing cross-platform\n\
+      \032           issues (case conflicts, illegal filenames)\n\
+      \032    * Many small bug fixes and random improvements.\n\
+      \n\
+      \032  Changes since 2.3.1:\n\
+      \032    * Several bug fixes. The most important is a bug in the rsync module\n\
+      \032      that would occasionally cause change propagation to fail with a\n\
+      \032      'rename' error.\n\
+      \n\
+      \032  Changes since 2.2:\n\
+      \032    * The multi-threaded transport system is now disabled by default.\n\
+      \032      (It is not stable enough yet.)\n\
+      \032    * Various bug fixes.\n\
+      \032    * A new experimental feature:\n\
+      \032      The final component of a -path argument may now be the wildcard\n\
+      \032      specifier *. When Unison sees such a path, it expands this path on\n\
+      \032      the client into into the corresponding list of paths by listing\n\
+      \032      the contents of that directory.\n\
+      \032      Note that if you use wildcard paths from the command line, you\n\
+      \032      will probably need to use quotes or a backslash to prevent the *\n\
+      \032      from being interpreted by your shell.\n\
+      \032      If both roots are local, the contents of the first one will be\n\
+      \032      used for expanding wildcard paths. (Nb: this is the first one\n\
+      \032      after the canonization step - i.e., the one that is listed first\n\
+      \032      in the user interface - not the one listed first on the command\n\
+      \032      line or in the preferences file.)\n\
+      \n\
+      \032  Changes since 2.1:\n\
+      \032    * The transport subsystem now includes an implementation by Sylvain\n\
+      \032      Gommier and Norman Ramsey of Tridgell and Mackerras's rsync\n\
+      \032      protocol. This protocol achieves much faster transfers when only a\n\
+      \032      small part of a large file has been changed by sending just diffs.\n\
+      \032      This feature is mainly helpful for transfers over slow links--on\n\
+      \032      fast local area networks it can actually degrade performance--so\n\
+      \032      we have left it off by default. Start unison with the -rsync\n\
+      \032      option (or put rsync=true in your preferences file) to turn it on.\n\
+      \032    * \"Progress bars\" are now diplayed during remote file transfers,\n\
+      \032      showing what percentage of each file has been transferred so far.\n\
+      \032    * The version numbering scheme has changed. New releases will now be\n\
+      \032      have numbers like 2.2.30, where the second component is\n\
+      \032      incremented on every significant public release and the third\n\
+      \032      component is the \"patch level.\"\n\
+      \032    * Miscellaneous improvements to the GTK-based user interface.\n\
+      \032    * The manual is now available in PDF format.\n\
+      \032    * We are experimenting with using a multi-threaded transport\n\
+      \032      subsystem to transfer several files at the same time, making much\n\
+      \032      more effective use of available network bandwidth. This feature is\n\
+      \032      not completely stable yet, so by default it is disabled in the\n\
+      \032      release version of Unison.\n\
+      \032      If you want to play with the multi-threaded version, you'll need\n\
+      \032      to recompile Unison from sources (as described in the\n\
+      \032      documentation), setting the THREADS flag in Makefile.OCaml to\n\
+      \032      true. Make sure that your OCaml compiler has been installed with\n\
+      \032      the -with-pthreads configuration option. (You can verify this by\n\
+      \032      checking whether the file threads/threads.cma in the OCaml\n\
+      \032      standard library directory contains the string -lpthread near the\n\
+      \032      end.)\n\
+      \n\
+      \032  Changes since 1.292:\n\
+      \032    * Reduced memory footprint (this is especially important during the\n\
+      \032      first run of unison, where it has to gather information about all\n\
+      \032      the files in both repositories).\n\
+      \032    * Fixed a bug that would cause the socket server under NT to fail\n\
+      \032      after the client exits.\n\
+      \032    * Added a SHIFT modifier to the Ignore menu shortcut keys in GTK\n\
+      \032      interface (to avoid hitting them accidentally).\n\
+      \n\
+      \032  Changes since 1.231:\n\
+      \032    * Tunneling over ssh is now supported in the Windows version. See\n\
+      \032      the installation section of the manual for detailed instructions.\n\
+      \032    * The transport subsystem now includes an implementation of the\n\
+      \032      rsync protocol, built by Sylvain Gommier and Norman Ramsey. This\n\
+      \032      protocol achieves much faster transfers when only a small part of\n\
+      \032      a large file has been changed by sending just diffs. The rsync\n\
+      \032      feature is off by default in the current version. Use the -rsync\n\
+      \032      switch to turn it on. (Nb. We still have a lot of tuning to do:\n\
+      \032      you may not notice much speedup yet.)\n\
+      \032    * We're experimenting with a multi-threaded transport subsystem,\n\
+      \032      written by Jerome Vouillon. The downloadable binaries are still\n\
+      \032      single-threaded: if you want to try the multi-threaded version,\n\
+      \032      you'll need to recompile from sources. (Say make THREADS=true.)\n\
+      \032      Native thread support from the compiler is required. Use the\n\
+      \032      option -threads N to select the maximal number of concurrent\n\
+      \032      threads (default is 5). Multi-threaded and single-threaded\n\
+      \032      clients/servers can interoperate.\n\
+      \032    * A new GTK-based user interface is now available, thanks to Jacques\n\
+      \032      Garrigue. The Tk user interface still works, but we'll be shifting\n\
+      \032      development effort to the GTK interface from now on.\n\
+      \032    * OCaml 3.00 is now required for compiling Unison from sources. The\n\
+      \032      modules uitk and myfileselect have been changed to use labltk\n\
+      \032      instead of camltk. To compile the Tk interface in Windows, you\n\
+      \032      must have ocaml-3.00 and tk8.3. When installing tk8.3, put it in\n\
+      \032      c:\\Tcl rather than the suggested c:\\Program Files\\Tcl, and be sure\n\
+      \032      to install the headers and libraries (which are not installed by\n\
+      \032      default).\n\
+      \032    * Added a new -addversionno switch, which causes unison to use\n\
+      \032      unison-<currentversionnumber> instead of just unison as the remote\n\
+      \032      server command. This allows multiple versions of unison to coexist\n\
+      \032      conveniently on the same server: whichever version is run on the\n\
+      \032      client, the same version will be selected on the server.\n\
+      \n\
+      \032  Changes since 1.219:\n\
+      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
+      \032      synchronize your replicas before upgrading, to avoid spurious\n\
+      \032      conflicts. The first sync after upgrading will be slow.\n\
+      \032    * This version fixes several annoying bugs, including:\n\
+      \032         + Some cases where propagation of file permissions was not\n\
+      \032           working.\n\
+      \032         + umask is now ignored when creating directories\n\
+      \032         + directories are create writable, so that a read-only\n\
+      \032           directory and its contents can be propagated.\n\
+      \032         + Handling of warnings generated by the server.\n\
+      \032         + Synchronizing a path whose parent is not a directory on both\n\
+      \032           sides is now flagged as erroneous.\n\
+      \032         + Fixed some bugs related to symnbolic links and nonexistant\n\
+      \032           roots.\n\
+      \032              o When a change (deletion or new contents) is propagated\n\
+      \032                onto a 'follow'ed symlink, the file pointed to by the\n\
+      \032                link is now changed. (We used to change the link itself,\n\
+      \032                which doesn't fit our assertion that 'follow' means the\n\
+      \032                link is completely invisible)\n\
+      \032              o When one root did not exist, propagating the other root\n\
+      \032                on top of it used to fail, becuase unison could not\n\
+      \032                calculate the working directory into which to write\n\
+      \032                changes. This should be fixed.\n\
+      \032    * A human-readable timestamp has been added to Unison's archive\n\
+      \032      files.\n\
+      \032    * The semantics of Path and Name regular expressions now correspond\n\
+      \032      better.\n\
+      \032    * Some minor improvements to the text UI (e.g. a command for going\n\
+      \032      back to previous items)\n\
+      \032    * The organization of the export directory has changed -- should be\n\
+      \032      easier to find / download things now.\n\
+      \n\
+      \032  Changes since 1.200:\n\
+      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
+      \032      synchronize your replicas before upgrading, to avoid spurious\n\
+      \032      conflicts. The first sync after upgrading will be slow.\n\
+      \032    * This version has not been tested extensively on Windows.\n\
+      \032    * Major internal changes designed to make unison safer to run at the\n\
+      \032      same time as the replicas are being changed by the user.\n\
+      \032    * Internal performance improvements.\n\
+      \n\
+      \032  Changes since 1.190:\n\
+      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
+      \032      synchronize your replicas before upgrading, to avoid spurious\n\
+      \032      conflicts. The first sync after upgrading will be slow.\n\
+      \032    * A number of internal functions have been changed to reduce the\n\
+      \032      amount of memory allocation, especially during the first\n\
+      \032      synchronization. This should help power users with very big\n\
+      \032      replicas.\n\
+      \032    * Reimplementation of low-level remote procedure call stuff, in\n\
+      \032      preparation for adding rsync-like smart file transfer in a later\n\
+      \032      release.\n\
+      \032    * Miscellaneous bug fixes.\n\
+      \n\
+      \032  Changes since 1.180:\n\
+      \032    * INCOMPATIBLE CHANGE: Archive format has changed. Make sure you\n\
+      \032      synchronize your replicas before upgrading, to avoid spurious\n\
+      \032      conflicts. The first sync after upgrading will be slow.\n\
+      \032    * Fixed some small bugs in the interpretation of ignore patterns.\n\
+      \032    * Fixed some problems that were preventing the Windows version from\n\
+      \032      working correctly when click-started.\n\
+      \032    * Fixes to treatment of file permissions under Windows, which were\n\
+      \032      causing spurious reports of different permissions when\n\
+      \032      synchronizing between windows and unix systems.\n\
+      \032    * Fixed one more non-tail-recursive list processing function, which\n\
+      \032      was causing stack overflows when synchronizing very large\n\
+      \032      replicas.\n\
+      \n\
+      \032  Changes since 1.169:\n\
+      \032    * The text user interface now provides commands for ignoring files.\n\
+      \032    * We found and fixed some more non-tail-recursive list processing\n\
+      \032      functions. Some power users have reported success with very large\n\
+      \032      replicas.\n\
+      \032    * INCOMPATIBLE CHANGE: Files ending in .tmp are no longer ignored\n\
+      \032      automatically. If you want to ignore such files, put an\n\
+      \032      appropriate ignore pattern in your profile.\n\
+      \032    * INCOMPATIBLE CHANGE: The syntax of ignore and follow patterns has\n\
+      \032      changed. Instead of putting a line of the form\n\
+      \032                ignore = <regexp>\n\
+      \032      in your profile (.unison/default.prf), you should put:\n\
+      \032                ignore = Regexp <regexp>\n\
+      \032      Moreover, two other styles of pattern are also recognized:\n\
+      \032                ignore = Name <name>\n\
+      \032      matches any path in which one component matches <name>, while\n\
+      \032                ignore = Path <path>\n\
+      \032      matches exactly the path <path>.\n\
+      \032      Standard \"globbing\" conventions can be used in <name> and <path>:\n\
+      \032         + a ? matches any single character except /\n\
+      \032         + a * matches any sequence of characters not including /\n\
+      \032         + [xyz] matches any character from the set {x, y, z }\n\
+      \032         + {a,bb,ccc} matches any one of a, bb, or ccc.\n\
+      \032      See the user manual for some examples.\n\
+      \n\
+      \032  Changes since 1.146:\n\
+      \032    * Some users were reporting stack overflows when synchronizing huge\n\
+      \032      directories. We found and fixed some non-tail-recursive list\n\
+      \032      processing functions, which we hope will solve the problem. Please\n\
+      \032      give it a try and let us know.\n\
+      \032    * Major additions to the documentation.\n\
+      \n\
+      \032  Changes since 1.142:\n\
+      \032    * Major internal tidying and many small bugfixes.\n\
+      \032    * Major additions to the user manual.\n\
+      \032    * Unison can now be started with no arguments - it will prompt\n\
+      \032      automatically for the name of a profile file containing the roots\n\
+      \032      to be synchronized. This makes it possible to start the graphical\n\
+      \032      UI from a desktop icon.\n\
+      \032    * Fixed a small bug where the text UI on NT was raising a 'no such\n\
+      \032      signal' exception.\n\
+      \n\
+      \032  Changes since 1.139:\n\
+      \032    * The precompiled windows binary in the last release was compiled\n\
+      \032      with an old OCaml compiler, causing propagation of permissions not\n\
+      \032      to work (and perhaps leading to some other strange behaviors we've\n\
+      \032      heard reports about). This has been corrected. If you're using\n\
+      \032      precompiled binaries on Windows, please upgrade.\n\
+      \032    * Added a -debug command line flag, which controls debugging of\n\
+      \032      various modules. Say -debug XXX to enable debug tracing for module\n\
+      \032      XXX, or -debug all to turn on absolutely everything.\n\
+      \032    * Fixed a small bug where the text UI on NT was raising a 'no such\n\
+      \032      signal' exception.\n\
+      \n\
+      \032  Changes since 1.111:\n\
+      \032    * INCOMPATIBLE CHANGE: The names and formats of the preference files\n\
+      \032      in the .unison directory have changed. In particular:\n\
+      \032         + the file \"prefs\" should be renamed to default.prf\n\
+      \032         + the contents of the file \"ignore\" should be merged into\n\
+      \032           default.prf. Each line of the form REGEXP in ignore should\n\
+      \032           become a line of the form ignore = REGEXP in default.prf.\n\
+      \032    * Unison now handles permission bits and symbolic links. See the\n\
+      \032      manual for details.\n\
+      \032    * You can now have different preference files in your .unison\n\
+      \032      directory. If you start unison like this\n\
+      \032            unison profilename\n\
+      \032      (i.e. with just one \"anonymous\" command-line argument), then the\n\
+      \032      file ~/.unison/profilename.prf will be loaded instead of\n\
+      \032      default.prf.\n\
+      \032    * Some improvements to terminal handling in the text user interface\n\
+      \032    * Added a switch -killServer that terminates the remote server\n\
+      \032      process when the unison client is shutting down, even when using\n\
+      \032      sockets for communication. (By default, a remote server created\n\
+      \032      using ssh/rsh is terminated automatically, while a socket server\n\
+      \032      is left running.)\n\
+      \032    * When started in 'socket server' mode, unison prints 'server\n\
+      \032      started' on stderr when it is ready to accept connections. (This\n\
+      \032      may be useful for scripts that want to tell when a socket-mode\n\
+      \032      server has finished initalization.)\n\
+      \032    * We now make a nightly mirror of our current internal development\n\
+      \032      tree, in case anyone wants an up-to-the-minute version to hack\n\
+      \032      around with.\n\
+      \032    * Added a file CONTRIB with some suggestions for how to help us make\n\
+      \032      Unison better.\n\
+      \n\
+      "))
+::
+    ("", ("Junk", 
+     "Junk\n\
+      \032    _________________________________________________________________\n\
+      \n\
+      \032    This document was translated from L^AT[E]X by [2]H^EV^EA.\n\
+      \n\
+      References\n\
+      \n\
+      \032  1. file://localhost/Users/bcpierce/current/unison/trunk/doc/temp.html#ssh-win\n\
+      \032  2. http://pauillac.inria.fr/~maranget/hevea/index.html\n\
+      "))
+::
+    [];;
+

Deleted: branches/2.40/src/ubase/depend
===================================================================
--- trunk/src/ubase/depend	2010-02-17 13:06:38 UTC (rev 410)
+++ branches/2.40/src/ubase/depend	2010-02-20 23:23:17 UTC (rev 412)
@@ -1,20 +0,0 @@
-myMap.cmo: myMap.cmi 
-myMap.cmx: myMap.cmi 
-prefs.cmo: util.cmi uarg.cmi safelist.cmi prefs.cmi 
-prefs.cmx: util.cmx uarg.cmx safelist.cmx prefs.cmi 
-proplist.cmo: util.cmi proplist.cmi 
-proplist.cmx: util.cmx proplist.cmi 
-rx.cmo: rx.cmi 
-rx.cmx: rx.cmi 
-safelist.cmo: safelist.cmi 
-safelist.cmx: safelist.cmi 
-trace.cmo: util.cmi safelist.cmi prefs.cmi trace.cmi 
-trace.cmx: util.cmx safelist.cmx prefs.cmx trace.cmi 
-uarg.cmo: util.cmi safelist.cmi uarg.cmi 
-uarg.cmx: util.cmx safelist.cmx uarg.cmi 
-uprintf.cmo: uprintf.cmi 
-uprintf.cmx: uprintf.cmi 
-util.cmo: uprintf.cmi safelist.cmi util.cmi 
-util.cmx: uprintf.cmx safelist.cmx util.cmi 
-prefs.cmi: util.cmi 
-trace.cmi: prefs.cmi 



More information about the Unison-hackers mailing list