diff --git a/CHANGES.md b/CHANGES.md index 954ea71d..ee6f6d4c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -9,6 +9,8 @@ next - Highlight error locations in error messages (#1121, @emillon) +- Display actual stanza when package is ambiguous (#1126, fix #1123, @emillon) + 1.1.1 (08/08/2018) ------------------ diff --git a/src/dune_file.ml b/src/dune_file.ml index 6a115aa3..6f4e1285 100644 --- a/src/dune_file.ml +++ b/src/dune_file.ml @@ -166,7 +166,7 @@ module Pkg = struct (Package.Name.to_string pkg.Package.name) (Path.to_string (Package.opam_file pkg)))) - let default (project : Dune_project.t) = + let default (project : Dune_project.t) stanza = match Package.Name.Map.values project.packages with | [pkg] -> Ok pkg | [] -> @@ -178,11 +178,12 @@ module Pkg = struct | _ :: _ :: _ -> Error (sprintf - "I can't determine automatically which package this (install ...) \ - stanza is for. I have the choice between these ones:\n\ + "I can't determine automatically which package this \ + stanza is for.\nI have the choice between these ones:\n\ %s\n\ - You need to add a (package ...) field in this (install ...) stanza" - (listing (Package.Name.Map.values project.packages))) + You need to add a (package ...) field to this (%s) stanza." + (listing (Package.Name.Map.values project.packages)) + stanza) let resolve (project : Dune_project.t) name = match Package.Name.Map.find project.packages name with @@ -215,14 +216,14 @@ module Pkg = struct | Ok x -> x | Error e -> Loc.fail loc "%s" e - let field = + let field stanza = map_validate (let%map p = Dune_project.get_exn () and pkg = field_o "package" string in (p, pkg)) ~f:(fun (p, pkg) -> match pkg with - | None -> default p + | None -> default p stanza | Some name -> resolve p (Package.Name.of_string name)) end @@ -1049,7 +1050,7 @@ module Install_conf = struct record (let%map section = field "section" Install.Section.t and files = field "files" (list file) - and package = Pkg.field + and package = Pkg.field "install" in { section ; files @@ -1289,7 +1290,10 @@ module Executables = struct match match package with | None -> - (buildable.loc, Pkg.default project) + let stanza = + pluralize ~multi "executable" + in + (buildable.loc, Pkg.default project stanza) | Some (loc, name) -> (loc, Pkg.resolve project (Package.Name.of_string name)) with @@ -1705,7 +1709,7 @@ module Documentation = struct let t = record - (let%map package = Pkg.field + (let%map package = Pkg.field "documentation" and mld_files = Ordered_set_lang.field "mld_files" and loc = loc in { loc diff --git a/test/blackbox-tests/dune.inc b/test/blackbox-tests/dune.inc index 72c1ad05..4a4b3d8b 100644 --- a/test/blackbox-tests/dune.inc +++ b/test/blackbox-tests/dune.inc @@ -708,6 +708,14 @@ test-cases/select (progn (run %{exe:cram.exe} -test run.t) (diff? run.t run.t.corrected))))) +(alias + (name several-packages) + (deps (package dune) (source_tree test-cases/several-packages)) + (action + (chdir + test-cases/several-packages + (progn (run %{exe:cram.exe} -test run.t) (diff? run.t run.t.corrected))))) + (alias (name shadow-bindings) (deps (package dune) (source_tree test-cases/shadow-bindings)) @@ -867,6 +875,7 @@ (alias scope-bug) (alias scope-ppx-bug) (alias select) + (alias several-packages) (alias shadow-bindings) (alias subst) (alias syntax-versioning) @@ -953,6 +962,7 @@ (alias reporting-of-cycles) (alias scope-bug) (alias select) + (alias several-packages) (alias shadow-bindings) (alias subst) (alias syntax-versioning) diff --git a/test/blackbox-tests/test-cases/several-packages/documentation/dune b/test/blackbox-tests/test-cases/several-packages/documentation/dune new file mode 100644 index 00000000..a24f8682 --- /dev/null +++ b/test/blackbox-tests/test-cases/several-packages/documentation/dune @@ -0,0 +1 @@ +(documentation) diff --git a/test/blackbox-tests/test-cases/several-packages/documentation/dune-project b/test/blackbox-tests/test-cases/several-packages/documentation/dune-project new file mode 100644 index 00000000..7655de07 --- /dev/null +++ b/test/blackbox-tests/test-cases/several-packages/documentation/dune-project @@ -0,0 +1 @@ +(lang dune 1.1) diff --git a/test/blackbox-tests/test-cases/several-packages/documentation/pkg1.opam b/test/blackbox-tests/test-cases/several-packages/documentation/pkg1.opam new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/several-packages/documentation/pkg2.opam b/test/blackbox-tests/test-cases/several-packages/documentation/pkg2.opam new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/several-packages/dune-project b/test/blackbox-tests/test-cases/several-packages/dune-project new file mode 100644 index 00000000..7655de07 --- /dev/null +++ b/test/blackbox-tests/test-cases/several-packages/dune-project @@ -0,0 +1 @@ +(lang dune 1.1) diff --git a/test/blackbox-tests/test-cases/several-packages/executable/dune b/test/blackbox-tests/test-cases/several-packages/executable/dune new file mode 100644 index 00000000..05df03d3 --- /dev/null +++ b/test/blackbox-tests/test-cases/several-packages/executable/dune @@ -0,0 +1,3 @@ +(executable + (public_name an_executable) +) diff --git a/test/blackbox-tests/test-cases/several-packages/executable/dune-project b/test/blackbox-tests/test-cases/several-packages/executable/dune-project new file mode 100644 index 00000000..7655de07 --- /dev/null +++ b/test/blackbox-tests/test-cases/several-packages/executable/dune-project @@ -0,0 +1 @@ +(lang dune 1.1) diff --git a/test/blackbox-tests/test-cases/several-packages/executable/pkg1.opam b/test/blackbox-tests/test-cases/several-packages/executable/pkg1.opam new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/several-packages/executable/pkg2.opam b/test/blackbox-tests/test-cases/several-packages/executable/pkg2.opam new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/several-packages/install/dune b/test/blackbox-tests/test-cases/several-packages/install/dune new file mode 100644 index 00000000..a44d3567 --- /dev/null +++ b/test/blackbox-tests/test-cases/several-packages/install/dune @@ -0,0 +1,4 @@ +(install + (section etc) + (files file.conf) +) diff --git a/test/blackbox-tests/test-cases/several-packages/install/dune-project b/test/blackbox-tests/test-cases/several-packages/install/dune-project new file mode 100644 index 00000000..7655de07 --- /dev/null +++ b/test/blackbox-tests/test-cases/several-packages/install/dune-project @@ -0,0 +1 @@ +(lang dune 1.1) diff --git a/test/blackbox-tests/test-cases/several-packages/install/pkg1.opam b/test/blackbox-tests/test-cases/several-packages/install/pkg1.opam new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/several-packages/install/pkg2.opam b/test/blackbox-tests/test-cases/several-packages/install/pkg2.opam new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/several-packages/run.t b/test/blackbox-tests/test-cases/several-packages/run.t new file mode 100644 index 00000000..0066576f --- /dev/null +++ b/test/blackbox-tests/test-cases/several-packages/run.t @@ -0,0 +1,35 @@ +If two packages are available and no (package) is present, an error message is +displayed. This can happen for: + +- (executable) + + $ dune build --root executable + File "dune", line 1, characters 0-43: + Error: I can't determine automatically which package this stanza is for. + I have the choice between these ones: + - pkg1 (because of pkg1.opam) + - pkg2 (because of pkg2.opam) + You need to add a (package ...) field to this (executables) stanza. + [1] + +- (documentation) + + $ dune build --root documentation + File "dune", line 1, characters 0-15: + Error: I can't determine automatically which package this stanza is for. + I have the choice between these ones: + - pkg1 (because of pkg1.opam) + - pkg2 (because of pkg2.opam) + You need to add a (package ...) field to this (documentation) stanza. + [1] + +- (install) + + $ dune build --root install + File "dune", line 1, characters 0-44: + Error: I can't determine automatically which package this stanza is for. + I have the choice between these ones: + - pkg1 (because of pkg1.opam) + - pkg2 (because of pkg2.opam) + You need to add a (package ...) field to this (install) stanza. + [1]