[Unison-hackers] [unison-svn] r309 - trunk/src

Benjamin C. Pierce bcpierce at seas.upenn.edu
Sat Nov 8 11:53:42 EST 2008


Author: bcpierce
Date: 2008-11-08 11:53:32 -0500 (Sat, 08 Nov 2008)
New Revision: 309

Modified:
   trunk/src/.depend
   trunk/src/Makefile.OCaml
   trunk/src/RECENTNEWS
   trunk/src/TODO.txt
   trunk/src/copy.ml
   trunk/src/files.ml
   trunk/src/mkProjectInfo.ml
   trunk/src/os.ml
   trunk/src/os.mli
   trunk/src/props.ml
   trunk/src/stasher.ml
   trunk/src/update.ml
Log:
* A special hack for Rasmus, who has a special situation that requires
  the utimes-setting program to run 'setuid root' (and we do not want
  all of Unison to run setuid, so we just spin off an external utility
  to do it).  This functionality is disabled by default and requires
  editing the source code (changing 'false' to 'true' on line 496 of
  props.ml) and recompiling to enable.  If there are other people that
  want it, we can easily make it accessible using a preference
  instead, but I prefer not to add a preference until someone else
  requests it, to avoid creating an incompatible version.

* Logging tweak.




Modified: trunk/src/.depend
===================================================================
--- trunk/src/.depend	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/.depend	2008-11-08 16:53:32 UTC (rev 309)
@@ -4,7 +4,8 @@
 copy.cmi: uutil.cmi props.cmi path.cmi osx.cmi os.cmi lwt/lwt.cmi fspath.cmi \
     common.cmi 
 fileinfo.cmi: props.cmi path.cmi osx.cmi fspath.cmi 
-files.cmi: uutil.cmi props.cmi path.cmi lwt/lwt.cmi common.cmi 
+files.cmi: uutil.cmi props.cmi path.cmi lwt/lwt_util.cmi lwt/lwt.cmi \
+    common.cmi 
 fingerprint.cmi: uutil.cmi path.cmi fspath.cmi 
 fspath.cmi: path.cmi name.cmi 
 globals.cmi: ubase/prefs.cmi path.cmi lwt/lwt.cmi common.cmi 
@@ -22,8 +23,8 @@
 uigtk.cmi: uicommon.cmi 
 uigtk2.cmi: uicommon.cmi 
 uitext.cmi: uicommon.cmi 
-update.cmi: tree.cmi props.cmi ubase/prefs.cmi path.cmi osx.cmi os.cmi \
-    name.cmi lwt/lwt.cmi fspath.cmi fileinfo.cmi common.cmi 
+update.cmi: tree.cmi props.cmi path.cmi osx.cmi os.cmi name.cmi lwt/lwt.cmi \
+    fspath.cmi fileinfo.cmi common.cmi 
 xferhint.cmi: ubase/prefs.cmi path.cmi os.cmi fspath.cmi 
 abort.cmo: uutil.cmi ubase/util.cmi ubase/trace.cmi ubase/safelist.cmi \
     abort.cmi 
@@ -33,20 +34,24 @@
 case.cmx: ubase/prefs.cmx case.cmi 
 checksum.cmo: checksum.cmi 
 checksum.cmx: checksum.cmi 
-clroot.cmo: ubase/rx.cmi ubase/prefs.cmi clroot.cmi 
-clroot.cmx: ubase/rx.cmx ubase/prefs.cmx clroot.cmi 
+clroot.cmo: ubase/util.cmi ubase/rx.cmi ubase/prefs.cmi clroot.cmi 
+clroot.cmx: ubase/util.cmx ubase/rx.cmx ubase/prefs.cmx clroot.cmi 
 common.cmo: uutil.cmi ubase/util.cmi ubase/safelist.cmi props.cmi path.cmi \
     osx.cmi os.cmi name.cmi fspath.cmi fileinfo.cmi common.cmi 
 common.cmx: uutil.cmx ubase/util.cmx ubase/safelist.cmx props.cmx path.cmx \
     osx.cmx os.cmx name.cmx fspath.cmx fileinfo.cmx common.cmi 
 copy.cmo: xferhint.cmi uutil.cmi ubase/util.cmi transfer.cmi ubase/trace.cmi \
