diff --git a/unison-2.40.63-manual.html b/unison-2.40.63-manual.html new file mode 100644 index 0000000..0ec37b0 --- /dev/null +++ b/unison-2.40.63-manual.html @@ -0,0 +1,4709 @@ + + + +
+ + + + + + + + + + + + + + + + + ++ Overview+ +
+Preface
+ •People
+ •Mailing Lists and Bug Reporting
+ •Development Status
+ •Copying
+ •Acknowledgements
+Installation
+ •Downloading Unison
+ •Running Unison
+ •Upgrading
+ •Building Unison from Scratch
+ Unix
+ Mac OS X
+ Windows
+ Installation Options
+Tutorial
+ •Preliminaries
+ •Local Usage
+ •Remote Usage
+ •Remote Shell Method
+ •Socket Method
+ •Using Unison for All Your Files
+ •Using Unison to Synchronize More Than Two Machines
+ •Going Further
+Basic Concepts
+ •Roots
+ •Paths
+ •What is an Update?
+ •What is a Conflict?
+ •Reconciliation
+ •Invariants
+ •Caveats and Shortcomings
+Reference Guide
+ •Running Unison
+ •The .unison Directory
+ •Archive Files
+ •Preferences
+ •Profiles
+ •Sample Profiles
+ A Minimal Profile
+ A Basic Profile
+ A Power-User Profile
+ •Keeping Backups
+ •Merging Conflicting Versions
+ •The User Interface
+ •Exit code
+ •Path specification
+ •Ignoring Paths
+ •Symbolic Links
+ •Permissions
+ •Cross-Platform Synchronization
+ •Slow Links
+ •Making Unison Faster on Large Files
+ •Fast Update Detection
+ •Mount Points and Removable Media
+ •Click-starting Unison
+Installing Ssh
+ •Unix
+ •Windows
+Changes in Version 2.40.61
+ +
+http://www.cis.upenn.edu/~bcpierce/unison/lists.html ++for more +information.
gtkui
) actually provides both interfaces: the graphical one
+appears by default, while the textual interface can be selected by including
+-ui text
on the command line. The textui
executable
+provides just the textual interface.Unix
module is fully implemented. It has
+been tested on many flavors of Windows (98, NT, 2000, XP) and Unix (OS X,
+Solaris, Linux, FreeBSD), and on both 32- and 64-bit architectures.+ http://wwwfun.kurims.kyoto-u.ac.jp/soft/olabl/lablgtk.html, ++ untar it, and follow the instructions to build and install it.
unison
executable with a Gtk2 graphical
+interface. (In previous releases of Unison, it was necessary to add UISTYLE=gtk2 to the 'make' command above. This requirement has been
+removed: the makefile should detect automatically when lablgtk2 is
+present and set this flag automatically.) unison
executable somewhere in your search path, either
+by adding the Unison directory to your PATH variable or by copying the
+executable to some standard directory where executables are stored.+ make NATIVE=false +to compile the bytecode. The result should be an executable file called +
unison.exe
. Makefile
in the distribution includes several switches that
+can be used to control how Unison is built. Here are the most useful
+ones:
+NATIVE=true
uses the native-code OCaml
+compiler, yielding an executable that will run quite a bit faster. We use
+this for building distribution versions.
+make DEBUGGING=true
generates debugging
+symbols.
+make STATIC=true
generates a (mostly)
+statically linked executable. We use this for building distribution
+versions, for portability.
++ mkdir a.tmp + touch a.tmp/a a.tmp/b + mkdir a.tmp/d + touch a.tmp/d/f +Copy this directory to b.tmp: +
+ cp -r a.tmp b.tmp ++Now try synchronizing a.tmp and b.tmp. (Since they are +identical, synchronizing them won't propagate any changes, but Unison +will remember the current state of both directories so that it will be +able to tell next time what has changed.) Type: +
+ unison a.tmp b.tmp +(You may need to add
-ui text
, depending how your unison binary was built.)+ rm a.tmp/a + echo "Hello" > a.tmp/b + echo "Hello" > b.tmp/b + date > b.tmp/c + echo "Hi there" > a.tmp/d/h + echo "Hello there" > b.tmp/d/h +Run Unison again: +
+ unison a.tmp b.tmp ++This time, the user interface will display only the files that have +changed. If a file has been modified in just one +replica, then it will be displayed with an arrow indicating the +direction that the change needs to be propagated. For example, +
+ <--- new file c [f] +indicates that the file c has been modified only in the second +replica, and that the default action is therefore to propagate the new +version to the first replica. To follow Unison's recommendation, +press the “f” at the prompt.
+ new file <-?-> new file d/h [] +By default, neither version will be propagated and both +replicas will remain as they are.
<
” or “>
” to force
+the change to be propagated from right to left or from left to right,
+or else press “/
” to skip this file and leave both replicas alone.
+When it reaches the end of the list of modified files, Unison will ask
+you one more time whether it should proceed with the updates that have
+been selected.?
”
+will always give a list of possible responses and their meanings.
+<
” key (to cause the version in b.tmp to
+propagate to a.tmp) or the right-arrow or “>
” key (which makes the a.tmp
+version override b.tmp). -addversionno
option; see
+the Preferences section.ssh
.
+ This method is more convenient (since there is no need to manually
+ start a “unison server” process on the server) and also more
+ secure (especially if you use ssh
).ssh
, which provides the
+same functionality as the older rsh
but much better security. Ssh is available from
+ftp://ftp.cs.hut.fi/pub/ssh/; up-to-date binaries for some
+architectures can also be found at
+ftp://ftp.faqs.org/ssh/contrib. See section A.2
+for installation instructions for the Windows version.ssh
requires some coordination between the client and server
+machines to establish that the client is allowed to invoke commands on
+the server; please refer to the ssh
documentation
+for information on how to set this up. The examples in this section
+use ssh
, but you can substitute rsh
for ssh
if
+you wish.+ ssh remotehostname unison -version ++should print the same version information as running +
+ unison -version +locally on the client. If remote execution fails, then either +something is wrong with your ssh setup (e.g., “permission denied”) +or else the search path that's being used when executing commands on +the server doesn't contain the
unison
executable (e.g.,
+“command not found”).+ unison -testServer a.tmp ssh://remotehostname/a.tmp ++Now cd to your home directory and type: +
+ unison a.tmp ssh://remotehostname/a.tmp +The result should be that the entire directory a.tmp is propagated +from the client to your home directory on the server.
+ unison a.tmp ssh://username@remotehostname/a.tmp ++Notes: +
a.tmp
some place other than your home
+directory on the remote host, you can give an absolute path for it by
+adding an extra slash between remotehostname
and the beginning
+of the path:
++ unison a.tmp ssh://remotehostname//absolute/path/to/a.tmp +
unison
executable
+ on the server by using the command-line option -servercmd
+ /full/path/name/of/unison or adding
+ servercmd=/full/path/name/of/unison to your profile (see
+ the Profile section). Similarly, you can specify a
+ explicit path for the ssh
program using the -sshcmd
+ option.
+ Extra arguments can be passed to ssh
by setting the
+ -sshargs
preference.
+
+ Warning: The socket method is
+ insecure: not only are the texts of your changes transmitted over
+ the network in unprotected form, it is also possible for anyone in
+ the world to connect to the server process and read out the contents
+ of your filesystem! (Of course, to do this they must understand the
+ protocol that Unison uses to communicate between client and server,
+ but all they need for this is a copy of the Unison sources.) The socket
+ method is provided only for expert users with specific needs; everyone
+ else should use the ssh
method.
+
+To run Unison over a socket connection, you must start a Unison
+daemon process on the server. This process runs continuously,
+waiting for connections over a given socket from client machines
+running Unison and processing their requests in turn.+ unison -socket NNNN +on the server machine, where NNNN is the socket number that the +daemon should listen on for connections from clients. (NNNN can +be any large number that is not being used by some other program; if +NNNN is already in use, Unison will exit with an error +message.) Note that paths specified by the client will be interpreted +relative to the directory in which you start the server process; this +behavior is different from the ssh case, where the path is relative to +your home directory on the server.
+ unison a.tmp socket://remotehostname:NNNN/a.tmp ++The result should be that the entire directory a.tmp is +propagated from the client to the server (a.tmp will be +created on the server in the directory that the server was started +from). +After finishing the first synchronization, change a few files and try +synchronizing again. You should see similar results as in the local +case.
+ unison /home/username ssh://remotehost//home/username -path shared ++The -path option can be used as many times as needed, to +synchronize several files or subdirectories: +
+ unison /home/username ssh://remotehost//home/username+These\
+ -path shared\
+ -path pub\
+ -path .netscape/bookmarks.html +
-path
arguments can also be put in your preference file.
+See the Preferences section for an example.
+rdist
, where
+the mirroring operation typically needs to be initiated from the
+machine with the most recent changes. the Profile section
+covers the syntax of Unison profiles, together with some sample profiles.+ unison -doc topics +at the command line, or by selecting the Help menu in the graphical +user interface. +The on-line information and the printed manual are essentially identical. +
+ relative/path/of/root ++specifies a local root relative to the directory where Unison is +started, while +
+ /absolute/path/of/root ++specifies a root relative to the top of the local filesystem, +independent of where Unison is running. Remote roots can begin with +
ssh://
,
+rsh://
+to indicate that the remote server should be started with rsh or ssh:
++ ssh://remotehost//absolute/path/of/root + rsh://user@remotehost/relative/path/of/root ++If the remote server is already running (in the socket mode), then the syntax +
+ socket://remotehost:portnum//absolute/path/of/root + socket://remotehost:portnum/relative/path/of/root ++is used to specify the hostname and the port that the client Unison should +use to contact it.
+ replica ::= [protocol:]//[user@][host][:port][/path] + | path + + protocol ::= file + | socket + | ssh + | rsh + + user ::= [-_a-zA-Z0-9]+ + + host ::= [-_a-zA-Z0-9.]+ + + port ::= [0-9]+ ++When
path
is given without any protocol prefix, the protocol is
+assumed to be file:
. Under Windows, it is possible to
+synchronize with a remote directory using the file:
protocol over
+the Windows Network Neighborhood. For example,
++ unison foo //host/drive/bar +synchronizes the local directory
foo
with the directory
+drive:\bar
on the machine host
, provided that host
+is accessible via Network Neighborhood. When the file:
protocol
+is used in this way, there is no need for a Unison server to be running
+on the remote host. However, running Unison this way is only a good
+idea if the remote host is reached by a very fast network connection,
+since the full contents of every file in the remote replica will have to
+be transferred to the local machine to detect updates./
.
+Note that the path separator character is always a forward slash, no
+matter what operating system Unison is running on. Forward slashes
+are converted to backslashes as necessary when paths are converted to
+filenames in the local filesystem on a particular host.
+(For example, suppose that we run Unison on a Windows system, synchronizing
+the local root c:\pierce
with the root
+ssh://saul.cis.upenn.edu/home/bcpierce
on a Unix server. Then
+the path current/todo.txt
refers to the file
+c:\pierce\current\todo.txt
on the client and
+/home/bcpierce/current/todo.txt
on the server.)[root]
.”p
is a path and q
is a path beginning with p
, then
+q
is said to be a descendant of p
. (Each path is also a
+descendant of itself.)p
in a particular replica could be a
+file, a directory, a symbolic link, or absent (if p
does not
+refer to anything at all in that replica). More specifically:
+p
refers to an ordinary file, then the
+contents of p
are the actual contents of this file (a string of bytes)
+plus the current permission bits of the file.
+p
refers to a symbolic link, then the contents of p
+are just the string specifying where the link points.
+p
refers to a directory, then the
+contents of p
are just the token “DIRECTORY” plus the current
+permission bits of the directory.
+p
does not refer to anything in this replica, then the
+contents of p
are the token “ABSENT.”
+.tmp
) in the replicas. It is safe to delete these
+files. Also, if the backups
flag is set, Unison will
+leave around old versions of files that it overwrites, with names like
+file.0.unison.bak
. These can be deleted safely when they are no
+longer wanted.-times
option allows you to synchronize file times, but it does not
+cause identical files to be changed; Unison will only modify the file
+times.)retouch
to change a file's modtime back to a time in the past.
+ umask
on both computers to
+something like 022, masking out the “world write” and “group write”
+permission bits. setuid
and setgid
bits, for
+security. .unison
+directory. If this file does not specify a pair of roots, Unison will
+prompt for them and add them to the information specified by the profile.
+saul
are converted into full addresses like saul.cis.upenn.edu
),
+gethostname
operating system call. However, if the environment
+variable UNISONLOCALHOSTNAME
is set, its value will 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).rootalias
preference. The preference file may contain any number of
+lines of the form:
++ rootalias = //hostnameA//path-to-replicaA -> //hostnameB/path-to-replicaB ++When calculating the name of the archive files for a given pair of roots, +Unison replaces any root that matches the left-hand side of any rootalias +rule by the corresponding right-hand side.
+ rootalias = //new-hostname//new-path -> //old-hostname/old-path ++Note that root aliases are case-sensitive, even on case-insensitive file +systems.
rootalias
option is dangerous and should only
+be used if you are sure you know what you're doing. In particular, it
+should only be used if you are positive that either (1) both the original
+root and the new alias refer to the same set of files, or (2) the files
+have been relocated so that the original name is now invalid and will
+never be used again. (If the original root and the alias refer to
+different sets of files, Unison's update detector could get confused.)
+After introducing a new rootalias
, it is a good idea to run Unison
+a few times interactively (with the batch
flag off, etc.) and
+carefully check that things look reasonable—in particular, that update
+detection is working as expected.false
on the command line, use -p=false.++Here, in more detail, is what they do. Many are discussed in greater detail +in other sections of the manual. ++Usage: unison [options] + or unison root1 root2 [options] + or unison profilename [options] + +Basic options: + -auto automatically accept default (nonconflicting) actions + -batch batch mode: ask no questions at all + -doc xxx show documentation ('-doc topics' lists topics) + -fat use appropriate options for FAT filesystems + -group synchronize group attributes + -ignore xxx add a pattern to the ignore list + -ignorenot xxx add a pattern to the ignorenot list + -nocreation xxx prevent file creations on one replica + -nodeletion xxx prevent file deletions on one replica + -noupdate xxx prevent file updates and deletions on one replica + -owner synchronize owner + -path xxx path to synchronize + -perms n part of the permissions which is synchronized + -root xxx root of a replica (should be used exactly twice) + -silent print nothing except error messages + -terse suppress status messages + -testserver exit immediately after the connection to the server + -times synchronize modification times + -version print version and exit + +Advanced options: + -addprefsto xxx file to add new prefs to + -addversionno add version number to name of unison on server + -backup xxx add a pattern to the backup list + -backupcurr xxx add a pattern to the backupcurr list + -backupcurrnot xxx add a pattern to the backupcurrnot list + -backupdir xxx directory for storing centralized backups + -backuploc xxx where backups are stored ('local' or 'central') + -backupnot xxx add a pattern to the backupnot list + -backupprefix xxx prefix for the names of backup files + -backups keep backup copies of all files (see also 'backup') + -backupsuffix xxx a suffix to be added to names of backup files + -confirmbigdel ask about whole-replica (or path) deletes (default true) + -confirmmerge ask for confirmation before commiting results of a merge + -contactquietly suppress the 'contacting server' message during startup + -copymax n maximum number of simultaneous copyprog transfers + -copyprog xxx external program for copying large files + -copyprogrest xxx variant of copyprog for resuming partial transfers + -copyquoterem xxx add quotes to remote file name for copyprog (true/false/default) + -copythreshold n use copyprog on files bigger than this (if >=0, in Kb) + -debug xxx debug module xxx ('all' -> everything, 'verbose' -> more) + -diff xxx set command for showing differences between files + -dontchmod when set, never use the chmod system call + -dumbtty do not change terminal settings in text UI (default true) + -fastcheck xxx do fast update detection (true/false/default) + -follow xxx add a pattern to the follow list + -force xxx force changes from this replica to the other + -forcepartial xxx add a pattern to the forcepartial list + -halfduplex force half-duplex communication with the server + -height n height (in lines) of main window in graphical interface + -host xxx bind the socket to this host name in server socket mode + -ignorearchives ignore existing archive files + -ignorecase xxx identify upper/lowercase filenames (true/false/default) + -ignoreinodenumbers ignore inode number changes when detecting updates + -ignorelocks ignore locks left over from previous run (dangerous!) + -immutable xxx add a pattern to the immutable list + -immutablenot xxx add a pattern to the immutablenot list + -key xxx define a keyboard shortcut for this profile (in some UIs) + -killserver kill server when done (even when using sockets) + -label xxx provide a descriptive string label for this profile + -links xxx allow the synchronization of symbolic links (true/false/default) + -log record actions in logfile (default true) + -logfile xxx logfile name + -maxbackups n number of backed up versions of a file + -maxerrors n maximum number of errors before a directory transfer is aborted + -maxthreads n maximum number of simultaneous file transfers + -merge xxx add a pattern to the merge list + -mountpoint xxx abort if this path does not exist + -nocreationpartial xxx add a pattern to the nocreationpartial list + -nodeletionpartial xxx add a pattern to the nodeletionpartial list + -noupdatepartial xxx add a pattern to the noupdatepartial list + -numericids don't map uid/gid values by user/group names + -prefer xxx choose this replica's version for conflicting changes + -preferpartial xxx add a pattern to the preferpartial list + -repeat xxx synchronize repeatedly (text interface only) + -retry n re-try failed synchronizations N times (text ui only) + -rootalias xxx register alias for canonical root names + -rsrc xxx synchronize resource forks (true/false/default) + -rsync activate the rsync transfer mode (default true) + -selftest run internal tests and exit + -servercmd xxx name of unison executable on remote server + -showarchive show 'true names' (for rootalias) of roots and archive + -socket xxx act as a server on a socket + -sortbysize list changed files by size, not name + -sortfirst xxx add a pattern to the sortfirst list + -sortlast xxx add a pattern to the sortlast list + -sortnewfirst list new before changed files + -sshargs xxx other arguments (if any) for remote shell command + -sshcmd xxx path to the ssh executable + -stream use a streaming protocol for transferring file contents (default true) + -ui xxx select UI ('text' or 'graphic'); command-line only + -unicode xxx assume Unicode encoding in case insensitive mode + -xferbycopying optimize transfers using local copies (default true) + ++
ignore
clauses) will be appended to whatever preference file Unison was told to load at the beginning of the run. Setting the preference addprefsto filename makes Unison add new preferences to the file named filename instead.unison
as the remote server command. This allows multiple binaries for different 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.backuplocation
preference. The backups are named according to the backupprefix
and backupsuffix
preferences. The number of versions that are kept is determined by the maxbackups
preference.merge
preference. For more details, see the Merging Conflicting Versions section.backupcurr
, like the ignorenot
preference.central
. It is checked after the UNISONBACKUPDIR environment variable.local
, backups will be kept in the same directory as the original files, and if set to central
, backupdir will be used instead.NAME
is created, it is stored in a directory specified by backuplocation, in a file called backupprefixNAME
backupsuffix. backupprefix can include a directory name (causing Unison to keep all backup files for a given directory in a subdirectory with this name), and both backupprefix and backupsuffix can contain the string$VERSION, which will be replaced by the age of the backup (1 for the most recent, 2 for the second most recent, and so on...). This keyword is ignored if it appears in a directory name in the prefix; if it does not appear anywhere in the prefix or the suffix, it will be automatically placed at the beginning of the suffix. Name *
.debug
can be found by looking for calls to Util.debug
in the sources (using, e.g., grep
). Setting -debug all
causes information from all modules to be printed (this mode of usage is the first one to try, if you are trying to understand something that Unison seems to be doing wrong); -debug verbose
turns on some additional debugging output from some modules (e.g., it will show exactly what bytes are being sent across the network).diff -u CURRENT2 CURRENT1
'. If the value of this preference contains the substrings CURRENT1 and CURRENT2, these will be replaced by the names of the files to be diffed. If not, the two filenames will be appended to the command. In both cases, the filenames are suitably quoted.-doc all
to display the whole manual, which includes exactly the same information as the printed and HTML manuals, modulo formatting. Use -doc topics
to obtain a list of the names of the various sections that can be printed.true
, this flag makes the text mode user interface avoid trying to change any of the terminal settings. (Normally, Unison puts the terminal in `raw mode', so that it can do things like overwriting the current line.) This is useful, for example, when Unison runs in a shell inside of Emacs. dumbtty
is set, commands to the user interface need to be followed by a carriage return before Unison will execute them. (When it is off, Unison recognizes keystrokes as soon as they are typed.)true
, Unison will use the modification time and length of a file as a
+ `pseudo inode number' when scanning replicas for updates, instead of reading the full contents of every file. Under Windows, this may cause Unison to miss propagating an update if the modification time and length of the file are both unchanged by the update. 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 under Windows 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. For backward compatibility, yes
, no
, and default
can be used in place of true
, false
, and auto
. See the Fast Checking section for more information.-force newer
(or -force older
) to force Unison to choose the file with the later (earlier) modtime. In this case, the -times
preference must also be enabled.forcepartial
preference.forcepartial PATHSPEC -> newer
(or forcepartial PATHSPEC older
) to force Unison to choose the file with the later (earlier) modtime. In this case, the -times
preference must also be enabled.true
, the group attributes of the files are synchronized. Whether the group names or the group identifiers are synchronized depends on the preference numerids.ignore
) for paths that should definitely not be ignored,
+ whether or not they happen to match one of the ignore
patterns.
+ true
, this flag causes Unison to kill the remote server process when the synchronization is finished. This behavior is the default for ssh
connections, so this preference is not normally needed when running over ssh
; it is provided so that socket-mode servers can be killed off after a single run of Unison, rather than waiting to accept future connections. (Some users prefer to start a remote socket server for each run of Unison, rather than leaving one running all the time.)unison.log
in your HOME directory. Set this preference if
+ you prefer another file.backup
. The default is 2.true
, groups and users are synchronized numerically, rather than by name. true
, the owner attributes of the files are synchronized. Whether the owner names or the owner identifiers are synchronizeddepends on the preference numerids.path
preference is given, Unison will simply synchronize the two entire replicas, beginning from the given pair of roots. If one or more path
preferences are given, then Unison will synchronize only these paths and their children. (This is useful for doing a fast sync of just one directory, for example.) Note that path preferences are intepreted literally—they are not regular expressions.root
preference, plus the special values newer
and older
.) preferpartial
preference.root
preference, plus the special values newer
and older
.) root
in the profile, or to give no values in the profile and provide two on the command line. Details of the syntax of roots can be found in the Roots section.rsh
command used to invoke the remote server. sortfirst
, except that files matching one of these patterns will be listed at the very end.ssh
command used to invoke the remote server. ssh1
orssh2
instead of just ssh
to invoke ssh. The default value is empty, which will make unison use whatever version of ssh is installed as the default `ssh' command.true
, file modification times (but not directory modtimes) are propagated.graphic
or text
. .unison
directory on the client
+machine. If Unison is started with just one argument name on
+the command line, it looks for a profile called name.prf in
+the .unison
directory. If it is started with no arguments, it
+scans the .unison
directory for files whose names end in
+.prf
and offers a menu (provided that the Unison executable is compiled with the graphical user interface). If a file named default.prf
is
+found, its settings will be offered as the default choices.+ p = true +for a boolean flag or +
+ p = <value> +for a preference of any other type.
.unison
directory) to be read at the point, and included as if
+its contents, instead of the include line, was part of the
+profile. Include lines allows settings common to several profiles to
+be stored in one place.+ # Roots of the synchronization + root = /home/bcpierce + root = ssh://saul//home/bcpierce + + # Paths to synchronize + path = current + path = common + path = .netscape/bookmarks.html ++ + +
+ # Roots of the synchronization + root = /home/bcpierce + root = ssh://saul//home/bcpierce + + # Paths to synchronize + path = current + path = common + path = .netscape/bookmarks.html + + # Some regexps specifying names and paths to ignore + ignore = Name temp.* + ignore = Name *~ + ignore = Name .*~ + ignore = Path */pilot/backup/Archive_* + ignore = Name *.o + ignore = Name *.tmp + + # Window height + height = 37 + + # Keep a backup copy of every file in a central location + backuplocation = central + backupdir = /home/bcpierce/backups + backup = Name * + backupprefix = $VERSION. + backupsuffix = + + # Use this command for displaying diffs + diff = diff -y -W 79 --suppress-common-lines + + # Log actions to the terminal + log = true ++ + +
+ # Include the contents of the file common + include common +Note that the name of the common file is common, not common.prf; this prevents Unison from offering common as one of +the list of profiles in the opening dialog (in the graphical UI).
+ # Roots of the synchronization + root = /home/bcpierce + root = ssh://saul//home/bcpierce + + # (... other preferences ...) + + # If any new preferences are added by Unison (e.g. 'ignore' + # preferences added via the graphical UI), then store them in the + # file 'common' rathen than in the top-level preference file + addprefsto = common + + # Names and paths to ignore: + ignore = Name temp.* + ignore = Name *~ + ignore = Name .*~ + ignore = Path */pilot/backup/Archive_* + ignore = Name *.o + ignore = Name *.tmp +Note that there are no path preferences in common. This +means that, when we invoke Unison with the default profile (e.g., by +typing 'unison default' or just 'unison' on the command +line), the whole replicas will be synchronized. (If we never want +to synchronize the whole replicas, then default.prf would instead +include settings for all the paths that are usually synchronized.)
+ path = current/papers + path = Mail/inbox + path = Mail/drafts + include common +causes Unison to synchronize just the listed subdirectories.
+ path = Mail + batch = true + key = 2 + include common +then pressing 2 will cause Unison to look for updates in the Mail +subdirectory and (because the batch flag is set) immediately +propagate any that it finds.
backup
preferences.
+Each of these has the form
++ backup = <pathspec> +where
<pathspec>
has the same form as for the ignore
+preference. For example,
++ backup = Name * +causes Unison to keep backups of all files and directories. The +
backupnot
preference can be used to give a few exceptions: it
+specifies which files and directories should not be backed up, even if
+they match the backup
pathspec. pathspec
is matched against the path
+that is being updated by Unison, not its descendants. For example, if you
+set backup = Name *.txt
and then delete a whole directory named
+foo
containing some text files, these files will not be backed up
+because Unison will just check that foo
does not match *.txt
.
+Similarly, if the directory itself happened to be called foo.txt
,
+then the whole directory and all the files in it will be backed up,
+regardless of their names. backuplocation
, whose value
+must be either central
or local
. (The default is
+central
.) backupdir
and the
+environment variable UNISONBACKUPDIR
. (The environment variable is
+checked first.) If neither of these are set, then the directory
+.unison/backup
in the user's home directory is used.maxbackups
controls how many previous versions of
+each file are kept (including the current version). .bak.VERSION.FILENAME
,
+where FILENAME
is the original filename and VERSION
is the
+backup number (1 for the most recent, 2 for the next most recent,
+etc.). This can be changed by setting the preferences backupprefix
+and/or backupsuffix
. If desired, backupprefix
may include a
+directory prefix; this can be used with backuplocation = local
to put all
+backup files for each directory into a single subdirectory. For example, setting
++ backuplocation = local + backupprefix = .unison/$VERSION. + backupsuffix = +will put all backups in a local subdirectory named
.unison
. Also,
+note that the string $VERSION
in either backupprefix
or
+backupsuffix
(it must appear in one or the other) is replaced by
+the version number. This can be used, for example, to ensure that backup
+files retain the same extension as the originals.backups
preference is also supported.
+It simply means backup = Name *
and backuplocation = local
.merge
controls this process. merge
preference may be given once or several times in a
+preference file (it can also be given on the command line, of course, but
+this tends to be awkward because of the spaces and special characters
+involved). Each instance of the preference looks like this:
++ merge = <PATHSPEC> -> <MERGECMD> +The
<PATHSPEC>
here has exactly the same format as for the
+ignore
preference (see the Path specification section). For example,
+using “Name *.txt
” as the <PATHSPEC>
tells Unison that this
+command should be used whenever a file with extension .txt
needs to
+be merged. backupcurrent
preference. This
+preference is used in exactly the same way as backup
and its meaning
+is similar, except that it causes backups to be kept of the current
+contents of each file after it has been synchronized by Unison, rather than
+the previous contents that Unison overwrote. These backups are kept
+on both replicas in the same place as ordinary backup files—i.e.
+according to the backuplocation
and backupdir
preferences.
+They are named like the original files if backupslocation
is set to
+'central' and otherwise, Unison uses the backupprefix
and
+backupsuffix
preferences and assumes a version number 000 for these
+backups.<MERGECMD>
part of the preference specifies what external command
+should be invoked to merge files at paths matching the <PATHSPEC>
.
+Within this string, several special substrings are recognized; these will be
+substituted with appropriate values before invoking a sub-shell to execute
+the command.
+CURRENT1
is replaced by the name of (a temporary copy of)
+ the local variant of the file.
+CURRENT2
is replaced by the name of a temporary
+ file, into which the contents of the remote variant of the file have
+ been transferred by Unison prior to performing the merge.
+CURRENTARCH
is replaced by the name of the backed up copy
+ of the original version of the file (i.e., the file saved by Unison
+ if the current filename matches the path specifications for the
+ backupcurrent
preference, as explained above), if one exists.
+ If no archive exists and CURRENTARCH
appears in the
+ merge command, then an error is signalled.
+CURRENTARCHOPT
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, or the empty
+ string if no archive exists.
+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.
+PATH
is replaced by the path (relative to the roots of
+ the replicas) of the file being merged.
+NEW1
and NEW2
are replaced by the names of temporary files
+ that Unison expects to be written by the merge program when it
+ is only able to partially merge the originals; in this case, NEW1
+ will be written back to the local replica and NEW2
to the remote
+ replica; NEWARCH
, if present, will be used as the “last common
+ state” of the replicas. (These three options are provided for
+ later compatibility with the Harmony data synchronizer.)
+NEW
has been created, it is written back to both
+ replicas (and stored in the backup directory). Similarly, if just the
+ file NEW1
has been created, it is written back to both
+ replicas.
+NEW
nor NEW1
have been created, then Unison
+ examines the temporary files CURRENT1
and CURRENT2
that
+ were given as inputs to the merge program. If either has been changed (or
+ both have been changed in identical ways), then its new contents are written
+ back to both replicas. If either CURRENT1
or CURRENT2
has
+ been deleted, then the contents of the other are written back to
+ both replicas.
+NEW1
, NEW2
, and NEWARCH
have all
+ been created, they are written back to the local replica, remote replica,
+ and backup directory, respectively. If the files NEW1
, NEW2
have
+ been created, but NEWARCH
has not, then these files are written back to the
+ local replica and remote replica, respectively. Also, if NEW1
and
+ NEW2
have identical contents, then the same contents are stored as
+ a backup (if the backupcurrent
preference is set for this path) to
+ reflect the fact that the path is currently in sync.
+ NEW1
and NEW2
(resp. CURRENT1
and
+ CURRENT2
) are created (resp. overwritten) with different contents
+ but the merge command did not fail (i.e., it exited with status code 0),
+ then we copy NEW1
(resp. CURRENT1
) to the other replica and
+ to the archive. confirmmerge
preference is set and Unison is not run in
+batch mode, then Unison will always ask for confirmation before
+actually committing the results of the merge to the replicas.merge
preference to
++ merge = Name *.txt -> diff3 -m CURRENT1 CURRENTARCH CURRENT2 + > NEW || echo "differences detected" +will tell Unison to use the external
diff3
program for merging.
+Alternatively, users of emacs
may find the following settings convenient:
++ merge = Name *.txt -> emacs -q --eval '(ediff-merge-files-with-ancestor + "CURRENT1" "CURRENT2" "CURRENTARCH" nil "NEW")' +(These commands are displayed here on two lines to avoid running off the +edge of the page. In your preference file, each command should be written on a +single line.)
+ merge = Name * -> C:\Progra~1\Emacs\emacs\bin\emacs.exe -q --eval + "(ediff-files """CURRENT1""" """CURRENT2""")" ++Users running Mac OS X (you may need the Developer Tools installed to get +the opendiff utility) may prefer +
+ merge = Name *.txt -> opendiff CURRENT1 CURRENT2 -ancestor CURRENTARCH -merge NEW +Here is a slightly more involved hack. The opendiff program can +operate either with or without an archive file. A merge command of this +form +
+ merge = Name *.txt -> + if [ CURRENTARCHOPTx = x ]; + then opendiff CURRENT1 CURRENT2 -merge NEW; + else opendiff CURRENT1 CURRENT2 -ancestor CURRENTARCHOPT -merge NEW; + fi +(still all on one line in the preference file!) will test whether an archive +file exists and use the appropriate variant of the arguments to opendiff.
+Please post suggestions for other useful values of the
+merge
preference to the unison-users mailing list—we'd like
+to give several examples here.
+
+
+
+>
” to tell Unison to
+propagate a file from left to right, rather than “>
Enter.”)dumbtty
preference will force Unison to leave the
+terminal alone and process input a line at a time.
+ignore
/ignorenot
,
+follow
, sortfirst
/sortlast
, backup
,
+merge
, etc.)
+specify individual paths or sets of paths. These preferences share a
+common syntax based on regular-expressions. Each preference
+is associated with a list of path patterns; the paths specified are those
+that match any one of the path pattern.
++ ignore = pattern ++adds pattern to the list of patterns to be ignored.
Regex
. (The collating sequences and character classes of
+full Posix regexps are not currently supported).
++ Regex regexp ++For convenience, three other styles of pattern are also recognized: +
+ Name name ++matches any path in which the last component matches name, +
+ Path path ++matches exactly the path path, and +
+ BelowPath path ++matches the path path and any path below. +The name and path arguments of the latter forms of +patterns are not regular expressions. Instead, +standard “globbing” conventions can be used in name and +path: +
*
matches any sequence of characters not including /
+(and not beginning with .
, when used at the beginning of a
+name)
+?
matches any single character except /
(and leading
+ .
)
+[xyz]
matches any character from the set {x,
+ y, z }
+{a,bb,ccc}
matches any one of a
, bb
, or
+ ccc
.
+CVS
or a name ending in .cmo
:
++ ignore = Name {CVS,*.cmo} +The next pattern makes Unison ignore the path
a/b
:
++ ignore = Path a/b +Path patterns do not skip filesnames beginning with
.
(as Name
+patterns do). For example,
++ ignore = Path */tmp +will include
.foo/tmp
in the set of ignore directories, as it is a
+path, not a name, that is ignored.a/b
+and ending with a name ending by .ml
.
++ ignore = Regex a/b/.*\.ml +Note that regular expression patterns are “anchored”: they must +match the whole path, not just a substring of the path.
include
directive to include a common
+collection of preferences in several top-level preference files, you will
+probably also want to set the addprefsto
preference to the name of
+this file. This will cause any new ignore patterns that you add from
+inside Unison to be appended to this file, instead of whichever top-level
+preference file you started Unison with. -ignore 'Name temp.txt'
.ignorenot
preference, which specifies a set of
+ patterns for paths that should not be ignored, even if they match an
+ ignore
pattern. However, the interaction of these two sets of
+ patterns can be a little tricky. Here is exactly how it works:
+ ignore
pattern and does not match an ignorenot
pattern, then
+ the whole replica will be ignored. (For this reason, it is not a good
+ idea to include Name *
as an ignore
pattern. If you want to
+ ignore everything except a certain set of files, use Name ?*
.)
+ ignore
pattern and does not match an ignorenot
pattern, then
+ this whole path including everything below it will be ignored.
+ + follow = pathspec ++to the profile, where pathspec is a path pattern as described in +the Path Patterns section.
ignore
pattern or a follow
pattern.setuid
and setgid
+bits are not propagated.
++ copyprog = rsync --inplace --compress + copyprogrest = rsync --partial --inplace --compress +You may also need to set the copyquoterem preference. When it is set +to true, this causes Unison to add an extra layer of quotes to +the remote path passed to the external copy program. This is is needed by +rsync, for example, which internally uses an ssh connection, requiring an +extra level of quoting for paths containing spaces. When this flag is set to +default, extra quotes are added if the value of copyprog +contains the string rsync. The default value is default, +naturally.
true
, causes it to use file creation times as 'pseudo inode
+numbers' when scanning replicas for updates, instead of reading the full
+contents of every file. fastcheck
is set to no
,
+Unison will perform slow checking—re-scanning the contents of each file
+on each synchronization—on all replicas. When fastcheck
is set
+to default
(which, naturally, is the default), Unison will use
+fast checks on Unix replicas and slow checks on Windows replicas.no
, if you are worried that Unison may have
+overlooked an update..xls
or .mpp
, to prevent Unison from being confused by the
+habits of certain programs (Excel, in particular) of updating files without
+changing their modification times.mountpoint
. Including a line like
++ mountpoint = foo +in your preference file will cause Unison to check, after it finishes +detecting updates, that something actually exists at the path +
foo
on both replicas; if it does not, the Unison run will
+abort. ssh
pre-installed.ssh
executable. Foo
.
+setup.exe
;
+ save it in the directory Foo
. The file setup.exe
is a
+ small program that will download the actual install files from
+ the Internet when you run it.
+setup.exe
(by double-clicking). This brings up a
+ series of dialogs that you will have to go through. Select
+ “Install from Internet.” For “Local Package Directory” select
+ the directory Foo
. For “Select install root directory” we
+ recommend that you use the default, C:\cygwin
. The next
+ dialog asks you to select the way that you want to connect to the
+ network to download the installation files; we have used “Use IE5
+ Settings” successfully, but you may need to make a different
+ selection depending on your networking setup. The next dialog gives
+ a list of mirrors; select one close to you.Note that you are plan to build unison using the free + CygWin GNU C compiler, you need to install essential development + packages such as “gcc”, “make”, “fileutil”, etc; we refer to + the file “INSTALL.win32-cygwin-gnuc” in the source distribution + for further details. ++After the packages are downloaded and installed, the next dialog + allows you to choose whether to “Create Desktop Icon” and “Add to + Start Menu.” You make the call. +
Foo
and its contents.
++ http://opensores.thebunker.net/pub/mirrors/ssh/contrib/ssh-1.2.14-win32bin.zip +
.ssh
in the directory given
+ by HOME, so that it has a place to keep data like your public and
+ private keys. PATH must be set to include the Cygwin bin
+ directory, so that Unison can find the ssh executable.
+ + set PATH=%PATH%;<SSHDIR> + set HOME=<HOMEDIR> +to the file
C:\AUTOEXEC.BAT
, where <HOMEDIR>
is the
+ directory where you want ssh to create its .ssh
directory,
+ and <SSHDIR>
is the directory where the executable
+ ssh.exe
is stored; if you've installed Cygwin in the
+ default location, this is C:\cygwin\bin
. You will have to
+ reboot your computer to take the changes into account.
+ ;<SSHDIR>
+ to it, where <SSHDIR>
is the full name of the directory
+ that includes the ssh executable; if you've installed Cygwin in
+ the default location, this is C:\cygwin\bin
.
+ + ssh <remote host> -l <login name> +You should get a prompt for your password on
<remote host>
,
+ followed by a working connection.
+ ssh-keygen
may not work (fails with
+ “gethostname: no such file or directory”) on some systems. This is
+ OK: you can use ssh with your regular password for the remote
+ system.
+//username@host/path...
).
+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.
+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.)
+ 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.]
+mergebatch
preference. (It never seemed very useful, and
+ its semantics were confusing.)
+.#
to .unison
.
+-terse
flag) to make it easier to interpret the
+ results when Unison is run several times in succession from a script.
+.mpp
files to the “never fastcheck” list (like
+.xls
files).
+backupXXX
+preferences) for details.
+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.modified at hh:mm:ss on dd MMM, yyyy
+to modified on yyyy-mm-dd hh:mm:ss
+$UNISON
for home directory as a last resort
+ (it was wrongly moved before $HOME
and $USERPROFILE
in
+ Unison 2.12.0)
++ 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).
+O_EXCL
+HOME
and
+ USERPROFILE
in that order. On Unix and Cygwin systems, HOME
is used.
+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.
+~/.unison
exists, use it
+ ~/Library/Application Support/Unison
,
+ creating it if necessary.
+-prefer/-force newer
' works properly now.
+ (The bug was reported by Sebastian Urbaniak and Sean Fulton.)
+[END]
messages in log now use a briefer format
+.#<filename>.<serial>.unison.tmp
.
+ [N.b. This was later changed to .unison.<filename>.<serial>.unison.tmp
.]
+ force=older preference
not working).
+ addprefsto
preference, which (when set) controls which
+preference file new preferences (e.g. new ignore patterns) are added to.
+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
.
+ 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.fastcheck
preference, pay careful attention to what
+ Unison is doing.UNISONBACKUPDIR
.)
+ backup
controls which files are actually
+ backed up:
+ giving the preference 'backup = Path *
' causes backing up
+ of all files.
+ backupversions
controls how many previous
+ versions of each file are kept. The default is 2 (i.e., the last
+ synchronized version plus one backup).
+ backups
preference is also
+ still supported, but backup
is now preferred.
+ 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
).
+ merge
preference to
++ merge = diff3 -m CURRENT1 OLD CURRENT2 > NEW +will tell Unison to use the external
diff3
program for merging. 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.)
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
.merge2
and merge
preferences – we'd like to give several
+ examples in the manual.
+.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.)
+force
and prefer
preferences, which were
+ getting the propagation direction exactly backwards.
+~/.unison/default.prf
) does not exist.
+src/DEPENDENCIES.ps
, to help new prospective developers with
+ navigating the code.
+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
.+ + 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.
-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.Actions
menu.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.) 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.
+DISPLAY
variable and, if it is not set, automatically fall back
+ to the textual user interface.
+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.
+include <name>
, which will cause name.prf
to be read
+ at that point.CYGWIN=binmode
in now added to the environment
+ so that the Cygwin port of OpenSSH works properly in a non-Cygwin
+ context.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
.'-pref=val'
and '-pref val'
are now allowed for
+ boolean values. (The former can be used to set a preference to false.)log
preference is now set to true
by default,
+ since the log file seems useful for most users.
+false
by default.
+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.)
+owner
preference is set to true
, file
+ownership information is synchronized.
+group
preference is set to true
, group
+information is synchronized.
+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.)
+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.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.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.)
+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.
+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.
+trace
and silent
preferences. They did
+not seem very useful, and there were too many preferences for controlling
+output in various ways.
+<return>
) instead of all
+available commands. Typing ?
will print the full list of
+possibilities.
+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).
+lablgtk
, which
+ means we can throw away our local patched version. debug
preference now prints quite a bit of additional
+information that should be useful for identifying sources of problems.
+ignore
) is now case-insensitive
+ when Unison is in case-insensitive mode (i.e., when one of the replicas
+ is on a windows machine).
+sortnewfirst
preference to true
causes
+newly created files to be displayed before changed files.
+sortbysize
causes files to be displayed in
+increasing order of size.
+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.
+sortlast=<pattern>
+causes paths matching this pattern to be displayed last.
+sortnewfirst
and sortbysize
flags can also be accessed
+from the 'Sort' menu in the grpahical user interface.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.
+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.
+rsync
preference has been removed (it was used to
+activate rsync compression for file transfers, but rsync compression is
+now enabled by default).
+====>
instead of ---->
). This
+ matches the behavior of the graphical interface, which displays such
+ arrows in a different color.
+*
. 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. 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.-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.)
+
+ 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.)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. 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).-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.
+
+ .tmp
are no longer ignored automatically. If you want
+to ignore such files, put an appropriate ignore pattern in your profile.+ 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>
.<name>
and
+<path>
:
+?
matches any single character except /
+*
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
.
+-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.
+REGEXP
in ignore should
+ become a line of the form ignore = REGEXP
in default.prf.
++ unison profilename +(i.e. with just one “anonymous” command-line argument), then the +file
~/.unison/profilename.prf
will be loaded instead of
+default.prf
. This document was translated from LATEX by +HEVEA.+ diff --git a/unison240-missing-documentation.patch b/unison240-missing-documentation.patch new file mode 100644 index 0000000..e70d543 --- /dev/null +++ b/unison240-missing-documentation.patch @@ -0,0 +1,4474 @@ +diff -up unison-2.40.63/strings.ml.orig unison-2.40.63/strings.ml +--- unison-2.40.63/strings.ml.orig 2012-01-22 12:05:03.953273614 +0100 ++++ unison-2.40.63/strings.ml 2012-01-22 12:05:39.599904881 +0100 +@@ -1,2 +1,4468 @@ +-(* Dummy strings.ml *) +-let docs = [] ++(* DO NOT MODIFY. ++ This file has been automatically generated, see docs.ml. *) ++ ++let docs = ++ ("about", ("About Unison", ++ "Unison File Synchronizer\n\ ++ Version 2.40.69\n\ ++ \n\ ++ ")) ++:: ++ ("", ("Overview", ++ "\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.), uni-directional\n\ ++ \032 mirroring utilities (rsync (http://samba.anu.edu.au/rsync/), etc.), and\n\ ++ \032 other synchronizers (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 (OSX,\n\ ++ \032 Solaris, Linux, etc.) systems. Moreover, Unison works across\n\ ++ \032 platforms, allowing you to synchronize a Windows laptop with a Unix\n\ ++ \032 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 replicas\n\ ++ \032 and its own private structures in a sensible state at all times,\n\ ++ \032 even in case of abnormal termination or communication failures.\n\ ++ \032 * Unison is free; full source code is available under the GNU Public\n\ ++ \032 License.\n\ ++ \n\ ++ ")) ++:: ++ ("", ("Preface", ++ "\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 Jerome 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 based on\n\ ++ \032 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 Stephane 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 many\n\ ++ \032 people and will generally get high priority. Other bug reports will be\n\ ++ \032 looked at as time permits. Bugs should be reported to the users list at\n\ ++ \032 unison-users@yahoogroups.com (mailto:unison-users@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@yahoogroups.com (mailto:unison-users@yahoogroups.com).\n\ ++ \n\ ++ \032 Patches are even more welcome. They should be sent to\n\ ++ \032 unison-hackers@lists.seas.upenn.edu\n\ ++ \032 (mailto:unison-hackers@lists.seas.upenn.edu). (Since safety and\n\ ++ \032 robustness are Unison's most important properties, patches will be held\n\ ++ \032 to high standards of clear design and clean coding.) If you want to\n\ ++ \032 contribute to Unison, start by downloading the developer tarball from\n\ ++ \032 the download page. For some details on how the code is organized, etc.,\n\ ++ \032 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 under\n\ ++ \032 the terms of the GNU General Public License as published by the Free\n\ ++ \032 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. Pre-built\n\ ++ \032 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 (on\n\ ++ \032 Linux/Windows) or the native UI framework (on OSX).\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 path\n\ ++ \032 (if you're going to invoke it from the command line) or on your desktop\n\ ++ \032 (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 directories\n\ ++ \032 on a single machine, with a remote machine over a direct socket\n\ ++ \032 connection, or with a remote machine using ssh for authentication and\n\ ++ \032 secure transfer. If you intend to use the last option, you may need to\n\ ++ \032 install ssh; see the section \"Installing Ssh\" .\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 new\n\ ++ \032 version of Unison will sometimes introduce a different format for the\n\ ++ \032 archive files used to remember information about the previous state of\n\ ++ \032 the replicas. In this case, the old archive will be ignored (not\n\ ++ \032 deleted -- if you roll back to the previous version of Unison, you will\n\ ++ \032 find the old archives intact), which means that any differences between\n\ ++ \032 the replicas will show up as conflicts that need to be resolved\n\ ++ \032 manually.\n\ ++ \n\ ++ Building Unison from Scratch\n\ ++ \n\ ++ \032 If a pre-built image is not available, you will need to compile it from\n\ ++ \032 scratch; the sources are available from the same place as the 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.11.2 or later),\n\ ++ \032 which is available from http://caml.inria.fr. Building and installing\n\ ++ \032 OCaml on Unix systems is very straightforward; just follow the\n\ ++ \032 instructions in the distribution. You'll probably want to build the\n\ ++ \032 native-code compiler in addition to the bytecode compiler, as Unison\n\ ++ \032 runs much faster when compiled to native code, but this is not\n\ ++ \032 absolutely necessary. (Quick start: on many systems, the following\n\ ++ \032 sequence of commands will get you a working and installed compiler:\n\ ++ \032 first do make 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 and\n\ ++ \032 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 is\n\ ++ \032 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\ ++ Mac OS X\n\ ++ \n\ ++ \032 To build the text-only user interface, follow the instructions above\n\ ++ \032 for building on Unix systems. You should do this first, even if you are\n\ ++ \032 also planning on building the GUI, just to make sure it works.\n\ ++ \n\ ++ \032 To build the basic GUI version, you'll first need to download and\n\ ++ \032 install the XCode developer tools from Apple. Once this is done, just\n\ ++ \032 type make UISTYLE=macnew in the src directory, and if things go well\n\ ++ \032 you should get an application that you can move from\n\ ++ \032 uimacnew/build/Default/Unison.app to wherever you want it.\n\ ++ \n\ ++ \032 There is also an experimental GUI with a somewhat smoother look and\n\ ++ \032 feel. To compile this one (once you've got the basic one working),\n\ ++ \032 proceed as follows:\n\ ++ \032 1. Go to the uimacnew09 directory and double-click the file\n\ ++ \032 BWToolkit.ibplugin.\n\ ++ \032 2. Go back up to the src directory and type make UISTYLE=macnew09.\n\ ++ \032 3. You should get an application built for you at\n\ ++ \032 uimacnew09/build/Default/Unison.app.\n\ ++ \n\ ++ Windows\n\ ++ \n\ ++ \032 Although the binary distribution should work on any version of Windows,\n\ ++ \032 some people may want to build Unison from scratch on those 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 called\n\ ++ \032 unison.exe.\n\ ++ \n\ ++ Native version:\n\ ++ \n\ ++ \032 Building a more efficient, native version of Unison on Windows requires\n\ ++ \032 a little more work. See the file INSTALL.win32 in the source code\n\ ++ \032 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 been\n\ ++ \032 selected as default when the executable you are running was built. You\n\ ++ \032 can force the text interface even if graphical is the default by adding\n\ ++ \032 -ui text. The other command-line arguments to both versions are\n\ ++ \032 identical.\n\ ++ \n\ ++ \032 The graphical version can also be run directly by clicking on its icon,\n\ ++ \032 but this may require a little set-up (see the section \"Click-starting\n\ ++ \032 Unison\" ). For this tutorial, we assume that you're starting it from\n\ ++ \032 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 and/or\n\ ++ \032 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 replica,\n\ ++ \032 and that the default action is therefore to propagate the new version\n\ ++ \032 to the first replica. To follow Unison's recommendation, press the \"f\"\n\ ++ \032 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 Unison\n\ ++ \032 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 same\n\ ++ \032 (as with the file b), then no propagation is necessary and nothing is\n\ ++ \032 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 force\n\ ++ \032 the change to be propagated from right to left or from left to\n\ ++ \032 right, or else press \"/\" to skip this file and leave both replicas\n\ ++ \032 alone. When it reaches the end of the list of modified files,\n\ ++ \032 Unison will ask you one more time whether it should proceed with\n\ ++ \032 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 annotated\n\ ++ \032 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. But\n\ ++ \032 some flexibility on the version of Unison at the client side can be\n\ ++ \032 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\" process\n\ ++ \032 on the server) and also more secure (especially if you use 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 http://www.openssh.org. See\n\ ++ \032 section [1]A.2 for installation 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 ssh documentation for information on\n\ ++ \032 how to set this up. The examples in this section use ssh, but you can\n\ ++ \032 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 something\n\ ++ \032 is wrong with your ssh setup (e.g., \"permission denied\") or else the\n\ ++ \032 search path that's being used when executing commands on the server\n\ ++ \032 doesn't contain the unison executable (e.g., \"command not 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 from\n\ ++ \032 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\ ++ \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 for\n\ ++ \032 the ssh program using the \"-sshcmd\" option. Extra arguments can be\n\ ++ \032 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 is\n\ ++ \032 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, to\n\ ++ \032 do this they must understand the protocol that Unison uses to\n\ ++ \032 communicate between client and server, but all they need for this is\n\ ++ \032 a copy of the Unison sources.) The socket method is provided only\n\ ++ \032 for expert users with specific needs; everyone else should use the\n\ ++ \032 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 and\n\ ++ \032 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 already\n\ ++ \032 in use, Unison will exit with an error message.) Note that paths\n\ ++ \032 specified by the client will be interpreted relative to the directory\n\ ++ \032 in which you start the server process; this behavior is different from\n\ ++ \032 the ssh case, where the path is relative to your home directory on the\n\ ++ \032 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 from\n\ ++ \032 the client to the server (a.tmp will be created on the server in the\n\ ++ \032 directory that the server was started from). After finishing the first\n\ ++ \032 synchronization, change a few files and try synchronizing again. You\n\ ++ \032 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 to\n\ ++ \032 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 treat\n\ ++ \032 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\ ++ \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\ ++ \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 operation\n\ ++ \032 typically needs to be initiated from the machine with the most recent\n\ ++ \032 changes. the section \"Profile\" covers the syntax of Unison profiles,\n\ ++ \032 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 mailing\n\ ++ \032 lists, to receive announcements of new versions. See the section\n\ ++ \032 \"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 assumed\n\ ++ \032 to be file:. Under Windows, it is possible to synchronize with a remote\n\ ++ \032 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 that\n\ ++ \032 the path separator character is always a forward slash, no matter what\n\ ++ \032 operating system Unison is running on. Forward slashes are converted to\n\ ++ \032 backslashes as necessary when paths are converted to filenames in the\n\ ++ \032 local filesystem on a particular host. (For example, suppose that we\n\ ++ \032 run Unison on a Windows system, synchronizing the local root c:\\pierce\n\ ++ \032 with the root ssh://saul.cis.upenn.edu/home/bcpierce on a Unix server.\n\ ++ \032 Then the path current/todo.txt refers to the file\n\ ++ \032 c:\\pierce\\current\\todo.txt on the client and\n\ ++ \032 /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 a\n\ ++ \032 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 the\n\ ++ \032 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 contents\n\ ++ \032 are different from its contents the last time it was successfully\n\ ++ \032 synchronized. Note that whether a path is updated has nothing to do\n\ ++ \032 with its last modification time--Unison considers only the contents\n\ ++ \032 when determining whether an update has occurred. This means that\n\ ++ \032 touching a file without changing its contents will not be recognized as\n\ ++ \032 an update. A file can even be changed several times and then changed\n\ ++ \032 back to its original contents; as long as Unison is only run at the end\n\ ++ \032 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 replica,\n\ ++ \032 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 state\n\ ++ \032 of each path in the replica when it was last synchronized) with the\n\ ++ \032 current contents of the replica, to determine which paths have been\n\ ++ \032 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 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 shortcoming\n\ ++ \032 of the Posix filesystem API, cannot be); in particular, when it is\n\ ++ \032 copying a file onto a directory or vice versa, it must first move the\n\ ++ \032 original contents out of the way. If Unison gets interrupted during one\n\ ++ \032 of these periods, some manual cleanup may be required. In this case, a\n\ ++ \032 file called DANGER.README will be left in your home directory,\n\ ++ \032 containing information about the operation that was interrupted. The\n\ ++ \032 next time you try to run Unison, it will notice this file and warn you\n\ ++ \032 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 not\n\ ++ \032 changed; then, for each file that might have changed, it computes a\n\ ++ \032 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 discovers\n\ ++ \032 that it has propagated an out-of-date change, or that the file it is\n\ ++ \032 updating has changed on the target replica, it will signal a failure\n\ ++ \032 for that file. Run Unison again to propagate the latest change.\n\ ++ \n\ ++ \032 Changes to the ignore patterns from the user interface (e.g., using the\n\ ++ \032 `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\" but will never\n\ ++ \032 miss 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 over\n\ ++ \032 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 write\"\n\ ++ \032 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 if\n\ ++ \032 Unison is performing some long-running operation, the display will\n\ ++ \032 not be repainted until it finishes. We recommend not trying to do\n\ ++ \032 anything with the user interface while Unison is in the middle of\n\ ++ \032 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 ignored 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 the\n\ ++ \032 local machine contains a file or subdirectory P that matches an\n\ ++ \032 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 P\n\ ++ \032 will be deleted. This is because Unison sees the rename as a delete\n\ ++ \032 and a separate create: it deletes the old directory (including the\n\ ++ \032 ignored files) and creates a new one (not including the ignored\n\ ++ \032 files, since they are completely invisible to it).\n\ ++ \n\ ++ ")) ++:: ++ ("", ("Reference Guide", ++ "\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 a\n\ ++ \032 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, if\n\ ++ \032 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 (which\n\ ++ \032 is used, for example, in calculating the name of the archive file used\n\ ++ \032 to remember which files have been synchronized) normally uses the\n\ ++ \032 gethostname operating system call. However, if the environment variable\n\ ++ \032 UNISONLOCALHOSTNAME is set, its value will be used instead. This makes\n\ ++ \032 it easier to use Unison in situations where a machine's name changes\n\ ++ \032 frequently (e.g., because it is a laptop and 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 check\n\ ++ \032 that things look reasonable--in particular, that update detection is\n\ ++ \032 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-fat use appropriate options for FAT filesystems\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/defa\n\ ++ ult)\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\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/defa\n\ ++ ult)\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 abor\n\ ++ ted\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 (def\n\ ++ ault 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\ ++ \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\ ++ \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 was\n\ ++ \032 told to load at the beginning of the run. Setting the preference\n\ ++ \032 addprefsto filename makes Unison add new preferences to the file\n\ ++ \032 named filename instead.\n\ ++ \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 remote\n\ ++ \032 server command. This allows multiple binaries for different\n\ ++ \032 versions of unison to coexist conveniently on the same server:\n\ ++ \032 whichever version is run on the client, the same version will be\n\ ++ \032 selected on the server.\n\ ++ \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\ ++ \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\ ++ \n\ ++ \032 The syntax of pathspec is described in the section \"Path\n\ ++ \032 Specification\" .\n\ ++ \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\ ++ \n\ ++ \032 The syntax of pathspec is described in the section \"Path\n\ ++ \032 Specification\" .\n\ ++ \n\ ++ \032 backupcurrnot xxx\n\ ++ \032 Exceptions to backupcurr, like the ignorenot preference.\n\ ++ \n\ ++ \032 backupdir xxx\n\ ++ \032 If this preference is set, Unison will use it as the name of the\n\ ++ \032 directory used to store backup files specified by the backup\n\ ++ \032 preference, when backuplocation is set to central. It is checked\n\ ++ \032 after the UNISONBACKUPDIR environment variable.\n\ ++ \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 if\n\ ++ \032 set to central, backupdir will be used instead.\n\ ++ \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 the\n\ ++ \032 backup preference selects them--i.e., it selectively overrides\n\ ++ \032 backup. The same caveats apply here as with ignore and\n\ ++ \032 ignorenot.\n\ ++ \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\ ++ \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\ ++ \n\ ++ \032 backups\n\ ++ \032 Setting this flag to true is equivalent to setting\n\ ++ \032 backuplocation to local and backup to Name *.\n\ ++ \n\ ++ \032 backupsuffix xxx\n\ ++ \032 See backupprefix for full documentation.\n\ ++ \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\ ++ \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 text\n\ ++ \032 user interface.) See also the mountpoint preference.\n\ ++ \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 may\n\ ++ \032 be commited to the replica or not. Since the merge command works\n\ ++ \032 on temporary files, the user can then cancel all the effects of\n\ ++ \032 applying the merge if it turns out that the result is not\n\ ++ \032 satisfactory. In batch-mode, this preference has no effect.\n\ ++ \032 Default is false.\n\ ++ \n\ ++ \032 contactquietly\n\ ++ \032 If this flag is set, Unison will skip displaying the `Contacting\n\ ++ \032 server' message (which some users find annoying) during startup.\n\ ++ \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\ ++ \n\ ++ \032 copyprog xxx\n\ ++ \032 A string giving the name of an external program that can be used\n\ ++ \032 to copy large files efficiently (plus command-line switches\n\ ++ \032 telling it to copy files in-place). The default setting invokes\n\ ++ \032 rsync with appropriate options--most users should not need to\n\ ++ \032 change it.\n\ ++ \n\ ++ \032 copyprogrest xxx\n\ ++ \032 A variant of copyprog that names an external program that should\n\ ++ \032 be used to continue the transfer of a large file that has\n\ ++ \032 already been partially transferred. Typically, copyprogrest will\n\ ++ \032 just be copyprog with one extra option (e.g., --partial, for\n\ ++ \032 rsync). The default setting invokes rsync with appropriate\n\ ++ \032 options--most users should not need to change it.\n\ ++ \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, extra\n\ ++ \032 quotes are added if the value of copyprog contains the string\n\ ++ \032 rsync.\n\ ++ \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\ ++ \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 name\n\ ++ \032 of a module for which debugging information should be printed.\n\ ++ \032 Possible arguments for debug can be found by looking for calls\n\ ++ \032 to Util.debug in the sources (using, e.g., grep). Setting -debug\n\ ++ \032 all causes information from all modules to be printed (this mode\n\ ++ \032 of usage is the first one to try, if you are trying to\n\ ++ \032 understand something that Unison seems to be doing wrong);\n\ ++ \032 -debug verbose turns on some additional debugging output from\n\ ++ \032 some modules (e.g., it will show exactly what bytes are being\n\ ++ \032 sent across the network).\n\ ++ \n\ ++ \032 diff xxx\n\ ++ \032 This preference can be used to control the name and command-line\n\ ++ \032 arguments of the system utility used to generate displays of\n\ ++ \032 file differences. The default is `diff -u CURRENT2 CURRENT1'. If\n\ ++ \032 the value of this preference contains the substrings CURRENT1\n\ ++ \032 and CURRENT2, these will be replaced by the names of the files\n\ ++ \032 to be diffed. If not, the two filenames will be appended to the\n\ ++ \032 command. In both cases, the filenames are suitably quoted.\n\ ++ \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 names\n\ ++ \032 of the various sections that can be printed.\n\ ++ \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 call\n\ ++ \032 always fails. Setting this preference completely prevents Unison\n\ ++ \032 from ever calling chmod.\n\ ++ \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 things\n\ ++ \032 like overwriting the current line.) This is useful, for example,\n\ ++ \032 when Unison runs in a shell inside of Emacs.\n\ ++ \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\ ++ \n\ ++ \032 This preference has no effect on the graphical user interface.\n\ ++ \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\ ++ \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 check\n\ ++ \032 for updates just before propagating a change. Thus, it is\n\ ++ \032 reasonable to use this switch under Windows most of the time and\n\ ++ \032 occasionally run Unison once with fastcheck set to false, if you\n\ ++ \032 are worried that Unison may have overlooked an update. For\n\ ++ \032 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\ ++ \n\ ++ \032 fat\n\ ++ \032 When this is set to true, Unison will use appropriate options to\n\ ++ \032 synchronize efficiently and without error a replica located on a\n\ ++ \032 FAT filesystem on a non-Windows machine: do not synchronize\n\ ++ \032 permissions (perms = 0); never use chmod ( t dontchmod = true);\n\ ++ \032 treat filenames as case insensitive (ignorecase = true); do not\n\ ++ \032 attempt to synchronize symbolic links (links = false); ignore\n\ ++ \032 inode number changes when detecting updates (ignoreinodenumbers\n\ ++ \032 = true). Any of these change can be overridden by explicitely\n\ ++ \032 setting the corresponding preference in the profile.\n\ ++ \n\ ++ \032 follow xxx\n\ ++ \032 Including the preference -follow pathspec causes Unison to treat\n\ ++ \032 symbolic links matching pathspec as `invisible' and behave as if\n\ ++ \032 the object pointed to by the link had appeared literally at this\n\ ++ \032 position in the replica. See the section \"Symbolic Links\" for\n\ ++ \032 more details. The syntax of pathspec is described in the section\n\ ++ \032 \"Path Specification\" .\n\ ++ \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 root.\n\ ++ \032 This effectively changes Unison from a synchronizer into a\n\ ++ \032 mirroring utility.\n\ ++ \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\ ++ \n\ ++ \032 This preference is overridden by the forcepartial preference.\n\ ++ \n\ ++ \032 This preference should be used only if you are sure you know\n\ ++ \032 what you are doing!\n\ ++ \n\ ++ \032 forcepartial xxx\n\ ++ \032 Including the preference forcepartial = PATHSPEC -> root causes\n\ ++ \032 Unison to resolve all differences (even non-conflicting changes)\n\ ++ \032 in favor of root for the files in PATHSPEC (see the section\n\ ++ \032 \"Path Specification\" for more information). This effectively\n\ ++ \032 changes Unison from a synchronizer into a mirroring utility.\n\ ++ \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\ ++ \n\ ++ \032 This preference should be used only if you are sure you know\n\ ++ \032 what you are doing!\n\ ++ \n\ ++ \032 group\n\ ++ \032 When this flag is set to true, the group attributes of the files\n\ ++ \032 are synchronized. Whether the group names or the group\n\ ++ \032 identifiers are synchronized depends on the preference numerids.\n\ ++ \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 in\n\ ++ \032 a deadlock.\n\ ++ \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\ ++ \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 in\n\ ++ \032 the section \"Path Specification\" , and further details on\n\ ++ \032 ignoring paths is found in the section \"Ignoring Paths\" .\n\ ++ \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\ ++ \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 to\n\ ++ \032 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 may be useful to set the flag manually.\n\ ++ \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 with\n\ ++ \032 filesystems which do not support inode numbers.\n\ ++ \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\ ++ \n\ ++ \032 ignorenot xxx\n\ ++ \032 This preference overrides the preference ignore. It gives a list\n\ ++ \032 of patterns (in the same format as ignore) for paths that should\n\ ++ \032 definitely not be ignored, whether or not they happen to match\n\ ++ \032 one of the ignore patterns.\n\ ++ \n\ ++ \032 Note that the semantics of ignore and ignorenot is a little\n\ ++ \032 counter-intuitive. When detecting updates, Unison examines paths\n\ ++ \032 in depth-first order, starting from the roots of the replicas\n\ ++ \032 and working downwards. Before examining each path, it checks\n\ ++ \032 whether it matches ignore and does not match ignorenot; in this\n\ ++ \032 case it skips this path and all its descendants. This means\n\ ++ \032 that, if some parent of a given path matches an ignore pattern,\n\ ++ \032 then it will be skipped even if the path itself matches an\n\ ++ \032 ignorenot pattern. In particular, putting ignore = Path * in\n\ ++ \032 your profile and then using ignorenot to select particular paths\n\ ++ \032 to be synchronized will not work. Instead, you should use the\n\ ++ \032 path preference to choose particular paths to synchronize.\n\ ++ \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\ ++ \n\ ++ \032 immutablenot xxx\n\ ++ \032 This preference overrides immutable.\n\ ++ \n\ ++ \032 key xxx\n\ ++ \032 Used in a profile to define a numeric key (0-9) that can be used\n\ ++ \032 in the graphical user interface to switch immediately to this\n\ ++ \032 profile.\n\ ++ \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 of\n\ ++ \032 Unison, rather than waiting to accept future connections. (Some\n\ ++ \032 users prefer to start a remote socket server for each run of\n\ ++ \032 Unison, rather than leaving one running all the time.)\n\ ++ \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\ ++ \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 synchronized\n\ ++ \032 except when one of the hosts is running Windows. In rare\n\ ++ \032 circumstances it may be useful to set the flag manually.\n\ ++ \n\ ++ \032 log\n\ ++ \032 When this flag is set, Unison will log all changes to the\n\ ++ \032 filesystems on a file.\n\ ++ \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\ ++ \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 predicate\n\ ++ \032 backup. The default is 2.\n\ ++ \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\ ++ \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 1)\n\ ++ \032 so that Unison doesn't soak up all the available bandwidth. The\n\ ++ \032 default is the special value 0, which mean 20 threads when file\n\ ++ \032 content streaming is desactivated and 1000 threads when it is\n\ ++ \032 activated.\n\ ++ \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 up,\n\ ++ \032 just like t backup. The syntax of pathspec>cmd is described in\n\ ++ \032 the section \"Path Specification\" , and further details on\n\ ++ \032 Merging functions are present in the section \"Merging files\" .\n\ ++ \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\ ++ \n\ ++ \032 nocreation xxx\n\ ++ \032 Including the preference -nocreation root prevents Unison from\n\ ++ \032 performing any file creation on root root.\n\ ++ \n\ ++ \032 This preference can be included twice, once for each root, if\n\ ++ \032 you want to prevent any creation.\n\ ++ \n\ ++ \032 nocreationpartial xxx\n\ ++ \032 Including the preference nocreationpartial = PATHSPEC -> root\n\ ++ \032 prevents Unison from performing any file creation in PATHSPEC on\n\ ++ \032 root root (see the section \"Path Specification\" for more\n\ ++ \032 information). It is recommended to use BelowPath patterns when\n\ ++ \032 selecting a directory and all its contents.\n\ ++ \n\ ++ \032 nodeletion xxx\n\ ++ \032 Including the preference -nodeletion root prevents Unison from\n\ ++ \032 performing any file deletion on root root.\n\ ++ \n\ ++ \032 This preference can be included twice, once for each root, if\n\ ++ \032 you want to prevent any deletion.\n\ ++ \n\ ++ \032 nodeletionpartial xxx\n\ ++ \032 Including the preference nodeletionpartial = PATHSPEC -> root\n\ ++ \032 prevents Unison from performing any file deletion in PATHSPEC on\n\ ++ \032 root root (see the section \"Path Specification\" for more\n\ ++ \032 information). It is recommended to use BelowPath patterns when\n\ ++ \032 selecting a directory and all its contents.\n\ ++ \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\ ++ \n\ ++ \032 This preference can be included twice, once for each root, if\n\ ++ \032 you want to prevent any update.\n\ ++ \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). It is recommended to use BelowPath patterns\n\ ++ \032 when selecting a directory and all its contents.\n\ ++ \n\ ++ \032 numericids\n\ ++ \032 When this flag is set to true, groups and users are synchronized\n\ ++ \032 numerically, rather than by name.\n\ ++ \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\ ++ \n\ ++ \032 owner\n\ ++ \032 When this flag is set to true, the owner attributes of the files\n\ ++ \032 are synchronized. Whether the owner names or the owner\n\ ++ \032 identifiers are synchronizeddepends on the preference numerids.\n\ ++ \n\ ++ \032 path xxx\n\ ++ \032 When no path preference is given, Unison will simply synchronize\n\ ++ \032 the two entire replicas, beginning from the given pair of roots.\n\ ++ \032 If one or more path preferences are given, then Unison will\n\ ++ \032 synchronize only these paths and their children. (This is useful\n\ ++ \032 for doing a fast sync of just one directory, for example.) Note\n\ ++ \032 that path preferences are intepreted literally--they are not\n\ ++ \032 regular expressions.\n\ ++ \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 security\n\ ++ \032 hazard). If you want to synchronize all bits, you can set the\n\ ++ \032 value of this preference to -1. If one of the replica is on a\n\ ++ \032 FAT [Windows] filesystem, you should consider using the t fat\n\ ++ \032 preference instead of this preference. If you need Unison not to\n\ ++ \032 set permissions at all, set the value of this preference to 0\n\ ++ \032 and set the preference t dontchmod to t true.\n\ ++ \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\ ++ \n\ ++ \032 This preference is overridden by the preferpartial preference.\n\ ++ \n\ ++ \032 This preference should be used only if you are sure you know\n\ ++ \032 what you are doing!\n\ ++ \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 than\n\ ++ \032 asking for guidance from the user, for the files in PATHSPEC\n\ ++ \032 (see the section \"Path Specification\" for more information).\n\ ++ \032 (The syntax of root is the same as for the root preference, plus\n\ ++ \032 the special values newer and older.)\n\ ++ \n\ ++ \032 This preference should be used only if you are sure you know\n\ ++ \032 what you are doing!\n\ ++ \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\ ++ \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\ ++ \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 and\n\ ++ \032 provide two on the command line. Details of the syntax of roots\n\ ++ \032 can be found in the section \"Roots\" .\n\ ++ \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\ ++ \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\ ++ \n\ ++ \032 rshargs xxx\n\ ++ \032 The string value of this preference will be passed as additional\n\ ++ \032 arguments (besides the host name and the name of the Unison\n\ ++ \032 executable on the remote system) to the rsh command used to\n\ ++ \032 invoke the remote server.\n\ ++ \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\ ++ \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\ ++ \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 should\n\ ++ \032 permit you to synchronize the offending files.\n\ ++ \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 command\n\ ++ \032 line. When it is provided, no preference file is read: all\n\ ++ \032 preferences must be specified on thecommand line. Also, since\n\ ++ \032 the self-test procedure involves overwriting the roots and\n\ ++ \032 backup directory, the names of the roots and of the backupdir\n\ ++ \032 preference must include the string \"test\" or else the tests will\n\ ++ \032 be aborted. (If these are not given on the command line, dummy\n\ ++ \032 subdirectories in the current directory will be created\n\ ++ \032 automatically.)\n\ ++ \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 path\n\ ++ \032 name), if necessary.\n\ ++ \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\ ++ \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. Setting\n\ ++ \032 silent to true automatically sets the batch preference to true.\n\ ++ \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 it\n\ ++ \032 puts very large files at the end of the list where they will not\n\ ++ \032 prevent smaller files from being transferred quickly.\n\ ++ \n\ ++ \032 This preference (as well as the other sorting flags, but not the\n\ ++ \032 sorting preferences that require patterns as arguments) can be\n\ ++ \032 set interactively and temporarily using the 'Sort' menu in the\n\ ++ \032 graphical user interface.\n\ ++ \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\ ++ \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\ ++ \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., ones\n\ ++ \032 that should be ignored or deleted rather than synchronized.\n\ ++ \n\ ++ \032 sshargs xxx\n\ ++ \032 The string value of this preference will be passed as additional\n\ ++ \032 arguments (besides the host name and the name of the Unison\n\ ++ \032 executable on the remote system) to the ssh command used to\n\ ++ \032 invoke the remote server.\n\ ++ \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\ ++ \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\ ++ \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\ ++ \n\ ++ \032 terse\n\ ++ \032 When this preference is set to true, the user interface will not\n\ ++ \032 print status messages.\n\ ++ \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\ ++ \n\ ++ \032 times\n\ ++ \032 When this flag is set to true, file modification times (but not\n\ ++ \032 directory modtimes) are propagated.\n\ ++ \n\ ++ \032 ui xxx\n\ ++ \032 This preference selects either the graphical or the textual user\n\ ++ \032 interface. Legal values are graphic or text.\n\ ++ \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\ ++ \n\ ++ \032 If the Unison executable was compiled with only a textual\n\ ++ \032 interface, this option has no effect. (The pre-compiled binaries\n\ ++ \032 are all compiled with both interfaces available.)\n\ ++ \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. This is\n\ ++ \032 the default. When the flag is set to false, a Latin 1 encoding\n\ ++ \032 is assumed. When Unison runs in case sensitive mode, this flag\n\ ++ \032 only makes a difference if one host is running Windows or Mac OS\n\ ++ \032 X. Under Windows, the flag selects between using the Unicode or\n\ ++ \032 8bit Windows API for accessing the filesystem. Under Mac OS X,\n\ ++ \032 it selects whether comparing the filenames up to decomposition,\n\ ++ \032 or byte-for-byte.\n\ ++ \n\ ++ \032 version\n\ ++ \032 Print the current version number and exit. (This option only\n\ ++ \032 makes sense on the command line.)\n\ ++ \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 need\n\ ++ \032 to be typed at the command line every time Unison is run. Profiles\n\ ++ \032 should reside in the .unison directory on the client machine. If Unison\n\ ++ \032 is started with just one argument name on the command line, it looks\n\ ++ \032 for a profile called name.prf in the .unison directory. If it is\n\ ++ \032 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 default\n\ ++ \032 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 =