Skip to content

Commit 21334cf

Browse files
authored
pkg: handle undefined vars in command filters (ocaml#11512)
Opam treats undefined variables as false when evaluating command filters. This change wraps command filters in lockfiles with `catch_undefined_var` so dune's behaviour matches. Signed-off-by: Stephen Sherratt <[email protected]>
1 parent fc3996b commit 21334cf

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

src/dune_pkg/opam_solver.ml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1686,7 +1686,18 @@ let opam_commands_to_actions
16861686
let filter_blang =
16871687
filter_to_blang ~package ~loc filter |> Slang.simplify_blang
16881688
in
1689-
Slang.when_ filter_blang slang)))
1689+
let filter_blang_handling_undefined =
1690+
(* Wrap the blang filter so that if any undefined
1691+
variables are expanded while evaluating the filter,
1692+
the filter will return false. *)
1693+
let slang =
1694+
Slang.catch_undefined_var
1695+
(Slang.blang filter_blang)
1696+
~fallback:(Slang.bool false)
1697+
in
1698+
Blang.Expr slang
1699+
in
1700+
Slang.when_ filter_blang_handling_undefined slang)))
16901701
in
16911702
if List.is_empty terms
16921703
then None

test/blackbox-tests/test-cases/pkg/convert-opam-commands.t

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,13 @@ Test that if opam filter translation is disabled the output doesn't contain any
248248
(run
249249
echo
250250
a
251-
(when %{pkg-self:foo} b)
252251
(when
253-
(and_absorb_undefined_var %{pkg-self:bar} %{pkg-self:baz})
252+
(catch_undefined_var %{pkg-self:foo} false)
253+
b)
254+
(when
255+
(catch_undefined_var
256+
(and_absorb_undefined_var %{pkg-self:bar} %{pkg-self:baz})
257+
false)
254258
c)))
255259
256260
$ solve filter-error-bool-where-string-expected

test/blackbox-tests/test-cases/pkg/partial-filter-evaluation.t

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ Solve the package using the default solver env:
4343
-j
4444
%{jobs}
4545
(when
46-
(= %{pkg-self:foo} bar)
46+
(catch_undefined_var
47+
(= %{pkg-self:foo} bar)
48+
false)
4749
--foobar)
4850
@install)))
4951

0 commit comments

Comments
 (0)