-    remote.cmi props.cmi ubase/prefs.cmi path.cmi osx.cmi os.cmi \
-    lwt/lwt_util.cmi lwt/lwt.cmi globals.cmi fspath.cmi fileinfo.cmi \
-    common.cmi abort.cmi copy.cmi 
+    ubase/safelist.cmi remote.cmi props.cmi ubase/prefs.cmi path.cmi osx.cmi \
+    os.cmi lwt/lwt_util.cmi lwt/lwt.cmi globals.cmi fspath.cmi fileinfo.cmi \
+    external.cmi common.cmi clroot.cmi abort.cmi copy.cmi 
 copy.cmx: xferhint.cmx uutil.cmx ubase/util.cmx transfer.cmx ubase/trace.cmx \
-    remote.cmx props.cmx ubase/prefs.cmx path.cmx osx.cmx os.cmx \
-    lwt/lwt_util.cmx lwt/lwt.cmx globals.cmx fspath.cmx fileinfo.cmx \
-    common.cmx abort.cmx copy.cmi 
+    ubase/safelist.cmx remote.cmx props.cmx ubase/prefs.cmx path.cmx osx.cmx \
+    os.cmx lwt/lwt_util.cmx lwt/lwt.cmx globals.cmx fspath.cmx fileinfo.cmx \
+    external.cmx common.cmx clroot.cmx abort.cmx copy.cmi 
+external.cmo: ubase/util.cmi ubase/safelist.cmi lwt/lwt_util.cmi \
+    lwt/lwt_unix.cmi lwt/lwt.cmi external.cmi 
+external.cmx: ubase/util.cmx ubase/safelist.cmx lwt/lwt_util.cmx \
+    lwt/lwt_unix.cmx lwt/lwt.cmx external.cmi 
 fileinfo.cmo: ubase/util.cmi props.cmi ubase/prefs.cmi path.cmi osx.cmi \
     fspath.cmi fileinfo.cmi 
 fileinfo.cmx: ubase/util.cmx props.cmx ubase/prefs.cmx path.cmx osx.cmx \
@@ -54,13 +59,13 @@
 files.cmo: uutil.cmi ubase/util.cmi update.cmi ubase/trace.cmi stasher.cmi \
     ubase/safelist.cmi ubase/rx.cmi remote.cmi props.cmi ubase/prefs.cmi \
     path.cmi osx.cmi os.cmi lwt/lwt_util.cmi lwt/lwt_unix.cmi lwt/lwt.cmi \
-    globals.cmi fspath.cmi fingerprint.cmi fileinfo.cmi copy.cmi common.cmi \
-    abort.cmi files.cmi 
+    globals.cmi fspath.cmi fingerprint.cmi fileinfo.cmi external.cmi copy.cmi \
+    common.cmi abort.cmi files.cmi 
 files.cmx: uutil.cmx ubase/util.cmx update.cmx ubase/trace.cmx stasher.cmx \
     ubase/safelist.cmx ubase/rx.cmx remote.cmx props.cmx ubase/prefs.cmx \
     path.cmx osx.cmx os.cmx lwt/lwt_util.cmx lwt/lwt_unix.cmx lwt/lwt.cmx \
-    globals.cmx fspath.cmx fingerprint.cmx fileinfo.cmx copy.cmx common.cmx \
-    abort.cmx files.cmi 
+    globals.cmx fspath.cmx fingerprint.cmx fileinfo.cmx external.cmx copy.cmx \
+    common.cmx abort.cmx files.cmi 
 fileutil.cmo: fileutil.cmi 
 fileutil.cmx: fileutil.cmi 
 fingerprint.cmo: uutil.cmi ubase/util.cmi fspath.cmi fingerprint.cmi 
@@ -108,9 +113,9 @@
 pred.cmx: ubase/util.cmx ubase/safelist.cmx ubase/rx.cmx ubase/prefs.cmx \
     case.cmx pred.cmi 
 props.cmo: uutil.cmi ubase/util.cmi ubase/prefs.cmi path.cmi osx.cmi \
-    fspath.cmi props.cmi 
+    fspath.cmi external.cmi props.cmi 
 props.cmx: uutil.cmx ubase/util.cmx ubase/prefs.cmx path.cmx osx.cmx \
-    fspath.cmx props.cmi 
+    fspath.cmx external.cmx props.cmi 
 recon.cmo: ubase/util.cmi update.cmi tree.cmi ubase/trace.cmi sortri.cmi \
     ubase/safelist.cmi props.cmi ubase/prefs.cmi pred.cmi path.cmi name.cmi \
     globals.cmi fileinfo.cmi common.cmi recon.cmi 
