git: ec146756a8a4 - main - net/unison: Update to 2.53.3

From: Guido Falsi <madpilot_at_FreeBSD.org>
Date: Fri, 28 Apr 2023 12:34:31 UTC
The branch main has been updated by madpilot:

URL: https://cgit.FreeBSD.org/ports/commit/?id=ec146756a8a41040668a3a748aba17abd0a40068

commit ec146756a8a41040668a3a748aba17abd0a40068
Author:     Guido Falsi <madpilot@FreeBSD.org>
AuthorDate: 2023-04-28 12:32:11 +0000
Commit:     Guido Falsi <madpilot@FreeBSD.org>
CommitDate: 2023-04-28 12:32:11 +0000

    net/unison: Update to 2.53.3
    
    Add patches to allow building with ocaml 4.07.1 [1]. Many thanks
    to Tõivo Leedjärv from upstream for providing them.
    
    Obtained from:  https://github.com/tleedjarv/unison/commit/ad79ecf3c42e0f10b05c7cb8eb5671c66b8a09e9
                    https://github.com/tleedjarv/unison/commit/accfb998cc9afc95c0b13dac20d9b49ef9af7e8d
                    https://github.com/tleedjarv/unison/commit/f9191b19dfaba01f5903ce36eb0258edef09964e
---
 net/unison/Makefile                                |   2 +-
 net/unison/distinfo                                |   6 +-
 net/unison/files/patch-Makefile.OCaml              |  18 +-
 net/unison/files/patch-fsmonitor_linux_Makefile    |  11 +-
 net/unison/files/patch-ocaml_4.07-compat           | 200 ++++++++++++++++++--
 .../files/patch-ocaml_4.07-compat-copyquoterem-01  | 209 +++++++++++++++++++++
 .../files/patch-ocaml_4.07-compat-copyquoterem-02  |  54 ++++++
 net/unison/files/patch-ubase_umarshal.ml           | 114 -----------
 8 files changed, 458 insertions(+), 156 deletions(-)

diff --git a/net/unison/Makefile b/net/unison/Makefile
index 4156f99912e1..a3988171bdcc 100644
--- a/net/unison/Makefile
+++ b/net/unison/Makefile
@@ -1,5 +1,5 @@
 PORTNAME=	unison
-PORTVERSION=	2.53.2
+PORTVERSION=	2.53.3
 DISTVERSIONPREFIX=	v
 CATEGORIES=	net
 
diff --git a/net/unison/distinfo b/net/unison/distinfo
index f05f0fe44a51..48327d0f92cb 100644
--- a/net/unison/distinfo
+++ b/net/unison/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1679421059
-SHA256 (bcpierce00-unison-v2.53.2_GH0.tar.gz) = fb337c221722e496916b385e50e99a49604b8aed3f5fafcc45029c1d2aa1232b
-SIZE (bcpierce00-unison-v2.53.2_GH0.tar.gz) = 1410117
+TIMESTAMP = 1682664394
+SHA256 (bcpierce00-unison-v2.53.3_GH0.tar.gz) = aaea04fc5bc76dcfe8627683c9659ee4c194d4f992cc8aaa15bbb2820fc8de46
+SIZE (bcpierce00-unison-v2.53.3_GH0.tar.gz) = 1415490
diff --git a/net/unison/files/patch-Makefile.OCaml b/net/unison/files/patch-Makefile.OCaml
index 5df9f0758e48..330f26d01721 100644
--- a/net/unison/files/patch-Makefile.OCaml
+++ b/net/unison/files/patch-Makefile.OCaml
@@ -1,18 +1,6 @@
---- Makefile.OCaml.orig	2023-03-19 12:38:58 UTC
+--- Makefile.OCaml.orig	2023-04-24 16:49:02 UTC
 +++ Makefile.OCaml
-@@ -34,7 +34,11 @@ ifeq ($(shell uname),NetBSD)
- else
- ifeq ($(shell uname),NetBSD)
-   OSARCH=NetBSD
-+else
-+ifeq ($(shell uname),FreeBSD)
-+  OSARCH=FreeBSD
- endif
-+endif
- ifeq ($(shell uname),Linux)
-   OSARCH=Linux
- endif
-@@ -271,7 +275,7 @@ OCAMLOBJS+=main.cmo
+@@ -248,7 +248,7 @@ OCAMLOBJS+=main.cmo
  
  # OCaml libraries for the bytecode version
  # File extensions will be substituted for the native code version
@@ -21,7 +9,7 @@
  INCLFLAGS+=-I +unix -I +str
  
  COBJS+=osxsupport$(OBJ_EXT) pty$(OBJ_EXT) bytearray_stubs$(OBJ_EXT) hash_compat$(OBJ_EXT) props_xattr$(OBJ_EXT) props_acl$(OBJ_EXT)
