[opam-devel] depopt constraints not respected

Roberto Di Cosmo roberto at dicosmo.org
Sat Apr 5 15:04:10 BST 2014

This was raised in issue #1310, copying here my answer from
that thread.

The short answer is: when there is an incompatibility/conflict,
this must show up as a conflict in the metadata, to make sure
the solver will know.

The right solution is to fix the metadata for (all versions of)
lwt, that miss this single line

 conflicts: [ "react" { >= "1.0.0"} ]

More generally, one should look at all instances of this pattern
in the metadata, and fix them... just opened an issue on this



The metadata for lwt 2.4.4, which is the following

             package: lwt
             version: 2.4.4
          repository: default
        upstream-url: https://github.com/ocsigen/lwt/archive/2.4.4.tar.gz
       upstream-kind: http
   upstream-checksum: 7f3e8d63055763004bb49ff4e7db44ea
             depends: ocamlfind
             depopts: base-threads | base-unix | conf-libev | ssl | react < 1.0.0 | lablgtk | ocaml-text
  installed-versions: lwt.2.4.3 [4.01.0+fp], lwt.2.4.4 [eliom_vanilla 4.01.0 3.12.1]
  available-versions: 2.3.2, 2.4.0, 2.4.1, 2.4.2
         description: A cooperative threads library for OCaml

gets converted into the CUDF file as

package: lwt
version: 6
depends: base-threads , base-unix , ocamlfind
conflicts: lwt
opam-name: lwt
opam-version: 2.4.4

Indeed base-threads, base-unix and ocamlfind are the only packages already
installed (you are on a new switch, which has exactly those ones), and depopts
are converted into hard dependencies for installed packages.

So the solver, that only sees the CUDF file, has no knowledge that lwt 2.4.4 is
incompatible with react >= 1.0.0, and proposes a solution that installs
react=1.0.0 and you get an error.

One could wonder what the precise semantics of depopts is, but my position here
is that when a given package is incompatible with another one, this must be
translated into a conflict, and one should see a

  conflicts : react >= 1.0.0

in the lwt metadata.

On Sat, Apr 05, 2014 at 02:33:36PM +0100, Anil Madhavapeddy wrote:
> With the React 1.0 API incompatibility now in the repository, it highlights that depopt constraints in OPAM 1.1.x aren't always respected.
> See:
> https://github.com/ocaml/opam-repository/pull/1863
> which results in Lwt.2.4.4 and React.1.0.0 being selected despite Lwt.2.4.4 having a depopt of React<"1.0.0".
> https://travis-ci.org/ocaml/opam-repository/jobs/22335518
> # File "src/react/lwt_react.ml", line 384, characters 4-10:
> # Error: This function has type
> #          ?eq:('a -> 'a -> bool) ->
> #          'a React.signal React.signal -> 'a React.signal
> #        It is applied to too many arguments; maybe you forgot a `;'.
> # Command exited with code 2.
> Right now the workaround has to be to put a hard "react<1.0.0" in every dependency. Is that the only way?
> -anil
> _______________________________________________
> opam-devel mailing list
> opam-devel at lists.ocaml.org
> http://lists.ocaml.org/listinfo/opam-devel

More information about the opam-devel mailing list