@@ -203,26 +208,36 @@
     ubase/safelist.cmx remote.cmx recon.cmx ubase/prefs.cmx path.cmx os.cmx \
     main.cmx lwt/lwt_util.cmx lwt/lwt_unix.cmx lwt/lwt.cmx globals.cmx \
     fspath.cmx files.cmx common.cmx clroot.cmx 
+uimacbridgenew.cmo: xferhint.cmi uutil.cmi ubase/util.cmi update.cmi \
+    uicommon.cmi transport.cmi ubase/trace.cmi terminal.cmi stasher.cmi \
+    ubase/safelist.cmi remote.cmi recon.cmi ubase/prefs.cmi path.cmi os.cmi \
+    main.cmo lwt/lwt_util.cmi lwt/lwt_unix.cmi lwt/lwt.cmi globals.cmi \
+    fspath.cmi files.cmi common.cmi clroot.cmi 
+uimacbridgenew.cmx: xferhint.cmx uutil.cmx ubase/util.cmx update.cmx \
+    uicommon.cmx transport.cmx ubase/trace.cmx terminal.cmx stasher.cmx \
+    ubase/safelist.cmx remote.cmx recon.cmx ubase/prefs.cmx path.cmx os.cmx \
+    main.cmx lwt/lwt_util.cmx lwt/lwt_unix.cmx lwt/lwt.cmx globals.cmx \
+    fspath.cmx files.cmx common.cmx clroot.cmx 
 uitext.cmo: uutil.cmi ubase/util.cmi update.cmi uicommon.cmi transport.cmi \
-    ubase/trace.cmi ubase/safelist.cmi recon.cmi ubase/prefs.cmi path.cmi \
-    lwt/lwt_util.cmi lwt/lwt_unix.cmi lwt/lwt.cmi globals.cmi common.cmi \
-    uitext.cmi 
+    ubase/trace.cmi ubase/safelist.cmi remote.cmi recon.cmi ubase/prefs.cmi \
+    path.cmi lwt/lwt_util.cmi lwt/lwt_unix.cmi lwt/lwt.cmi globals.cmi \
+    common.cmi uitext.cmi 
 uitext.cmx: uutil.cmx ubase/util.cmx update.cmx uicommon.cmx transport.cmx \
-    ubase/trace.cmx ubase/safelist.cmx recon.cmx ubase/prefs.cmx path.cmx \
-    lwt/lwt_util.cmx lwt/lwt_unix.cmx lwt/lwt.cmx globals.cmx common.cmx \
-    uitext.cmi 
+    ubase/trace.cmx ubase/safelist.cmx remote.cmx recon.cmx ubase/prefs.cmx \
+    path.cmx lwt/lwt_util.cmx lwt/lwt_unix.cmx lwt/lwt.cmx globals.cmx \
+    common.cmx uitext.cmi 
 update.cmo: xferhint.cmi uutil.cmi ubase/util.cmi tree.cmi ubase/trace.cmi \
     stasher.cmi ubase/safelist.cmi ubase/rx.cmi remote.cmi props.cmi \
     ubase/prefs.cmi pred.cmi path.cmi osx.cmi os.cmi name.cmi ubase/myMap.cmi \
     lwt/lwt_unix.cmi lwt/lwt.cmi lock.cmi globals.cmi fspath.cmi \
-    fingerprint.cmi fileinfo.cmi common.cmi update.cmi 
+    fingerprint.cmi fileinfo.cmi external.cmi common.cmi update.cmi 
 update.cmx: xferhint.cmx uutil.cmx ubase/util.cmx tree.cmx ubase/trace.cmx \
     stasher.cmx ubase/safelist.cmx ubase/rx.cmx remote.cmx props.cmx \
     ubase/prefs.cmx pred.cmx path.cmx osx.cmx os.cmx name.cmx ubase/myMap.cmx \
     lwt/lwt_unix.cmx lwt/lwt.cmx lock.cmx globals.cmx fspath.cmx \
-    fingerprint.cmx fileinfo.cmx common.cmx update.cmi 
-uutil.cmo: ubase/util.cmi ubase/projectInfo.cmo uutil.cmi 
-uutil.cmx: ubase/util.cmx ubase/projectInfo.cmx uutil.cmi 
+    fingerprint.cmx fileinfo.cmx external.cmx common.cmx update.cmi 
+uutil.cmo: ubase/util.cmi uutil.cmi 
+uutil.cmx: ubase/util.cmx uutil.cmi 
 xferhint.cmo: ubase/util.cmi ubase/trace.cmi ubase/prefs.cmi path.cmi os.cmi \
     fspath.cmi xferhint.cmi 
 xferhint.cmx: ubase/util.cmx ubase/trace.cmx ubase/prefs.cmx path.cmx os.cmx \

