diff -aruN unison.orig/unison-2.10.2/Makefile.OCaml unison/unison-2.10.2/Makefile.OCaml --- unison.orig/unison-2.10.2/Makefile.OCaml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/Makefile.OCaml 2005-09-18 13:03:25.000000000 -0700 @@ -25,7 +25,7 @@ ifeq (${OSCOMP},cygwingnuc) # Define this if compiling with Cygwin GNU C OSARCH=win32gnuc - ETAGS=c:/emacs/bin/etags + ETAGS=/bin/etags buildexecutable:: win32rc/unison.res.lib else # Win32 system @@ -58,9 +58,7 @@ # The OCaml lib dir is used by all versions # It is extracted from 'ocamlc -v' and Windows '\' separators are turned # to Unix '/' separators, and extraneous control-M's are deleted. -# Unfortunately there is a literal control-M buried in this, I'd rather -# get rid of it... -OCAMLLIBDIR=$(shell ocamlc -v | tail -1 | sed -e 's/.* //g' | sed -e 's/\\/\//g' | sed -e 's/ //g') +OCAMLLIBDIR=$(shell ocamlc -v | tail -n -1 | sed -e 's/.* //g' | sed -e 's/\\/\//g' | tr -d '\r') # User interface style: # Legal values are @@ -295,18 +293,35 @@ #-cclib user32.lib -cclib advapi32.lib -cclib wsock32.lib \ # -cclib gdi32.lib -cclib imm32.lib -cclib shell32.lib \ # -cclib ole32.lib -cclib uuid.lib - CLIBS+=-cclib -llablgtk \ + ifeq ($(OSCOMP), cygwingnuc) + # Cygwin + CLIBS+=-cclib -llablgtk \ + -cclib /usr/lib/libglib.dll.a \ + -cclib /usr/lib/libgmodule.dll.a \ + -cclib /usr/lib/libgdk.dll.a \ + -cclib /usr/lib/libgtk.dll.a \ + $(WINSYSLIBS) + STATICLIBS+=-cclib -llablgtk \ + -cclib /usr/lib/libglib.a \ + -cclib /usr/lib/libgmodule.a \ + -cclib /usr/lib/libgdk.a \ + -cclib /usr/lib/libgtk.a \ + $(WINSYSLIBS) + else + # Win32 with GNU C, but not Cygwin + CLIBS+=-cclib -llablgtk \ -cclib $(GUILIBDIR)/glib-1.3.lib \ -cclib $(GUILIBDIR)/gmodule-1.3.lib \ -cclib $(GUILIBDIR)/gdk-1.3.lib \ -cclib $(GUILIBDIR)/gtk-1.3.lib \ $(WINSYSLIBS) - STATICLIBS+=-cclib -llablgtk \ + STATICLIBS+=-cclib -llablgtk \ -cclib $(GUILIBDIR)/cclibs/glib-1.3.lib \ -cclib $(GUILIBDIR)/cclibs/gmodule-1.3.lib \ -cclib $(GUILIBDIR)/cclibs/gdk-1.3.lib \ -cclib $(GUILIBDIR)/cclibs/gtk-1.3.lib \ $(WINSYSLIBS) + endif # cygwingnuc else ifeq ($(OSARCH), solaris) STATICLIBS+=-cclib -llablgtk \ @@ -351,18 +366,35 @@ #-cclib user32.lib -cclib advapi32.lib -cclib wsock32.lib \ # -cclib gdi32.lib -cclib imm32.lib -cclib shell32.lib \ # -cclib ole32.lib -cclib uuid.lib - CLIBS+=-cclib -llablgtk2 \ + ifeq ($(OSCOMP), cygwingnuc) + # Cygwin + CLIBS+=-cclib -llablgtk2 \ + -cclib /usr/lib/libglib-2.0.dll.a \ + -cclib /usr/lib/libglib-2.0.dll.a \ + -cclib /usr/lib/libgdk-x11-2.0.dll.a \ + -cclib /usr/lib/libgtk-x11-2.0.dll.a \ + $(WINSYSLIBS) + STATICLIBS+=-cclib -llablgtk2 \ + -cclib /usr/lib/libglib-2.0.dll.a \ + -cclib /usr/lib/libglib-2.0.dll.a \ + -cclib /usr/lib/libgdk-x11-2.0.dll.a \ + -cclib /usr/lib/libgtk-x11-2.0.dll.a \ + $(WINSYSLIBS) + else + # Win32 with GNU C, but not Cygwin + CLIBS+=-cclib -llablgtk2 \ -cclib $(GUILIBDIR)/glib-1.3.lib \ -cclib $(GUILIBDIR)/gmodule-1.3.lib \ -cclib $(GUILIBDIR)/gdk-1.3.lib \ -cclib $(GUILIBDIR)/gtk-1.3.lib \ $(WINSYSLIBS) - STATICLIBS+=-cclib -llablgtk2 \ + STATICLIBS+=-cclib -llablgtk2 \ -cclib $(GUILIBDIR)/cclibs/glib-1.3.lib \ -cclib $(GUILIBDIR)/cclibs/gmodule-1.3.lib \ -cclib $(GUILIBDIR)/cclibs/gdk-1.3.lib \ -cclib $(GUILIBDIR)/cclibs/gtk-1.3.lib \ $(WINSYSLIBS) + endif # cygwingnuc else ifeq ($(OSARCH), solaris) STATICLIBS+=-cclib -llablgtk2 \ @@ -450,7 +482,7 @@ >>dot.tmp echo '{ rank = same; "Tree"; "Safelist"; }'>>dot.tmp echo '{ rank = same; "Uarg"; "Prefs"; }'>>dot.tmp - ocamldot .depend | tail +2 >> dot.tmp + ocamldot .depend | tail -n +2 >> dot.tmp -dot -Tps -o DEPENDENCIES.ps dot.tmp endif diff -aruN unison.orig/unison-2.10.2/copy.ml unison/unison-2.10.2/copy.ml --- unison.orig/unison-2.10.2/copy.ml 2004-09-06 12:15:47.000000000 -0700 +++ unison/unison-2.10.2/copy.ml 2005-09-18 13:03:24.000000000 -0700 @@ -10,14 +10,16 @@ let openFileIn fspath path kind = match kind with - `DATA -> Unix.openfile (Fspath.concatToString fspath path) - [Unix.O_RDONLY] 0o444 + `DATA -> Unix.descr_of_in_channel + (open_in_gen [Open_rdonly; Open_binary] 0o444 + (Fspath.concatToString fspath path)) | `RESS _ -> Osx.openRessIn fspath path let openFileOut fspath path kind = match kind with - `DATA -> Unix.openfile (Fspath.concatToString fspath path) - [Unix.O_WRONLY;Unix.O_CREAT;Unix.O_EXCL] 0o600 + `DATA -> Unix.descr_of_out_channel + (open_out_gen [Open_wronly; Open_creat; Open_excl; Open_binary] + 0o600 (Fspath.concatToString fspath path)) | `RESS len -> Osx.openRessOut fspath path len let protect f g = @@ -260,10 +262,9 @@ fspathTo pathTo realPathTo `DATA update srcFileSize id file_id >>= (fun (outfd, infd, bi) -> Lwt.catch (fun () -> - Lwt_util.run_in_region transmitFileReg (bufferSize srcFileSize) (fun () -> - Uutil.showProgress id Uutil.Filesize.zero "f"; - compressRemotely connFrom - (bi, fspathFrom, pathFrom, `DATA, srcFileSize, id, file_id)) + Uutil.showProgress id Uutil.Filesize.zero "f"; + compressRemotely connFrom + (bi, fspathFrom, pathFrom, `DATA, srcFileSize, id, file_id) >>= (fun () -> decompressor := Remote.MsgIdMap.remove file_id !decompressor; (* For GC *) @@ -281,16 +282,15 @@ (`RESS ressLength) update ressLength id file_id >>= (fun (outfd, infd, bi) -> Lwt.catch (fun () -> - Lwt_util.run_in_region transmitFileReg (bufferSize ressLength) (fun () -> - Uutil.showProgress id Uutil.Filesize.zero "f"; - compressRemotely connFrom - (bi, fspathFrom, pathFrom, - `RESS ressLength, ressLength, id, file_id)) - >>= (fun () -> - decompressor := - Remote.MsgIdMap.remove file_id !decompressor; (* For GC *) - close_all infd outfd; - Lwt.return ())) + Uutil.showProgress id Uutil.Filesize.zero "f"; + compressRemotely connFrom + (bi, fspathFrom, pathFrom, + `RESS ressLength, ressLength, id, file_id) + >>= (fun () -> + decompressor := + Remote.MsgIdMap.remove file_id !decompressor; (* For GC *) + close_all infd outfd; + Lwt.return ())) (fun e -> decompressor := Remote.MsgIdMap.remove file_id !decompressor; (* For GC *) @@ -367,9 +367,13 @@ let transmitFile rootFrom pathFrom rootTo fspathTo pathTo realPathTo update desc fp ress id = - transmitFileOnRoot rootTo rootFrom - (snd rootFrom, pathFrom, fspathTo, pathTo, realPathTo, - update, desc, fp, ress, id) + let bufSz = bufferSize (max (Props.length desc) (Osx.ressLength ress)) in + (* This must be on the client: any lock on the server side may result + in a deadlock under windows *) + Lwt_util.run_in_region transmitFileReg bufSz (fun () -> + transmitFileOnRoot rootTo rootFrom + (snd rootFrom, pathFrom, fspathTo, pathTo, realPathTo, + update, desc, fp, ress, id)) (****) diff -aruN unison.orig/unison-2.10.2/files.ml unison/unison-2.10.2/files.ml --- unison.orig/unison-2.10.2/files.ml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/files.ml 2005-09-18 13:03:24.000000000 -0700 @@ -356,18 +356,20 @@ debug (fun() -> Util.msg "Creating directory %s/%s\n" (root2string rootTo) (Path.toString pTo)); mkdir rootTo workingDir pTo) >>= (fun initialDesc -> - let actions = - Update.NameMap.fold - (fun name child rem -> - copyRec (Path.child pFrom name) - (Path.child pTo name) - (Path.child realPTo name) - child - :: rem) - children [] - in + let runningThreads = ref [] in Lwt.catch - (fun () -> Lwt_util.join actions) + (fun () -> + Update.NameMap.iter + (fun name child -> + let thread = + copyRec (Path.child pFrom name) + (Path.child pTo name) + (Path.child realPTo name) + child + in + runningThreads := thread :: !runningThreads) + children; + Lwt_util.join !runningThreads) (fun e -> (* If one thread fails (in a non-fatal way), we wait for all other threads to terminate before continuing *) @@ -381,7 +383,8 @@ match e with Util.Transient _ -> Lwt.return () | _ -> Lwt.fail e)) - actions + !runningThreads >>= (fun () -> + Lwt.fail e (* DO NOT FORGET TO RERAISE THE EXCEPTION !!!*)) | _ -> Lwt.fail e) >>= (fun () -> Lwt_util.run_in_region copyReg 1 (fun () -> @@ -469,8 +472,8 @@ Lwt_unix.run (Update.translatePath root2 path2 >>= (fun path2 -> Copy.file root2 path2 root1 workingDir tmppath realPath - `Copy (Props.setLength Props.fileSafe (Props.length desc1)) - fp1 ress1 id)); + `Copy (Props.setLength Props.fileSafe (Props.length desc2)) + fp2 ress2 id)); displayDiff (Fspath.concat workingDir realPath) (Fspath.concat workingDir tmppath); @@ -487,8 +490,8 @@ (Update.translatePath root1 path1 >>= (fun path1 -> (* Note that we don't need the ressource fork *) Copy.file root1 path1 root2 workingDir tmppath realPath - `Copy (Props.setLength Props.fileSafe (Props.length desc2)) - fp2 ress2 id)); + `Copy (Props.setLength Props.fileSafe (Props.length desc1)) + fp1 ress1 id)); displayDiff (Fspath.concat workingDir tmppath) (Fspath.concat workingDir realPath); diff -aruN unison.orig/unison-2.10.2/fingerprint.ml unison/unison-2.10.2/fingerprint.ml --- unison.orig/unison-2.10.2/fingerprint.ml 2004-09-06 12:15:47.000000000 -0700 +++ unison/unison-2.10.2/fingerprint.ml 2005-09-18 13:03:24.000000000 -0700 @@ -22,7 +22,7 @@ Util.convertUnixErrorsToTransient "digesting subfile" (fun () -> - let inch = open_in path in + let inch = open_in_bin path in LargeFile.seek_in inch offset; begin try let res = Digest.channel inch (Uutil.Filesize.toInt len) in diff -aruN unison.orig/unison-2.10.2/os.ml unison/unison-2.10.2/os.ml --- unison.orig/unison-2.10.2/os.ml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/os.ml 2005-09-18 13:03:24.000000000 -0700 @@ -150,10 +150,23 @@ loop newChildren directory in let absolutePath = Fspath.concat fspath path in - let directory = Fspath.opendir absolutePath in - let result = loop [] directory in - Unix.closedir directory; - result) + let directory = + try + Some (Fspath.opendir absolutePath) + with Unix.Unix_error (Unix.ENOENT, _, _) -> + (* FIX (in Ocaml): under Windows, when a directory is empty + (not even "." and ".."), FindFirstFile fails with + ERROR_FILE_NOT_FOUND while ocaml expects the error + ERROR_NO_MORE_FILES *) + None + in + match directory with + Some directory -> + let result = loop [] directory in + Unix.closedir directory; + result + | None -> + []) (*****************************************************************************) (* ACTIONS ON FILESYSTEM *) @@ -167,14 +180,19 @@ let absolutePath = Fspath.concatToString fspath path in match (Fileinfo.get false fspath path).Fileinfo.typ with `DIRECTORY -> - Unix.chmod absolutePath 0o700; + begin try + Unix.chmod absolutePath 0o700 + with Unix.Unix_error _ -> () end; Safelist.iter (fun child -> delete fspath (Path.child path child)) (childrenOf fspath path); Unix.rmdir absolutePath | `FILE -> - if Util.osType <> `Unix then - Unix.chmod absolutePath 0o600; + if Util.osType <> `Unix then begin + try + Unix.chmod absolutePath 0o600; + with Unix.Unix_error _ -> () + end; Unix.unlink absolutePath; if Prefs.read Osx.rsrc then begin let pathDouble = Osx.appleDoubleFile fspath path in diff -aruN unison.orig/unison-2.10.2/osxsupport.c unison/unison-2.10.2/osxsupport.c --- unison.orig/unison-2.10.2/osxsupport.c 2004-09-06 12:15:47.000000000 -0700 +++ unison/unison-2.10.2/osxsupport.c 2005-09-18 13:03:24.000000000 -0700 @@ -6,6 +6,8 @@ #include #include #ifdef __APPLE__ +#include +#include #include #include #include @@ -115,6 +117,20 @@ retcode = setattrlist(String_val (path), &attrList, attrBuf.finderInfo, sizeof attrBuf.finderInfo, options); + if (retcode == -1 && errno == EACCES) { + /* Unlike with normal Unix attributes, we cannot set OS X attributes + if file is read-only. Try making it writable temporarily. */ + struct stat st; + int r = stat(String_val(path), &st); + if (r == -1) uerror("setattrlist", path); + r = chmod(String_val(path), st.st_mode | S_IWUSR); + if (r == -1) uerror("setattrlist", path); + /* Try again */ + retcode = setattrlist(String_val (path), &attrList, attrBuf.finderInfo, + sizeof attrBuf.finderInfo, options); + /* Whether or not that worked, we should try to set the mode back. */ + chmod(String_val(path), st.st_mode); + } if (retcode == -1) uerror("setattrlist", path); CAMLreturn (Val_unit); diff -aruN unison.orig/unison-2.10.2/props.ml unison/unison-2.10.2/props.ml --- unison.orig/unison-2.10.2/props.ml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/props.ml 2005-09-18 13:03:24.000000000 -0700 @@ -421,7 +421,7 @@ let iCanWrite p = try - Unix.access p [Unix.R_OK]; + Unix.access p [Unix.W_OK]; true with Unix.Unix_error _ -> false @@ -615,9 +615,9 @@ let set fspath path kind p = Uid.set fspath path kind p.uid; Gid.set fspath path kind p.gid; - Perm.set fspath path kind p.perm; + TypeCreator.set fspath path kind p.typeCreator; Time.set fspath path kind p.time; - TypeCreator.set fspath path kind p.typeCreator + Perm.set fspath path kind p.perm let init someHostIsRunningWindows = Perm.init someHostIsRunningWindows; diff -aruN unison.orig/unison-2.10.2/recon.ml unison/unison-2.10.2/recon.ml --- unison.orig/unison-2.10.2/recon.ml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/recon.ml 2005-09-18 13:03:24.000000000 -0700 @@ -30,6 +30,10 @@ d := Replica1ToReplica2 else d := Replica2ToReplica1 + end else if s1=`Deleted && dir=`Newer then begin + d := Replica2ToReplica1 + end else if s2=`Deleted && dir=`Newer then begin + d := Replica1ToReplica2 end | _ -> () diff -aruN unison.orig/unison-2.10.2/terminal.ml unison/unison-2.10.2/terminal.ml --- unison.orig/unison-2.10.2/terminal.ml 2004-09-06 12:15:47.000000000 -0700 +++ unison/unison-2.10.2/terminal.ml 2005-09-18 13:03:25.000000000 -0700 @@ -32,7 +32,7 @@ *) let passwordRx = - Rx.rx ".*'s password: " + Rx.rx ".*'s password:[ ]*" let authenticityRx = Rx.rx "The authenticity of host .* continue connecting \\(yes/no\\)\\? " let password s = Rx.match_string passwordRx s diff -aruN unison.orig/unison-2.10.2/transport.ml unison/unison-2.10.2/transport.ml --- unison.orig/unison-2.10.2/transport.ml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/transport.ml 2005-09-18 13:03:24.000000000 -0700 @@ -15,7 +15,8 @@ match uiFrom, uiTo with _, Updates (File (props, ContentsUpdated (_, _, ress)), _) -> (Props.length props, Osx.ressLength ress) - | Updates (File _, Previous (_, props, _, ress)), NoUpdates -> + | Updates (_, Previous (`FILE, props, _, ress)), + (NoUpdates | Updates (File (_, ContentsSame), _)) -> (Props.length props, Osx.ressLength ress) | _ -> assert false diff -aruN unison.orig/unison-2.10.2/ubase/util.ml unison/unison-2.10.2/ubase/util.ml --- unison.orig/unison-2.10.2/ubase/util.ml 2004-09-06 12:15:47.000000000 -0700 +++ unison/unison-2.10.2/ubase/util.ml 2005-09-18 13:03:24.000000000 -0700 @@ -244,14 +244,18 @@ convertUnixErrorsToTransient "time" Unix.time let time2string timef = - let time = localtime timef in - Printf.sprintf - "%2d:%.2d on %2d %3s, %4d" - time.Unix.tm_hour - time.Unix.tm_min - time.Unix.tm_mday - (monthname time.Unix.tm_mon) - (time.Unix.tm_year + 1900) + try + let time = localtime timef in + Printf.sprintf + "%2d:%.2d:%.2d on %2d %3s, %4d" + time.Unix.tm_hour + time.Unix.tm_min + time.Unix.tm_sec + time.Unix.tm_mday + (monthname time.Unix.tm_mon) + (time.Unix.tm_year + 1900) + with Transient _ -> + "(invalid date)" let percentageOfTotal current total = (int_of_float ((float current) *. 100.0 /. (float total))) @@ -355,19 +359,20 @@ (*****************************************************************************) let fileInHomeDir n = - match osType with - `Win32 -> - let dirString = - try Unix.getenv "USERPROFILE" (* Windows NT/2K *) - with Not_found -> - try Unix.getenv "HOME" (* Windows 9x with Cygwin HOME set *) - with Not_found -> - try Unix.getenv "UNISON" (* Use UNISON dir if none of - the above are set *) - with Not_found -> "c:/" (* Default *) in - Filename.concat dirString n - | `Unix -> - Filename.concat (safeGetenv "HOME") n + if osType = `Unix || isCygwin then + Filename.concat (safeGetenv "HOME") n + else if osType = `Win32 then + let dirString = + try Unix.getenv "USERPROFILE" (* Windows NT/2K *) + with Not_found -> + try Unix.getenv "HOME" (* Windows 9x with Cygwin HOME set *) + with Not_found -> + try Unix.getenv "UNISON" (* Use UNISON dir if none of + the above are set *) + with Not_found -> "c:/" (* Default *) in + Filename.concat dirString n + else + assert false (* osType can't be anything else *) (*****************************************************************************) (* "Upcall" for building pathnames in the .unison dir *) diff -aruN unison.orig/unison-2.10.2/uicommon.ml unison/unison-2.10.2/uicommon.ml --- unison.orig/unison-2.10.2/uicommon.ml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/uicommon.ml 2005-09-18 13:03:24.000000000 -0700 @@ -268,26 +268,28 @@ | c -> buf.[!pos] <- c; pos := !pos + 1 done; - String.sub buf 0 !pos + "{" ^ String.sub buf 0 !pos ^ "}" -let ignorePath path = "Path " ^ (quote (Path.toString path)) +let ignorePath path = "Path " ^ quote (Path.toString path) let ignoreName path = match Path.finalName path with - Some name -> "Name " ^ (quote (Name.toString name)) + Some name -> "Name " ^ quote (Name.toString name) | None -> assert false let ignoreExt path = match Path.finalName path with Some name -> let str = Name.toString name in - (try - let pos = String.rindex str '.' + 1 in + begin try + let pos = String.rindex str '.' in let ext = String.sub str pos (String.length str - pos) in - "Name *." ^ (quote ext) + "Name {,.}*" ^ quote ext with Not_found -> (* str does not contain '.' *) - "Name "^(quote str)) - | None -> assert false + "Name " ^ quote str + end + | None -> + assert false let addIgnorePattern theRegExp = if theRegExp = "Path " then diff -aruN unison.orig/unison-2.10.2/uigtk.ml unison/unison-2.10.2/uigtk.ml --- unison.orig/unison-2.10.2/uigtk.ml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/uigtk.ml 2005-09-18 13:03:24.000000000 -0700 @@ -1606,7 +1606,7 @@ catch (fun () -> Transport.transportItem theSI.ri (Uutil.File.ofLine i) - (fun title text -> Trace.status (Printf.sprintf "\n%s\n\n%s\n\n" title text)) + (fun title text -> Trace.status (Printf.sprintf "\n%s\n\n%s\n\n" title text); true) >>= (fun () -> return Util.Succeeded)) (fun e -> @@ -1760,6 +1760,7 @@ actionBar#insert_space (); grAdd grDiff (actionBar#insert_button ~text:"Diff" ~callback:diffCmd ()); +(* let mergeCmd () = match !current with Some i -> @@ -1787,7 +1788,7 @@ actionBar#insert_space (); grAdd grDiff (actionBar#insert_button ~text:"Merge" ~callback:mergeCmd ()); - +*) (********************************************************************* Keyboard commands *********************************************************************) diff -aruN unison.orig/unison-2.10.2/uigtk2.ml unison/unison-2.10.2/uigtk2.ml --- unison.orig/unison-2.10.2/uigtk2.ml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/uigtk2.ml 2005-09-18 13:03:24.000000000 -0700 @@ -745,8 +745,7 @@ match Uicommon.sshParse s with Uicommon.Password account -> getPassword account | _ -> "" in - if Osx.isMacOSX or Osx.isLinux then Some handleSSH - else None + None (* ------ *) diff -aruN unison.orig/unison-2.10.2/uitext.ml unison/unison-2.10.2/uitext.ml --- unison.orig/unison-2.10.2/uitext.ml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/uitext.ml 2005-09-18 13:03:24.000000000 -0700 @@ -423,6 +423,8 @@ (["n";"q";"x"], ("Exit"), fun()-> + alwaysDisplay "\n"; + restoreTerminal (); Lwt_unix.run (Update.unlockArchives ()); exit 1)] (fun()-> display "Press return to continue.") diff -aruN unison.orig/unison-2.10.2/update.ml unison/unison-2.10.2/update.ml --- unison.orig/unison-2.10.2/update.ml 2004-09-06 12:15:46.000000000 -0700 +++ unison/unison-2.10.2/update.ml 2005-09-18 13:03:24.000000000 -0700 @@ -347,13 +347,25 @@ let fto = Fspath.toString (Os.fileInUnisonDir toname) in debug (fun() -> Util.msg "Copying archive %s to %s\n" ffrom fto); Util.convertUnixErrorsToFatal "copying archive" (fun () -> - let outFd = Unix.openfile fto - [Unix.O_RDWR;Unix.O_CREAT;Unix.O_TRUNC] 0o600 in + let outFd = + open_out_gen [Open_wronly; Open_creat; Open_trunc; Open_binary] + 0o600 fto + in Unix.chmod fto 0o600; (* In case the file already existed *) - let inFd = Unix.openfile ffrom [Unix.O_RDONLY] 0o444 in - Uutil.readWrite inFd outFd (fun _ -> ()); - Unix.close inFd; - Unix.close outFd; + let inFd = open_in_bin ffrom in + let bufsize = 10000 in + let buf = String.create bufsize in + + let rec read () = + let n = input inFd buf 0 bufsize in + if n>0 then begin + output outFd buf 0 n; + read() + end + in + read (); + close_in inFd; + close_out outFd; let arcFspath = Os.fileInUnisonDir toname in let info = Fileinfo.get false arcFspath Path.empty in Hashtbl.replace archiveInfoCache thisRoot info)) @@ -1308,11 +1320,14 @@ && Props.length info.Fileinfo.desc = Props.length archDesc && + notExcelFile path + && match archStamp with Fileinfo.InodeStamp inode -> info.Fileinfo.inode = inode | Fileinfo.CtimeStamp ctime -> - info.Fileinfo.ctime = ctime && notExcelFile path in + info.Fileinfo.ctime = ctime + in let ressClearlyUnchanged = fastCheck && @@ -1578,7 +1593,6 @@ let rec buildUpdate archive fspath fullpath here path = match Path.deconstruct path with None -> - Os.checkThatParentPathIsADir fspath here; showStatus path; let (arch, ui) = buildUpdateRec archive fspath here (useFastChecking()) in @@ -1588,6 +1602,12 @@ end, ui) | Some(name, path') -> + if not (isDir fspath here) then + (archive, + Error (Printf.sprintf + "path %s is not valid because %s is not a directory" + (Path.toString fullpath) (Path.toString here))) + else let children = getChildren fspath here in let (name', status) = try @@ -1625,7 +1645,7 @@ Note that we may also put NoArchive deep inside an archive... *) - (ArchiveDir (desc, NameMap.add name' child otherChildren), + (ArchiveDir (desc, NameMap.add name' arch otherChildren), updates) (* for the given path, find the archive and compute the list of update diff -aruN unison.orig/unison-2.10.2/uutil.ml unison/unison-2.10.2/uutil.ml --- unison.orig/unison-2.10.2/uutil.ml 2004-09-06 12:15:47.000000000 -0700 +++ unison/unison-2.10.2/uutil.ml 2005-09-18 13:03:24.000000000 -0700 @@ -83,7 +83,7 @@ (* Copy bytes from one file_desc to another *) (*****************************************************************************) -let bufsize = 10000 +let bufsize = 16384 let bufsizeFS = Filesize.ofInt bufsize let buf = String.create bufsize diff -aruN unison.orig/unison-2.13.16/Makefile.OCaml unison/unison-2.13.16/Makefile.OCaml --- unison.orig/unison-2.13.16/Makefile.OCaml 2005-06-27 10:38:25.000000000 -0700 +++ unison/unison-2.13.16/Makefile.OCaml 2005-09-18 13:03:24.000000000 -0700 @@ -143,7 +143,7 @@ # NOTE: the OCAMLLIBDIR is not getting passed correctly? macexecutable: $(NAME)-blob.o (cd uimac; xcodebuild OCAMLLIBDIR="$(OCAMLLIBDIR)") - gcc uimac/cltool.c -o uimac/build/Unison.app/Contents/MacOS/cltool -framework Carbon + gcc uimac/cltool.c -o uimac/build/Unison.app/Contents/MacOS/cltool -framework Carbon || gcc uimac/cltool.c -o uimac/build/Default/Unison.app/Contents/MacOS/cltool -framework Carbon # OCaml objects for the bytecode version # File extensions will be substituted for the native code version diff -aruN unison.orig/unison-2.13.16/osxsupport.c unison/unison-2.13.16/osxsupport.c --- unison.orig/unison-2.13.16/osxsupport.c 2005-05-19 12:38:27.000000000 -0700 +++ unison/unison-2.13.16/osxsupport.c 2005-09-18 13:03:24.000000000 -0700 @@ -6,6 +6,8 @@ #include #include #ifdef __APPLE__ +#include +#include #include #include #include @@ -100,6 +102,20 @@ retcode = setattrlist(String_val (path), &attrList, attrBuf.finderInfo, sizeof attrBuf.finderInfo, options); + if (retcode == -1 && errno == EACCES) { + /* Unlike with normal Unix attributes, we cannot set OS X attributes + if file is read-only. Try making it writable temporarily. */ + struct stat st; + int r = stat(String_val(path), &st); + if (r == -1) uerror("setattrlist", path); + r = chmod(String_val(path), st.st_mode | S_IWUSR); + if (r == -1) uerror("setattrlist", path); + /* Try again */ + retcode = setattrlist(String_val (path), &attrList, attrBuf.finderInfo, + sizeof attrBuf.finderInfo, options); + /* Whether or not that worked, we should try to set the mode back. */ + chmod(String_val(path), st.st_mode); + } if (retcode == -1) uerror("setattrlist", path); CAMLreturn (Val_unit); diff -aruN unison.orig/unison-2.13.16/terminal.ml unison/unison-2.13.16/terminal.ml --- unison.orig/unison-2.13.16/terminal.ml 2005-05-19 12:38:27.000000000 -0700 +++ unison/unison-2.13.16/terminal.ml 2005-09-18 13:03:25.000000000 -0700 @@ -32,10 +32,13 @@ *) let passwordRx = - Rx.rx ".*assword: " + Rx.rx ".*assword:[ ]*" +let passphraseRx = + Rx.rx "Enter passphrase for key.*" let authenticityRx = Rx.rx "The authenticity of host .* continue connecting \\(yes/no\\)\\? " let password s = Rx.match_string passwordRx s +let passphrase s = Rx.match_string passphraseRx s let authenticity s = Rx.match_string authenticityRx s (* Create a new process with a new controlling terminal, useful for diff -aruN unison.orig/unison-2.13.16/terminal.mli unison/unison-2.13.16/terminal.mli --- unison.orig/unison-2.13.16/terminal.mli 2005-05-19 12:38:27.000000000 -0700 +++ unison/unison-2.13.16/terminal.mli 2005-09-18 13:03:25.000000000 -0700 @@ -19,4 +19,5 @@ (* For recognizing messages from OpenSSH *) val password : string -> bool +val passphrase : string -> bool val authenticity : string -> bool diff -aruN unison.orig/unison-2.13.16/uimac/English.lproj/MainMenu.nib/classes.nib unison/unison-2.13.16/uimac/English.lproj/MainMenu.nib/classes.nib --- unison.orig/unison-2.13.16/uimac/English.lproj/MainMenu.nib/classes.nib 2005-03-18 15:33:18.000000000 -0800 +++ unison/unison-2.13.16/uimac/English.lproj/MainMenu.nib/classes.nib 2005-09-18 13:03:25.000000000 -0700 @@ -40,12 +40,17 @@ detailsTextView = NSTextView; mainWindow = NSWindow; passwordCancelButton = NSButton; + passwordPrompt = NSTextField; passwordText = NSTextField; passwordWindow = NSWindow; preferencesController = PreferencesController; preferencesView = NSView; profileController = ProfileController; + restartButton = NSButton; + restartMenuItem = NSMenuItem; statusText = NSTextField; + synchronizeButton = NSButton; + synchronizeMenuItem = NSMenuItem; tableView = ReconTableView; updatesText = NSTextField; updatesView = NSView; diff -aruN unison.orig/unison-2.13.16/uimac/English.lproj/MainMenu.nib/info.nib unison/unison-2.13.16/uimac/English.lproj/MainMenu.nib/info.nib --- unison.orig/unison-2.13.16/uimac/English.lproj/MainMenu.nib/info.nib 2005-03-21 12:22:18.000000000 -0800 +++ unison/unison-2.13.16/uimac/English.lproj/MainMenu.nib/info.nib 2005-09-18 13:03:25.000000000 -0700 @@ -3,34 +3,34 @@ IBDocumentLocation - 318 45 509 310 0 0 1280 832 + 502 19 509 310 0 0 1024 746 IBEditorPositions 197 - 450 391 383 326 0 0 1280 832 + 320 335 383 326 0 0 1024 746 198 - 307 297 669 515 0 0 1280 832 + 177 221 669 515 0 0 1024 746 29 - 72 209 280 44 0 0 1280 832 + -23 199 294 44 0 0 1024 746 307 - 392 388 499 332 0 0 1280 832 + 262 332 499 332 0 0 1024 746 423 - 450 391 383 326 0 0 1280 832 + 320 335 383 326 0 0 1024 746 IBFramework Version - 364.0 + 439.0 IBOpenObjects - 423 - 198 - 29 402 - 234 + 197 21 + 234 307 - 197 + 29 + 198 + 423 IBSystem Version - 7U16 + 8C46 diff -aruN unison.orig/unison-2.13.16/uimac/English.lproj/MainMenu.nib/objects.nib unison/unison-2.13.16/uimac/English.lproj/MainMenu.nib/objects.nib --- unison.orig/unison-2.13.16/uimac/English.lproj/MainMenu.nib/objects.nib 2005-03-21 12:22:18.000000000 -0800 +++ unison/unison-2.13.16/uimac/English.lproj/MainMenu.nib/objects.nib 2005-09-18 13:03:25.000000000 -0700 @@ -1,49 +1,44 @@ - typedstreamè„@„„„NSIBObjectDataà„„NSObject…’„„„NSCustomObject)”„@@„„„NSMutableString„„NSString”„+ NSApplication†…†„if–„„„ NSTableColumn)”„@fff@@cc„™™profiles†ƒC—½ƒB=èsè„„„NSTableHeaderCell„„NSTextFieldCell>„„ NSActionCell„„NSCellA”„ii‚þ„@@@@„™™Profiles†„„„NSFont”š$„[36c]þÿLucidaGrande„f „c¦¦¦ †……„i:…’…’…„c@@„„„NSColor”¦„ffƒ>ªªŸ†„¦¦„@@@„™™System†„™™headerTextColor†„¦¦ª†††„Ÿ¡‚1þ@¢…„¤š$¤þÿLucidaGrande¥ ¦¦¦¦†……§…’…’„„„NSClassSwapper*”„@#„™™ProfileTableView†„„ NSTableView=„„ NSControl)„„NSView)„„ NSResponder”’„„„ -NSClipView:²’„„„ NSScrollViewâ²’„„„ NSCustomView)²’…š„ @@@@ffffffff„„„NSMutableArray„„NSArray”š’„„„ NSTextField±’¸š‚ -µ…………#Ü#,#,’¸’…’…’…„icc@„Ÿ¡‚þ‚@¢„™™?Welcome to Unison! + typedstreamè„@„„„NSIBObjectDataà„„NSObject…’„„„NSCustomObject)”„@@„„„NSMutableString„„NSString”„+ NSApplication†…†„ie–„„„NSButton„„ NSControl)„„NSView)„„ NSResponder”’„„„ NSCustomView)’…š„ @@@@ffffffff„„„NSMutableArray„„NSArray”š’„„„ NSTextFieldœ’Ÿš‚ +€ …………#Ü#,#,’Ÿ’…’…’…„icc@„„„NSTextFieldCell>„„ NSActionCell„„NSCellA”„ii‚þ‚@„@@@@„™™?Welcome to Unison! Please choose a profile or create a new one -†¬……§…’…’½¨„¦¦«¨„™™ controlColor†„¦¦ªƒ?*ª«††„¦¦«¨„™™controlTextColor†ª††’…„:…†’„„„NSButton±’¸š‚!µ………… T T ’¸’…’…’…¹„„„ NSButtonCell? ¡‚þ‚8¢„™™Open†¬……§…’…’Æ„ ssii@@@@@È‚†‚@ÿ„˜™†„˜™†…„¤š„[28c]þÿHelvetica¥ ¦¦¦¦†…††’„Ç’¸šµ…………‹ý÷T T ’¸’…’…’…¹„É¡‚þ‚8¢„™™Quit†¬……§…’…’νÈ‚†‚@ÿ„˜™†„˜™†…Í…††’¶’„Ç’¸š‚!µ…………Æ C C ’¸’…’…’…¹„É¡‚þ‚8¢„™™New†¬……§…’…’ӽȂ†‚@ÿ„˜™†„˜™†…Í…†††………kk’…’…’…’…–„˜™NSView†„™™ NSResponder††š‚€µ„»š’´’„„„ -NSScrollerÓ±’¶š‚€µ…………3††’¶’…’…’…¹…’¶„ff:ƒ?4Œ „ _doScroller:¦¦†’„Ü’¶š‚€µ…………œœqq’¶’…’…’…¹…’¶Àƒ?}ÙÁ¦¦†’„µ’¶š‚Àµ„»š’„„„NSTableHeaderView²’Þš‚€µ…………22’Þ’…’…’…’­††………22’¶’…’à’…’à„@@ccc„¦¦«¨„™™controlBackgroundColor†Ã†…†’„„„ _NSCornerView²’¶š‚€µ…………3’¶’…’…’…††………<C˜C˜’¸’…’´’…’Û’Ý’´’Þ’ä„ffffi +†„„„NSFont”š$„[36c]þÿLucidaGrande„f „c­­­†……„i:…’…’¤„c@@„„„NSColor”­„@@@„™™System†„™™ controlColor†„®­„ffƒ?*ª«††„®­±¯„™™controlTextColor†„®­²†††’…„:…†’„›’Ÿš‚!€ ………… T T ’Ÿ’…’…’…¤„„„ NSButtonCell?¨¨‚þ‚8©„™™Open†«……®…’…’µ„ ssii@@@@@È‚†‚@ÿ„˜™†„˜™†…„¬š„[28c]þÿHelvetica¬ ­­­­†…††’„›’Ÿš‚€ …………‹ý÷T T ’Ÿ’…’…’…¤„·¨‚þ‚8©„™™Quit†«……®…’…’¼µÈ‚†‚@ÿ„˜™†„˜™†…»…††’„„„ NSScrollViewâ’Ÿš‚€ „¢š’„„„ +NSClipView:’Áš‚À „¢š’„„„NSClassSwapper*”„@#„™™ProfileTableView†„„ NSTableView=œ’Äš‚€ …………2†2†’Ä’…’…’…¤…„ @@@ff@@f::i„„„NSTableHeaderView’„Å’Áš‚À „¢š’ˆ………22’Á’…’Ë’…’Ë„@@ccc„®­±¯„™™controlBackgroundColor†±†…†š‚€ …………22’Í’…’…’…’dž„„„ _NSCornerView’Áš‚€ …………3’Á’…’…’…†„¢š’„„„ NSTableColumn)”„@fff@@cc„™™profiles†ƒC—½ƒB=èsè„„„NSTableHeaderCell§¨‚þ©„™™Profiles†„¬š$«þÿLucidaGrande¬ ­­­­ †……®…’…’…¯„®­²ƒ>ªªŸ†„®­±¯„™™headerTextColor†´††„§¨‚1þ@©…«……®…’…’ǯ„®­²†²†’dž†ß„®­±¯„™™ gridColor†„®­²ƒ?††……‚Â@’…’…’…††………2†2†’Á’…’Ç’…’Ǿυ†’„„„ +NSScrollerÓœ’Áš‚€ …………3††’Á’…’…’…¤…’Á„ff:ƒ?4Œ „ _doScroller:­­†’„ä’Áš‚€ …………œœqq’Á’…’…’…¤…’Áă?}ÙÅ­­†’͒ц………<C˜C˜’Ÿ’…’Ä’…’ã’å’Ä’Í’Ñ„ffffi + +‚„†’š†………kk’…’…’…’…–„˜™NSView†„™™ NSResponder††š‚!€ …………Æ C C ’Ÿ’…’…’…¤„·¨‚þ‚8©„™™New†«……®…’…’šµÈ‚†‚@ÿ„˜™†„˜™†…»…††Ÿ–„„„NSMatrix>œ’„’„„„NSBox*’„ ’…š „¢š’„ð’ñš‚ + „¢š’„’óš „¢š’„¥’õš‚€ ………… ’õ’…’…’…¤„§¨‚þ‚@©„™™File: +†«……®…’…’÷¯­²†’…³…†’„¥’õš‚€ ………….ww’õ’…’…’…¤„§¨‚”qþA‚@©„™™†«……®…’…’ú¯„®­±¯„™™textBackgroundColor†ß†„®­±¯„™™ textColor†´††’…³…††………³3³3’ó’…’…’…††………­·G·G’ñ’…’…’…„ff@@ccc„§¨‚þ©„™™ +First root†«……®…’…’…¯ý„®­²ƒ?LÌ͆†õ’…†’ï’„›’ñš‚!€ …………} T T ’ñ’…’…’…¤„·¨‚þ‚8©„™™Save†«……®…’…’µÈ‚†‚@ÿ„˜™†„˜™†…»…††’„›’ñš‚!€ …………) T T ’ñ’…’…’…¤„·¨‚þ‚8©„™™Cancel†«……®…’…’ µÈ‚†‚@ÿ„˜™†„˜™†…»…††’„¥’ñš‚ € …………ýWW’ñ’…’…’…¤„§¨‚þ‚@©„™™ Profile name:†«……®…’…’¯­²†’…³…†’„¥’ñš‚ +€ …………mû^^’ñ’…’…’…¤„§¨‚”qþA‚@©ü«……®…’…’¯ýÿ†’…³…††………ß"ß"’…’…’…’…–„˜™NSView†„™™ NSResponder††š‚ „¢š’……<·j·j’ñ’…’…’…É„§¨‚þ©„™™ Second root†«……®…’…’…¯ý„®­²ƒ?LÌ͆†î’…†š „¢š’ì’„¥’îš‚€ …………j:%%’î’…’…’…¤„§¨‚þ‚@©„™™User:†«……®…’…’¯­²†’…³…†’„¥’îš‚€ …………”8NN’î’…’…’…¤„§¨‚”qþA‚@©ü«……®…’…’¯ýÿ†’…³…†’„¥’îš‚€ …………ö:&&’î’…’…’…¤„§¨‚þ‚@©„™™Host:†«……®…’…’¯­²†’…³…†’„¥’îš‚€ …………!8„„’î’…’…’…¤„§¨‚”qþA‚@©ü«……®…’…’"¯ýÿ†’…³…†’„¥’îš‚€ ………… ’î’…’…’…¤„§¨‚þ‚@©„™™File:†«……®…’…’$¯­²†’…³…†’„¥’îš‚€ ………….ww’î’…’…’…¤„§¨‚”qþA‚@©ü«……®…’…’'¯ýÿ†’…³…††………³V³V’ï’…’…’…†š‚€ ………… 'F&F&’î’…’…’…¤…„#iiii:::ffffi@@@@@¨………F‚D(„¢š’„·¨‚„þ©„™™Remote†«……®…’…’ìµÈ‚HªªŸ†§†„Ÿ¡‚1þ@¢…¬……§…’…’ö¨èĆ’ö†’„›œ„™™ direction†222„ž¡‚þ‚¢„™™Action†£……§…’…’…¨§†„Ÿ¡‚1þ@‚¢…¬……§…’…’ö¨èĆ’ö†’„›œ„™™right†___„ž¡‚þ¢„™™Right†£……§…’…’…¨„¦¦«¨„™™ headerColor†è†§†„Ÿ¡‚1þ@¢…„¤š$¤þÿLucidaGrande¥ ¦¦¦¦†……§…’…’ö¨âĆ’ö†’„›œ„™™progress†<<<„ž¡‚þ‚¢„™™Progress†£……§…’…’…¨ §†„Ÿ¡‚1þ@‚¢………§…’…’ö¨âĆ’ö†’„›œ„™™path†ƒCŠŒ)Èè„ž¡‚þ¢„™™Path†£……§…’…’…¨ §†„Ÿ¡‚1þ@¢………§…’…’ö¨âĆ’ö††èé……‚Z@’…’…’…††………PýPý’ò’…’ö’…’öÃâ…†’„Ü’òš‚€µ…………Qýý’ò’…’…’…¹…’òÀƒ?wêqÁ¦¦†’„Ü’òš‚€µ…………PP’ò’…’…’…¹…’òÀƒ?{¿]Á¦¦†’ù’û†………saa’í’…’ô’…’’’ô’ù’ûÅ - -‚Ć’ì’„·’íš‚€µ„»š’„µ’š‚Àµ„»š’„„„NSTextTemplateÆ„„NSViewTemplate.²’š‚µ………„„„ NSMutableSet„„NSSet”„I ’„™™Apple PDF pasteboard type†’„™™Apple PICT pasteboard type†’„™™NSStringPboardType†’„™™*NeXT Rich Text Format v1.0 pasteboard type†’„™™1NeXT Encapsulated PostScript v1.2 pasteboard type†’„™™Apple HTML pasteboard type†’„™™NSFilenamesPboardType†’„™™NeXT TIFF v4.0 pasteboard type†’„™™NSColor pasteboard type†’„™™NeXT RTFD pasteboard type†’„™™#CorePasteboardFlavorType 0x6D6F6F76††_-_-’’…’…’…’„™™NSText†’…’„¦¦«¨„™™ textColor†ª†’„¤š¾þÿHelvetica¥ ¦¦¦¦†š’èª-ª_‚˜–€’…¦¦¦¦¦¦¦¦¦¦¦††………_-_-’’…’ ’…’ Ãè„„„NSCursor”ª’„„„NSImage.”’…¦¦¦¦¦¦¦¦¦¦¦¦¦¦ª„s¦’„„„NSBitmapImageRep„„ -NSImageRep”š„[1218c]MM*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ª²º(R -ü€' -ü€'†’„¦¦ª†’…†¦¦††’„Ü’š‚€µ…………œœDD’’…’…’…¹…’ÀÁ¦¦†’„Ü’š‚€µ…………œœWW’’…’…’…¹…’Àƒ?rCÁ¦¦††………<a/a/’í’…’’…’=’>’’…’…Å +‚†’„›’_š‚€ ………… U U ’_’…’…’…¤„·¨‚þ‚8©„™™Restart†«……®…’…’ƒµÈ‚†‚@ÿ„˜™†„˜™†…»…††’„¥’_š‚ +€ …………™’_’…’…’…¤„§¨‚þ‚@©„™™Status +†Ú……®…’…’ˆ¯­²†’…³…††………‰Ù‰Ù’…’…’…’…–„˜™NSView†„™™ NSResponder††š‚€ „¢š’]’„ä’^š‚€ …………Qýý’^’…’…’…¤…’^ă?wêqÅ­­†’„ä’^š‚€ …………PP’^’…’…’…¤…’^ă?{¿]Å­­†’„Å’^š‚À „¢š’„Ì’š‚€ …………PP’’…’…’…’[††………PP’^’…’’’…’’¾Ï…†’„Ò’^š‚€ …………Q’^’…’…’…††………saa’_’…’]’…’Ž’’]’’“Æ + +‚Ćš‚À „¢š’[†………PýPý’^’…’[’…’[¾Ï…†š‚€ …………PýPý’]’…’…’…¤…¼’“„¢š’„ÕÁ„™™left†___„ب‚þ©„™™Left†Ú……®…’…’…¯„®­²ƒ>ªªŸ†Ü†„§¨‚1þ@©…«……®…’…’[¯ß²†’[†’„ÕÁ„™™ direction†222„ب‚þ‚©„™™Action†Ú……®…’…’…¯šÜ†„§¨‚1þ@‚©…«……®…’…’[¯ß²†’[†’S’„ÕÁ„™™progress†<<<„ب‚þ‚©„™™Progress†Ú……®…’…’…¯W܆„§¨‚1þ@‚©…Z……®…’…’[¯ϲ†’[†’„ÕÁ„™™path†ƒCŠŒ)Èè„ب‚þ©„™™Path†Ú……®…’…’…¯W܆„§¨‚1þ@©…Z……®…’…’[¯ϲ†’[††ßà……‚Z@’…’…’…†¯ϲ†’[†[–„’…š „¢š†……… àhàh’…’…’…’…†„„„NSWindowTemplateø”„ iiffffi@@@@@clàh‚px„™™Unison†„™™NSWindow†„˜™View†«…„ffffê­²Õ’…­†–„5’„7΄™™MainMenu†„¢š’„5’³Ï8ü‚‚ÿÿÿ…;…?„submenuAction:…’…’6†’„5’³Ï„™™Edit†ü‚‚ÿÿÿ…;…?Ú…’…’„7΄˜™Edit†„¢š’„5’¹Ï„™™Cut†„™™x†‚‚ÿÿÿ…;…?……’…’…†’„5’¹Ï„™™Copy†„™™c†‚‚ÿÿÿ…;…?……’…’…†’„5’¹Ï„™™Paste†„™™v†‚‚ÿÿÿ…;…?……’…’…†’„5’¹Ï„™™ +Select All†„™™a†‚‚ÿÿÿ…;…?……’…’…†’„5’¹Ï„™™Select Conflicts†ü‚‚ÿÿÿ…;…?……’…’…††…††’²’„5’³Ï„™™Ignore†ü‚‚ÿÿÿ…;…?Ú…’…’„7ÎË„¢š’„5’ÌÏ„™™ Ignore Path†„™™i†‚‚ÿÿÿ…;…?……’…’…†’„5’ÌÏ„™™Ignore Extension†„™™e†‚‚ÿÿÿ…;…?……’…’…†’„5’ÌÏ„™™ Ignore Name†„™™n†‚‚ÿÿÿ…;…?……’…’…††…††’„5’³Ï„™™Help†ü‚‚ÿÿÿ…;…?Ú…’…’„7ÎØ„¢š’„5’ÙÏ„™™Unison Online Help†„™™?†‚‚ÿÿÿ…;…?……’…’…††…†††„™™ _NSMainMenu††Ï„™™Actions†ü‚‚ÿÿÿ…;…?Ú…’…’„7΂€ß„¢š +’„5’àÏ„™™Propagate Left to Right†„™™>†‚‚ÿÿÿ…;…?……’…’…†’„5’àÏ„™™Propagate Right to Left†„™™<†‚‚ÿÿÿ…;…?……’…’…†’„5’àÏ„™™Propagate Newer to Older†ü‚‚ÿÿÿ…;…?……’…’…†’„5’àÏ„™™Propagate Older to Newer†ü‚‚ÿÿÿ…;…?……’…’…†’„5’àÏ„™™ Leave Alone†„™™/†‚‚ÿÿÿ…;…?……’…’…†’„5’àÏ„™™!Revert to Unison's Recommendation†ü‚‚ÿÿÿ…;…?……’…’…†’„5’àÏ„™™Merge†ü‚‚ÿÿÿ…;…?……’…’…†’„5’àÏ‚Àüü‚‚ÿÿÿ…;…?……’…’…†’„5’àÏ„™™Restart†„™™r†‚‚ÿÿÿ…;…?……’…’…†’„5’àÏ„™™Synchronize all†„™™g†‚‚ÿÿÿ…;…?……’…’…††…††³–„›’„’…š „¢š’„Ⱥ„™™NSSecureTextField†¥’ûš‚€ …………<»»’û’…’…’…¤„§¨‚”qþA‚@©ü«……®…’…’ý¯ýÿ†’…³…†’„›’ûš‚€ …………s b b ’û’…’…’…¤„·¨‚þ‚8©„™™Continue†«……®…’…’µÈ‚†‚@ÿ„˜™†„˜™†…»…††’ú’„¥’ûš‚€ …………Z··’û’…’…’…¤„§¨‚þ‚@©„™™Please enter your password +†«……®…’…’¯­²†’…³…††……… ã€ã€’…’…’…’…†š‚€ ………… T T ’û’…’…’…¤„·¨‚þ‚8©„™™Cancel†«……®…’…’úµÈ‚†‚@ÿ„˜™†„˜™†…»…††û–ìà–µŸ–û–a_–K6–*ì–ಖïñ–âà–„®ØpÊ +‚pxü„™™NSWindow†„˜™View†„’…š „¢š’„¥’š‚€ …………˜ÜÜ’’…’…’…¤„§¨‚„þ@‚@©„™™Unison†„¬š,„[44c]$þÿLucidaGrande-Bold¬­­­­†……®…’…’¯ýÿ†’…³…†’„¥’š‚€ …………à4à4’’…’…’…¤„§¨‚„þ‚@©„™™X© Copyright 1999-2005. -‚†’„Ç’íš‚µ………… U U ’í’…’…’…¹„É¡‚þ‚8¢„™™Restart†¬……§…’…’?½È‚†‚@ÿ„˜™†„˜™†…Í…††’„¾’íš‚ -µ…………™’í’…’…’…¹„Ÿ¡‚þ‚@¢„™™Status -†£……§…’…’D¨ÁĆ’…º…††………‰Ù‰Ù’…’…’…’…–„˜™NSView†„™™ NSResponder††š‚µ………… u u ’í’…’…’…¹„É¡‚þ‚8¢„™™ Synchronize†¬……§…’…’ì½È‚†‚@ÿ„˜™†„˜™†…Í…††í–„„„ -NSMenuItemŸ”’„„„NSMenuÌ”„i@@@„™™Unison†„»š -’„N’O„ i@@IIi@@@@:i@„™™ About Unison†„™™†‚‚ÿÿÿ…„„„NSCustomResource)”–„™™NSImage†„™™NSMenuCheckmark††…„W–X„™™NSMenuMixedState††……’…’…†’„N’OÕ‚ÀUU‚‚ÿÿÿ…V…Z……’…’…†’„N’OÕ„™™Preferences...†„™™,†‚‚ÿÿÿ…V…Z……’…’…†’„N’OÕ„™™Install command-line tool†U‚‚ÿÿÿ…V…Z……’…’…†’„N’OÕ‚ÀUU‚‚ÿÿÿ…V…Z……’…’…†’„N’OÕ„™™ Hide Unison†„™™h†‚‚ÿÿÿ…V…Z……’…’…†’„N’OÕ„™™ Hide Others†„™™h†‚‚ÿÿÿ…V…Z……’…’…†’M’„N’OÕ‚ÀUU‚‚ÿÿÿ…V…Z……’…’…†’„N’OÕ„™™ Quit Unison†„™™q†‚‚ÿÿÿ…V…Z……’…’…††„™™ _NSAppleMenu††Õ„™™Show All†U‚‚ÿÿÿ…V…Z……’…’…†O–„––„™™ MyController†…†•–„Ç’„¹’…šµ„»š’„„„NSBox*²’rš‚ -µ„»š’„²’tšµ„»š’„¾’wšµ………… ’w’…’…’…¹„Ÿ¡‚þ‚@¢„™™File: -†¬……§…’…’y¨ÁĆ’…º…†’„¾’wš‚µ………….ww’w’…’…’…¹„Ÿ¡‚”qþA‚@¢U¬……§…’…’|¨„¦¦«¨„™™textBackgroundColor†è†2†’…º…††………³3³3’t’…’…’…††………­·G·G’r’…’…’…„ff@@ccc„Ÿ¡‚þ¢„™™ -First root†¬……§…’…’…¨~Ćw’…†’„u’rš‚µ„»š’„²’‚šµ„»š’„„„NSMatrix>±’„š‚µ………… 'F&F&’„’…’…’…¹…„#iiii:::ffffi@@@@@ ………F‚D(„»š’„É¡‚„þ¢„™™Remote†¬……§…’…’†½È‚H†‚‚ÿÿÿ…V…Z……’…’…†’„N’ÏÕ„™™Propagate Right to Left†„™™<†‚‚ÿÿÿ…V…Z……’…’…†’Î’„N’ÏÕ„™™Propagate Older to Newer†U‚‚ÿÿÿ…V…Z……’…’…†’„N’ÏÕ„™™ Leave Alone†„™™/†‚‚ÿÿÿ…V…Z……’…’…†’„N’ÏÕ„™™!Revert to Unison's Recommendation†U‚‚ÿÿÿ…V…Z……’…’…†’„N’ÏÕ„™™Merge†U‚‚ÿÿÿ…V…Z……’…’…†’„N’ÏÕ‚@UU‚‚ÿÿÿ…V…Z……’…’…†’„N’ÏÕ„™™Restart†„™™r†‚‚ÿÿÿ…V…Z……’…’…†’„N’ÏÕ„™™Synchronize all†„™™g†‚‚ÿÿÿ…V…Z……’…’…††…†Õ„™™Propagate Newer to Older†U‚‚ÿÿÿ…V…Z……’…’…†Ï–]O–jO–†„–?í–„PÔ„™™MainMenu†„»š’„N’éÕQU‚‚ÿÿÿ…V…Z„submenuAction:…’…’O†’„N’éÕ„™™Edit†U‚‚ÿÿÿ…V…ZÜ…’…’„PÔ„˜™Edit†„»š’„N’ïÕ„™™Cut†„™™x†‚‚ÿÿÿ…V…Z……’…’…†’„N’ïÕ„™™Copy†„™™c†‚‚ÿÿÿ…V…Z……’…’…†’„N’ïÕ„™™Paste†„™™v†‚‚ÿÿÿ…V…Z……’…’…†’„N’ïÕ„™™ -Select All†„™™a†‚‚ÿÿÿ…V…Z……’…’…†’„N’ïÕ„™™Select Conflicts†U‚‚ÿÿÿ…V…Z……’…’…††…††’„N’éÕÐU‚‚ÿÿÿ…V…ZÜ…’…’φ’„N’éÕ„™™Ignore†U‚‚ÿÿÿ…V…ZÜ…’…’„PÔ„»š’„N’Õ„™™ Ignore Path†„™™i†‚‚ÿÿÿ…V…Z……’…’…†’„N’Õ„™™Ignore Extension†„™™e†‚‚ÿÿÿ…V…Z……’…’…†’„N’Õ„™™ Ignore Name†„™™n†‚‚ÿÿÿ…V…Z……’…’…††…††’„N’éÕ„™™Help†U‚‚ÿÿÿ…V…ZÜ…’…’„PÔ„»š’„N’Õ„™™Unison Online Help†„™™?†‚‚ÿÿÿ…V…Z……’…’…††…†††„™™ _NSMainMenu††•–„„„NSWindowTemplateø”„ iiffffi@@@@@cp  -‚pxU„™™NSWindow†„˜™View†„²’…šµ„»š’„¾’šµ…………˜ÜÜ’’…’…’…¹„Ÿ¡‚„þ@‚@¢„™™Unison†„¤š,„[44c]$þÿLucidaGrande-Bold¥¦¦¦¦†……§…’…’¨~2†’…º…†’„¾’šµ…………à4à4’’…’…’…¹„Ÿ¡‚„þ‚@¢„™™X© Copyright 1999-2005. - -This software is licensed under the GNU General Public License.†„¤š$¤þÿLucidaGrande¥ -¦¦¦¦ †……§…’…’ ¨~2†’…º…†’„„„ NSImageView±’šµ………„$Ë’„™™Apple PDF pasteboard type†’„™™NeXT TIFF v4.0 pasteboard type†’„™™1NeXT Encapsulated PostScript v1.2 pasteboard type†’„™™NSFilenamesPboardType†’„™™Apple PICT pasteboard type††¶à@à@’’…’…’…¹„„„ NSImageCell)¡¡‚þ¢„W–X„™™Unison††………„iii†¦†’„¾’šµ…………eàà’’…’…’…¹„Ÿ¡‚„þ@‚@¢„™™Sync you very much!†„¤š$¤þÿOptima-Italic¥ ¦¦¦¦†……§…’…’0¨~2†’…º…†’„¾’šµ…………ÜÜ’’…’…’…¹„Ÿ¡‚„þ@‚@¢„™™?.?.?†„¤š$¤þÿLucidaGrande¥ ¦¦¦¦†……§…’…’4¨~2†’…º…††………  +This software is licensed under the GNU General Public License.†„¬š$«þÿLucidaGrande¬ +­­­­ †……®…’…’¯ýÿ†’…³…†’„„„ NSImageViewœ’š‚€ ………„pÕ’„™™Apple PDF pasteboard type†’„™™1NeXT Encapsulated PostScript v1.2 pasteboard type†’„™™NeXT TIFF v4.0 pasteboard type†’„™™NSFilenamesPboardType†’„™™Apple PICT pasteboard type†’„™™Apple PNG pasteboard type††¶à@à@’’…’…’…¤„„„ NSImageCell)©¨‚þ‚©„<–=„™™Unison††………„iii†­†’„¥’š‚€ …………eàà’’…’…’…¤„§¨‚„þ@‚@©„™™Sync you very much!†„¬š$«þÿOptima-Italic¬ ­­­­†……®…’…’&¯ýÿ†’…³…†’„¥’š‚€ …………ÜÜ’’…’…’…¤„§¨‚„þ@‚@©„™™?.?.?†Z……®…’…’*¯ýÿ†’…³…††………   -’…’…’…’…†…„ffff@¦ªÕ’…¦ªƒÿîƒÿ–„²’…šµ„»š†……… àhàh’…’…’…’…†„ÞÂàh‚px„™™Unison†„™™NSWindow†„˜™View†8…ã@¦ªÕ’…¦†–­¶–½¸–„Þ¨R。px„™™PasswordWindow†„™™NSWindow†„˜™View†µ…ã@¦ªÕ’…¦ªƒÿîƒÿ–›„–„––„–ØÏ–`O–wt–θ–„––„™™PreferencesController†…†•–0–ºµ–ïí–––ÈÆ–$–øï–ö–òï–ÝÏ–bO––ÚÏ–„––„™™ProfileController†…†•–âÏ–¶¸–é– –©r–íé– –Ï–„‚–í–ýö–cO–ûï–:•––þï–¿µ–‰†–yw–iO–r•– –ßÏ–ìé–ÒÏ–õï–òí––µ>–– „–Dí–˜„–Oì–“„–fO–áÏ–4–Ƹ–é–SO–ïí–é––¸•–ÕÏ–‚r–ö–·µ–åÏšD–¤„™™NSButton†–„˜™†–­„™™ NSTableView†–›„™™ NSTextField1†–j„™™1111†–í„™™ updatesView†–>„™™PasswordWindow†–š„™™ NSTableColumn†–r„™™PreferencesView†–˜„™™ NSTextField21†–4„™™ NSTextField3†–õ„™™ NSMenuItem1†–„™™ NSButtonCell1†–¸„™™chooseProfileView†–„„™™NSView†–ø„™™ NSMenuItem9†–DE–„˜™1†–„™™NSTableColumn1†–„™™ AboutWindow†–„™™ NSTextField†–Æ„™™ConnectingView†–È„™™ NSTextField†–]„™™121†––„™™ NSTextField†–w„™™NSView†–‰„™™ NSButtonCell†–|„™™ NSTextField†–ò„™™ NSScrollView1†–“„™™ NSTextField2†–ò„™™ NSMenuItem3†–ï„™™NSMenu†–û„™™ NSMenuItem10†–†„™™ NSMatrix1†–¶„™™ NSScrollView1†–ì„™™ NSButton1†–ö„™™ NSTableView†–¬„™™ NSTextField4†–ï„™™ NSTextField2†– „™™ NSTextField1†–„™™ NSTextField22†–:„™™Window†–„™™ NSScrollView2†–t„™™NSBox†–„˜™2†–?„™™ -NSButton21†–q„™™ NSButton1†–©„™™ NSTextField23†–½„™™ NSTextField2†–º„™™NSButton†–鄘™MainMenu†–Æ„™™NSButton†–í„™™ -NSMenuItem†–‚„™™NSBox1†–΄™™ NSButton1†–D„™™ NSTextField1†–•„˜™ File's Owner†–y„™™ NSTextField2†–´„™™ NSButton1†–Ó„™™ NSButton2†– „™™ -NSTextView†– „™™ NSTextField3†–BC–·„™™ NSTextField†–¿„™™ NSTextField2†–ý„™™ NSTableColumn†–0„™™ NSTextField2†–op’„$Ë’:†’„»šJ’„„„NSNibControlConnectorÏ„„NSNibConnector”«j•„˜™ -terminate:††’„Š«f•„™™hideOtherApplications:††’„Š«c•„™™hide:††’„Š«M•„™™unhideAllApplications:††’„Š«ò…„˜™cut:††’„Š«ø…„˜™paste:††’„Š«û…„˜™ -selectAll:††’„Š«õ…„˜™copy:††’„„„NSNibOutletConnectorÏ‹«oí„™™ updatesView††’„œ«o¸„™™chooseProfileView††’„Š«Óo„™™ createButton:††’„Š«Æo„™™ openButton:††’„Š«?o„™™restartButton:††’„œ«o:„™™ -mainWindow††’„œ«D­„™™ tableView††’„œ«­D„™™ -dataSource††’„œ«oï„™™ updatesText††’„œ«oD„™™profileController††’„œ«oö„™™ tableView††’„œ«öo„™™ -dataSource††’„Š«ìo„™™ syncButton:††’„Š«ºo„™™endPasswordWindow:††’„œ«o>„™™passwordWindow††’„œ«o·„™™ passwordText††’„Š«´o„™™endPasswordWindow:††’„œ«o „™™detailsTextView††’„œ«öo„™™delegate††’„Š«…„™™ ignorePath:††’„Š«…„™™ -ignoreExt:††’„Š« …„™™ ignoreName:††’„Š«Ò…„™™copyLR:††’„Š«Õ…„™™copyRL:††’„Š«þ…„™™selectConflicts:††’„Š«Ý…„™™revert:††’„Š«Î…„™™ forceNewer:††’„Š«Ø…„™™ forceOlder:††’„Š«Ú…„™™ leaveAlone:††’„œ«oD„™™ -statusText††’„œ«B¬„™™profileNameText††’„œ«Bq„™™ cancelButton††’„œ«B¤„™™ -saveButton††’„œ«oB„™™preferencesController††’„œ«or„™™preferencesView††’„œ«B|„™™ firstRootText††’„œ«B–„™™secondRootUser††’„œ«B›„™™secondRootHost††’„œ«B „™™secondRootText††’„œ«B‰„™™remoteButtonCell††’„œ«B„™™localButtonCell††’„œ«¬|„™™ nextKeyView††’„œ«|†„œ«†–„œ«–›„œ«› „œ« ¤„œ«¤¬„Š«‰B„™™ remoteClick:††’„Š«B„™™ localClick:††’„œ«¶Æ„œ«Æ­„Š«¤o„™™saveProfileButton:††’„Š«qo„™™cancelProfileButton:††’„œ«o´„™™passwordCancelButton††’„œ«·o„™™delegate††’„œ«­o„™™ myController††’„œ«o„™™ aboutWindow††’„œ«o4„™™ versionText††’„Š«So„™™raiseAboutWindow:††’„Š«o„™™ onlineHelp:††’„Š«åo„™™ syncButton:††’„Š«ß…„™™merge:††’„œ«oÆ„™™ConnectingView††’„Š«`o„™™installCommandLineTool:††’„Š«âo„™™ restartButton†††’…š±„@iç›rç‚Cç©çÚQç›Òçjçõç¯çÀüç•çšÊçèxç¦Øçºíç`¬çÏçÎ瓯ç†lçDÙçãçéç©IçøƒçÎÉç„Dçœç´éç’çíÆç­ç•°çjˆçÜRç¿ïççá£çäçòàçÂç½Çç tçí£çBKçêyç¨Úçþ çç“oçÐç0šçþçýç4›çú†ç¶ðç¤Gççf‘ç úçƧçø«çÞ^çìèç‰mç\Äçû‡ç?ÏçyjçÄçµëçÝ çìzçªÛçsçüˆçï©ç¸ÅçÒç—³çÿç¶Ëç¸ñç¬Jç -Ÿçöâ牋çÒçÎçàfçžÓçi•çoçå¤çnçÆç–pçî{ç¬Üçþ‰çì8çbç–çÔç —çºòç  çâuç ÕçwBç]çÓÎçÈç´îçÆÈçð|ç®Ýç‹çßçâ®çÖ2çû¬çqHç­ÍçtAçñ}ç>êç˜qçò ç¼óçoÑç¥çM–çävç¢ÖçO9çò~ç‘çÈ«çÊç’çß¡çóç°æçŒç$™çc†ç˜çØLçr3ç·ìç çô€çùç¾ûç:çÚçD0ç¦çgçýáçØ ç|kçæwçSžçõç8ç¤×çÌç‘™çÕ -çïÐ癵çõçö‚ç²çš°š–­¯–·¸–ö÷’„˜™IBCocoaFramework†† \ No newline at end of file +’…’…’…’…†…Ùê­²Õ’…­²ƒÿîƒÿ– –úõ–î–:6–óñ–ÔÇ–„––„™™ProfileController†…†•–¦[–ïà–ÎÌ–ÇÁ–ˆ_–„––„™™ MyController†…†•–lh–Ÿ•–M6–¹– ñ–׳–ÔÌ–A6–õó–ÁŸ–*–"î–„¥’„ ’…š „¢š’1†………kk’…’…’…’…–„˜™NSView†„™™ NSResponder††š‚€ …………‹CC’2’…’…’…¤„§¨‚„þ@‚@©„™™ Connecting...†„¬š$«þÿLucidaGrande¬­­­­†……®…’…’1¯ýÿ†’…³…†2–åà–h_–Ù×–ñà–N6–ÛÙ–­•–Ź–ñ–¼¹–„®Ø¨R。px„™™PasswordWindow†„™™NSWindow†„˜™View†û…Ùê­²Õ’…­²ƒÿîƒÿ––î–'î–œ[–îï–ñ–ʳ–ƒ_–û9–óà–¹·–„––„™™PreferencesController†…†•–èà–¤Ÿ––÷õ–ñ•–¿¹––Ñ̖ȹ–[^–¼Ÿ––[–³•–¡[–^_–D6–û–ôà–ÌÊ–_•–¶³–&–î–·³–êà–E6–2•–H6–$î–÷à–d_–ýû–6¶–0ì–ñšD–¼„™™ NSButton1†–ú„™™ NSButton1†–1„™™ NSTextField†–ý„™™ NSTextField†–[„™™ NSTableView†–¹„™™NSMenu†–d„™™ NSButton1†–&„™™ NSTextField2†–Å„™™ NSMenuItem10†– „™™ NSButton1†–¤„™™ NSTextField2†–œ„™™NSTableColumn1†–ú„™™ NSTextField†–ׄ˜™1†–*„™™ NSButtonCell†–„™™ NSTextField2†–ì„™™ NSMatrix1†–ñ„™™PreferencesView†–Ô„™™ NSTableColumn†–ƒ„™™ +NSButton21†–Á„™™ NSScrollView1†–÷„™™ NSTextField2†–¼„™™ NSMenuItem3†–„™™ NSTextField23†–³„˜™MainMenu†–„™™ NSTextField4†–A„™™121†–„™™ NSTextField†–a„™™ NSTextField2†–„™™ NSTextField1†–2„™™ConnectingView†–Ù„˜™2†–^„™™ NSScrollView1†–-.–Û„˜™†–•„˜™ File's Owner†–î„™™NSView†–ó„™™NSBox†–ˆ„™™ NSTextField1†–9„™™PasswordWindow†–¿„™™ NSMenuItem1†–Ÿ„™™chooseProfileView†– „™™ AboutWindow†–­„™™Window†––„™™ NSTableColumn†–õ„™™NSView†–„™™NSButton†–„™™ NSTextField2†–0„™™ NSButtonCell1†–_„™™ updatesView†–ï„™™NSBox1†–l„™™ +NSTextView†–„™™NSButton†–·„™™ +NSMenuItem†–Ç„™™ NSTableView†–=>–„™™ NSMenuItem9†–„™™ NSTextField†–'„™™ NSTextField3†–$„™™ NSTextField22†–*„™™ NSTextField3†–"„™™ NSTextField1†–µ„™™NSButton†–/0–„™™ NSTextField21†–h„™™ NSScrollView2†–N„™™1111†–š„™™ NSButton2†’„pÕ’­†’„¢šN’„„„NSNibControlConnectorÏ„„NSNibConnector”±N•„˜™ +terminate:††’„ƒ±H•„™™hideOtherApplications:††’„ƒ±E•„™™hide:††’„ƒ±K•„™™unhideAllApplications:††’„ƒ±¼…„˜™cut:††’„ƒ±Â…„˜™paste:††’„ƒ±Å…„˜™ +selectAll:††’„ƒ±¿…„˜™copy:††’„„„NSNibOutletConnectorÏ„±/_„™™ updatesView††’„•±/Ÿ„™™chooseProfileView††’„ƒ±š/„™™ createButton:††’„ƒ±µ/„™™ openButton:††’„ƒ±ƒ/„™™restartButton:††’„•±/­„™™ +mainWindow††’„•±-Ç„™™ tableView††’„•±Ç-„™™ +dataSource††’„•±/a„™™ updatesText††’„•±/-„™™profileController††’„•±/[„™™ tableView††’„•±[/„™™ +dataSource††’„ƒ±d/„™™ syncButton:††’„ƒ±/„™™endPasswordWindow:††’„•±/9„™™passwordWindow††’„•±/ý„™™ passwordText††’„ƒ±ú/„™™endPasswordWindow:††’„•±/l„™™detailsTextView††’„•±[/„™™delegate††’„ƒ±Î…„™™ ignorePath:††’„ƒ±Ñ…„™™ +ignoreExt:††’„ƒ±Ô…„™™ ignoreName:††’„ƒ±â…„™™copyLR:††’„ƒ±å…„™™copyRL:††’„ƒ±È…„™™selectConflicts:††’„ƒ±ï…„™™revert:††’„ƒ±è…„™™ forceNewer:††’„ƒ±ê…„™™ forceOlder:††’„ƒ±ì…„™™ leaveAlone:††’„•±/ˆ„™™ +statusText††’„•±=„™™profileNameText††’„•±= „™™ cancelButton††’„•±=„™™ +saveButton††’„•±/=„™™preferencesController††’„•±/ñ„™™preferencesView††’„•±=ú„™™ firstRootText††’„•±=„™™secondRootUser††’„•±="„™™secondRootHost††’„•±='„™™secondRootText††’„•±=*„™™remoteButtonCell††’„•±=0„™™localButtonCell††’„•±ú„™™ nextKeyView††’„•±úì膒„•±ì膒„•±"膒„•±"'膒„•±'膒„•±膒„ƒ±*=„™™ remoteClick:††’„ƒ±0=„™™ localClick:††’„•±Áµ膒„•±µÇ膒„ƒ±/„™™saveProfileButton:††’„ƒ± /„™™cancelProfileButton:††’„•±/ú„™™passwordCancelButton††’„•±ý/„™™delegate††’„•±Ç/„™™ myController††’„•±/ „™™ aboutWindow††’„•±/*„™™ versionText††’„ƒ±4/„™™raiseAboutWindow:††’„ƒ±Û/„™™ onlineHelp:††’„ƒ±÷/„™™ syncButton:††’„ƒ±ñ…„™™merge:††’„•±/2„™™ConnectingView††’„ƒ±ô/„™™restartButton:††’„•±/d„™™synchronizeButton††’„•±/ƒ„™™ restartButton††’„•±/÷„™™synchronizeMenuItem††’„•±/ô„™™restartMenuItem††’„•±/„™™passwordPrompt†††’…š´„@iï âé|â§Ýâ*›âù‹â•âÏ2â¶8âê}â:ÄâlúâµóâÛoâ¥âJâ&šâê âÝvâ›ÖâÇÍâë~âÈ âÃ→â-Ùâ¶â«â™â«âìâ©æâdèâÎÿâûŒâ¼Éâúk∘âÑLâí€âqâàâ·û⠦⼠âßwâ×âîâô®â9êâ/ÑâÅâ·âŠ™â’µâï‚â«çâ­âýâ2§âââ ©âÓQâ”Òâ'tâïâM•â¹üâ¤Çâ*mâáxâŸØâH‘âAâDâèâíâÇâ¸âŒ¯âïCâ1«âîDâñƒâ­éâÿœâóAâ[ââaÐ⎰âÊýâñ¡âˆ0â69âÕRâ–áâ0nâ»âãyâ¡Úâ ’â¡õâìlâñ3â"râœßâÉâìâpâŬâ4žâµÈâIâó†â=Kâ¯ðâ_ÆââŸÅâ×^â¿âô‡âhùâ—â½â ¯âúîâÑâåzâ£ÛâNˆâõˆâ×gâËâ³â÷¤â±ñâ·£âE†âŸâ‚‹âƒÏâÙfâ–â÷jâSãâ—Óâ¦äâ¿â°âÁËâ³âç{â¥Üâ÷‰âå +âGâšÎâoâÔâÍâó£âK–âÌþâ²â³òâýìâ â$sâ HâÛuâ™ÕâûëâÙjâÁ⹩â±âõBâ‘â^àâÔÊš¹š–ýþ–ÇÉ–[\’„˜™IBCocoaFramework†† \ No newline at end of file diff -aruN unison.orig/unison-2.13.16/uimac/MyController.h unison/unison-2.13.16/uimac/MyController.h --- unison.orig/unison-2.13.16/uimac/MyController.h 2005-03-18 15:33:18.000000000 -0800 +++ unison/unison-2.13.16/uimac/MyController.h 2005-09-18 13:03:25.000000000 -0700 @@ -12,6 +12,9 @@ { IBOutlet NSWindow *mainWindow; + IBOutlet NSMenuItem *restartMenuItem; + IBOutlet NSMenuItem *synchronizeMenuItem; + IBOutlet ProfileController *profileController; IBOutlet NSView *chooseProfileView; NSSize chooseProfileSize; @@ -28,8 +31,11 @@ IBOutlet ReconTableView *tableView; IBOutlet NSTextField *updatesText; + IBOutlet NSButton *restartButton; + IBOutlet NSButton *synchronizeButton; IBOutlet NSWindow *passwordWindow; + IBOutlet NSTextField *passwordPrompt; IBOutlet NSTextField *passwordText; IBOutlet NSTextView *detailsTextView; IBOutlet NSTextField *statusText; diff -aruN unison.orig/unison-2.13.16/uimac/MyController.m unison/unison-2.13.16/uimac/MyController.m --- unison.orig/unison-2.13.16/uimac/MyController.m 2005-03-20 19:25:50.000000000 -0800 +++ unison/unison-2.13.16/uimac/MyController.m 2005-09-18 13:03:25.000000000 -0700 @@ -74,6 +74,8 @@ [reconItems insertObject:[ReconItem initWithRi:Field(caml_reconItems,j)] atIndex:j]; } + [synchronizeButton setEnabled:YES]; + [synchronizeMenuItem setEnabled:YES]; } - (void)displayDetails:(int)i @@ -129,6 +131,8 @@ [mainWindow setContentView:blankView]; [self resizeWindowToSize:updatesSize]; [mainWindow setContentView:updatesView]; + [synchronizeButton setEnabled:NO]; + [synchronizeMenuItem setEnabled:NO]; // reconItems table gets keyboard input [mainWindow makeFirstResponder:tableView]; @@ -203,6 +207,8 @@ [[NSNotificationCenter defaultCenter] removeObserver:self name:NSThreadWillExitNotification object:nil]; + [restartButton setEnabled:YES]; + [restartMenuItem setEnabled:YES]; int i; for (i = 0; i < [reconItems count]; i++) { [[reconItems objectAtIndex:i] resetProgress]; @@ -213,6 +219,10 @@ - (IBAction)syncButton:(id)sender { [tableView setEditable:NO]; + [restartButton setEnabled:NO]; + [restartMenuItem setEnabled:NO]; + [synchronizeButton setEnabled:NO]; + [synchronizeMenuItem setEnabled:NO]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(afterSync:) name:NSThreadWillExitNotification object:nil]; @@ -269,6 +279,18 @@ value *f = caml_named_value("unisonPasswordMsg"); value v = Callback_checkexn(*f, caml_copy_string([prompt cString])); if (v == Val_true) { + [passwordPrompt setStringValue:@"Please enter password"]; + [NSApp beginSheet:passwordWindow + modalForWindow:mainWindow + modalDelegate:nil + didEndSelector:nil + contextInfo:nil]; + return; + } + f = caml_named_value("unisonPassphraseMsg"); + v = Callback_checkexn(*f, caml_copy_string([prompt cString])); + if (v == Val_true) { + [passwordPrompt setStringValue:@"Please enter passphrase"]; [NSApp beginSheet:passwordWindow modalForWindow:mainWindow modalDelegate:nil @@ -430,6 +452,7 @@ profile]]; /* If invoked from terminal we need to bring the app to the front */ [NSApp activateIgnoringOtherApps:YES]; + [mainWindow orderFront:self]; /* Start the connection */ [self connect:caml_profile]; diff -aruN unison.orig/unison-2.13.16/uimacbridge.ml unison/unison-2.13.16/uimacbridge.ml --- unison.orig/unison-2.13.16/uimacbridge.ml 2005-06-02 08:59:21.000000000 -0700 +++ unison/unison-2.13.16/uimacbridge.ml 2005-09-18 13:03:25.000000000 -0700 @@ -480,6 +480,7 @@ Callback.register "unisonProfileInit" unisonProfileInit;; Callback.register "unisonPasswordMsg" Terminal.password;; +Callback.register "unisonPassphraseMsg" Terminal.passphrase;; Callback.register "unisonAuthenticityMsg" Terminal.authenticity;; let unisonExnInfo e = diff -aruN unison.orig/unison-2.9.1/Makefile.OCaml unison/unison-2.9.1/Makefile.OCaml --- unison.orig/unison-2.9.1/Makefile.OCaml 2002-04-10 22:13:23.000000000 -0700 +++ unison/unison-2.9.1/Makefile.OCaml 2005-09-18 13:03:25.000000000 -0700 @@ -25,7 +25,7 @@ ifeq (${OSCOMP},cygwingnuc) # Define this if compiling with Cygwin GNU C OSARCH=win32gnuc - ETAGS=c:/emacs/bin/etags + ETAGS=/bin/etags buildexecutable:: win32rc/unison.res.lib else # Win32 system @@ -141,9 +141,7 @@ # The OCaml lib dir is used by all versions # It is extracted from 'ocamlc -v' and Windows '\' separators are turned # to Unix '/' separators, and extraneous control-M's are deleted. -# Unfortunately there is a literal control-M buried in this, I'd rather -# get rid of it... -OCAMLLIBDIR=$(shell ocamlc -v | tail -1 | sed -e 's/.* //g' | sed -e 's/\\/\//g' | sed -e 's/ //g') +OCAMLLIBDIR=$(shell ocamlc -v | tail -n -1 | sed -e 's/.* //g' | sed -e 's/\\/\//g' | tr -d '\r') # Standard GUI libraries directories STDLIBDIR=/usr/lib @@ -207,18 +205,35 @@ #-cclib user32.lib -cclib advapi32.lib -cclib wsock32.lib \ # -cclib gdi32.lib -cclib imm32.lib -cclib shell32.lib \ # -cclib ole32.lib -cclib uuid.lib - CLIBS+=-cclib -llablgtk \ + ifeq ($(OSCOMP), cygwingnuc) + # Cygwin + CLIBS+=-cclib -llablgtk \ + -cclib /usr/lib/libglib.dll.a \ + -cclib /usr/lib/libgmodule.dll.a \ + -cclib /usr/lib/libgdk.dll.a \ + -cclib /usr/lib/libgtk.dll.a \ + $(WINSYSLIBS) + STATICLIBS+=-cclib -llablgtk \ + -cclib /usr/lib/libglib.a \ + -cclib /usr/lib/libgmodule.a \ + -cclib /usr/lib/libgdk.a \ + -cclib /usr/lib/libgtk.a \ + $(WINSYSLIBS) + else + # Win32 with GNU C, but not Cygwin + CLIBS+=-cclib -llablgtk \ -cclib $(GUILIBDIR)/glib-1.3.lib \ -cclib $(GUILIBDIR)/gmodule-1.3.lib \ -cclib $(GUILIBDIR)/gdk-1.3.lib \ -cclib $(GUILIBDIR)/gtk-1.3.lib \ $(WINSYSLIBS) - STATICLIBS+=-cclib -llablgtk \ + STATICLIBS+=-cclib -llablgtk \ -cclib $(GUILIBDIR)/cclibs/glib-1.3.lib \ -cclib $(GUILIBDIR)/cclibs/gmodule-1.3.lib \ -cclib $(GUILIBDIR)/cclibs/gdk-1.3.lib \ -cclib $(GUILIBDIR)/cclibs/gtk-1.3.lib \ $(WINSYSLIBS) + endif # cygwingnuc else ifeq ($(OSARCH), solaris) STATICLIBS+=-cclib -llablgtk \ @@ -272,7 +287,7 @@ >>dot.tmp echo '{ rank = same; "Tree"; "Safelist"; }'>>dot.tmp echo '{ rank = same; "Uarg"; "Prefs"; }'>>dot.tmp - ocamldot .depend | tail +2 >> dot.tmp + ocamldot .depend | tail -n +2 >> dot.tmp -dot -Tps -o DEPENDENCIES.ps dot.tmp endif diff -aruN unison.orig/unison-2.9.1/ubase/uprintf.ml unison/unison-2.9.1/ubase/uprintf.ml --- unison.orig/unison-2.9.1/ubase/uprintf.ml 2002-04-10 22:13:23.000000000 -0700 +++ unison/unison-2.9.1/ubase/uprintf.ml 2005-09-18 13:03:24.000000000 -0700 @@ -10,8 +10,8 @@ (* *) (***********************************************************************) -external format_int: string -> int -> string = "format_int" -external format_float: string -> float -> string = "format_float" +external format_int: string -> int -> string = "caml_format_int" +external format_float: string -> float -> string = "caml_format_float" let fprintf outchan doafter format = let format = (Obj.magic format : string) in diff -aruN unison.orig/unison-2.9.1/ubase/util.ml unison/unison-2.9.1/ubase/util.ml --- unison.orig/unison-2.9.1/ubase/util.ml 2002-04-10 22:13:23.000000000 -0700 +++ unison/unison-2.9.1/ubase/util.ml 2005-09-18 13:03:24.000000000 -0700 @@ -329,19 +329,20 @@ (*****************************************************************************) let fileInHomeDir n = - match osType with - `Win32 -> - let dirString = - try Unix.getenv "USERPROFILE" (* Windows NT/2K *) - with Not_found -> - try Unix.getenv "HOME" (* Windows 9x with Cygwin HOME set *) - with Not_found -> - try Unix.getenv "UNISON" (* Use UNISON dir if none of - the above are set *) - with Not_found -> "c:/" (* Default *) in - Filename.concat dirString n - | `Unix -> - Filename.concat (safeGetenv "HOME") n + if osType = `Unix || isCygwin then + Filename.concat (safeGetenv "HOME") n + else if osType = `Win32 then + let dirString = + try Unix.getenv "USERPROFILE" (* Windows NT/2K *) + with Not_found -> + try Unix.getenv "HOME" (* Windows 9x with Cygwin HOME set *) + with Not_found -> + try Unix.getenv "UNISON" (* Use UNISON dir if none of + the above are set *) + with Not_found -> "c:/" (* Default *) in + Filename.concat dirString n + else + assert false (* osType can't be anything else *) (*****************************************************************************) (* "Upcall" for building pathnames in the .unison dir *)