diff --git a/doc/pages/Manual.md b/doc/pages/Manual.md
index 3263ca1ebd6..87bd96f6f8f 100644
--- a/doc/pages/Manual.md
+++ b/doc/pages/Manual.md
@@ -888,11 +888,10 @@ files.
- `patches: [ { } ... ]`: a list
of files relative to the project source root (often added through the `files/`
metadata subdirectory). The listed patch files will be applied sequentially to
- the source using the `patch` command (before opam 2.2) or `git apply`
- (since opam 2.2), stripping one level of leading directories (`-p1`) -- which
- is what version control systems generally use. Variable interpolation is
- available, so you can specify `patches: [ "file" ]` to have the patch
- processed from `file.in`.
+ the source as with the `patch` command, stripping one level of leading
+ directories (`-p1`) -- which is what version control systems generally use .
+ Variable interpolation is available, so you can specify `patches: [ "file" ]`
+ to have the patch processed from `file.in`.
Patches may be applied conditionally by adding _filters_.
@@ -1532,9 +1531,8 @@ them modified with [`opam option --global`](man/opam-option.html).
- `quorum`: integer, the currently defined quorum
- `repo`: directory containing the already-validated state of the repository
(empty for an initial validation)
- - `patch`: for incremental validation, filename of a patch applying to `repo`
- (using `patch -p1` before opam 2.2, and using `git apply -p1` since opam 2.2)
- and that needs verification
+ - `patch`: for incremental validation, filename of a patch applying to
+ `repo` (with `patch -p1`) and that needs verification
- `dir`: for initial validation, the directory to verify
- `incremental`: `false` if doing an initial validation based on `dir`,
`true` for an incremental validation based on `repo` and `patch`.
diff --git a/master_changes.md b/master_changes.md
index 456753bdaee..26ecc54741d 100644
--- a/master_changes.md
+++ b/master_changes.md
@@ -168,4 +168,3 @@ users)
## opam-core
* `OpamStd.Sys`: add `is_cygwin_variant_cygcheck` that returns true if in path `cygcheck` is from a Cygwin or MSYS2 installation [#5843 @rjbou]
- * `OpamSystem.patch`: use `git -c core.autocrlf=false apply --unsafe-paths -p1 ` instead of `patch` [#5400 @kit-ty-kate - fix #3433 #3782 #3639]
diff --git a/src/client/opamInitDefaults.ml b/src/client/opamInitDefaults.ml
index 6ef9fcb5001..ed5fb85a5f4 100644
--- a/src/client/opamInitDefaults.ml
+++ b/src/client/opamInitDefaults.ml
@@ -57,6 +57,9 @@ let not_win32_filter =
FOp (FIdent ([], OpamVariable.of_string "os", None), `Neq, FString "win32")
let sandbox_filter = FOr (linux_filter, macos_filter)
+let gpatch_filter = FOr (openbsd_filter, freebsd_filter)
+let patch_filter = FNot gpatch_filter
+
let gtar_filter = openbsd_filter
let tar_filter = FNot gtar_filter
@@ -131,7 +134,8 @@ let required_tools ~sandboxing () =
req_dl_tools () @
[
["diff"], None, None;
- ["git"], None, None;
+ ["patch"], None, Some patch_filter;
+ ["gpatch"], None, Some gpatch_filter;
["tar"], None, Some tar_filter;
["gtar"], None, Some gtar_filter;
["unzip"], None, None;
diff --git a/src/core/opamSystem.ml b/src/core/opamSystem.ml
index 1ccc0fd535f..cd4169ccd9d 100644
--- a/src/core/opamSystem.ml
+++ b/src/core/opamSystem.ml
@@ -1645,7 +1645,13 @@ let patch ?(preprocess=true) ~dir p =
else
p
in
- make_command ~name:"git apply" ~dir "git" ["-c"; "core.autocrlf=false"; "apply"; "--unsafe-paths"; "-p1"; p'] @@> fun r ->
+ let patch_cmd =
+ match OpamStd.Sys.os () with
+ | OpamStd.Sys.OpenBSD
+ | OpamStd.Sys.FreeBSD -> "gpatch"
+ | _ -> "patch"
+ in
+ make_command ~name:"patch" ~dir patch_cmd ["-p1"; "-i"; p'] @@> fun r ->
if not (OpamConsole.debug ()) then Sys.remove p';
if OpamProcess.is_success r then Done None
else Done (Some (Process_error r))
diff --git a/tests/reftests/repository.test b/tests/reftests/repository.test
index d826e00ad04..3e087df0333 100644
--- a/tests/reftests/repository.test
+++ b/tests/reftests/repository.test
@@ -6,9 +6,9 @@ build: ["test" "-f" "bar"]
some content
### : Internal repository storage as archive or plain directory :
### opam switch create tarring --empty
-### opam update -vv | grep '^\+' | sed-cmd diff | sed-cmd git | 'patch-[^"]+' -> 'patch'
+### opam update -vv | grep '^\+' | sed-cmd diff | sed-cmd patch | 'patch-[^"]+' -> 'patch'
+ diff "-ruaN" "default" "default.new" (CWD=${BASEDIR}/OPAM/repo)
-+ git "-c" "core.autocrlf=false" "apply" "--unsafe-paths" "-p1" "${BASEDIR}/OPAM/log/patch" (CWD=${BASEDIR}/OPAM/repo/default)
++ patch "-p1" "-i" "${BASEDIR}/OPAM/log/patch" (CWD=${BASEDIR}/OPAM/repo/default)
### ls $OPAMROOT/repo | grep -v "cache"
default
lock
@@ -24,9 +24,9 @@ opam-version: "2.0"
build: ["test" "-f" "baz"]
###
some content
-### opam update default -vv | grep '^\+' | sed-cmd tar | sed-cmd diff | sed-cmd git | 'patch-[^"]+' -> 'patch'
+### opam update default -vv | grep '^\+' | sed-cmd tar | sed-cmd diff | sed-cmd patch | 'patch-[^"]+' -> 'patch'
+ diff "-ruaN" "default" "default.new" (CWD=${BASEDIR}/OPAM/repo)
-+ git "-c" "core.autocrlf=false" "apply" "--unsafe-paths" "-p1" "${BASEDIR}/OPAM/log/patch" (CWD=${BASEDIR}/OPAM/repo/default)
++ patch "-p1" "-i" "${BASEDIR}/OPAM/log/patch" (CWD=${BASEDIR}/OPAM/repo/default)
+ tar "cfz" "${BASEDIR}/OPAM/repo/default.tar.gz.tmp" "-C" "${BASEDIR}/OPAM/repo" "default"
### ls $OPAMROOT/repo | grep -v "cache"
default.tar.gz
@@ -61,10 +61,10 @@ opam-version: "2.0"
build: ["test" "-f" "baz"]
###
some content
-### opam update -vv | grep '^\+' | sed-cmd tar | sed-cmd diff | sed-cmd git | 'patch-[^"]+' -> 'patch'
+### opam update -vv | grep '^\+' | sed-cmd tar | sed-cmd diff | sed-cmd patch | 'patch-[^"]+' -> 'patch'
+ tar "xfz" "${BASEDIR}/OPAM/repo/tarred.tar.gz" "-C" "${OPAMTMP}"
+ diff "-ruaN" "tarred" "tarred.new" (CWD=${OPAMTMP})
-+ git "-c" "core.autocrlf=false" "apply" "--unsafe-paths" "-p1" "${BASEDIR}/OPAM/log/patch" (CWD=${OPAMTMP}/tarred)
++ patch "-p1" "-i" "${BASEDIR}/OPAM/log/patch" (CWD=${OPAMTMP}/tarred)
+ tar "cfz" "${BASEDIR}/OPAM/repo/tarred.tar.gz.tmp" "-C" "${OPAMTMP}" "tarred"
### opam install foo.4 -vv | grep '^\+' | sed-cmd test | sed-cmd tar
+ tar "xfz" "${BASEDIR}/OPAM/repo/tarred.tar.gz" "-C" "${OPAMTMP}"
@@ -83,10 +83,10 @@ opam-version: "2.0"
build: ["test" "-f" "quux"]
###
some content
-### opam update -vv | grep '^\+' | sed-cmd tar | sed-cmd diff | sed-cmd git | 'patch-[^"]+' -> 'patch'
+### opam update -vv | grep '^\+' | sed-cmd tar | sed-cmd diff | sed-cmd patch | 'patch-[^"]+' -> 'patch'
+ tar "xfz" "${BASEDIR}/OPAM/repo/tarred.tar.gz" "-C" "${OPAMTMP}"
+ diff "-ruaN" "tarred" "tarred.new" (CWD=${OPAMTMP})
-+ git "-c" "core.autocrlf=false" "apply" "--unsafe-paths" "-p1" "${BASEDIR}/OPAM/log/patch" (CWD=${OPAMTMP}/tarred)
++ patch "-p1" "-i" "${BASEDIR}/OPAM/log/patch" (CWD=${OPAMTMP}/tarred)
### opam install foo.5 -vv | grep '^\+' | sed-cmd test
+ test "-f" "quux" (CWD=${BASEDIR}/OPAM/tarring/.opam-switch/build/foo.5)
### ls $OPAMROOT/repo | grep -v "cache"