Modified: trunk/src/Makefile.OCaml
===================================================================
--- trunk/src/Makefile.OCaml	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/Makefile.OCaml	2008-11-08 16:53:32 UTC (rev 309)
@@ -172,7 +172,7 @@
           \
           case.cmo pred.cmo uutil.cmo \
           fileutil.cmo name.cmo path.cmo fspath.cmo fingerprint.cmo \
-          abort.cmo osx.cmo \
+          abort.cmo osx.cmo external.cmo \
           props.cmo fileinfo.cmo os.cmo lock.cmo clroot.cmo common.cmo \
           tree.cmo checksum.cmo terminal.cmo \
           transfer.cmo xferhint.cmo remote.cmo globals.cmo copy.cmo \

Modified: trunk/src/RECENTNEWS
===================================================================
--- trunk/src/RECENTNEWS	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/RECENTNEWS	2008-11-08 16:53:32 UTC (rev 309)
@@ -1,7 +1,57 @@
 CHANGES FROM VERSION 2.31.5
 
+* A special hack for Rasmus, who has a special situation that requires
+  the utimes-setting program to run 'setuid root' (and we do not want
+  all of Unison to run setuid, so we just spin off an external utility
+  to do it).  This functionality is disabled by default and requires
+  editing the source code (changing 'false' to 'true' on line 496 of
+  props.ml) and recompiling to enable.  If there are other people that
+  want it, we can easily make it accessible using a preference
+  instead, but I prefer not to add a preference until someone else
+  requests it, to avoid creating an incompatible version.
+
+* Logging tweak.
+
+
+
+-------------------------------
+CHANGES FROM VERSION 2.31.5
+
+* A special hack for Rasmus, who has a special situation that requires
+  the utimes-setting program to run 'setuid root' (and we do not want
+  all of Unison to run setuid, so we just spin off an external utility
+  to do it).  This functionality is disabled by default and requires
+  editing the source code (changing 'false' to 'true' on line 496 of
+  props.ml) and recompiling to enable.  If there are other people that
+  want it, we can easily make it accessible using a preference
+  instead, but I prefer not to add a preference until someone else
+  requests it, to avoid creating an incompatible version.
+
+* Logging tweak.
+
+
+
+-------------------------------
+CHANGES FROM VERSION 2.31.5
+
+* A special hack for Rasmus, who has a special situation that requires
+  the utimes-setting program to run 'setuid root' (and we do not want
+  all of Unison to run setuid, so we just spin off an external utility
+  to do it).  This functionality is disabled by default and requires
+  editing the source code (changing 'false' to 'true' on line 496 of
+  props.ml) and recompiling to enable.  If there are other people that
+  want it, we can easily make it accessible using a preference
+  instead, but I prefer not to add a preference until someone else
+  requests it, to avoid creating an incompatible version.
+
+* Logging tweak.
+
+
+CHANGES FROM VERSION 2.31.5
+
 Resizing the update window vertically no longer moves the status label. Fix contributed by Pedro Melo.
 -------------------------------
+
 CHANGES FROM VERSION 2.31.4
 
 * Don't ignore files that look like backup files if the {\\tt

Modified: trunk/src/TODO.txt
===================================================================
--- trunk/src/TODO.txt	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/TODO.txt	2008-11-08 16:53:32 UTC (rev 309)
@@ -11,6 +11,13 @@
 CURRENT
 =======
 
+* Merge issues:
+     - It would be better to ignore the exit status of the external merge
+       tool and just look at what files it produced to decide what happened
+     - The function that runs the external program should not grab stdin /
+       stdout / stderr if Unison is running with the text UI. 
+     - The confirmation step should offer to display the new merged file.
+
 * Makefile for fstest
 
 * Work on the Unison side

Modified: trunk/src/copy.ml
===================================================================
--- trunk/src/copy.ml	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/copy.ml	2008-11-08 16:53:32 UTC (rev 309)
@@ -625,7 +625,7 @@
                ^ (Os.quotes fromSpec) ^ " "
                ^ (Os.quotes toSpec) in
     Trace.log (Printf.sprintf "%s\n" cmd);
