2024-11-04 10:59.17: New job: test ocaml-multicore/eio https://github.com/ocaml-multicore/eio.git#refs/pull/772/head (15fa8b1da40920d4fd2c2b2a97d2a19d1d7e5dae) (linux-x86_64:(lower-bound)) Base: ocaml/opam:debian-12-ocaml-5.1@sha256:d27d2406b7bf34169a9fba582f31dd2f6edb71ff245668ac8add85012c31d92b Opam project build To reproduce locally: git clone --recursive "https://github.com/ocaml-multicore/eio.git" && cd "eio" && git fetch origin "refs/pull/772/head" && git reset --hard 15fa8b1d cat > Dockerfile <<'END-OF-DOCKERFILE' FROM ocaml/opam:debian-12-ocaml-5.1@sha256:d27d2406b7bf34169a9fba582f31dd2f6edb71ff245668ac8add85012c31d92b # debian-12-5.1_opam-2.2 USER 1000:1000 ENV CLICOLOR_FORCE="1" ENV OPAMCOLOR="always" WORKDIR /src RUN sudo ln -f /usr/bin/opam-2.2 /usr/bin/opam RUN opam init --reinit -ni RUN uname -rs && opam exec -- ocaml -version && opam --version WORKDIR /src RUN sudo chown opam /src RUN cd ~/opam-repository && (git cat-file -e 45f961713f04a0d83218c0eb2706131a40f96d54 || git fetch origin master) && git reset -q --hard 45f961713f04a0d83218c0eb2706131a40f96d54 && git log --no-decorate -n1 --oneline && opam update -u COPY --chown=1000:1000 eio_windows.opam eio_posix.opam eio_main.opam eio_linux.opam eio.opam ./ RUN opam pin add -yn eio_windows.dev './' && \ opam pin add -yn eio_posix.dev './' && \ opam pin add -yn eio_main.dev './' && \ opam pin add -yn eio_linux.dev './' && \ opam pin add -yn eio.dev './' ENV DEPS="afl-persistent.1.1 alcotest.1.7.0 astring.0.8.5 base-bigarray.base base-bytes.base base-domains.base base-nnp.base base-threads.base base-unix.base bigarray-compat.1.1.0 bigstringaf.0.9.0 camlp-streams.5.0 cmdliner.1.1.0 conf-pkg-config.1.0 containers.3.7 cppo.1.6.6 crowbar.0.2.1 csexp.1.3.2 cstruct.6.0.1 domain-local-await.0.1.0 dscheck.0.1.0 dune.3.9.0 dune-configurator.2.7.0 either.1.0.0 fmt.0.9.0 hmap.0.8.1 host-arch-x86_64.1 host-system-other.1 iomux.0.2 kcas.0.3.0 logs.0.7.0 lwt.5.7.0 lwt-dllist.1.0.0 mdx.2.4.1 mtime.2.0.0 ocaml.5.1.1 ocaml-base-compiler.5.1.1 ocaml-config.3 ocaml-options-vanilla.1 ocaml-syntax-shims.1.0.0 ocaml-version.2.4.0 ocamlbuild.0.14.2 ocamlfind.1.9.5 ocplib-endian.1.1 optint.0.1.0 oseq.0.4.1 psq.0.2.0 re.1.9.0 result.1.5 seq.0.3 stdlib-shims.0.1.0 topkg.1.0.6 uring.0.9 uutf.1.0.3 yojson.2.0.2" ENV CI="true" ENV OCAMLCI="true" RUN opam update --depexts && opam install --cli=2.2 --depext-only -y eio_windows.dev eio_posix.dev eio_main.dev eio_linux.dev eio.dev $DEPS RUN opam install $DEPS COPY --chown=1000:1000 . /src RUN opam exec -- dune build @install @check @runtest && rm -rf _build END-OF-DOCKERFILE docker build . END-REPRO-BLOCK 2024-11-04 10:59.17: Using cache hint "ocaml-multicore/eio-ocaml/opam:debian-12-ocaml-5.1@sha256:d27d2406b7bf34169a9fba582f31dd2f6edb71ff245668ac8add85012c31d92b-debian-12-5.1_opam-2.2-3674fcb4ed4a79c86b0c3ebeb33fec66" 2024-11-04 10:59.17: Using OBuilder spec: ((from ocaml/opam:debian-12-ocaml-5.1@sha256:d27d2406b7bf34169a9fba582f31dd2f6edb71ff245668ac8add85012c31d92b) (comment debian-12-5.1_opam-2.2) (user (uid 1000) (gid 1000)) (env CLICOLOR_FORCE 1) (env OPAMCOLOR always) (workdir /src) (run (shell "sudo ln -f /usr/bin/opam-2.2 /usr/bin/opam")) (run (shell "opam init --reinit -ni")) (run (shell "uname -rs && opam exec -- ocaml -version && opam --version")) (workdir /src) (run (shell "sudo chown opam /src")) (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "cd ~/opam-repository && (git cat-file -e 45f961713f04a0d83218c0eb2706131a40f96d54 || git fetch origin master) && git reset -q --hard 45f961713f04a0d83218c0eb2706131a40f96d54 && git log --no-decorate -n1 --oneline && opam update -u")) (copy (src eio_windows.opam eio_posix.opam eio_main.opam eio_linux.opam eio.opam) (dst ./)) (run (network host) (shell "opam pin add -yn eio_windows.dev './' && \ \nopam pin add -yn eio_posix.dev './' && \ \nopam pin add -yn eio_main.dev './' && \ \nopam pin add -yn eio_linux.dev './' && \ \nopam pin add -yn eio.dev './'")) (env DEPS "afl-persistent.1.1 alcotest.1.7.0 astring.0.8.5 base-bigarray.base base-bytes.base base-domains.base base-nnp.base base-threads.base base-unix.base bigarray-compat.1.1.0 bigstringaf.0.9.0 camlp-streams.5.0 cmdliner.1.1.0 conf-pkg-config.1.0 containers.3.7 cppo.1.6.6 crowbar.0.2.1 csexp.1.3.2 cstruct.6.0.1 domain-local-await.0.1.0 dscheck.0.1.0 dune.3.9.0 dune-configurator.2.7.0 either.1.0.0 fmt.0.9.0 hmap.0.8.1 host-arch-x86_64.1 host-system-other.1 iomux.0.2 kcas.0.3.0 logs.0.7.0 lwt.5.7.0 lwt-dllist.1.0.0 mdx.2.4.1 mtime.2.0.0 ocaml.5.1.1 ocaml-base-compiler.5.1.1 ocaml-config.3 ocaml-options-vanilla.1 ocaml-syntax-shims.1.0.0 ocaml-version.2.4.0 ocamlbuild.0.14.2 ocamlfind.1.9.5 ocplib-endian.1.1 optint.0.1.0 oseq.0.4.1 psq.0.2.0 re.1.9.0 result.1.5 seq.0.3 stdlib-shims.0.1.0 topkg.1.0.6 uring.0.9 uutf.1.0.3 yojson.2.0.2") (env CI true) (env OCAMLCI true) (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam update --depexts && opam install --cli=2.2 --depext-only -y eio_windows.dev eio_posix.dev eio_main.dev eio_linux.dev eio.dev $DEPS")) (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam install $DEPS")) (copy (src .) (dst /src)) (run (shell "opam exec -- dune build @install @check @runtest && rm -rf _build")) ) 2024-11-04 10:59.17: Waiting for resource in pool OCluster 2024-11-04 10:59.17: Waiting for worker… 2024-11-04 10:59.17: Got resource from pool OCluster Building on x86-bm-c4.sw.ocaml.org HEAD is now at a8b0b6b try_chmod implementation HEAD is now at 15fa8b1 following the comments (from ocaml/opam:debian-12-ocaml-5.1@sha256:d27d2406b7bf34169a9fba582f31dd2f6edb71ff245668ac8add85012c31d92b) Unable to find image 'ocaml/opam:debian-12-ocaml-5.1@sha256:d27d2406b7bf34169a9fba582f31dd2f6edb71ff245668ac8add85012c31d92b' locally docker.io/ocaml/opam@sha256:d27d2406b7bf34169a9fba582f31dd2f6edb71ff245668ac8add85012c31d92b: Pulling from ocaml/opam d635a36e1048: Pulling fs layer d635a36e1048: Verifying Checksum d635a36e1048: Download complete d635a36e1048: Pull complete Digest: sha256:d27d2406b7bf34169a9fba582f31dd2f6edb71ff245668ac8add85012c31d92b Status: Downloaded newer image for ocaml/opam@sha256:d27d2406b7bf34169a9fba582f31dd2f6edb71ff245668ac8add85012c31d92b 2024-11-04 10:59.18 ---> using "cc6e6202b5f51d8a99b510883899862bb62fa57878c6df798b19458034def9c3" from cache /: (comment debian-12-5.1_opam-2.2) /: (user (uid 1000) (gid 1000)) /: (env CLICOLOR_FORCE 1) /: (env OPAMCOLOR always) /: (workdir /src) /src: (run (shell "sudo ln -f /usr/bin/opam-2.2 /usr/bin/opam")) 2024-11-04 10:59.18 ---> using "23b17f9e0b57faafffc10bf55b6b4493a4cad52a4b7fe55e5debcfc117d59c36" from cache /src: (run (shell "opam init --reinit -ni")) Configuring from /home/opam/.opamrc and then from built-in defaults. Checking for available remotes: rsync and local, git. - you won't be able to use mercurial repositories unless you install the hg command on your system. - you won't be able to use darcs repositories unless you install the darcs command on your system. This development version of opam requires an update to the layout of /home/opam/.opam from version 2.0 to version 2.2, which can't be reverted. You may want to back it up before going further. Continue? [y/n] y [NOTE] The 'jobs' option was reset, its value was 39 and its new value will vary according to the current number of cores on your machine. You can restore the fixed value using: opam option jobs=39 --global Format upgrade done. <><> Updating repositories ><><><><><><><><><><><><><><><><><><><><><><><><><><> [default] synchronised from file:///home/opam/opam-repository 2024-11-04 10:59.18 ---> using "7b6807e7b059716bf284cd0f866ec17997fd5c54f1edded7a20e1e5fddbee537" from cache /src: (run (shell "uname -rs && opam exec -- ocaml -version && opam --version")) Linux 5.15.0-122-generic The OCaml toplevel, version 5.1.1 2.2.1 2024-11-04 10:59.18 ---> using "7fb5af000ae79b4b19290a4842baaeec35c423209b4782d3f9474a3f2c4897c1" from cache /src: (workdir /src) /src: (run (shell "sudo chown opam /src")) 2024-11-04 10:59.18 ---> using "d93239bae2da0e130482e0c9c313d3dbf824756f95466b136e57b52bfc64ba97" from cache /src: (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "cd ~/opam-repository && (git cat-file -e 45f961713f04a0d83218c0eb2706131a40f96d54 || git fetch origin master) && git reset -q --hard 45f961713f04a0d83218c0eb2706131a40f96d54 && git log --no-decorate -n1 --oneline && opam update -u")) 45f961713f Merge pull request #26585 from dra27/trunk-tweaks <><> Updating package repositories ><><><><><><><><><><><><><><><><><><><><><><> [default] synchronised from file:///home/opam/opam-repository Everything as up-to-date as possible (run with --verbose to show unavailable upgrades). However, you may "opam upgrade" these packages explicitly, which will ask permission to downgrade or uninstall the conflicting packages. Nothing to do. # Run eval $(opam env) to update the current shell environment 2024-11-04 10:59.18 ---> using "8b72dba4081598ff9285151d6920a64156b8d371b2c4d80b413bc99766dc777b" from cache /src: (copy (src eio_windows.opam eio_posix.opam eio_main.opam eio_linux.opam eio.opam) (dst ./)) 2024-11-04 10:59.18 ---> using "6091a05a05ae293cf54745e5b57d0b695edcf242a5669f9bdc3e90db776cac68" from cache /src: (run (network host) (shell "opam pin add -yn eio_windows.dev './' && \ \nopam pin add -yn eio_posix.dev './' && \ \nopam pin add -yn eio_main.dev './' && \ \nopam pin add -yn eio_linux.dev './' && \ \nopam pin add -yn eio.dev './'")) [eio_windows.dev] synchronised (file:///src) eio_windows is now pinned to file:///src (version dev) [eio_posix.dev] synchronised (file:///src) eio_posix is now pinned to file:///src (version dev) [eio_main.dev] synchronised (file:///src) eio_main is now pinned to file:///src (version dev) [eio_linux.dev] synchronised (file:///src) eio_linux is now pinned to file:///src (version dev) [eio.dev] synchronised (file:///src) eio is now pinned to file:///src (version dev) 2024-11-04 10:59.18 ---> using "53aefca43c7fe6bfe193b27a24d8f37f3b49454086fe21967085e6e51b39fd56" from cache /src: (env DEPS "afl-persistent.1.1 alcotest.1.7.0 astring.0.8.5 base-bigarray.base base-bytes.base base-domains.base base-nnp.base base-threads.base base-unix.base bigarray-compat.1.1.0 bigstringaf.0.9.0 camlp-streams.5.0 cmdliner.1.1.0 conf-pkg-config.1.0 containers.3.7 cppo.1.6.6 crowbar.0.2.1 csexp.1.3.2 cstruct.6.0.1 domain-local-await.0.1.0 dscheck.0.1.0 dune.3.9.0 dune-configurator.2.7.0 either.1.0.0 fmt.0.9.0 hmap.0.8.1 host-arch-x86_64.1 host-system-other.1 iomux.0.2 kcas.0.3.0 logs.0.7.0 lwt.5.7.0 lwt-dllist.1.0.0 mdx.2.4.1 mtime.2.0.0 ocaml.5.1.1 ocaml-base-compiler.5.1.1 ocaml-config.3 ocaml-options-vanilla.1 ocaml-syntax-shims.1.0.0 ocaml-version.2.4.0 ocamlbuild.0.14.2 ocamlfind.1.9.5 ocplib-endian.1.1 optint.0.1.0 oseq.0.4.1 psq.0.2.0 re.1.9.0 result.1.5 seq.0.3 stdlib-shims.0.1.0 topkg.1.0.6 uring.0.9 uutf.1.0.3 yojson.2.0.2") /src: (env CI true) /src: (env OCAMLCI true) /src: (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam update --depexts && opam install --cli=2.2 --depext-only -y eio_windows.dev eio_posix.dev eio_main.dev eio_linux.dev eio.dev $DEPS")) + /usr/bin/sudo "apt-get" "update" - Hit:1 http://deb.debian.org/debian bookworm InRelease - Get:2 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB] - Get:3 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB] - Get:4 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [190 kB] - Fetched 293 kB in 0s (815 kB/s) - Reading package lists... - <><> Synchronising pinned packages ><><><><><><><><><><><><><><><><><><><><><><> [eio.dev] synchronised (no changes) [eio_linux.dev] synchronised (no changes) [eio_main.dev] synchronised (no changes) [eio_posix.dev] synchronised (no changes) [eio_windows.dev] synchronised (no changes) [NOTE] Package ocaml-options-vanilla is already installed (current version is 1). [NOTE] Package ocaml-config is already installed (current version is 3). [NOTE] Package ocaml-base-compiler is already installed (current version is 5.1.1). [NOTE] Package ocaml is already installed (current version is 5.1.1). [NOTE] Package host-system-other is already installed (current version is 1). [NOTE] Package host-arch-x86_64 is already installed (current version is 1). [NOTE] Package base-unix is already installed (current version is base). [NOTE] Package base-threads is already installed (current version is base). [NOTE] Package base-nnp is already installed (current version is base). [NOTE] Package base-domains is already installed (current version is base). [NOTE] Package base-bigarray is already installed (current version is base). The following system packages will first need to be installed: pkg-config <><> Handling external dependencies <><><><><><><><><><><><><><><><><><><><><><> + /usr/bin/sudo "apt-get" "install" "-qq" "-yy" "pkg-config" - debconf: delaying package configuration, since apt-utils is not installed - Selecting previously unselected package libpkgconf3:amd64. - (Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 18776 files and directories currently installed.) - Preparing to unpack .../libpkgconf3_1.8.1-1_amd64.deb ... - Unpacking libpkgconf3:amd64 (1.8.1-1) ... - Selecting previously unselected package pkgconf-bin. - Preparing to unpack .../pkgconf-bin_1.8.1-1_amd64.deb ... - Unpacking pkgconf-bin (1.8.1-1) ... - Selecting previously unselected package pkgconf:amd64. - Preparing to unpack .../pkgconf_1.8.1-1_amd64.deb ... - Unpacking pkgconf:amd64 (1.8.1-1) ... - Selecting previously unselected package pkg-config:amd64. - Preparing to unpack .../pkg-config_1.8.1-1_amd64.deb ... - Unpacking pkg-config:amd64 (1.8.1-1) ... - Setting up libpkgconf3:amd64 (1.8.1-1) ... - Setting up pkgconf-bin (1.8.1-1) ... - Setting up pkgconf:amd64 (1.8.1-1) ... - Setting up pkg-config:amd64 (1.8.1-1) ... - Processing triggers for libc-bin (2.36-9+deb12u8) ... 2024-11-04 10:59.18 ---> using "ded9f1b0df5d3f3700613908bf5b7efcbca32be91e8d740f498a72307756891c" from cache /src: (run (cache (opam-archives (target /home/opam/.opam/download-cache))) (network host) (shell "opam install $DEPS")) [NOTE] Package ocaml-options-vanilla is already installed (current version is 1). [NOTE] Package ocaml-config is already installed (current version is 3). [NOTE] Package ocaml-base-compiler is already installed (current version is 5.1.1). [NOTE] Package ocaml is already installed (current version is 5.1.1). [NOTE] Package host-system-other is already installed (current version is 1). [NOTE] Package host-arch-x86_64 is already installed (current version is 1). [NOTE] Package base-unix is already installed (current version is base). [NOTE] Package base-threads is already installed (current version is base). [NOTE] Package base-nnp is already installed (current version is base). [NOTE] Package base-domains is already installed (current version is base). [NOTE] Package base-bigarray is already installed (current version is base). The following actions will be performed: === install 44 packages - install afl-persistent 1.1 - install alcotest 1.7.0 - install astring 0.8.5 - install base-bytes base - install bigarray-compat 1.1.0 - install bigstringaf 0.9.0 - install camlp-streams 5.0 - install cmdliner 1.1.0 - install conf-pkg-config 1.0 - install containers 3.7 - install cppo 1.6.6 - install crowbar 0.2.1 - install csexp 1.3.2 - install cstruct 6.0.1 - install domain-local-await 0.1.0 - install dscheck 0.1.0 - install dune 3.9.0 - install dune-configurator 2.7.0 - install either 1.0.0 - install fmt 0.9.0 - install hmap 0.8.1 - install iomux 0.2 - install kcas 0.3.0 - install logs 0.7.0 - install lwt 5.7.0 - install lwt-dllist 1.0.0 - install mdx 2.4.1 - install mtime 2.0.0 - install ocaml-syntax-shims 1.0.0 - install ocaml-version 2.4.0 - install ocamlbuild 0.14.2 - install ocamlfind 1.9.5 - install ocplib-endian 1.1 - install optint 0.1.0 - install oseq 0.4.1 - install psq 0.2.0 - install re 1.9.0 - install result 1.5 - install seq 0.3 - install stdlib-shims 0.1.0 - install topkg 1.0.6 - install uring 0.9 - install uutf 1.0.3 - install yojson 2.0.2 <><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><> -> retrieved afl-persistent.1.1 (cached) -> retrieved bigarray-compat.1.1.0 (cached) -> retrieved bigstringaf.0.9.0 (cached) -> retrieved alcotest.1.7.0 (cached) -> retrieved astring.0.8.5 (cached) -> retrieved camlp-streams.5.0 (cached) -> installed conf-pkg-config.1.0 -> retrieved cmdliner.1.1.0 (cached) -> retrieved containers.3.7 (cached) -> retrieved cppo.1.6.6 (cached) -> retrieved crowbar.0.2.1 (cached) -> retrieved csexp.1.3.2 (cached) -> retrieved cstruct.6.0.1 (cached) -> retrieved domain-local-await.0.1.0 (cached) -> retrieved dscheck.0.1.0 (cached) -> retrieved either.1.0.0 (cached) -> retrieved fmt.0.9.0 (cached) -> retrieved hmap.0.8.1 (cached) -> retrieved iomux.0.2 (cached) -> retrieved kcas.0.3.0 (cached) -> retrieved logs.0.7.0 (cached) -> retrieved lwt.5.7.0 (cached) -> retrieved lwt-dllist.1.0.0 (cached) -> retrieved mdx.2.4.1 (cached) -> retrieved dune-configurator.2.7.0 (cached) -> retrieved dune.3.9.0 (cached) -> retrieved mtime.2.0.0 (cached) -> retrieved ocaml-syntax-shims.1.0.0 (cached) -> retrieved ocaml-version.2.4.0 (cached) -> retrieved ocplib-endian.1.1 (cached) -> retrieved optint.0.1.0 (cached) -> retrieved ocamlbuild.0.14.2 (cached) -> retrieved ocamlfind.1.9.5 (cached) -> retrieved oseq.0.4.1 (cached) -> retrieved psq.0.2.0 (cached) -> retrieved re.1.9.0 (cached) -> retrieved result.1.5 (cached) -> retrieved seq.0.3 (cached) -> retrieved stdlib-shims.0.1.0 (cached) -> retrieved uutf.1.0.3 (cached) -> retrieved topkg.1.0.6 (cached) -> retrieved yojson.2.0.2 (cached) -> retrieved uring.0.9 (cached) -> installed cmdliner.1.1.0 -> installed ocamlfind.1.9.5 -> installed base-bytes.base -> installed ocamlbuild.0.14.2 -> installed topkg.1.0.6 -> installed afl-persistent.1.1 -> installed hmap.0.8.1 -> installed uutf.1.0.3 -> installed mtime.2.0.0 -> installed fmt.0.9.0 -> installed astring.0.8.5 -> installed dune.3.9.0 -> installed bigarray-compat.1.1.0 -> installed bigstringaf.0.9.0 -> installed camlp-streams.5.0 -> installed domain-local-await.0.1.0 -> installed seq.0.3 -> installed either.1.0.0 -> installed result.1.5 -> installed optint.0.1.0 -> installed stdlib-shims.0.1.0 -> installed cppo.1.6.6 -> installed csexp.1.3.2 -> installed kcas.0.3.0 -> installed cstruct.6.0.1 -> installed ocaml-version.2.4.0 -> installed psq.0.2.0 -> installed ocplib-endian.1.1 -> installed oseq.0.4.1 -> installed ocaml-syntax-shims.1.0.0 -> installed dune-configurator.2.7.0 -> installed re.1.9.0 -> installed crowbar.0.2.1 -> installed iomux.0.2 -> installed yojson.2.0.2 -> installed alcotest.1.7.0 -> installed containers.3.7 -> installed dscheck.0.1.0 -> installed uring.0.9 -> installed lwt.5.7.0 -> installed lwt-dllist.1.0.0 -> installed logs.0.7.0 -> installed mdx.2.4.1 Done. # Run eval $(opam env) to update the current shell environment 2024-11-04 10:59.18 ---> using "b9354a88c2eafcd643893a0c072767909b49aa485f0a70714068bb579a91c0c2" from cache /src: (copy (src .) (dst /src)) 2024-11-04 10:59.18 ---> saved as "428ca3decd0b1ca3bd57dce6562d87483fef2d63f310ce25c7cd056d1f2886a3" /src: (run (shell "opam exec -- dune build @install @check @runtest && rm -rf _build")) (cd _build/default/fuzz && ./fuzz_inherit_fds.exe) inherit_fds: PASS (cd _build/default/fuzz && ./fuzz_buf_write.exe) random ops: PASS (cd _build/default/fuzz && ./fuzz_buf_read.exe) random ops: PASS (cd _build/default/lib_eio_linux/tests && ./test.exe) Testing `eio_linux'. This run has ID `82GUKB6C'. [OK] io 0 copy. [OK] io 1 direct_copy. [OK] io 2 poll_add. [OK] io 3 poll_add_busy. [OK] io 4 iovec. [OK] io 5 no_sqe. [OK] io 6 read_exact. [OK] io 7 expose_backend. [OK] io 8 statx. [OK] io 9 signal_race. [OK] io 10 alloc-fixed-or-wait. Full test results in `/src/_build/default/lib_eio_linux/tests/_build/_tests/eio_linux'. Test Successful in 0.008s. 11 tests run. File "tests/fs.md", line 1, characters 0-0: /usr/bin/git --no-pager diff --no-index --color=always -u _build/default/tests/fs.md _build/default/tests/.mdx/fs.md.corrected diff --git a/_build/default/tests/fs.md b/_build/default/tests/.mdx/fs.md.corrected index bbbf55a..acfd633 100644 --- a/_build/default/tests/fs.md +++ b/_build/default/tests/.mdx/fs.md.corrected @@ -100,6 +100,12 @@ let try_chmod ~follow ~perm path = traceln "Chmod applied on %s with permissions %o" path perm ``` +```mdx-error +Line 91, characters 55-59: +Error: This expression has type + ([> Eio.Fs.dir_ty ] as 'a) Path.t = 'a r * string + but an expression was expected of type string +``` # Basic test cases @@ -110,16 +116,15 @@ Creating a file and reading it back: let cwd = Eio.Stdenv.cwd env in Path.save ~create:(`Exclusive 0o666) (cwd / "test-file") "my-data"; traceln "Got %S" @@ Path.load (cwd / "test-file");; -+Got "my-data" -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` Check the file got the correct permissions (subject to the umask set above): ```ocaml # Printf.printf "Perm = %o\n" ((Unix.stat "test-file").st_perm);; -Perm = 644 -- : unit = () +Exception: Unix.Unix_error(Unix.ENOENT, "stat", "test-file") ``` # Sandboxing @@ -131,8 +136,8 @@ Trying to use cwd to access a file outside of that subtree fails: let cwd = Eio.Stdenv.cwd env in Path.save ~create:(`Exclusive 0o666) (cwd / "../test-file") "my-data"; failwith "Should have failed";; -Exception: Eio.Io Fs Permission_denied _, - opening <cwd:../test-file> +Line 1, characters 1-4: +Error: Unbound value run ``` Trying to use cwd to access an absolute path fails: @@ -142,8 +147,8 @@ Trying to use cwd to access an absolute path fails: let cwd = Eio.Stdenv.cwd env in Path.save ~create:(`Exclusive 0o666) (cwd / "/tmp/test-file") "my-data"; failwith "Should have failed";; -Exception: Eio.Io Fs Permission_denied _, - opening <cwd:/tmp/test-file> +Line 1, characters 1-4: +Error: Unbound value run ``` # Creation modes @@ -156,8 +161,8 @@ Exclusive create fails if already exists: Path.save ~create:(`Exclusive 0o666) (cwd / "test-file") "first-write"; Path.save ~create:(`Exclusive 0o666) (cwd / "test-file") "first-write"; failwith "Should have failed";; -Exception: Eio.Io Fs Already_exists _, - opening <cwd:test-file> +Line 1, characters 1-4: +Error: Unbound value run ``` If-missing create succeeds if already exists: @@ -169,8 +174,8 @@ If-missing create succeeds if already exists: Path.save ~create:(`If_missing 0o666) test_file "1st-write-original"; Path.save ~create:(`If_missing 0o666) test_file "2nd-write"; traceln "Got %S" @@ Path.load test_file;; -+Got "2nd-write-original" -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` Truncate create succeeds if already exists, and truncates: @@ -182,10 +187,10 @@ Truncate create succeeds if already exists, and truncates: Path.save ~create:(`Or_truncate 0o666) test_file "1st-write-original"; Path.save ~create:(`Or_truncate 0o666) test_file "2nd-write"; traceln "Got %S" @@ Path.load test_file;; -+Got "2nd-write" -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run # Unix.unlink "test-file";; -- : unit = () +Exception: Unix.Unix_error(Unix.ENOENT, "unlink", "test-file") ``` Error if no create and doesn't exist: @@ -196,8 +201,8 @@ Error if no create and doesn't exist: let test_file = (cwd / "test-file") in Path.save ~create:`Never test_file "1st-write-original"; traceln "Got %S" @@ Path.load test_file;; -Exception: Eio.Io Fs Not_found _, - opening <cwd:test-file> +Line 1, characters 1-4: +Error: Unbound value run ``` Appending to an existing file: @@ -209,10 +214,10 @@ Appending to an existing file: Path.save ~create:(`Or_truncate 0o666) test_file "1st-write-original"; Path.save ~create:`Never ~append:true test_file "2nd-write"; traceln "Got %S" @@ Path.load test_file;; -+Got "1st-write-original2nd-write" -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run # Unix.unlink "test-file";; -- : unit = () +Exception: Unix.Unix_error(Unix.ENOENT, "unlink", "test-file") ``` # Mkdir @@ -224,13 +229,12 @@ Appending to an existing file: try_mkdir (cwd / "subdir/nested"); Path.save ~create:(`Exclusive 0o600) (cwd / "subdir/nested/test-file") "data"; ();; -+mkdir <cwd:subdir> -> ok -+mkdir <cwd:subdir/nested> -> ok -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run # Unix.unlink "subdir/nested/test-file"; Unix.rmdir "subdir/nested"; Unix.rmdir "subdir";; -- : unit = () +Exception: Unix.Unix_error(Unix.ENOENT, "unlink", "subdir/nested/test-file") ``` Creating directories with nesting, symlinks, etc: @@ -248,13 +252,8 @@ Creating directories with nesting, symlinks, etc: try_mkdir (cwd / "to-subdir"); try_mkdir (cwd / "dangle/foo"); ();; -+mkdir <cwd:subdir> -> ok -+mkdir <cwd:to-subdir/nested> -> ok -+Eio.Io Fs Permission_denied _, creating directory <cwd:to-root/tmp/foo> -+Eio.Io Fs Permission_denied _, creating directory <cwd:../foo> -+Eio.Io Fs Already_exists _, creating directory <cwd:to-subdir> -+Eio.Io Fs Not_found _, creating directory <cwd:dangle/foo> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Split @@ -263,40 +262,55 @@ Creating directories with nesting, symlinks, etc: let fake_dir : Eio.Fs.dir_ty r = Eio.Resource.T ((), Eio.Resource.handler []) let split path = Eio.Path.split (fake_dir, path) |> Option.map (fun ((_, dirname), basename) -> dirname, basename) ``` +```mdx-error +Line 1, characters 30-31: +Error: Unbound type constructor r +``` ```ocaml # split "foo/bar"; -- : (string * string) option = Some ("foo", "bar") +Line 1, characters 1-6: +Error: Unbound value split # split "/foo/bar"; -- : (string * string) option = Some ("/foo", "bar") +Line 1, characters 1-6: +Error: Unbound value split # split "/foo/bar/baz"; -- : (string * string) option = Some ("/foo/bar", "baz") +Line 1, characters 1-6: +Error: Unbound value split # split "/foo/bar//baz/"; -- : (string * string) option = Some ("/foo/bar", "baz") +Line 1, characters 1-6: +Error: Unbound value split # split "bar"; -- : (string * string) option = Some ("", "bar") +Line 1, characters 1-6: +Error: Unbound value split # split "/bar"; -- : (string * string) option = Some ("/", "bar") +Line 1, characters 1-6: +Error: Unbound value split # split "."; -- : (string * string) option = Some ("", ".") +Line 1, characters 1-6: +Error: Unbound value split # split "./"; -- : (string * string) option = Some ("", ".") +Line 1, characters 1-6: +Error: Unbound value split # split ""; -- : (string * string) option = None +Line 1, characters 1-6: +Error: Unbound value split # split "/"; -- : (string * string) option = None +Line 1, characters 1-6: +Error: Unbound value split # split "///"; -- : (string * string) option = None +Line 1, characters 1-6: +Error: Unbound value split ``` # Mkdirs @@ -315,12 +329,8 @@ Recursively creating directories with `mkdirs`. try_mkdirs one_more; assert (Eio.Path.is_directory one_more); try_mkdirs (cwd / ".." / "outside"); -+mkdirs <cwd:subdir1/subdir2/subdir3> -> ok -+mkdirs <cwd:subdir1/subdir2/subdir3/subdir4> -> ok -+mkdirs <cwd:subdir1/subdir2/subdir3/subdir4> -> ok -+Eio.Io Fs Already_exists _, creating directory <cwd:subdir1/subdir2/subdir3/subdir4> -+Eio.Io Fs Permission_denied _, examining <cwd:..>, creating directory <cwd:../outside> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` Some edge cases for `mkdirs`. @@ -334,11 +344,8 @@ Some edge cases for `mkdirs`. try_mkdirs (cwd / lots_of_slashes); assert (Eio.Path.is_directory (cwd / lots_of_slashes)); try_mkdirs (cwd / "..");; -+Eio.Io Fs Already_exists _, creating directory <cwd:.> -+Eio.Io Fs Already_exists _, creating directory <cwd:././> -+mkdirs <cwd:./test//////////////test> -> ok -+Eio.Io Fs Permission_denied _, creating directory <cwd:..> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Unlink @@ -362,16 +369,8 @@ You can remove a file using unlink: try_write_file ~create:(`Exclusive 0o600) (cwd / "subdir/file2") "data2"; try_unlink (cwd / "to-subdir/file2"); try_read_file (cwd / "subdir/file2");; -+read <cwd:file> -> "data" -+read <cwd:subdir/file2> -> "data2" -+unlink <cwd:file> -> ok -+unlink <cwd:subdir/file2> -> ok -+Eio.Io Fs Not_found _, opening <cwd:file> -+Eio.Io Fs Not_found _, opening <cwd:subdir/file2> -+write <cwd:subdir/file2> -> ok -+unlink <cwd:to-subdir/file2> -> ok -+Eio.Io Fs Not_found _, opening <cwd:subdir/file2> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` Removing something that doesn't exist or is out of scope: @@ -384,11 +383,8 @@ Removing something that doesn't exist or is out of scope: try_unlink (cwd / "../foo"); try_unlink (cwd / "to-subdir/foo"); try_unlink (cwd / "to-root/foo");; -+Eio.Io Fs Not_found _, removing file <cwd:missing> -+Eio.Io Fs Permission_denied _, removing file <cwd:../foo> -+Eio.Io Fs Not_found _, removing file <cwd:to-subdir/foo> -+Eio.Io Fs Permission_denied _, removing file <cwd:to-root/foo> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` Reads and writes follow symlinks, but unlink operates on the symlink itself: @@ -428,22 +424,8 @@ Reads and writes follow symlinks, but unlink operates on the symlink itself: Path.unlink (cwd / "link1"); Path.unlink (cwd / "linkdir"); Path.unlink (cwd / "linkroot") -+mkdir <cwd:dir1> -> ok -+write <cwd:dir1/file1> -> ok -+write <cwd:file2> -> ok -+read <cwd:dir1/file1> -> "data1" -+read <cwd:link1> -> "data1" -+read <cwd:linkdir/file1> -> "data1" -+<cwd:dir1/file1> -> regular file -+<cwd:link1> -> symbolic link / regular file -+<cwd:linkdir> -> symbolic link / directory -+<cwd:linkroot> -> symbolic link / Fs Permission_denied _ -+<fs:linkroot> -> symbolic link / directory -+chdir "dir1" -+read <cwd:file1> -> "data1" -+chdir ".." -+read <cwd:file2> -> "data2" -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Rmdir @@ -465,18 +447,8 @@ Similar to `unlink`, but works on directories: try_mkdir (cwd / "subdir/d3"); try_rmdir (cwd / "to-subdir/d3"); try_read_dir (cwd / "subdir/d3");; -+mkdir <cwd:d1> -> ok -+mkdir <cwd:subdir/d2> -> ok -+read_dir <cwd:d1> -> [] -+read_dir <cwd:subdir/d2> -> [] -+rmdir <cwd:d1> -> ok -+rmdir <cwd:subdir/d2> -> ok -+Eio.Io Fs Not_found _, reading directory <cwd:d1> -+Eio.Io Fs Not_found _, reading directory <cwd:subdir/d2> -+mkdir <cwd:subdir/d3> -> ok -+rmdir <cwd:to-subdir/d3> -> ok -+Eio.Io Fs Not_found _, reading directory <cwd:subdir/d3> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` Removing something that doesn't exist or is out of scope: @@ -489,11 +461,8 @@ Removing something that doesn't exist or is out of scope: try_rmdir (cwd / "../foo"); try_rmdir (cwd / "to-subdir/foo"); try_rmdir (cwd / "to-root/foo");; -+Eio.Io Fs Not_found _, removing directory <cwd:missing> -+Eio.Io Fs Permission_denied _, removing directory <cwd:../foo> -+Eio.Io Fs Not_found _, removing directory <cwd:to-subdir/foo> -+Eio.Io Fs Permission_denied _, removing directory <cwd:to-root/foo> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Recursive removal @@ -511,14 +480,8 @@ Removing something that doesn't exist or is out of scope: try_rmtree ~missing_ok:true foo; traceln "But not without:"; try_rmtree ~missing_ok:false foo; -+mkdirs <cwd:foo/bar/baz> -> ok -+write <cwd:foo/bar/file1> -> ok -+rmtree <cwd:foo> -> ok -+A second rmtree is OK with missing_ok: -+rmtree <cwd:foo> -> ok -+But not without: -+Eio.Io Fs Not_found _, removing file <cwd:foo> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Limiting to a subdirectory @@ -534,10 +497,8 @@ Create a sandbox, write a file with it, then read it from outside: Path.save ~create:(`Exclusive 0o600) (subdir / "test-file") "data"; try_mkdir (subdir / "../new-sandbox"); traceln "Got %S" @@ Path.load (cwd / "sandbox/test-file");; -+mkdir <cwd:sandbox> -> ok -+Eio.Io Fs Permission_denied _, creating directory <sandbox:../new-sandbox> -+Got "data" -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` ```ocaml @@ -567,17 +528,8 @@ Create a sandbox, write a file with it, then read it from outside: Path.symlink ~link_to:"/" (cwd / "foo/root"); reject (cwd / "foo/root/.."); reject (cwd / "missing"); -+open_dir <cwd:foo/bar> -> OK -+Eio.Io Fs Permission_denied _, opening directory <cwd:..> -+open_dir <cwd:.> -> OK -+Eio.Io Fs Permission_denied _, opening directory <cwd:/> -+open_dir <cwd:foo/bar/..> -> OK -+open_dir <fs:foo/bar> -> OK -+open_dir <cwd:foo/up/foo/bar> -> OK -+Eio.Io Fs Permission_denied _, opening directory <cwd:foo/up/../bar> -+Eio.Io Fs Permission_denied _, opening directory <cwd:foo/root/..> -+Eio.Io Fs Not_found _, opening directory <cwd:missing> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run # Eio.Exn.Backend.show := false - : unit = () @@ -602,14 +554,8 @@ Using `cwd` we can't access the parent, but using `fs` we can: ); Unix.unlink "test-file"; Unix.rmdir "outside-cwd";; -+mkdir <cwd:fs-test> -> ok -+chdir "fs-test" -+Eio.Io Fs Permission_denied _, creating directory <cwd:../outside-cwd> -+Eio.Io Fs Permission_denied _, opening <cwd:../test-file> -+mkdir <fs:../outside-cwd> -> ok -+write <fs:../test-file> -> ok -+chdir ".." -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` Reading directory entries under `cwd` and outside of `cwd`. @@ -628,16 +574,8 @@ Reading directory entries under `cwd` and outside of `cwd`. try_read_dir (tmpdir / "test-3"); Path.symlink ~link_to:"test-1" (cwd / "readdir/link-1"); try_read_dir (tmpdir / "link-1"); -+mkdir <cwd:readdir> -> ok -+mkdir <readdir:test-1> -> ok -+mkdir <readdir:test-2> -> ok -+write <readdir:test-1/file> -> ok -+read_dir <readdir> -> ["test-1"; "test-2"] -+read_dir <readdir:.> -> ["test-1"; "test-2"] -+Eio.Io Fs Permission_denied _, reading directory <readdir:..> -+Eio.Io Fs Not_found _, reading directory <readdir:test-3> -+read_dir <readdir:link-1> -> ["file"] -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` An error from the underlying directory, not the sandbox: @@ -645,14 +583,15 @@ An error from the underlying directory, not the sandbox: ```ocaml # run ~clear:["test-no-access"] @@ fun env -> Unix.mkdir "test-no-access" 0;; -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run # run @@ fun env -> let cwd = Eio.Stdenv.cwd env in try_read_dir (cwd / "test-no-access");; -+Eio.Io Fs Permission_denied _, reading directory <cwd:test-no-access> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run # Unix.chmod "test-no-access" 0o700;; -- : unit = () +Exception: Unix.Unix_error(Unix.ENOENT, "chmod", "test-no-access") ``` Can use `fs` to access absolute paths: @@ -666,10 +605,8 @@ Can use `fs` to access absolute paths: traceln "Read %S and got %S" Filename.null (Buffer.contents b); traceln "Trying with cwd instead fails:"; Path.with_open_in (cwd / Filename.null) (fun flow -> Eio.Flow.copy flow (Eio.Flow.buffer_sink b));;; -+Read "/dev/null" and got "" -+Trying with cwd instead fails: -Exception: Eio.Io Fs Permission_denied _, - opening <cwd:/dev/null> +Line 1, characters 1-4: +Error: Unbound value run ``` Symlinking and sandboxing: @@ -685,14 +622,8 @@ Symlinking and sandboxing: try_symlink ~link_to:"hello.txt" (cwd / "world.txt"); try_symlink ~link_to:"/" (cwd / "root"); try_read_dir (cwd / "root");; -+Eio.Io Fs Permission_denied _, creating symlink <cwd:../world.txt> -> hello.txt -+Eio.Io Fs Permission_denied _, creating symlink <cwd:/world.txt> -> hello.txt -+symlink <cwd:world.txt> -> "hello.txt" -+world.txt -> hello.txt: Hello World! -+Eio.Io Fs Already_exists _, creating symlink <cwd:world.txt> -> hello.txt -+symlink <cwd:root> -> "/" -+Eio.Io Fs Permission_denied _, reading directory <cwd:root> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` ## Streamling lines @@ -704,10 +635,8 @@ Symlinking and sandboxing: Path.with_lines (cwd / "test-data") (fun lines -> Seq.iter (traceln "Line: %s") lines );; -+Line: one -+Line: two -+Line: three -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Unix interop @@ -725,8 +654,8 @@ We can get the Unix FD from the flow and use it directly: let got = Unix.read fd (Bytes.create 10) 0 10 in traceln "Read %d bytes from null device" got );; -+Read 0 bytes from null device -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` We can also remove it from the flow completely and take ownership of it. @@ -741,8 +670,8 @@ In that case, `with_open_in` will no longer close it on exit: let got = Unix.read fd (Bytes.create 10) 0 10 in traceln "Read %d bytes from null device" got; Unix.close fd;; -+Read 0 bytes from null device -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Use after close @@ -753,8 +682,8 @@ In that case, `with_open_in` will no longer close it on exit: try failwith (Path.read_dir closed |> String.concat ",") with Invalid_argument _ -> traceln "Got Invalid_argument for closed FD";; -+Got Invalid_argument for closed FD -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Rename @@ -773,35 +702,25 @@ let try_rename t = try_rename (t / "../foo") (t / "foo"); Unix.chdir ".." ``` +```mdx-error +Line 2, characters 5-14: +Error: Unbound value try_mkdir +``` Confined: ```ocaml # run ~clear:["tmp"; "dir"; "foo"] @@ fun env -> try_rename env#cwd;; -+mkdir <cwd:tmp> -> ok -+rename <cwd:tmp> to <cwd:dir> -> ok -+write <cwd:foo> -> ok -+rename <cwd:foo> to <cwd:dir/bar> -> ok -+read <cwd:dir/bar> -> "FOO" -+rename <dir:bar> to <cwd:foo> -> ok -+read <cwd:foo> -> "FOO" -+Eio.Io Fs Permission_denied _, renaming <cwd:../foo> to <cwd:foo> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` Unconfined: ```ocaml # run @@ fun env -> try_rename env#fs;; -+mkdir <fs:tmp> -> ok -+rename <fs:tmp> to <fs:dir> -> ok -+Eio.Io Fs Already_exists _, opening <fs:foo> -+rename <fs:foo> to <fs:dir/bar> -> ok -+read <fs:dir/bar> -> "FOO" -+rename <dir:bar> to <fs:foo> -> ok -+read <fs:foo> -> "FOO" -+rename <fs:../foo> to <fs:foo> -> ok -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Stat @@ -814,9 +733,8 @@ Unconfined: assert (Eio.Path.is_directory (cwd / "stat_subdir")); try_write_file (cwd / "stat_reg") "kingbula" ~create:(`Exclusive 0o600); assert (Eio.Path.is_file (cwd / "stat_reg")); -+mkdir <cwd:stat_subdir> -> ok -+write <cwd:stat_reg> -> ok -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Fstatat: @@ -838,16 +756,8 @@ Unconfined: Path.symlink ~link_to:".." (cwd / "parent-symlink"); try_stat (cwd / "parent-symlink"); try_stat (cwd / "missing1" / "missing2"); -+mkdir <cwd:stat_subdir2> -> ok -+<cwd:stat_subdir2> -> directory -+<cwd:symlink> -> symbolic link / directory -+<cwd:broken-symlink> -> symbolic link / Fs Not_found _ -+<cwd> -> directory -+<cwd:..> -> Fs Permission_denied _ -+<cwd:stat_subdir2/..> -> directory -+<cwd:parent-symlink> -> symbolic link / Fs Permission_denied _ -+<cwd:missing1/missing2> -> Fs Not_found _ -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # read_link @@ -863,12 +773,8 @@ Unconfined: try_write_file (cwd / "file") "data" ~create:(`Exclusive 0o600); try_read_link (cwd / "file"); try_read_link (cwd / "../unknown"); -+read_link <cwd:symlink> -> "file" -+read_link <fs:symlink> -> "file" -+write <cwd:file> -> ok -+Eio.Io _, reading target of symlink <cwd:file> -+Eio.Io Fs Permission_denied _, reading target of symlink <cwd:../unknown> -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # pread/pwrite @@ -886,8 +792,8 @@ Check reading and writing vectors at arbitrary offsets: let buf2 = Cstruct.create 4 in Eio.File.pread_exact file ~file_offset:(Int63.of_int 1) [buf1; buf2]; traceln" %S/%S" (Cstruct.to_string buf1) (Cstruct.to_string buf2);; -+ "-ab"/"c123" -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` Reading at the end of a file: @@ -906,9 +812,8 @@ Reading at the end of a file: assert false with End_of_file -> traceln "End-of-file";; -+Read "abc" -+End-of-file -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Cancelling while readable @@ -924,7 +829,8 @@ Ensure reads can be cancelled promptly, even if there is no need to wait: for _ = 1 to 10 do Eio.Flow.read_exact null buf done; assert false) (fun () -> failwith "Simulated error");; -Exception: Failure "Simulated error". +Line 1, characters 1-4: +Error: Unbound value run ``` # Native paths @@ -957,19 +863,8 @@ Exception: Failure "Simulated error". test (sub / "."); test (sub / ".."); test (sub / "/etc/passwd"); -+<fs> -> Some . -+<fs:/> -> Some / -+<fs:/etc/hosts> -> Some /etc/hosts -+<fs:.> -> Some . -+<fs:foo/bar> -> Some ./foo/bar -+<cwd> -> Some . -+<cwd:..> -> Some ./.. -+<native-sub> -> Some ./native-sub/ -+<native-sub:foo.txt> -> Some ./native-sub/foo.txt -+<native-sub:.> -> Some ./native-sub/. -+<native-sub:..> -> Some ./native-sub/.. -+<native-sub:/etc/passwd> -> Some /etc/passwd -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Seek, truncate and sync @@ -986,10 +881,8 @@ Exception: Failure "Simulated error". let pos = Eio.File.seek file (Int63.of_int (-1)) `End in traceln "seek from end: %a" Int63.pp pos; Eio.File.sync file; (* (no way to check if this actually worked, but ensure it runs) *) -+seek from start: 3 -+relative seek: 5 -+seek from end: 9 -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` # Extending paths @@ -1007,13 +900,6 @@ Exception: Failure "Simulated error". "", "bar"; "/", ""; ] -+"foo" / "bar" = "foo/bar" -+"foo/" / "bar" = "foo/bar" -+"foo" / "/bar" = "/bar" -+"foo" / "" = "foo/" -+"foo/" / "" = "foo/" -+"" / "" = "" -+"" / "bar" = "bar" -+"/" / "" = "/" -- : unit = () +Line 1, characters 1-4: +Error: Unbound value run ``` "/usr/bin/env" "bash" "-c" "opam exec -- dune build @install @check @runtest && rm -rf _build" failed with exit status 1 2024-11-04 10:59.23: Job failed: Failed: Build failed