128 lines
3.6 KiB
Perl
128 lines
3.6 KiB
Perl
|
|
The solver should repsect the (conflicts) field of the (package) stanza.
|
||
|
|
|
||
|
|
$ . ./helpers.sh
|
||
|
|
$ mkrepo
|
||
|
|
$ mkpkg foo 0.0.1
|
||
|
|
$ mkpkg bar << EOF
|
||
|
|
> depends: [ "foo" ]
|
||
|
|
> EOF
|
||
|
|
|
||
|
|
The solver should say no solution rather than just ignoring the conflict.
|
||
|
|
|
||
|
|
$ solve_project << EOF
|
||
|
|
> (lang dune 3.11)
|
||
|
|
> (package
|
||
|
|
> (name x)
|
||
|
|
> (allow_empty)
|
||
|
|
> (conflicts foo)
|
||
|
|
> (depends bar))
|
||
|
|
> EOF
|
||
|
|
Error: Unable to solve dependencies for the following lock directories:
|
||
|
|
Lock directory dune.lock:
|
||
|
|
Couldn't solve the package dependency formula.
|
||
|
|
Selected candidates: bar.0.0.1 x.dev
|
||
|
|
- foo -> (problem)
|
||
|
|
No usable implementations:
|
||
|
|
foo.0.0.1: Package does not satisfy constraints of local package x
|
||
|
|
[1]
|
||
|
|
|
||
|
|
There could be more than one conflict and they can have version constraints:
|
||
|
|
|
||
|
|
$ mkpkg foo2 0.0.1
|
||
|
|
$ mkpkg bar2 << EOF
|
||
|
|
> depends: [ "foo2" ]
|
||
|
|
> EOF
|
||
|
|
|
||
|
|
$ solve_project << EOF
|
||
|
|
> (lang dune 3.11)
|
||
|
|
> (generate_opam_files true)
|
||
|
|
> (package
|
||
|
|
> (name x)
|
||
|
|
> (allow_empty)
|
||
|
|
> (conflicts (foo (< 0.2)) (foo2 (< 0.2)))
|
||
|
|
> (depends bar bar2))
|
||
|
|
> EOF
|
||
|
|
Error: Unable to solve dependencies for the following lock directories:
|
||
|
|
Lock directory dune.lock:
|
||
|
|
Couldn't solve the package dependency formula.
|
||
|
|
Selected candidates: bar.0.0.1 bar2.0.0.1 x.dev
|
||
|
|
- foo -> (problem)
|
||
|
|
No usable implementations:
|
||
|
|
foo.0.0.1: Package does not satisfy constraints of local package x
|
||
|
|
- foo2 -> (problem)
|
||
|
|
No usable implementations:
|
||
|
|
foo2.0.0.1: Package does not satisfy constraints of local package x
|
||
|
|
[1]
|
||
|
|
|
||
|
|
When conflicts are obtained from an opam file instead of a dune-project,
|
||
|
|
the behaviour should be the same:
|
||
|
|
|
||
|
|
$ dune build x.opam
|
||
|
|
$ sed -n '/conflicts/,/]/p' x.opam
|
||
|
|
conflicts: [
|
||
|
|
"foo" {< "0.2"}
|
||
|
|
"foo2" {< "0.2"}
|
||
|
|
]
|
||
|
|
|
||
|
|
Even though the conflicts are listed by opam without a `|` to indicate a
|
||
|
|
disjunction, either package is problematic:
|
||
|
|
|
||
|
|
$ mkpkg dune 3.11
|
||
|
|
$ echo '(lang dune 3.11)' | solve_project 2>&1 | sed -E 's/3.[0-9]+/3.XX/'
|
||
|
|
Error: Unable to solve dependencies for the following lock directories:
|
||
|
|
Lock directory dune.lock:
|
||
|
|
Couldn't solve the package dependency formula.
|
||
|
|
Selected candidates: bar.0.0.1 bar2.0.0.1 x.dev
|
||
|
|
- dune -> dune.3.XX
|
||
|
|
User requested = 3.XX
|
||
|
|
- foo -> (problem)
|
||
|
|
No usable implementations:
|
||
|
|
foo.0.0.1: Package does not satisfy constraints of local package x
|
||
|
|
- foo2 -> (problem)
|
||
|
|
No usable implementations:
|
||
|
|
foo2.0.0.1: Package does not satisfy constraints of local package x
|
||
|
|
|
||
|
|
Adding a new version of `foo` only resolves one conflict:
|
||
|
|
|
||
|
|
$ mkpkg foo 0.2
|
||
|
|
$ echo '(lang dune 3.11)' | solve_project 2>&1 | sed -E 's/3.[0-9]+/3.XX/'
|
||
|
|
Error: Unable to solve dependencies for the following lock directories:
|
||
|
|
Lock directory dune.lock:
|
||
|
|
Couldn't solve the package dependency formula.
|
||
|
|
Selected candidates: bar.0.0.1 bar2.0.0.1 foo.0.2 x.dev
|
||
|
|
- dune -> dune.3.XX
|
||
|
|
User requested = 3.XX
|
||
|
|
- foo2 -> (problem)
|
||
|
|
No usable implementations:
|
||
|
|
foo2.0.0.1: Package does not satisfy constraints of local package x
|
||
|
|
|
||
|
|
Addition of `foo2` to solve the last remaining conflict:
|
||
|
|
|
||
|
|
$ mkpkg foo2 0.2
|
||
|
|
$ solve_project <<EOF
|
||
|
|
> (lang dune 3.11)
|
||
|
|
> EOF
|
||
|
|
Solution for dune.lock:
|
||
|
|
- bar.0.0.1
|
||
|
|
- bar2.0.0.1
|
||
|
|
- foo.0.2
|
||
|
|
- foo2.0.2
|
||
|
|
|
||
|
|
Same but checking that the latest versions of `foo` and `foo2` are not selected
|
||
|
|
due to the version constraints conflicts:
|
||
|
|
|
||
|
|
$ solve_project << EOF
|
||
|
|
> (lang dune 3.11)
|
||
|
|
> (generate_opam_files true)
|
||
|
|
> (package
|
||
|
|
> (name x)
|
||
|
|
> (allow_empty)
|
||
|
|
> (conflicts (foo (>= 0.2)) (foo2 (>= 0.2)))
|
||
|
|
> (depends bar bar2))
|
||
|
|
> EOF
|
||
|
|
Solution for dune.lock:
|
||
|
|
- bar.0.0.1
|
||
|
|
- bar2.0.0.1
|
||
|
|
- foo.0.0.1
|
||
|
|
- foo2.0.0.1
|