[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