opam icon indicating copy to clipboard operation
opam copied to clipboard

Minimize opam operations/Freeze packages during reinstall

Open maroneze opened this issue 2 years ago • 2 comments

This Stack Overflow question asked how to upgrade a single package, and it used opam reinstall. Apparently --criteria=paranoid seemed to help, but trying this with opam 2.1.2 no longer seems to work.

I occasionally have the need to reinstall a package to a specific version for quick testing, and in many cases it has no or few dependencies, so opam should be able to change it, but it still wants to reinstall way more packages than seems necessary. For instance, I just upgraded alt-ergo 1.01 to 2.0.0:

The following actions will be performed:
  ↘ downgrade camlzip  1.11 to 1.07  [required by alt-ergo]
  ↗ upgrade   alt-ergo 1.01 to 2.0.0
  ↻ recompile why3     1.5.0         [uses camlzip]

Now, I just wanted to return to the previous state, by downgrading alt-ergo to 1.01 again (for testing purposes), but opam wants instead to perform 50 operations:

The following actions will be performed:
  ↻ recompile ocamlbuild           0.14.0        [upstream or system changes]
  ↻ recompile dune                 3.0.2         [upstream or system changes]
  ↻ recompile ocamlfind            1.9.1         [upstream or system changes]
  ↻ recompile stdlib-shims         0.3.0         [uses dune]
  ↻ recompile stdint               0.7.0         [upstream or system changes]
  ↻ recompile sexplib0             v0.15.0       [upstream or system changes]
  ↻ recompile result               1.5           [uses dune]
  ↻ recompile re                   1.10.4        [uses dune]
  ↻ recompile ppx_derivers         1.2.1         [uses dune]
  ↻ recompile ocaml-compiler-libs  v0.12.4       [uses dune]
  ↻ recompile menhirSdk            20211012      [uses dune]
  ↻ recompile menhirLib            20211012      [uses dune]
  ↻ recompile landmarks            1.4           [uses dune]
  ↻ recompile easy-format          1.3.2         [upstream or system changes]
  ↻ recompile dune-private-libs    2.9.3         [uses dune]
  ↻ recompile csexp                1.5.1         [uses dune]
  ↻ recompile cppo                 1.6.8         [uses dune]
  ↻ recompile zarith               1.12          [uses ocamlfind]
  ↻ recompile xml-light            2.4           [uses ocamlfind]
  ↻ recompile topkg                1.0.5         [uses ocamlbuild, ocamlfind]
  ↻ recompile camlzip              1.07          [uses ocamlfind]
  ↻ recompile base-bytes           base          [uses ocamlfind]
  ↻ recompile ocamlgraph           2.0.0         [uses dune]
  ↻ recompile odoc-parser          1.0.0         [upstream or system changes]
  ↻ recompile tyxml                4.5.0         [uses dune]
  ↻ recompile ppxlib               0.25.0        [uses dune, sexplib0]
  ↻ recompile menhir               20211012      [uses dune]
  ↻ recompile biniou               1.2.1         [upstream or system changes]
  ↻ recompile dune-site            2.9.3         [uses dune]
  ↻ recompile dune-configurator    2.9.1         [uses dune]
  ↘ downgrade alt-ergo             2.0.0 to 1.01                                  This release is too old. Please consider using version 1.30 that fixes many soundness bugs and brings a lot of improvements
  ↻ recompile ocp-indent           1.7.0         [uses dune, ocamlfind]
  ↻ recompile odoc                 2.1.0         [upstream or system changes]
  ↻ recompile ppx_import           1.9.1         [uses dune]
  ↻ recompile ppx_deriving         5.2.1         [uses dune, ocamlfind]
  ↻ recompile landmarks-ppx        1.4           [uses dune]
  ↻ recompile psmt2-frontend       0.4.0         [uses dune]
  ↻ recompile yojson               1.7.0         [uses dune, biniou, easy-format]
  ↻ recompile zmq                  5.1.4         [uses dune, stdint]
  ↻ recompile cairo2               0.6.2         [uses dune]
  ↻ recompile base                 v0.15.0       [upstream or system changes]
  ↻ recompile visitors             20210608      [uses dune]
  ↻ recompile ppx_deriving_yojson  3.6.1         [upstream or system changes]
  ↻ recompile dot-merlin-reader    4.1           [upstream or system changes]
  ↻ recompile lablgtk3             3.1.2         [uses dune]
  ↻ recompile ppx_sexp_conv        v0.15.0       [uses dune, base, sexplib0]
  ↻ recompile ppx_compare          v0.15.0       [uses base, dune]
  ↻ recompile merlin               4.4-413       [upstream or system changes]
  ↻ recompile lablgtk3-sourceview3 3.1.2         [uses dune]
  ↻ recompile why3                 1.5.0         [uses ocamlfind]
  ↻ recompile ppx_hash             v0.15.0       [uses base, dune]
  ↻ recompile tuareg               2.2.0         [uses merlin]
===== ↻ 51   ↘ 1 =====

I don't understand exactly why it wants to recompile ocamlbuild, dune and ocamlfind, but I'd like it not to, if possible. In such cases, it seems that --criteria=paranoid might help. I tried --criteria=-changed and some variations, but it didn't change much. If there were a syntax to say, for instance, "freeze[<package>]" or something, I could try using it.

Is there such a syntax? Or a way to quickly restore the previous state, without having to reinstall so many things? Or is the upstream or system changes message actually indicating some irreversible changes, and there is nothing I can do about it currently?

In case it's useful, here's the output of opam config report:

# opam-version         2.1.2 
# opam-version         2.1.2 
# self-upgrade         no
# system               arch=x86_64 os=linux os-distribution=fedora os-version=36
# solver               builtin-mccs+glpk
# install-criteria     -removed,-count[avoid-version,changed],-count[version-lag,request],-count[version-lag,changed],-count[missing-depexts,changed],-changed
# upgrade-criteria     -removed,-count[avoid-version,changed],-count[version-lag,solution],-count[missing-depexts,changed],-new
# jobs                 11
# repositories         1 (http), 1 (version-controlled) (default repo at 86134262)
# pinned               0
# current-switch       4.13.1
# ocaml:native         true
# ocaml:native-tools   true
# ocaml:native-dynlink true
# ocaml:stubsdir       /home/andr/.opam/4.13.1/lib/ocaml/stublibs:/home/andr/.opam/4.13.1/lib/ocaml
# ocaml:preinstalled   false
# ocaml:compiler       4.13.1

maroneze avatar Jul 26 '22 09:07 maroneze

Note that most of the useless reinstallations are fixed in master (opam 2.2.0) in https://github.com/ocaml/opam/pull/5118

kit-ty-kate avatar Jul 26 '22 09:07 kit-ty-kate

Great! I'll try that as soon as I can and report back here.

maroneze avatar Jul 26 '22 10:07 maroneze