ocaml / opam

opam is a source-based package manager. It supports multiple simultaneous compiler installations, flexible package constraints, and a Git-friendly development workflow.
https://opam.ocaml.org
Other
1.21k stars 348 forks source link

pin-depends system tries to remove part of the content #5939

Open kit-ty-kate opened 2 months ago

kit-ty-kate commented 2 months ago

Issue encounted by @leostera during the mirageOS retreat

Reproducible minimal test case:

cd /tmp
mkdir srv
mkdir blah
mkdir blah/blah
echo 'opam-version: "2.0"' > blah/blah.opam
tar cvzf srv/blah blah/
cd srv
python3 -m http.server
$ cat test.opam
opam-version: "2.0"
pin-depends: [
  ["blah.dev" "http://localhost:8000/blah"]
]
$ opam pin .
Package test does not exist, create as a NEW package? [y/n] y
The following additional pinnings are required by test.dev:
  - blah.dev at http://localhost:8000/blah
Pin and install them? [y/n] y
Package blah does not exist, create as a NEW package? [y/n] y
[blah.dev] fetching sources failed: Download failed
[ERROR] Error getting source from http://localhost:8000/blah:
          - http://localhost:8000/blah (download failed)

using debug-level=3 you can see what actually fail:

error: Cannot remove ~/.opam/trunk/.opam-switch/sources/blah/blah (opam: "unlink" failed on ~/.opam/trunk/.opam-switch/sources/blah/blah: Is a directory).

It turns-out the pin-depends system seems to be downloading and extracting the pin-depends twice or something and failing because it's trying to remove a file that is currently a directory

Tested with both opam 2.1.5 and 2.2.0~beta2

kit-ty-kate commented 2 months ago

Actually i believe https://github.com/ocaml/opam/pull/5018 fixes it. I'll try to rebase it on top of master

kit-ty-kate commented 2 months ago

I can confirm #5018 fixed it.