-@@ -332,6 +336,11 @@ ifeq ($(OSARCH),Linux)
+@@ -309,6 +309,11 @@ ifeq ($(OSARCH),Linux)
  ### Filesystem monitoring
  
  ifeq ($(OSARCH),Linux)
diff --git a/net/unison/files/patch-fsmonitor_linux_Makefile b/net/unison/files/patch-fsmonitor_linux_Makefile
index 820041472d23..7d44e1c8b925 100644
--- a/net/unison/files/patch-fsmonitor_linux_Makefile
+++ b/net/unison/files/patch-fsmonitor_linux_Makefile
@@ -1,6 +1,6 @@
---- fsmonitor/linux/Makefile.orig	2017-03-23 16:47:46 UTC
+--- fsmonitor/linux/Makefile.orig	2023-04-24 16:49:02 UTC
 +++ fsmonitor/linux/Makefile
-@@ -18,6 +18,10 @@ else
+@@ -18,6 +18,10 @@ endif
    FSMCAMLLIBS=$(FSMOCAMLLIBS)
  endif
  
@@ -11,10 +11,3 @@
  buildexecutable:: $(FSMONITOR)$(EXEC_EXT)
  
  $(FSMONITOR)$(EXEC_EXT): $(FSMCAMLOBJS) $(FSMCOBJS)
