From 30f48a7aeeae65cbce481a601a7deb7e9e571927 Mon Sep 17 00:00:00 2001 From: Ali Caglayan Date: Tue, 18 Aug 2026 13:09:25 +0200 Subject: [PATCH 1/2] test(pkg): preserve local platform dependency alternatives Signed-off-by: Ali Caglayan --- ...rs-ignore-malformed-unselectable-version.t | 28 +++++++++++ ...irs-local-platform-alternative-selection.t | 47 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-ignore-malformed-unselectable-version.t create mode 100644 test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-local-platform-alternative-selection.t diff --git a/test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-ignore-malformed-unselectable-version.t b/test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-ignore-malformed-unselectable-version.t new file mode 100644 index 00000000000..9a348feddf7 --- /dev/null +++ b/test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-ignore-malformed-unselectable-version.t @@ -0,0 +1,28 @@ +A malformed repository version that cannot satisfy a local package constraint +must not prevent the solver from selecting a valid version. + + $ mkrepo + $ add_mock_repo_if_needed + + $ mkpkg foo 1 <<'EOF' + > EOF + +Version 2 is malformed, but the local constraint makes it impossible before its +manifest needs to be loaded. + + $ mkpkg foo 2 <<'EOF' + > depends: [ + > EOF + + $ cat >dune-project <<'EOF' + > (lang dune 3.18) + > (package + > (name x) + > (depends (foo (= 1)))) + > EOF + + $ dune pkg lock + Solution for dune.lock + + Dependencies common to all supported platforms: + - foo.1 diff --git a/test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-local-platform-alternative-selection.t b/test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-local-platform-alternative-selection.t new file mode 100644 index 00000000000..fc5f4986ba9 --- /dev/null +++ b/test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-local-platform-alternative-selection.t @@ -0,0 +1,47 @@ +A local package dependency alternative may select a different package on each +platform. Preserve every package selected by the per-platform solves when +constructing the portable lock directory. + + $ mkrepo + $ add_mock_repo_if_needed + + $ mkpkg linux-impl <<'EOF' + > available: os = "linux" + > EOF + $ mkpkg macos-impl <<'EOF' + > available: os = "macos" + > EOF + +The local package accepts either implementation. Package availability forces +Linux and macOS to select different branches of the disjunction. + + $ cat >dune-project <<'EOF' + > (lang dune 3.18) + > EOF + $ cat >x.opam <<'EOF' + > opam-version: "2.0" + > depends: [ "linux-impl" | "macos-impl" ] + > EOF + + $ dune pkg lock + Solution for dune.lock + + Dependencies common to all supported platforms: + (none) + + Additionally, some packages will only be built on specific platforms. + + arch = arm64; os = linux: + - linux-impl.0.0.1 + + arch = arm64; os = macos: + - macos-impl.0.0.1 + + arch = x86_64; os = linux: + - linux-impl.0.0.1 + + arch = x86_64; os = macos: + - macos-impl.0.0.1 + $ ls dune.lock/*.pkg | sort + dune.lock/linux-impl.0.0.1.pkg + dune.lock/macos-impl.0.0.1.pkg From ca6f55ddfa6c506de68e5181d756a25b47856965 Mon Sep 17 00:00:00 2001 From: Ali Caglayan Date: Tue, 18 Aug 2026 18:32:34 +0200 Subject: [PATCH 2/2] test(pkg): reproduce duplicate platform failures Record the duplicate-result merge failure and repeated failure diagnostics before joint solving deduplicates requested platforms. Signed-off-by: Ali Caglayan --- .../portable-lockdirs-duplicate-platforms.t | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-duplicate-platforms.t diff --git a/test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-duplicate-platforms.t b/test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-duplicate-platforms.t new file mode 100644 index 00000000000..807d4eb2e19 --- /dev/null +++ b/test/blackbox-tests/test-cases/pkg/portable-lockdirs/portable-lockdirs-duplicate-platforms.t @@ -0,0 +1,51 @@ +Duplicate entries in solve_for_platforms currently break result merging. Record the +failure before joint solving deduplicates the requested platform set. + + $ mkrepo + $ add_mock_repo_if_needed + +Make a package: + $ mkpkg foo < build: [ + > ["mkdir" "-p" "%{lib}%/%{name}%"] + > ["touch" "%{lib}%/%{name}%/META"] # needed for dune to recognize this as a library + > ] + > EOF + + $ make_portable_lockdirs_project + +Solve for a platform set that contains the same platform twice: + $ cat > dune-workspace < (lang dune 3.11) + > (repository + > (name mock) + > (url "file://$(pwd)/mock-opam-repository")) + > (lock_dir + > (repositories mock) + > (solve_for_platforms + > ((arch arm64) (os macos)) + > ((arch arm64) (os macos)) + > ((arch x86_64) (os linux)))) + > EOF + +Merging successful per-platform results rejects the duplicate solver +environment: + + $ dune pkg lock >output 2>&1 + [1] + $ grep 'Tried to add duplicate solver env' output + ("Tried to add duplicate solver env to lockdir conditional choice", + +When solving fails before result merging, the duplicate platform is reported +twice: + + $ mkpkg foo <<'EOF' + > available: false + > EOF + $ dune pkg lock >output 2>&1 + [1] + $ grep 'arch = arm64; os = macos' output + - arch = arm64; os = macos + - arch = arm64; os = macos + $ grep 'arch = x86_64; os = linux' output + - arch = x86_64; os = linux