-    let _,log = Os.runExternalProgram cmd in
+    let _,log = External.runExternalProgram cmd in
     debug (fun() ->
              let l = Util.trimWhitespace log in
              Util.msg "transferFileUsingExternalCopyprog %s: returned...\n%s%s"
@@ -662,8 +662,9 @@
       targetExistsOnRoot
         rootTo rootFrom (`CheckSize (desc,ress), fspathTo, pathTo) >>= (fun b ->
       if b then begin
-        Util.msg "%s/%s has already been transferred\n"
-          (Fspath.toString fspathTo) (Path.toString pathTo);
+        Trace.log (Printf.sprintf
+          "%s/%s has already been transferred\n"
+          (Fspath.toString fspathTo) (Path.toString pathTo));
         Lwt.return ()
       (* Check whether we should use an external program to copy the
          file *)

Modified: trunk/src/files.ml
===================================================================
--- trunk/src/files.ml	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/files.ml	2008-11-08 16:53:32 UTC (rev 309)
@@ -488,7 +488,7 @@
         "\"" ^ cmd ^ "\""
        else
          cmd) in
-    showDiff cmd (Os.readChannelTillEof c);
+    showDiff cmd (External.readChannelTillEof c);
     ignore (Unix.close_process_in c) in
   let (desc1, fp1, ress1, desc2, fp2, ress2) = Common.fileInfos ui1 ui2 in
   match root1,root2 with
@@ -743,7 +743,7 @@
           (Os.quotes (Fspath.concatToString workingDirForMerge newarch)) in
       Trace.log (Printf.sprintf "Merge command: %s\n" cmd);
       
-      let returnValue, mergeResultLog = Os.runExternalProgram cmd in
+      let returnValue, mergeResultLog = External.runExternalProgram cmd in
       
       Trace.log (Printf.sprintf "Merge result (%s):\n%s\n"
                    (showStatus returnValue) mergeResultLog);

Modified: trunk/src/mkProjectInfo.ml
===================================================================
--- trunk/src/mkProjectInfo.ml	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/mkProjectInfo.ml	2008-11-08 16:53:32 UTC (rev 309)
@@ -92,3 +92,5 @@
 
 
 
+
+

Modified: trunk/src/os.ml
===================================================================
--- trunk/src/os.ml	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/os.ml	2008-11-08 16:53:32 UTC (rev 309)
@@ -347,80 +347,3 @@
    loop()
 
 
-(*****************************************************************************)
-(*                     RUNNING EXTERNAL PROGRAMS                             *)
-(*****************************************************************************)
-
-let (>>=) = Lwt.bind
-open Lwt
-
-let readChannelTillEof c =
-  let rec loop lines =
-    try let l = input_line c in
-        (* Util.msg "%s\n" l; *)
-        loop (l::lines)
-    with End_of_file -> lines in
-  String.concat "\n" (Safelist.rev (loop []))
-
-let readChannelTillEof_lwt c =
-  let rec loop lines =
-    let lo =
-      try
-        Some(Lwt_unix.run (Lwt_unix.input_line c))
-      with End_of_file -> None
-    in
-    match lo with
-      Some l -> loop (l :: lines)
-    | None   -> lines
-  in
-  String.concat "\n" (Safelist.rev (loop []))
-
-let readChannelsTillEof l =
-  let rec suckitdry lines c =
-    Lwt.catch
-      (fun() -> Lwt_unix.input_line c >>= (fun l -> return (Some l)))
-      (fun e -> match e with End_of_file -> return None | _ -> raise e)
-    >>= (fun lo ->
-           match lo with
-             None -> return lines
-           | Some l -> suckitdry (l :: lines) c) in
-  Lwt_util.map
-    (fun c ->
-       suckitdry [] c
-       >>= (fun res -> return (String.concat "\n" (Safelist.rev res))))
-    l
-
-let runExternalProgram cmd =
-  if Util.osType = `Win32 && not Util.isCygwin then begin
-    debug (fun()-> Util.msg "Executing external program windows-style\n");
-    let c = Unix.open_process_in ("\"" ^ cmd ^ "\"") in
-    let log = readChannelTillEof c in
-    let returnValue = Unix.close_process_in c in
-    let mergeResultLog =
-      cmd ^
-      (if log <> "" then "\n\n" ^ log else "") ^
-      (if returnValue <> Unix.WEXITED 0 then
-         "\n\n" ^ Util.process_status_to_string returnValue
-       else
-         "") in
-    (returnValue,mergeResultLog) 
-  end else Lwt_unix.run (
-    Lwt_unix.open_process_full cmd (Unix.environment ()) 
-    >>= (fun (out, ipt, err) ->
-    readChannelsTillEof [out;err]
-    >>= (function [logOut;logErr] ->
-    Lwt_unix.close_process_full (out, ipt, err)
-    >>= (fun returnValue ->
-    let logOut = Util.trimWhitespace logOut in
-    let logErr = Util.trimWhitespace logErr in
-    return (returnValue, (
-      (*  cmd
-      ^ "\n\n" ^ *)
-        (if logOut = "" || logErr = ""
-           then logOut ^ logErr
-         else logOut ^ "\n\n" ^ ("Error Output:" ^ logErr))
-      ^ (if returnValue = Unix.WEXITED 0
-         then ""
-         else "\n\n" ^ Util.process_status_to_string returnValue))))
-      (* Stop typechechecker from complaining about non-exhaustive pattern above *)
-      | _ -> assert false))) 

Modified: trunk/src/os.mli
===================================================================
--- trunk/src/os.mli	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/os.mli	2008-11-08 16:53:32 UTC (rev 309)
@@ -55,6 +55,4 @@
     ((Fspath.t * Path.local) -> (Fspath.t * Path.local) -> unit) ->
     unit
 
-val readChannelTillEof : in_channel -> string
-val runExternalProgram : string -> Unix.process_status * string
 val quotes : string -> string

Modified: trunk/src/props.ml
===================================================================
--- trunk/src/props.ml	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/props.ml	2008-11-08 16:53:32 UTC (rev 309)
@@ -493,7 +493,26 @@
                     Unix.utimes abspath v v)
                  (fun()-> Unix.chmod abspath oldPerms)
              end
-           else Unix.utimes abspath v v)
+           else if false then begin
+             (* A special hack for Rasmus, who has a special situation that
+                requires the utimes-setting program to run 'setuid root'
+                (and we do not want all of Unison to run setuid, so we just
+                spin off an external utility to do it). *)
+             let time = Unix.localtime v in
+             let tstr = Printf.sprintf
+                          "%4d%02d%02d%2d%02d.%02d"
+                          (time.Unix.tm_year + 1900)
+                          (time.Unix.tm_mon + 1)
+                          time.Unix.tm_mday
+                          time.Unix.tm_hour
+                          time.Unix.tm_min
+                          time.Unix.tm_sec in
+             let cmd = "touch -m -a -t " ^ tstr ^ " " ^ abspath in
+             Util.msg "Running external program to set utimes:\n  %s\n" cmd;
+             let (r,_) = External.runExternalProgram cmd in
+             if r<>(Unix.WEXITED 0) then raise (Util.Transient "External time-setting command failed")
+           end else
+             Unix.utimes abspath v v)
   | _ ->
       ()
 

