Loading ...
Sorry, an error occurred while loading the content.

47New unison beta-release (2.17) available; 2.13 promoted to stable

Expand Messages
  • Benjamin Pierce
    Aug 11, 2005
    • 0 Attachment
      The Unison team is pleased to announce a new beta-release, version
      2.17. The changes in this version are substantial, but mostly
      internal: we've completely revamped the way backups are handled,
      making the code simpler and more robust (probably modulo a few growing
      pains :-), and we've added a few new options to make backups easier to
      configure. Also, we've revamped the support for external merge
      programs, so that Unison will be able to use instances of Harmony as
      external merge tools.

      Version 2.13.16, which has been working well for weeks, is now
      promoted to stable.

      Grab it from here:




      Changes in Version 2.17.1

      Changes since 2.13.0:
      * The features for performing backups and for invoking external
      merge programs have been completely rewritten by Stephane
      (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
      version number (X.Y) will be considered significant when
      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.
      this process converges, the patched beta version will be dubbed
      * 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
      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
      + 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
      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
      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
      which are not correctly handled by unison, are rejected
      + 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
      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
      if the client is running on a Unix system and the EMACS
      environment variable is set to anything other than the
      * 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
      instead of OS X as well.
      + Finder flags now synchronized
      + Fallback in copy.ml for filesystem that do not support
      + 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
      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
      HFS with non-HFS volumes.) Synchronization of file
      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
      experience unpredictable crashes, so it is only for
      hackers for now. Run make with UISTYLE=mac to build
      * 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
      are doing.)
      + Running with the -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.)
      + Added a new preference assumeContentsAreImmutable. If a
      directory matches one of the patterns set in this
      then update detection is skipped for files in this
      (The purpose is to speed update detection for cases like
      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
      + The ignorecase flag has been changed from a boolean to a
      three-valued preference. The default setting, called
      checks the operating systems running on the client and
      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
      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
      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
      + 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
      and server and ignores filename case if either of them
      is OSX
      or Windows. Setting ignorecase to 'true' or 'false'
      this behavior.
      + Added a new preference, 'repeat', for the text user
      (only, at the moment). If 'repeat' is set to a number,
      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
      Tse for contributing this code!
      + The text UI now prints a list of failed and skipped
      at the end of synchronization.
      + Restarting update detection from the graphical UI will
      the current profile (which in particular will reset the -
      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.
      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
      the `rootalias' option, which allows you to tell unison
      two roots contain the same files. Rootalias was being
      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
      + 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
      of simultaneous file transfers.
      * Added a backupdir preference, which controls where backup files
      are stored.
      * Basic support added for OSX. In particular, Unison now
      when one of the hosts being synchronized is running OSX and
      switches to a case-insensitive treatment of filenames (i.e.,
      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
      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
      + Additions to FAQ, in particular suggestions about
      * Makefile
      + Makefile.OCaml now sets UISTYLE=text or UISTYLE=gtk
      automatically, depending on whether it finds lablgtk
      + 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
      * Fixed potential deadlock when synchronizing between Windows and
      * 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

      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
      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
      + "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
      column headers if loading a new profile caused the roots to
      + Fixed a bug that would put the text UI into an infinite
      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
      that had reported problems with display of non-ascii
      filenames, we'd appreciate knowing if this actually fixes
      + `-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
      + [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
      + 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
      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
      * Added a new command to the GTK user interface: pressing 'f'
      Unison to start a new update detection phase, using as paths
      those paths that have been detected as changed and not yet
      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
      * 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
      + Rsync instructions are send directly instead of first
      + Won't try forever to get the fingerprint of a continuously
      changing file: unison will give up after certain number of
      + Other bug fixes, including the one reported by Peter
      (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
      + 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

      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.
      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
      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
      * 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
      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
      * We now set the keepalive option on the server socket, to make
      that the server times out if the communication link is
      unexpectedly broken.
      * Bug fixes:
      + When updating small files, Unison now closes the
      + File permissions are properly updated when the file is
      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
      instead of reading the full contents of every file. This may
      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).
      Unison will never overwrite such an update with a change from
      other replica, since it always does a safe check for updates
      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-
      If you set the fastcheck preference, pay careful attention to
      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
      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
      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
      versions of each file are kept. The default is 2
      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
      o The actual merging is performed by an external
      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
      the special substrings CURRENT1, CURRENT2, NEW, and
      may appear at any point. Unison will substitute
      these as
      follows before invoking the command:
      # CURRENT1 is replaced by the name of the local
      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,
      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
      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
      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
      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
      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
      files can be named blah.include instead of blah.prf, so
      unison will not offer them in its 'choose a preference
      + For Linux systems, we now offer both a statically linked
      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
      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
      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
      and on the command line.
      You can achieve a similar effect, though, by breaking your
      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
      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
      + The GUI also supports one-key shortcuts for commonly used
      profiles. If a profile contains a preference of the form
      = n', where n is a single digit, then pressing this key
      cause Unison to immediately switch to this profile and
      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
      + Numerous other bugfixes and small improvements.

      Changes since 2.6.1:
      * The synchronization of modification times has been disabled for
      * Preference files may now include lines of the form include
      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
      * The servercmd and addversionno preferences can now be used
      together: -addversionno appends an appropriate -NNN to the
      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
      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
      o When the owner preference is set to true, file
      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
      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
      preference is a mask indicating which permission bits
      be synchronized. It is set by default to 0o1777: all
      bits but
      the set-uid and set-gid bits are synchronised
      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
      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
      will now be ignored iff it matches an ignore pattern and
      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
      + 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
      + 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
      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
      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
      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
      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
      + The version number of the remote server is now checked
      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.
      linux). We will not be distributing binaries for these
      architectures ourselves (at least for a while) but if
      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
      as having changed during synchronization. This should be
      + 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
      order of size.
      + Giving the preference sortfirst=<pattern> (where
      <pattern> is
      a path descriptor in the same format as 'ignore' and
      patterns, causes paths matching this pattern to be
      + 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
      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
      of a synchronizer.
      + Giving the preference prefer with argument <root> (by
      -prefer <root> to the command line or prefer=<root>) to
      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
      + 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

      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
      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,
      we added file: and socket:. You may have to modify your
      profiles in the .unison directory. If a replica is
      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.
      values are 1 and 2. (Default is empty, which will make
      use whatever version of ssh is installed as the default
      + The situation when the permissions of a file was updated
      same on both side is now handled correctly (we used to
      a spurious conflict)
      * Improvements for the Windows version:
      + The fact that filenames are treated case-insensitively
      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
      + 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
      it waits for user interaction.
      + The UI now quits immediately (rather than looping back and
      starting the interaction again) if the user presses 'q'
      asked whether to propagate changes.
      + Pressing 'g' in the text user interface will proceed
      immediately with propagating updates, without asking any
      * 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
      say what are the current stable and beta-test version
      + 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
      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
      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
      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
      * 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
      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

      Changes since 1.292:
      * Reduced memory footprint (this is especially important during
      first run of unison, where it has to gather information about
      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
      * 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
      Garrigue. The Tk user interface still works, but we'll be
      development effort to the GTK interface from now on.
      * OCaml 3.00 is now required for compiling Unison from sources.
      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
      to install the headers and libraries (which are not installed by
      * Added a new -addversionno switch, which causes unison to use
      unison-<currentversionnumber> instead of just unison as the
      server command. This allows multiple versions of unison to
      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
      + 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
      sides is now flagged as erroneous.
      + Fixed some bugs related to symnbolic links and nonexistant
      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
      which doesn't fit our assertion that 'follow' means
      link is completely invisible)
      o When one root did not exist, propagating the other
      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
      * The semantics of Path and Name regular expressions now
      * 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:
      * INCOM<br/><br/>(Message over 64 KB, truncated)