178 lines
4.3 KiB
Perl
178 lines
4.3 KiB
Perl
Fetch from more than one source
|
|
|
|
$ . ../git-helpers.sh
|
|
$ . ./helpers.sh
|
|
|
|
$ make_lockdir
|
|
$ mkdir foo
|
|
$ cat >foo/bar <<EOF
|
|
> this is bar
|
|
> EOF
|
|
|
|
$ cat >baz <<EOF
|
|
> this is baz
|
|
> EOF
|
|
|
|
$ cat >dune.lock/test.pkg <<EOF
|
|
> (version 0.0.1)
|
|
> (source (copy $PWD/foo))
|
|
> (extra_sources (mybaz (copy $PWD/baz)))
|
|
> (build
|
|
> (system "find . | sort -u"))
|
|
> EOF
|
|
|
|
$ build_pkg test
|
|
.
|
|
./bar
|
|
./mybaz
|
|
|
|
Make sure extra source patches are downloaded, checksum-verified and applied
|
|
when building.
|
|
|
|
First we need a project that will have the patch applied:
|
|
|
|
$ mkdir needs-patch
|
|
$ cd needs-patch
|
|
$ git init --quiet
|
|
$ cat > dune-project <<EOF
|
|
> (lang dune 3.15)
|
|
> (name needs-patch)
|
|
> EOF
|
|
$ cat > needs-patch.opam <<EOF
|
|
> opam-version: "2.0"
|
|
> EOF
|
|
$ cat > dune <<EOF
|
|
> (library (public_name needs-patch) (name needs_patch))
|
|
> EOF
|
|
$ cat > needs_patch.ml <<EOF
|
|
> let msg = "Needs to be patched"
|
|
> EOF
|
|
$ cd ..
|
|
$ tar cf needs-patch.tar needs-patch
|
|
$ SRC_MD5=$(md5sum needs-patch.tar | cut -f1 -d' ')
|
|
$ cd needs-patch
|
|
$ git add -A
|
|
$ git commit -m "Initial" --quiet
|
|
$ cat > needs_patch.ml <<EOF
|
|
> let msg = "Patch successfully applied"
|
|
> EOF
|
|
$ git diff > ../required.patch
|
|
$ git add needs_patch.ml
|
|
$ git commit -m "First patch" --quiet
|
|
$ cat > needs_patch.ml <<EOF
|
|
> let msg = "Patch successfully applied, multiple times"
|
|
> EOF
|
|
$ git diff > ../additional.patch
|
|
$ cd ..
|
|
$ rm -rf needs-patch
|
|
$ REQUIRED_PATCH_MD5=$(md5sum required.patch | cut -f1 -d' ')
|
|
$ ADDITIONAL_PATCH_MD5=$(md5sum additional.patch | cut -f1 -d' ')
|
|
|
|
Then we start the oneshot server for both the source and the patch.
|
|
|
|
$ echo needs-patch.tar > fake-curls
|
|
$ SRC_PORT=1
|
|
$ echo required.patch >> fake-curls
|
|
$ REQUIRED_PATCH_PORT=2
|
|
|
|
We now have the checksums as well as the port numbers, so we can define the
|
|
package.
|
|
|
|
$ mkrepo
|
|
$ mkpkg needs-patch 0.0.1 <<EOF
|
|
> build: ["dune" "build" "-p" name "-j" jobs]
|
|
> patches: ["required.patch"]
|
|
> url {
|
|
> src: "http://localhost:$SRC_PORT"
|
|
> checksum: "md5=$SRC_MD5"
|
|
> }
|
|
> extra-source "required.patch" {
|
|
> src: "http://localhost:$REQUIRED_PATCH_PORT"
|
|
> checksum: "md5=$REQUIRED_PATCH_MD5"
|
|
> }
|
|
> EOF
|
|
|
|
Now let's depend on that project with a binary that will display the message
|
|
that is supposed to get patched.
|
|
|
|
$ cat > dune-project <<EOF
|
|
> (lang dune 3.15)
|
|
> (package (name my) (depends needs-patch))
|
|
> EOF
|
|
$ cat > dune <<EOF
|
|
> (executable (public_name display) (libraries needs-patch))
|
|
> EOF
|
|
$ cat > display.ml <<EOF
|
|
> let () = print_endline Needs_patch.msg
|
|
> EOF
|
|
|
|
Lock the dependency, it should generate an a lock dir that references both the
|
|
url and the extra source.
|
|
|
|
$ add_mock_repo_if_needed
|
|
$ dune pkg lock
|
|
Solution for dune.lock:
|
|
- needs-patch.0.0.1
|
|
|
|
$ sed -E 's/md5=[0-9a-f]+/md5=$HASH/g' dune.lock/needs-patch.pkg
|
|
(version 0.0.1)
|
|
|
|
(build
|
|
(progn
|
|
(patch required.patch)
|
|
(run dune build -p %{pkg-self:name} -j %{jobs})))
|
|
|
|
(source
|
|
(fetch
|
|
(url http://localhost:1)
|
|
(checksum md5=$HASH)))
|
|
|
|
(extra_sources
|
|
(required.patch
|
|
(fetch
|
|
(url http://localhost:2)
|
|
(checksum md5=$HASH))))
|
|
|
|
Running the binary should download the tarball & patch, build them and show the
|
|
correct, patched, message:
|
|
|
|
$ dune exec ./display.exe
|
|
Patch successfully applied
|
|
|
|
Set up a new version of the package which has multiple `extra-sources`, the
|
|
application order of them mattering:
|
|
|
|
$ echo needs-patch.tar >> fake-curls
|
|
$ SRC_PORT=3
|
|
$ echo required.patch >> fake-curls
|
|
$ REQUIRED_PATCH_PORT=4
|
|
$ echo additional.patch >> fake-curls
|
|
$ ADDITIONAL_PATCH_PORT=5
|
|
|
|
$ mkpkg needs-patch 0.0.2 <<EOF
|
|
> build: ["dune" "build" "-p" name "-j" jobs]
|
|
> patches: ["required.patch" "additional.patch"]
|
|
> url {
|
|
> src: "http://localhost:$SRC_PORT"
|
|
> checksum: "md5=$SRC_MD5"
|
|
> }
|
|
> extra-source "required.patch" {
|
|
> src: "http://localhost:$REQUIRED_PATCH_PORT"
|
|
> checksum: "md5=$REQUIRED_PATCH_MD5"
|
|
> }
|
|
> extra-source "additional.patch" {
|
|
> src: "http://localhost:$ADDITIONAL_PATCH_PORT"
|
|
> checksum: "md5=$ADDITIONAL_PATCH_MD5"
|
|
> }
|
|
> EOF
|
|
|
|
Lock the project to use that new package
|
|
|
|
$ dune pkg lock
|
|
Solution for dune.lock:
|
|
- needs-patch.0.0.2
|
|
|
|
Running the binary should work and output the double patched message:
|
|
|
|
$ dune exec ./display.exe
|
|
Patch successfully applied, multiple times
|