Modified: trunk/src/stasher.ml
===================================================================
--- trunk/src/stasher.ml	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/stasher.ml	2008-11-08 16:53:32 UTC (rev 309)
@@ -63,7 +63,13 @@
      ^ " 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.")
+     ^ " placed at the beginning of the suffix.  "
+     ^ "\n\n"
+     ^ "One thing to be careful of: If the {\\tt backuploc} preference is set "
+     ^ "to {\\tt local}, Unison will automatically ignore {\\em all} files "
+     ^ "whose prefix and suffix match {\\tt backupprefix} and {\\tt backupsuffix}.  "
+     ^ "So be careful to choose values for these preferences that are sufficiently "
+     ^ "different from the names of your real files.")
     
 let backupsuffix =
   Prefs.createString "backupsuffix" ""

Modified: trunk/src/update.ml
===================================================================
--- trunk/src/update.ml	2008-08-26 11:10:52 UTC (rev 308)
+++ trunk/src/update.ml	2008-11-08 16:53:32 UTC (rev 309)
@@ -1524,7 +1524,7 @@
      and ignored paths *)
 (* FIX: The following line can be deleted -- it's just for debugging *)
 debug (fun() -> Util.msg "Running bogus external program\n");
-let _ = Os.runExternalProgram "dir" in
+let _ = External.runExternalProgram "dir" in
 debug (fun() -> Util.msg "Finished running bogus external program\n");
   findUpdatesOnPaths (Prefs.read Globals.paths)
 



More information about the Unison-hackers mailing list