-@@ -26,4 +30,4 @@ $(FSMONITOR)$(EXEC_EXT): $(FSMCAMLOBJS) $(FSMCOBJS)
- 
- clean::
- 	rm -f $(DIR)/*.cm[iox] $(DIR)/*.o $(DIR)/*~
--	rm -f $(FSMONITOR)$(EXEC_EXT)
-\ No newline at end of file
-+	rm -f $(FSMONITOR)$(EXEC_EXT)
diff --git a/net/unison/files/patch-ocaml_4.07-compat b/net/unison/files/patch-ocaml_4.07-compat
index 33cf9da99040..cfaabd107123 100644
--- a/net/unison/files/patch-ocaml_4.07-compat
+++ b/net/unison/files/patch-ocaml_4.07-compat
@@ -1,6 +1,6 @@
-From b787de04da85da2f911c8248e07342e58b4e8625 Mon Sep 17 00:00:00 2001
-From: Tõivo Leedjärv <toivol@gmail.com>
-Date: Fre, 24 Mar 2023 17:22:09 +0100
+From ad79ecf3c42e0f10b05c7cb8eb5671c66b8a09e9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?T=C3=B5ivo=20Leedj=C3=A4rv?= <toivol@gmail.com>
+Date: Thu, 17 Nov 2022 11:53:35 +0100
 Subject: [PATCH] Restore compatibility with OCaml 4.06 and 4.07 (temporary
  patch)
 
@@ -13,13 +13,16 @@ Makefile.OCaml).
  src/fswatchold.ml            |  25 +++--
  src/remote.ml                |   3 +-
  src/system/system_generic.ml | 204 +++++++++++++++++++++++++++++++++++
- src/uitext.ml                |   1 -
- 6 files changed, 326 insertions(+), 14 deletions(-)
+ src/ubase/umarshal.ml        | 105 ++++++++++++++++++
+ src/uicommon.ml              |  12 +--
+ src/uitext.ml                |   3 +-
+ 6 files changed, 332 insertions(+), 20 deletions(-)
 
-index 17f22dcb..13cab93b 100644
+diff --git a/src/fswatchold.ml b/src/fswatchold.ml
+index 84912071a..5b266f519 100644
 --- fswatchold.ml
 +++ fswatchold.ml
-@@ -116,19 +116,22 @@ let readChanges wi =
+@@ -113,19 +113,22 @@ let readChanges wi =
  let watcherRunning archHash =
    RootMap.mem archHash !watchers &&
      let wi = RootMap.find archHash !watchers in
@@ -54,7 +57,7 @@ index 17f22dcb..13cab93b 100644
  let getChanges archHash =
    if StringSet.mem archHash !newWatchers then
 diff --git a/src/remote.ml b/src/remote.ml
-index d320470a..0ed393ae 100644
+index d101c3903..bedf2e3ba 100644
 --- remote.ml
 +++ remote.ml
 @@ -1887,11 +1887,12 @@ let buildShellConnection shell host userOpt portOpt rootName termInteract =
@@ -72,7 +75,7 @@ index d320470a..0ed393ae 100644
          let () = at_exit end_ssh in
          (None, pid)
 diff --git a/src/system/system_generic.ml b/src/system/system_generic.ml
-index 2147d44d..3ef4fb09 100644
+index 6f6c6895a..15509abd5 100644
 --- system/system_generic.ml
 +++ system/system_generic.ml
 @@ -15,6 +15,210 @@
@@ -286,11 +289,183 @@ index 2147d44d..3ef4fb09 100644
  type fspath = string
  
  let mfspath = Umarshal.string
+diff --git a/src/ubase/umarshal.ml b/src/ubase/umarshal.ml
+index 5c5f061ad..d65e1a7c5 100644
+--- ubase/umarshal.ml
++++ ubase/umarshal.ml
+@@ -15,6 +15,111 @@
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *)
+ 
++(* OCaml 4.07 compatibility ONLY *)
++module Bytes = struct
++
++include Bytes
++
++(* The following code is taken from OCaml sources.
++   Authors of the code snippet: Alain Frisch and Daniel Bünzli *)
++
++(**************************************************************************)
++(*                                                                        *)
++(*                                 OCaml                                  *)
++(*                                                                        *)
++(*             Xavier Leroy, projet Cristal, INRIA Rocquencourt           *)
++(*                                                                        *)
++(*   Copyright 1996 Institut National de Recherche en Informatique et     *)
++(*     en Automatique.                                                    *)
++(*                                                                        *)
++(*   All rights reserved.  This file is distributed under the terms of    *)
++(*   the GNU Lesser General Public License version 2.1, with the          *)
++(*   special exception on linking described in the file LICENSE.          *)
++(*                                                                        *)
++(**************************************************************************)
++
++(** {6 Binary encoding/decoding of integers} *)
++
++external get_uint8 : bytes -> int -> int = "%string_safe_get"
++external get_uint16_ne : bytes -> int -> int = "%caml_string_get16"
++external get_int32_ne : bytes -> int -> int32 = "%caml_string_get32"
++external get_int64_ne : bytes -> int -> int64 = "%caml_string_get64"
++external set_int8 : bytes -> int -> int -> unit = "%string_safe_set"
++external set_int16_ne : bytes -> int -> int -> unit = "%caml_string_set16"
++external set_int32_ne : bytes -> int -> int32 -> unit = "%caml_string_set32"
++external set_int64_ne : bytes -> int -> int64 -> unit = "%caml_string_set64"
++external swap16 : int -> int = "%bswap16"
++external swap32 : int32 -> int32 = "%bswap_int32"
++external swap64 : int64 -> int64 = "%bswap_int64"
++
++let get_int8 b i =
++  ((get_uint8 b i) lsl (Sys.int_size - 8)) asr (Sys.int_size - 8)
++
++let get_uint16_le b i =
++  if Sys.big_endian then swap16 (get_uint16_ne b i)
++  else get_uint16_ne b i
++
++let get_uint16_be b i =
++  if not Sys.big_endian then swap16 (get_uint16_ne b i)
++  else get_uint16_ne b i
++
++let get_int16_ne b i =
++  ((get_uint16_ne b i) lsl (Sys.int_size - 16)) asr (Sys.int_size - 16)
++
++let get_int16_le b i =
++  ((get_uint16_le b i) lsl (Sys.int_size - 16)) asr (Sys.int_size - 16)
++
++let get_int16_be b i =
++  ((get_uint16_be b i) lsl (Sys.int_size - 16)) asr (Sys.int_size - 16)
++
++let get_int32_le b i =
++  if Sys.big_endian then swap32 (get_int32_ne b i)
++  else get_int32_ne b i
++
++let get_int32_be b i =
++  if not Sys.big_endian then swap32 (get_int32_ne b i)
++  else get_int32_ne b i
++
++let get_int64_le b i =
++  if Sys.big_endian then swap64 (get_int64_ne b i)
++  else get_int64_ne b i
++
++let get_int64_be b i =
++  if not Sys.big_endian then swap64 (get_int64_ne b i)
++  else get_int64_ne b i
++
++let set_int16_le b i x =
++  if Sys.big_endian then set_int16_ne b i (swap16 x)
++  else set_int16_ne b i x
++
++let set_int16_be b i x =
++  if not Sys.big_endian then set_int16_ne b i (swap16 x)
++  else set_int16_ne b i x
++
++let set_int32_le b i x =
++  if Sys.big_endian then set_int32_ne b i (swap32 x)
++  else set_int32_ne b i x
++
++let set_int32_be b i x =
++  if not Sys.big_endian then set_int32_ne b i (swap32 x)
++  else set_int32_ne b i x
++
++let set_int64_le b i x =
++  if Sys.big_endian then set_int64_ne b i (swap64 x)
++  else set_int64_ne b i x
++
++let set_int64_be b i x =
++  if not Sys.big_endian then set_int64_ne b i (swap64 x)
++  else set_int64_ne b i x
++
++let set_uint8 = set_int8
++let set_uint16_ne = set_int16_ne
++let set_uint16_be = set_int16_be
++let set_uint16_le = set_int16_le
++
++end
++(* / *)
++
+ exception Error of string
+ 
+ type 'a t = {
+diff --git a/src/uicommon.ml b/src/uicommon.ml
+index 94fbc66ef..8a16270c3 100644
+--- uicommon.ml
++++ uicommon.ml
+@@ -484,7 +484,7 @@ let addIgnorePattern theRegExp =
+ module Stats = struct
+ 
+ let calcETA rem rate =
+-  if Float.is_nan rate || Float.is_nan rem || rem < 0. then "" else
++  if rate <> rate || rem <> rem || rem < 0. then "" else
+   let t = truncate (rem /. rate +. 0.5) in
+   (* Estimating the remaining time is not accurate. Reduce the display
+      precision (and reduce more when longer time remaining). *)
+@@ -501,8 +501,8 @@ let calcETA rem rate =
+   Printf.sprintf "%02d:%02d:%02d" h m sec
+ 
+ let movAvg curr prev ?(c = 1.) deltaTime avgPeriod =
+-  if Float.is_nan prev then curr else
+-  let a = c *. Float.min (1. -. exp (-. deltaTime /. avgPeriod)) 1. in
++  if prev <> prev then curr else
++  let a = c *. min (1. -. exp (-. deltaTime /. avgPeriod)) 1. in
+   (* Simplified from a *. curr +. (1. -. a) *. prev *)
+   prev +. a *. (curr -. prev)
+ 
+@@ -525,7 +525,7 @@ let init totalToTransfer =
+   let t0 = 0. in
+   { t0; t = t0; totalToComplete = Uutil.Filesize.toInt64 totalToTransfer;
+     completed = 0L;
+-    curRate = Float.nan; avgRateS = Float.nan; avgRateDoubleSGauss = Float.nan;
++    curRate = nan; avgRateS = nan; avgRateDoubleSGauss = nan;
+   }
+ 
+ let calcAvgRate' sta totTime deltaCompleted deltaTime =
+@@ -534,11 +534,11 @@ let calcAvgRate' sta totTime deltaCompleted deltaTime =
+      changes (like switching from cache to disk or from disk to network
+      of from receiving to sending or with wildly variable network speed). *)
+   let avgRateS = movAvg curRate sta.avgRateS deltaTime
+-    (Float.min_num totTime avgPeriodS) in
++    (min totTime avgPeriodS) in
+   let cpr = (avgRateS -. sta.avgRateDoubleSGauss) /. sta.avgRateDoubleSGauss in
+   let c = 1. -. exp (-.(cpr ** 2.) /. gaussC) in
+   let avgRateDoubleSGauss = movAvg avgRateS sta.avgRateDoubleSGauss ~c deltaTime
+-    (Float.min_num totTime avgPeriodD) in
++    (min totTime avgPeriodD) in
+   sta.curRate <- curRate;
+   sta.avgRateS <- avgRateS;
+   sta.avgRateDoubleSGauss <- avgRateDoubleSGauss
 diff --git a/src/uitext.ml b/src/uitext.ml
-index 1c2e509d..fbb4f7f1 100644
+index 5d1513a03..fc1f8c716 100644
 --- uitext.ml
 +++ uitext.ml
-@@ -1621,7 +1621,6 @@ and breakRepeat = function
+@@ -833,7 +833,7 @@ let doTransport reconItemList numskip isSkip =
+         else if v >= 100. then "00:00:00"
+         else
+           let rate = Uicommon.Stats.avgRate1 sta in
+-          if Float.is_nan rate then "--:--"
++          if rate <> rate then "--:--"
+           else
+             Format.sprintf "%8s/s    %s"
+               (Util.bytes2string (Int64.of_float rate))
+@@ -1692,7 +1692,6 @@ and breakRepeat = function
    | Assert_failure _
    | Match_failure _
    | Invalid_argument _
@@ -298,6 +473,3 @@ index 1c2e509d..fbb4f7f1 100644
    (* Async exceptions *)
    | Out_of_memory
    | Stack_overflow
--- 
-2.39.2
-
diff --git a/net/unison/files/patch-ocaml_4.07-compat-copyquoterem-01 b/net/unison/files/patch-ocaml_4.07-compat-copyquoterem-01
new file mode 100644
index 000000000000..2fb4193f76fa
--- /dev/null
+++ b/net/unison/files/patch-ocaml_4.07-compat-copyquoterem-01
@@ -0,0 +1,209 @@
+From accfb998cc9afc95c0b13dac20d9b49ef9af7e8d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?T=C3=B5ivo=20Leedj=C3=A4rv?= <toivol@gmail.com>
+Date: Fri, 14 Apr 2023 14:48:48 +0200
+Subject: [PATCH] Revert "Avoid problems with quoting arguments to copyprog"
+
+This reverts commit e737106fbbd541c5d9536606fb15b04cb165f5d2.
+---
+ src/copy.ml                  | 38 ++++++++++++++++++++++--------
+ src/external.ml              | 45 +++---------------------------------
+ src/external.mli             |  1 -
+ src/system/system_generic.ml |  2 --
+ src/system/system_intf.ml    |  3 ---
+ 6 files changed, 31 insertions(+), 58 deletions(-)
+
+diff --git a/src/copy.ml b/src/copy.ml
+index 21e22743d..fa704f35c 100644
+--- copy.ml
++++ copy.ml
+@@ -911,8 +911,17 @@ let copythreshold =
+      ^ "See \\sectionref{speeding}{Making Unison Faster on Large Files} "
+      ^ "for more information.")
+ 
+-(* Pref copyquoterem removed since 2.53.3 *)
+-let () = Prefs.markRemoved "copyquoterem"
++let copyquoterem =
++  Prefs.createBoolWithDefault "copyquoterem"
++    ~category:(`Advanced `General)
++    "add quotes to remote file name for copyprog (true/false/default)"
++    ("When set to {\\tt true}, this flag causes Unison to add an extra layer "
++     ^ "of quotes to the remote path passed to the external copy program. "
++     ^ "This is needed by rsync, for example, which internally uses an ssh "
++     ^ "connection requiring an extra level of quoting for paths containing "
++     ^ "spaces. When this flag is set to {\\tt default}, extra quotes are "
++     ^ "added if the value of {\\tt copyprog} contains the string "
++     ^ "{\\tt rsync}.")
+ 
+ let copymax =
+   Prefs.createInt "copymax" 1
+@@ -1022,25 +1031,34 @@ let transferFileUsingExternalCopyprog
+              rootFrom pathFrom rootTo fspathTo pathTo realPathTo
+              update desc fp ress id useExistingTarget =
+   Uutil.showProgress id Uutil.Filesize.zero "ext";
+-  let progWithArgs =
++  let prog =
+     if useExistingTarget then
+       Prefs.read copyprogrest
+     else
+       Prefs.read copyprog
+   in
++  let extraquotes = Prefs.read copyquoterem = `True
++                 || (  Prefs.read copyquoterem = `Default
++                    && Util.findsubstring "rsync" prog <> None) in
++  let addquotes root s =
++    match root with
++    | Common.Local, _ -> s
++    | Common.Remote _, _ -> if extraquotes then Uutil.quotes s else s in
+   let fromSpec =
+       (formatConnectionInfo rootFrom)
+-    ^ (Fspath.toString (Fspath.concat (snd rootFrom) pathFrom)) in
++    ^ (addquotes rootFrom
++         (Fspath.toString (Fspath.concat (snd rootFrom) pathFrom))) in
+   let toSpec =
+       (formatConnectionInfo rootTo)
+-    ^ (Fspath.toString (Fspath.concat fspathTo pathTo)) in
+-  Trace.log (progWithArgs ^ " " ^ fromSpec ^ " " ^ toSpec ^ "\n");
++    ^ (addquotes rootTo
++         (Fspath.toString (Fspath.concat fspathTo pathTo))) in
++  let cmd = prog ^ " "
++             ^ (Uutil.quotes fromSpec) ^ " "
++             ^ (Uutil.quotes toSpec) in
++  Trace.log (Printf.sprintf "%s\n" cmd);
+   Lwt_util.resize_region !copyprogReg (Prefs.read copymax);
+-  let args = Str.split (Str.regexp "[ \t]+") progWithArgs in
+-  let prog = match args with [] -> assert false | h :: _ -> h in
+   Lwt_util.run_in_region !copyprogReg 1
+-    (fun () -> External.runExternalProgramArgs prog
+-                 (Array.of_list (args @ [fromSpec; toSpec]))) >>= fun (_, log) ->
++    (fun () -> External.runExternalProgram cmd) >>= fun (_, log) ->
+   debug (fun() ->
+            let l = Util.trimWhitespace log in
+            Util.msg "transferFileUsingExternalCopyprog %s: returned...\n%s%s"
+diff --git a/src/external.ml b/src/external.ml
+index f13368231..cefb9ea98 100644
+--- external.ml
++++ external.ml
+@@ -25,26 +25,6 @@ let debug = Util.debug "external"
+ let (>>=) = Lwt.bind
+ open Lwt
+ 
+-(* For backwards compatibility with OCaml < 4.12 *)
+-let path =
+-  try
+-    Str.split (Str.regexp (if Util.osType = `Win32 then ";" else ":"))
+-      (Sys.getenv "PATH")
+-  with Not_found ->
+-    []
+-
+-let search_in_path ?(path = path) name =
+-  if String.contains name '/' then name else
+-  Filename.concat
+-    (List.find (fun dir ->
+-       let p = Filename.concat dir name in
+-       let found = System.file_exists p in
+-       debug (fun () -> Util.msg "'%s' ...%s\n" p
+-         (match found with true -> "found" | false -> "not found"));
+-       found)
+-    path)
+-    name
+-
+ (* Make sure external process resources are collected and zombie processes
+    reaped when the Lwt thread calling the external program is stopped
+    suddenly due to remote connection being closed. *)
+@@ -66,17 +46,9 @@ let fullProcRes =
+ let openProcessIn cmd = inProcRes.register (System.open_process_in cmd)
+ let closeProcessIn = inProcRes.release
+ 
+-(* Remove call to search_in_path once we require OCaml >= 4.12. *)
+-let openProcessArgsIn cmd args = inProcRes.register (System.open_process_args_in (search_in_path cmd) args)
+-let closeProcessArgsIn = inProcRes.release
+-
+ let openProcessFull cmd = fullProcRes.register (System.open_process_full cmd)
+ let closeProcessFull = fullProcRes.release
+ 
+-(* Remove call to search_in_path once we require OCaml >= 4.12. *)
+-let openProcessArgsFull cmd args = fullProcRes.register (System.open_process_args_full (search_in_path cmd) args)
+-let closeProcessArgsFull = fullProcRes.release
+-
+ let readChannelTillEof c =
+   let lst = ref [] in
+   let rec loop () =
+@@ -108,11 +80,10 @@ let readChannelsTillEof l =
+        >>= (fun res -> return (String.concat "\n" (Safelist.rev res))))
+     l
+ 
+-
+-let runExternalProgramAux ~winProc ~posixProc =
++let runExternalProgram cmd =
+   if Util.osType = `Win32 && not Util.isCygwin then begin
+     debug (fun()-> Util.msg "Executing external program windows-style\n");
+-    let c = winProc () in
++    let c = openProcessIn ("\"" ^ cmd ^ "\"") in
+     let log = Util.trimWhitespace (readChannelTillEof c) in
+     let returnValue = closeProcessIn c in
+     let resultLog =
+@@ -124,7 +95,7 @@ let runExternalProgramAux ~winProc ~posixProc =
+          "") in
+     Lwt.return (returnValue, resultLog)
+   end else
+-    let (out, ipt, err) as desc = posixProc () in
++    let (out, ipt, err) as desc = openProcessFull cmd in
+     let out = Lwt_unix.intern_in_channel out in
+     let err = Lwt_unix.intern_in_channel err in
+     readChannelsTillEof [out;err]
+@@ -143,13 +114,3 @@ let runExternalProgramAux ~winProc ~posixProc =
+          else "\n\n" ^ Util.process_status_to_string returnValue)))
+       (* Stop typechechecker from complaining about non-exhaustive pattern above *)
+       | _ -> assert false)
+-
+-let runExternalProgram cmd =
+-  runExternalProgramAux
+-    ~winProc:(fun () -> openProcessIn ("\"" ^ cmd ^ "\""))
+-    ~posixProc:(fun () -> openProcessFull cmd)
+-
+-let runExternalProgramArgs cmd args =
+-  runExternalProgramAux
+-    ~winProc:(fun () -> openProcessArgsIn cmd args)
+-    ~posixProc:(fun () -> openProcessArgsFull cmd args)
+diff --git a/src/external.mli b/src/external.mli
+index d2d0bae5b..30d2dbd05 100644
+--- external.mli
++++ external.mli
+@@ -2,5 +2,4 @@
+ (* Copyright 1999-2020, Benjamin C. Pierce (see COPYING for details) *)
+ 
+ val runExternalProgram : string -> (Unix.process_status * string) Lwt.t
+-val runExternalProgramArgs : string -> string array -> (Unix.process_status * string) Lwt.t
+ val readChannelTillEof : in_channel -> string
+diff --git a/src/system/system_generic.ml b/src/system/system_generic.ml
+index 15509abd5..3ef4fb09b 100644
+--- system/system_generic.ml
++++ system/system_generic.ml
+@@ -272,10 +272,8 @@ let open_in_bin = open_in_bin
+ 
+ let create_process = Unix.create_process
+ let open_process_in = Unix.open_process_in
+-let open_process_args_in = Unix.open_process_args_in
+ let open_process_out = Unix.open_process_out
+ let open_process_full cmd = Unix.open_process_full cmd (Unix.environment ())
+-let open_process_args_full cmd args = Unix.open_process_args_full cmd args (Unix.environment ())
+ let process_in_pid = Unix.process_in_pid
+ let process_out_pid = Unix.process_out_pid
+ let process_full_pid = Unix.process_full_pid
+diff --git a/src/system/system_intf.ml b/src/system/system_intf.ml
+index 873f4ca57..4dc60dd3b 100644
+--- system/system_intf.ml
++++ system/system_intf.ml
+@@ -99,12 +99,9 @@ val create_process :
+   string -> string array ->
+   Unix.file_descr -> Unix.file_descr -> Unix.file_descr -> int
+ val open_process_in : string -> in_channel
+-val open_process_args_in : string -> string array -> in_channel
+ val open_process_out : string -> out_channel
+ val open_process_full :
+   string -> in_channel * out_channel * in_channel
+-val open_process_args_full :
+-  string -> string array -> in_channel * out_channel * in_channel
+ val process_in_pid : in_channel -> int
+ val process_out_pid : out_channel -> int
+ val process_full_pid : in_channel * out_channel * in_channel -> int
diff --git a/net/unison/files/patch-ocaml_4.07-compat-copyquoterem-02 b/net/unison/files/patch-ocaml_4.07-compat-copyquoterem-02
new file mode 100644
index 000000000000..cdd50a67e1d3
--- /dev/null
+++ b/net/unison/files/patch-ocaml_4.07-compat-copyquoterem-02
@@ -0,0 +1,54 @@
+From f9191b19dfaba01f5903ce36eb0258edef09964e Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?T=C3=B5ivo=20Leedj=C3=A4rv?= <toivol@gmail.com>
+Date: Tue, 25 Apr 2023 09:35:14 +0200
+Subject: [PATCH] Revert "Regen strings.ml"
+
+This reverts commit 63963d80157346c2f3c9073f741bbd58e5c32545.
+---
+ src/strings.ml | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+diff --git a/src/strings.ml b/src/strings.ml
+index 6e853eb07..eb00eac5f 100644
+--- strings.ml
++++ strings.ml
+@@ -1286,6 +1286,8 @@ let docs =
+       \032  -copymax n          maximum number of simultaneous copyprog transfers\n\
+       \032  -copyprog xxx       external program for copying large files\n\
+       \032  -copyprogrest xxx   variant of copyprog for resuming partial transfers\n\
++      \032  -copyquoterem xxx   add quotes to remote file name for copyprog\n\
++      \032                      (true/false/default)\n\
+       \032  -copythreshold n    use copyprog on files bigger than this (if >=0, in Kb)\n\
+       \032  -diff xxx           set command for showing differences between files\n\
+       \032  -ignorelocks        ignore locks left over from previous run (dangerous!)\n\
+@@ -1502,6 +1504,15 @@ let docs =
+       \032         rsync). The default setting invokes rsync with appropriate\n\
+       \032         options\226\128\148most users should not need to change it.\n\
+       \n\
++      \032  copyquoterem xxx\n\
++      \032         When set to true, this flag causes Unison to add an extra layer\n\
++      \032         of quotes to the remote path passed to the external copy\n\
++      \032         program. This is needed by rsync, for example, which internally\n\
++      \032         uses an ssh connection requiring an extra level of quoting for\n\
++      \032         paths containing spaces. When this flag is set to default, extra\n\
++      \032         quotes are added if the value of copyprog contains the string\n\
++      \032         rsync.\n\
++      \n\
+       \032  copythreshold n\n\
+       \032         A number indicating above what filesize (in kilobytes) Unison\n\
+       \032         should use the external copying utility specified by copyprog.\n\
+@@ -3113,6 +3124,14 @@ let docs =
+       \032  copyprog      =   rsync --inplace --compress\n\
+       \032  copyprogrest  =   rsync --partial --inplace --compress\n\
+       \n\
++      \032  You may also need to set the copyquoterem preference. When it is set to\n\
++      \032  true, this causes Unison to add an extra layer of quotes to the remote\n\
++      \032  path passed to the external copy program. This is is needed by rsync,\n\
++      \032  for example, which internally uses an ssh connection, requiring an\n\
++      \032  extra level of quoting for paths containing spaces. When this flag is\n\
++      \032  set to default, extra quotes are added if the value of copyprog\n\
++      \032  contains the string rsync. The default value is default, naturally.\n\
++      \n\
+       \032  If a directory transfer is interrupted, the next run of Unison will\n\
+       \032  automatically skip any files that were completely transferred before\n\
+       \032  the interruption. (This behavior is always on: it does not depend on\n\
diff --git a/net/unison/files/patch-ubase_umarshal.ml b/net/unison/files/patch-ubase_umarshal.ml
deleted file mode 100644
index 0edb9f18aec5..000000000000
--- a/net/unison/files/patch-ubase_umarshal.ml
+++ /dev/null
@@ -1,114 +0,0 @@
---- ubase/umarshal.ml.orig	2022-10-30 19:42:39 UTC
-+++ ubase/umarshal.ml
-@@ -15,6 +15,111 @@
-     along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *)
- 
-+(* OCaml 4.07 compatibility ONLY *)
-+module Bytes = struct
-+
-+include Bytes
-+
-+(* The following code is taken from OCaml sources.
-+   Authors of the code snippet: Alain Frisch and Daniel Bünzli *)
-+
-+(**************************************************************************)
-+(*                                                                        *)
-+(*                                 OCaml                                  *)
-+(*                                                                        *)
-+(*             Xavier Leroy, projet Cristal, INRIA Rocquencourt           *)
-+(*                                                                        *)
-+(*   Copyright 1996 Institut National de Recherche en Informatique et     *)
-+(*     en Automatique.                                                    *)
-+(*                                                                        *)
-+(*   All rights reserved.  This file is distributed under the terms of    *)
-+(*   the GNU Lesser General Public License version 2.1, with the          *)
-+(*   special exception on linking described in the file LICENSE.          *)
-+(*                                                                        *)
-+(**************************************************************************)
-+
-+(** {6 Binary encoding/decoding of integers} *)
-+
-+external get_uint8 : bytes -> int -> int = "%string_safe_get"
-+external get_uint16_ne : bytes -> int -> int = "%caml_string_get16"
-+external get_int32_ne : bytes -> int -> int32 = "%caml_string_get32"
-+external get_int64_ne : bytes -> int -> int64 = "%caml_string_get64"
-+external set_int8 : bytes -> int -> int -> unit = "%string_safe_set"
-+external set_int16_ne : bytes -> int -> int -> unit = "%caml_string_set16"
-+external set_int32_ne : bytes -> int -> int32 -> unit = "%caml_string_set32"
-+external set_int64_ne : bytes -> int -> int64 -> unit = "%caml_string_set64"
-+external swap16 : int -> int = "%bswap16"
-+external swap32 : int32 -> int32 = "%bswap_int32"
-+external swap64 : int64 -> int64 = "%bswap_int64"
-+
-+let get_int8 b i =
-+  ((get_uint8 b i) lsl (Sys.int_size - 8)) asr (Sys.int_size - 8)
-+
-+let get_uint16_le b i =
-+  if Sys.big_endian then swap16 (get_uint16_ne b i)
-+  else get_uint16_ne b i
-+
-+let get_uint16_be b i =
-+  if not Sys.big_endian then swap16 (get_uint16_ne b i)
-+  else get_uint16_ne b i
-+
-+let get_int16_ne b i =
-+  ((get_uint16_ne b i) lsl (Sys.int_size - 16)) asr (Sys.int_size - 16)
-+
-+let get_int16_le b i =
-+  ((get_uint16_le b i) lsl (Sys.int_size - 16)) asr (Sys.int_size - 16)
-+
-+let get_int16_be b i =
-+  ((get_uint16_be b i) lsl (Sys.int_size - 16)) asr (Sys.int_size - 16)
-+
-+let get_int32_le b i =
-+  if Sys.big_endian then swap32 (get_int32_ne b i)
-+  else get_int32_ne b i
-+
-+let get_int32_be b i =
-+  if not Sys.big_endian then swap32 (get_int32_ne b i)
-+  else get_int32_ne b i
-+
-+let get_int64_le b i =
-+  if Sys.big_endian then swap64 (get_int64_ne b i)
-+  else get_int64_ne b i
-+
-+let get_int64_be b i =
-+  if not Sys.big_endian then swap64 (get_int64_ne b i)
-+  else get_int64_ne b i
-+
-+let set_int16_le b i x =
-+  if Sys.big_endian then set_int16_ne b i (swap16 x)
-+  else set_int16_ne b i x
-+
-+let set_int16_be b i x =
-+  if not Sys.big_endian then set_int16_ne b i (swap16 x)
-+  else set_int16_ne b i x
-+
-+let set_int32_le b i x =
-+  if Sys.big_endian then set_int32_ne b i (swap32 x)
-+  else set_int32_ne b i x
-+
-+let set_int32_be b i x =
-+  if not Sys.big_endian then set_int32_ne b i (swap32 x)
-+  else set_int32_ne b i x
-+
-+let set_int64_le b i x =
-+  if Sys.big_endian then set_int64_ne b i (swap64 x)
-+  else set_int64_ne b i x
-+
-+let set_int64_be b i x =
-+  if not Sys.big_endian then set_int64_ne b i (swap64 x)
-+  else set_int64_ne b i x
-+
-+let set_uint8 = set_int8
-+let set_uint16_ne = set_int16_ne
-+let set_uint16_be = set_int16_be
-+let set_uint16_le = set_int16_le
-+
-+end
-+(* / *)
-+
- exception Error of string
- 
- type 'a t = {