Demonstrate our support for pin-depends. $ . ../git-helpers.sh $ . ./helpers.sh $ add_mock_repo_if_needed $ cat >dune-project < (lang dune 3.13) > EOF $ mkrepo $ mkpkg bar 0.0.1 $ runtest() { > cat >foo.opam < opam-version: "2.0" > depends: [ "bar" ] > pin-depends: [ "bar.1.0.0" "$1" ] > EOF > dune pkg lock && { > local pkg="dune.lock/bar.pkg"; > grep version $pkg; > grep dev $pkg; > print_source "bar"; > } > } Local pinned source. "opam" file at the root $ dir=_bar_file $ mkdir $dir $ cat >$dir/opam < opam-version: "2.0" > EOF $ runtest "file://$PWD/$dir" Solution for dune.lock: - bar.1.0.0 (version 1.0.0) (dev) (source (fetch (url file://PWD/_bar_file))) (dev) "opam" directory at the root $ dir=_bar_file_opam_dir $ mkdir -p $dir/opam $ cat >$dir/opam/bar.opam < opam-version: "2.0" > EOF $ runtest "file://$PWD/$dir" Solution for dune.lock: - bar.1.0.0 (version 1.0.0) (dev) (source (fetch (url file://PWD/_bar_file_opam_dir))) (dev) "bar.opam" file at the root $ dir=_bar_named_opam_root $ mkdir $dir $ cat >$dir/bar.opam < opam-version: "2.0" > EOF $ runtest "file://$PWD/$dir" Solution for dune.lock: - bar.1.0.0 (version 1.0.0) (dev) (source (fetch (url file://PWD/_bar_named_opam_root))) (dev) "bar.opam" file at opam/ $ dir=_bar_named_opam_subdir $ mkdir -p $dir/opam $ cat >$dir/opam/bar.opam < opam-version: "2.0" > EOF $ runtest "file://$PWD/$dir" Solution for dune.lock: - bar.1.0.0 (version 1.0.0) (dev) (source (fetch (url file://PWD/_bar_named_opam_subdir))) (dev) Git pinned source: $ dir=_bar_git $ mkdir $dir $ cd $dir $ git init --quiet $ cat >opam < opam-version: "2.0" > EOF $ git add -A $ git commit --quiet -m "Initial commit" $ cd .. $ runtest "git+file://$PWD/$dir" Solution for dune.lock: - bar.1.0.0 (version 1.0.0) (dev) (source (fetch (url git+file://PWD/_bar_git))) (dev) Git pinned source with toplevel opam file: $ dir=_bar_opam_git $ mkdir $dir $ cd $dir $ git init --quiet $ cat >bar.opam < opam-version: "2.0" > EOF $ git add -A $ git commit --quiet -m "Initial commit" $ cd .. $ runtest "git+file://$PWD/$dir" Solution for dune.lock: - bar.1.0.0 (version 1.0.0) (dev) (source (fetch (url git+file://PWD/_bar_opam_git))) (dev) Git pinned source with toplevel opam dir 1 $ dir=_bar_opam_dir_git1 $ mkdir $dir $ cd $dir $ git init --quiet $ mkdir opam $ cat >opam/opam < opam-version: "2.0" > EOF $ git add -A $ git commit --quiet -m "Initial commit" $ cd .. $ runtest "git+file://$PWD/$dir" Solution for dune.lock: - bar.1.0.0 (version 1.0.0) (dev) (source (fetch (url git+file://PWD/_bar_opam_dir_git1))) (dev) Git pinned source with toplevel opam dir 2 $ dir=_bar_opam_dir_git2 $ mkdir $dir $ cd $dir $ git init --quiet $ mkdir opam $ cat >opam/foo.opam < opam-version: "2.0" > EOF $ git add -A $ git commit --quiet -m "Initial commit" $ cd .. $ runtest "git+file://$PWD/$dir" File "foo.opam", line 1, characters 0-0: Error: unable to discover an opam file for package bar [1] Pin to something that doesn't have an opam file $ dir=_no_opam; mkdir $dir $ runtest "file://$PWD/$dir" File "foo.opam", line 1, characters 0-0: Error: unable to discover an opam file for package bar [1] Pin to an invalid opam file $ dir=_invalid_opam; mkdir $dir $ touch $dir/opam $ runtest "file://$PWD/$dir" File "$TESTCASE_ROOT/_invalid_opam/opam", line 1, characters 0-0: Error: unexpected version unsupported or missing file format version; should be 2.0 or older [1] Pin to an HTTP archive work $ mkdir _source/ $ cat > _source/bar.opam << EOF > opam-version: "2.0" > EOF $ tar cf tarball.tar -C _source bar.opam $ MD5_CHECKSUM=$(md5sum tarball.tar | cut -f1 -d' ') $ echo tarball.tar > fake-curls $ PORT=1 $ runtest "http://0.0.0.0:$PORT/tarball.tar" > output Solution for dune.lock: - bar.1.0.0 $ grep "md5=$MD5_CHECKSUM" output 2>&1 > /dev/null && echo "Checksum matches" Checksum matches Pin to an HTTP archive detects wrong hash $ cat << EOF > dune > (library > (name foo) > (libraries bar)) > EOF $ sed -i.tmp "s/$MD5_CHECKSUM/92449184682b45b5f07e811fdd61d35f/g" dune.lock/bar.pkg $ rm -rf already-served $ dune build 2>&1 | grep -v "md5" File "dune.lock/bar.pkg", line 6, characters 12-48: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Invalid checksum, got Pin to an HTTP archive needs `dune pkg lock` to download and compute the hash of the target again $ rm tarball.tar already-served $ echo "update checksum" > _source/random_file $ tar cf tarball.tar -C _source bar.opam random_file $ MD5_CHECKSUM=$(md5sum tarball.tar | cut -f1 -d' ') $ echo tarball.tar > fake-curls $ runtest "http://0.0.0.0:$PORT/tarball.tar" > output Solution for dune.lock: - bar.1.0.0 $ grep "md5=$MD5_CHECKSUM" output 2>&1 > /dev/null && echo "Checksum matches" Checksum matches