Organisationsocurrentocaml-docs-cicb095a ()(lint-fmt)

(lint-fmt)

Link Copied
Code Copied

Logs

2025-04-22 12:36.31: New job: test ocurrent/ocaml-docs-ci https://github.com/ocurrent/ocaml-docs-ci.git#refs/heads/next-gen2 (cb095a367a8964bd594109f331419be2af01f996) (linux-x86_64:(lint-fmt))
Base: ocaml/opam:debian-12-ocaml-4.08@sha256:23c85daf4eb9a91d154cf2f9fed47f4f9b9fa788adc9c1fc7f0802e3dc06d7c4
ocamlformat version: version 0.26.0 (from opam)


To reproduce locally:


git clone --recursive "https://github.com/ocurrent/ocaml-docs-ci.git" -b "next-gen2" && cd "ocaml-docs-ci" && git reset --hard cb095a36
cat > Dockerfile <<'END-OF-DOCKERFILE'
FROM ocaml/opam:debian-12-ocaml-4.08@sha256:23c85daf4eb9a91d154cf2f9fed47f4f9b9fa788adc9c1fc7f0802e3dc06d7c4
USER 1000:1000
RUN cd ~/opam-repository && (git cat-file -e 1b767795a4e028a4d45f916f1598c24ee7a7b6cb || git fetch origin master) && git reset -q --hard 1b767795a4e028a4d45f916f1598c24ee7a7b6cb && git log --no-decorate -n1 --oneline && opam update -u
RUN opam depext -i dune
WORKDIR /src
RUN opam depext -i ocamlformat=0.26.0
COPY --chown=1000:1000 . /src/
RUN opam exec -- dune build @fmt --ignore-promoted-rules || (echo "dune build @fmt failed"; exit 2)


END-OF-DOCKERFILE
docker build .
END-REPRO-BLOCK


2025-04-22 12:36.31: Using cache hint "ocurrent/ocaml-docs-ci-ocaml/opam:debian-12-ocaml-4.08@sha256:23c85daf4eb9a91d154cf2f9fed47f4f9b9fa788adc9c1fc7f0802e3dc06d7c4-debian-12-4.08_opam-2.3-ocamlformat-1b767795a4e028a4d45f916f1598c24ee7a7b6cb"
2025-04-22 12:36.31: Using OBuilder spec:
((from ocaml/opam:debian-12-ocaml-4.08@sha256:23c85daf4eb9a91d154cf2f9fed47f4f9b9fa788adc9c1fc7f0802e3dc06d7c4)
(user (uid 1000) (gid 1000))
(run (cache (opam-archives (target /home/opam/.opam/download-cache)))
(network host)
(shell "cd ~/opam-repository && (git cat-file -e 1b767795a4e028a4d45f916f1598c24ee7a7b6cb || git fetch origin master) && git reset -q --hard 1b767795a4e028a4d45f916f1598c24ee7a7b6cb && git log --no-decorate -n1 --oneline && opam update -u"))
(run (cache (opam-archives (target /home/opam/.opam/download-cache)))
(network host)
(shell "opam depext -i dune"))
(workdir /src)
(run (cache (opam-archives (target /home/opam/.opam/download-cache)))
(network host)
(shell "opam depext -i ocamlformat=0.26.0"))
(copy (src .) (dst /src/))
(run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)"))
)


2025-04-22 12:36.31: Waiting for resource in pool OCluster
2025-04-22 12:36.31: Waiting for worker…
2025-04-22 12:36.32: Got resource from pool OCluster
Building on clete.caelum.ci.dev
All commits already cached
HEAD is now at cb095a3 Remove blocked items from monitor page


(from ocaml/opam:debian-12-ocaml-4.08@sha256:23c85daf4eb9a91d154cf2f9fed47f4f9b9fa788adc9c1fc7f0802e3dc06d7c4)
2025-04-22 12:36.33 ---> using "44ab722c6d76cc4aa083f99994b6eb04bd97004720a37e6316ca14ec9a9ee4aa" from cache


/: (user (uid 1000) (gid 1000))


/: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
(network host)
(shell "cd ~/opam-repository && (git cat-file -e 1b767795a4e028a4d45f916f1598c24ee7a7b6cb || git fetch origin master) && git reset -q --hard 1b767795a4e028a4d45f916f1598c24ee7a7b6cb && git log --no-decorate -n1 --oneline && opam update -u"))
1b767795a4 Merge pull request #27704 from maiste/release-dune-3.18.0


<><> Updating package repositories ><><><><><><><><><><><><><><><><><><><><><><>
[default] Initialised
default (at git+file:///home/opam/opam-repository):
[INFO] opam 2.1 and 2.2 include many performance and security improvements over 2.0; please consider upgrading (https://opam.ocaml.org/doc/Install.html)


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
2025-04-22 12:37.45 ---> saved as "5af033ca5998041d246dc8498882e9dc146ac54b140907f2e1916f6f582b7193"


/: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
(network host)
(shell "opam depext -i dune"))
# Detecting depexts using vars: arch=x86_64, os=linux, os-distribution=debian, os-family=debian
# No extra OS packages requirements found.
# All required OS packages found.
# Now letting opam install the packages
The following actions will be performed:
- install dune 3.18.0


<><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[dune.3.18.0] found in cache


<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed dune.3.18.0
Done.
# Run eval $(opam env) to update the current shell environment
2025-04-22 12:38.50 ---> saved as "f3ca3dfc78385ac1381397f690e815b0455920d345180c72e1fc56947dfe3be3"


/: (workdir /src)


/src: (run (cache (opam-archives (target /home/opam/.opam/download-cache)))
(network host)
(shell "opam depext -i ocamlformat=0.26.0"))
# Detecting depexts using vars: arch=x86_64, os=linux, os-distribution=debian, os-family=debian
# No extra OS packages requirements found.
# All required OS packages found.
# Now letting opam install the packages
The following actions will be performed:
- install sexplib0          v0.14.0  [required by base]
- install cmdliner          1.3.0    [required by ocamlformat]
- install dune-build-info   3.18.0   [required by ocamlformat-lib]
- install menhirLib         20240715 [required by ocamlformat-lib]
- install menhirCST         20240715 [required by menhir]
- install ocamlbuild        0.16.1   [required by fpath, astring, uuseg]
- install menhirSdk         20240715 [required by ocamlformat-lib]
- install either            1.0.0    [required by ocamlformat-lib]
- install result            1.5      [required by ocamlformat-lib]
- install ocaml-version     4.0.0    [required by ocamlformat-lib]
- install camlp-streams     5.0.1    [required by ocamlformat-lib]
- install csexp             1.5.2    [required by ocamlformat-lib]
- install seq               base     [required by re]
- install ocamlfind         1.9.8    [required by ocp-indent, astring, fpath, uuseg]
- install fix               20230505 [required by ocamlformat-lib]
- install menhir            20240715 [required by ocamlformat-lib]
- install dune-configurator 3.18.0   [required by base]
- install re                1.11.0   [required by ocamlformat]
- install topkg             1.0.8    [required by fpath, astring, uuseg]
- install base-bytes        base     [required by ocp-indent]
- install base              v0.14.3  [required by ocamlformat-lib]
- install uutf              1.0.4    [required by ocamlformat-lib]
- install astring           0.8.5    [required by ocamlformat-lib]
- install ocp-indent        1.8.1    [required by ocamlformat-lib]
- install stdio             v0.14.0  [required by ocamlformat-lib]
- install uucp              15.0.0   [required by uuseg]
- install fpath             0.7.3    [required by ocamlformat-lib]
- install uuseg             15.0.0   [required by ocamlformat-lib]
- install ocamlformat-lib   0.26.0   [required by ocamlformat]
- install ocamlformat       0.26.0
===== 30 to install =====


<><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[astring.0.8.5] found in cache
[base.v0.14.3] found in cache
[camlp-streams.5.0.1] found in cache
[cmdliner.1.3.0] found in cache
[csexp.1.5.2] found in cache
[dune-build-info.3.18.0] found in cache
[dune-configurator.3.18.0] found in cache
[either.1.0.0] found in cache
[fix.20230505] found in cache
[fpath.0.7.3] found in cache
[menhir.20240715] found in cache
[menhirCST.20240715] found in cache
[menhirLib.20240715] found in cache
[menhirSdk.20240715] found in cache
[ocaml-version.4.0.0] found in cache
[ocamlbuild.0.16.1] found in cache
[ocamlfind.1.9.8] found in cache
[ocamlformat.0.26.0] found in cache
[ocamlformat-lib.0.26.0] found in cache
[ocp-indent.1.8.1] found in cache
[re.1.11.0] found in cache
[result.1.5] found in cache
[sexplib0.v0.14.0] found in cache
[stdio.v0.14.0] found in cache
[topkg.1.0.8] found in cache
[uucp.15.0.0] found in cache
[uuseg.15.0.0] found in cache
[uutf.1.0.4] found in cache


<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
-> installed seq.base
-> installed camlp-streams.5.0.1
-> installed csexp.1.5.2
-> installed either.1.0.0
-> installed fix.20230505
-> installed cmdliner.1.3.0
-> installed menhirCST.20240715
-> installed menhirLib.20240715
-> installed menhirSdk.20240715
-> installed ocaml-version.4.0.0
-> installed re.1.11.0
-> installed result.1.5
-> installed sexplib0.v0.14.0
-> installed dune-build-info.3.18.0
-> installed dune-configurator.3.18.0
-> installed ocamlfind.1.9.8
-> installed base-bytes.base
-> installed ocp-indent.1.8.1
-> installed ocamlbuild.0.16.1
-> installed base.v0.14.3
-> installed stdio.v0.14.0
-> installed topkg.1.0.8
-> installed uutf.1.0.4
-> installed astring.0.8.5
-> installed fpath.0.7.3
-> installed menhir.20240715
-> installed uucp.15.0.0
-> installed uuseg.15.0.0
-> installed ocamlformat-lib.0.26.0
-> installed ocamlformat.0.26.0
Done.


<><> ocp-indent.1.8.1 installed successfully ><><><><><><><><><><><><><><><><><>
=> This package requires additional configuration for use in editors. Install package 'user-setup', or manually:


* for Emacs, add these lines to ~/.emacs:
(add-to-list 'load-path "/home/opam/.opam/4.08/share/emacs/site-lisp")
(require 'ocp-indent)


* for Vim, add this line to ~/.vimrc:
set rtp^="/home/opam/.opam/4.08/share/ocp-indent/vim"
# Run eval $(opam env) to update the current shell environment
2025-04-22 12:40.09 ---> saved as "9d4e05d7215de4c09734aa004b02c994d19dec2363b796d29ddf14afeabf8120"


/src: (copy (src .) (dst /src/))
2025-04-22 12:40.09 ---> saved as "088799107dc9135160b6966064e80be37c3da6a0350bf603b7afaba8b1a84690"


/src: (run (shell "opam exec -- dune build @fmt --ignore-promoted-rules || (echo \"dune build @fmt failed\"; exit 2)"))
ocamlformat: ignoring "src/solver/solver.mli" (misplaced documentation comments - warning 50)
File "src/solver/solver.mli", line 6, characters 0-69:
6 | (** [test hash] runs a test with commit [hash] in opam-repository. *)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Warning 50 [unexpected-docstring]: ambiguous documentation comment
Hint: (Warning 50) This file contains a documentation comment (** ... *) that the OCaml compiler does not know how to attach to the AST. OCamlformat does not support these cases. You can find more information at: https://github.com/ocaml-ppx/ocamlformat#overview. If you'd like to disable this check and let ocamlformat make a choice (though it might not be consistent with the ocaml compilers and odoc), you can set the --no-comment-check option.
-> required by _build/default/src/solver/.formatted/solver.mli
-> required by alias src/solver/.formatted/fmt
-> required by alias src/solver/fmt
File "src/api/solver/worker.ml", line 1, characters 0-0:
diff --git a/_build/default/src/api/solver/worker.ml b/_build/default/src/api/solver/.formatted/worker.ml
index 4782905..9b6163a 100644
--- a/_build/default/src/api/solver/worker.ml
+++ b/_build/default/src/api/solver/.formatted/worker.ml
@@ -12,9 +12,11 @@ module Vars = struct
[@@deriving yojson]
end


-type solve_result =
-  { compile_universes : (string * string * string list) list;
-    link_universes: (string * string * string list) list; } [@@deriving yojson, ord]
+type solve_result = {
+  compile_universes : (string * string * string list) list;
+  link_universes : (string * string * string list) list;
+}
+[@@deriving yojson, ord]


(** A set of packages for a single build. *)
module Selection = struct
@@ -40,7 +42,15 @@ module Solve_request = struct
[@@deriving yojson]


let pp_constraint ppf (pkg, rel, vsn) =
-    Format.fprintf ppf "%s%s%s" pkg (match rel with | `Eq -> "=" | `Geq -> ">=" | `Gt -> ">" | `Leq -> "<=" | `Lt -> "<" | `Neq -> "<>") vsn
+    Format.fprintf ppf "%s%s%s" pkg
+      (match rel with
+      | `Eq -> "="
+      | `Geq -> ">="
+      | `Gt -> ">"
+      | `Leq -> "<="
+      | `Lt -> "<"
+      | `Neq -> "<>")
+      vsn
end


(** The response from the solver. *)
File "src/solver/main.ml", line 1, characters 0-0:
diff --git a/_build/default/src/solver/main.ml b/_build/default/src/solver/.formatted/main.ml
index 52e95bb..05bda32 100644
--- a/_build/default/src/solver/main.ml
+++ b/_build/default/src/solver/.formatted/main.ml
@@ -76,8 +76,9 @@ let () =
export service ~on:Lwt_unix.stdin)
| [| _prog; "--worker"; hash |] ->
Solver.main (Git_unix.Store.Hash.of_hex hash)
-  | [| _prog; "test"; |] ->
-      Solver.test (Git_unix.Store.Hash.of_hex "ac01ad6037c0bdcca9f67fe49cd54475b585f9b2")
+  | [| _prog; "test" |] ->
+      Solver.test
+        (Git_unix.Store.Hash.of_hex "ac01ad6037c0bdcca9f67fe49cd54475b585f9b2")
| args ->
Fmt.failwith "Usage: ocaml-ci-solver (got %a)"
Fmt.(array (quote string))
File "src/lib/epoch.mli", line 1, characters 0-0:
diff --git a/_build/default/src/lib/epoch.mli b/_build/default/src/lib/.formatted/epoch.mli
index e31dd99..fa7fab7 100644
--- a/_build/default/src/lib/epoch.mli
+++ b/_build/default/src/lib/.formatted/epoch.mli
@@ -1,6 +1,5 @@
type t


val v : Config.t -> t
-
val digest : t -> string
val pp : t Fmt.t
File "src/lib/live.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/live.ml b/_build/default/src/lib/.formatted/live.ml
index 9ae3877..1901f07 100644
--- a/_build/default/src/lib/live.ml
+++ b/_build/default/src/lib/.formatted/live.ml
@@ -4,9 +4,7 @@ let set_current ~ssh name generation =
let open Current.Syntax in
Current.component "Set current folder"
|> let> generation in
-     let new_generation_folder =
-       Storage.Base.generation_folder generation
-     in
+     let new_generation_folder = Storage.Base.generation_folder generation in
let storage_folder =
Fpath.(of_string (Ssh.storage_folder ssh) |> Result.get_ok)
in
@@ -18,9 +16,7 @@ let set_live ~ssh name generation =
let open Current.Syntax in
Current.component "Set live folder"
|> let> generation in
-     let new_generation_folder =
-       Storage.Base.generation_folder generation
-     in
+     let new_generation_folder = Storage.Base.generation_folder generation in
let storage_folder =
Fpath.(of_string (Ssh.storage_folder ssh) |> Result.get_ok)
in
@@ -30,6 +26,4 @@ let set_live ~ssh name generation =


let set_to ~ssh name generation =
Current.all
-    [
-      set_current ~ssh name generation; set_live ~ssh name generation;
-    ]
+    [ set_current ~ssh name generation; set_live ~ssh name generation ]
File "src/lib/compile.mli", line 1, characters 0-0:
diff --git a/_build/default/src/lib/compile.mli b/_build/default/src/lib/.formatted/compile.mli
index a538cdf..4dc2238 100644
--- a/_build/default/src/lib/compile.mli
+++ b/_build/default/src/lib/.formatted/compile.mli
@@ -5,13 +5,19 @@
the compilation, link and html generation steps, outputting the results in
the compile/ and html/ folders. *)


-type hashes = { compile_hash : string option; linked_hash : string option; html_hash : string option }
+type hashes = {
+  compile_hash : string option;
+  linked_hash : string option;
+  html_hash : string option;
+}


type t
(** A compiled package *)


-type jobty = | CompileAndLink | CompileOnly | LinkOnly
-(** The type of compilation job *)
+type jobty =
+  | CompileAndLink
+  | CompileOnly
+  | LinkOnly  (** The type of compilation job *)


val hashes : t -> hashes
(** Hash of the compiled artifacts *)
File "src/lib/live.mli", line 1, characters 0-0:
diff --git a/_build/default/src/lib/live.mli b/_build/default/src/lib/.formatted/live.mli
index 30fd180..d4e67fc 100644
--- a/_build/default/src/lib/live.mli
+++ b/_build/default/src/lib/.formatted/live.mli
@@ -1,5 +1 @@
-val set_to :
-  ssh:Config.Ssh.t ->
-  string ->
-  Epoch.t Current.t ->
-  unit Current.t
+val set_to : ssh:Config.Ssh.t -> string -> Epoch.t Current.t -> unit Current.t
File "src/lib/record.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/record.ml b/_build/default/src/lib/.formatted/record.ml
index 7b71be8..c72f873 100644
--- a/_build/default/src/lib/record.ml
+++ b/_build/default/src/lib/.formatted/record.ml
@@ -1,4 +1,3 @@
-
let v config =
let open Lwt.Syntax in
let generation = Epoch.v config in
@@ -7,9 +6,7 @@ let v config =
let epoch_html = Epoch.digest generation in


let result =
-    Index.record_new_pipeline
-      ~odoc_commit ~epoch_html
-      ~epoch_linked
+    Index.record_new_pipeline ~odoc_commit ~epoch_html ~epoch_linked
in
match result with
| Ok pipeline_id -> Lwt.return_ok (pipeline_id |> Int64.to_int)
File "src/lib/prep.mli", line 1, characters 0-0:
diff --git a/_build/default/src/lib/prep.mli b/_build/default/src/lib/.formatted/prep.mli
index ce07fe0..5e25d50 100644
--- a/_build/default/src/lib/prep.mli
+++ b/_build/default/src/lib/.formatted/prep.mli
@@ -1,8 +1,7 @@
type t
(** The type for a prepped package (build objects in a universe/package folder) *)


-module OpamFiles :sig
-
+module OpamFiles : sig
type t = No_context


module Key : sig
@@ -10,15 +9,17 @@ module OpamFiles :sig
end


module Value : sig
-    type t = ((bool * string), [`Msg of string]) result OpamPackage.Map.t
+    type t = (bool * string, [ `Msg of string ]) result OpamPackage.Map.t
[@@deriving yojson]
end
end


module OpamFilesCache : sig
-  val get : ?schedule:Current_cache.Schedule.t ->
+  val get :
+    ?schedule:Current_cache.Schedule.t ->
OpamFiles.t ->
-    OpamFiles.Key.t -> OpamFiles.Value.t Current.Primitive.t
+    OpamFiles.Key.t ->
+    OpamFiles.Value.t Current.Primitive.t
end


val hash : t -> string
ocamlformat: ignoring "src/lib/misc.ml" (misplaced documentation comments - warning 50)
File "src/lib/misc.ml", line 64, characters 0-31:
64 | (** Select base image to use *)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Warning 50 [unexpected-docstring]: ambiguous documentation comment
Hint: (Warning 50) This file contains a documentation comment (** ... *) that the OCaml compiler does not know how to attach to the AST. OCamlformat does not support these cases. You can find more information at: https://github.com/ocaml-ppx/ocamlformat#overview. If you'd like to disable this check and let ocamlformat make a choice (though it might not be consistent with the ocaml compilers and odoc), you can set the --no-comment-check option.
-> required by _build/default/src/lib/.formatted/misc.ml
-> required by alias src/lib/.formatted/fmt
-> required by alias src/lib/fmt
File "src/lib/storage.mli", line 1, characters 0-0:
diff --git a/_build/default/src/lib/storage.mli b/_build/default/src/lib/.formatted/storage.mli
index 5230ae1..b86d55d 100644
--- a/_build/default/src/lib/storage.mli
+++ b/_build/default/src/lib/.formatted/storage.mli
@@ -8,7 +8,12 @@ type repository =
val folder : repository -> Package.t -> Fpath.t


module Base : sig
-  type repository = HtmlRaw of Epoch.t | Linked of Epoch.t | Compile of Epoch.t | Prep | Prep0
+  type repository =
+    | HtmlRaw of Epoch.t
+    | Linked of Epoch.t
+    | Compile of Epoch.t
+    | Prep
+    | Prep0


val folder : repository -> Fpath.t
val generation_folder : Epoch.t -> Fpath.t
File "src/lib/epoch.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/epoch.ml b/_build/default/src/lib/.formatted/epoch.ml
index d10e48a..1b22f57 100644
--- a/_build/default/src/lib/epoch.ml
+++ b/_build/default/src/lib/.formatted/epoch.ml
@@ -1,15 +1,15 @@
-type t = { config : Config.t; }
+type t = { config : Config.t }


let version = "v2"
-let v config = { config; }
+let v config = { config }


let digest t =
let key =
-    Fmt.str "%s:%s:%s" version (Config.odoc t.config) (Config.sherlodoc t.config)
+    Fmt.str "%s:%s:%s" version (Config.odoc t.config)
+      (Config.sherlodoc t.config)
in
key |> Digest.string |> Digest.to_hex


let pp f t =
-  Fmt.pf f
-    "docs-ci: %s\nodoc: %s\nsherlodoc: %s"
-    version (Config.odoc t.config) (Config.sherlodoc t.config)
+  Fmt.pf f "docs-ci: %s\nodoc: %s\nsherlodoc: %s" version (Config.odoc t.config)
+    (Config.sherlodoc t.config)
File "src/lib/config.mli", line 1, characters 0-0:
diff --git a/_build/default/src/lib/config.mli b/_build/default/src/lib/.formatted/config.mli
index 77b0449..5d05c31 100644
--- a/_build/default/src/lib/config.mli
+++ b/_build/default/src/lib/.formatted/config.mli
@@ -48,4 +48,4 @@ val take_n_last_versions : t -> int option
(** Number of versions to take (None for all) *)


val cache_threshold : t -> int
-(** Number of versions to keep in the cache *)
\ No newline at end of file
+(** Number of versions to keep in the cache *)
File "src/solver/solver.ml", line 1, characters 0-0:
diff --git a/_build/default/src/solver/solver.ml b/_build/default/src/solver/.formatted/solver.ml
index cd90716..956eb9f 100644
--- a/_build/default/src/solver/solver.ml
+++ b/_build/default/src/solver/.formatted/solver.ml
@@ -14,53 +14,59 @@ let env (vars : Worker.Vars.t) =
let get_names = OpamFormula.fold_left (fun a (name, _) -> name :: a) []


let universes ~packages (resolutions : OpamPackage.t list) =
-
let aux root =
-      let name, version = (OpamPackage.name root, OpamPackage.version root) in
-      let opamfile : OpamFile.OPAM.t =
-        packages
-        |> OpamPackage.Name.Map.find name
-        |> OpamPackage.Version.Map.find version
-      in
-      let deps =
-        opamfile
-        |> OpamFile.OPAM.depends
-        |> OpamFilter.partial_filter_formula
-              (OpamFilter.deps_var_env ~build:true ~post:false ~test:false
-                ~doc:false ~dev_setup:false ~dev:false)
-        |> get_names
-        |> OpamPackage.Name.Set.of_list
-      in
-      let depopts =
-        opamfile
-        |> OpamFile.OPAM.depopts
-        |> OpamFilter.partial_filter_formula
-              (OpamFilter.deps_var_env ~build:true ~post:false ~test:false
-                ~doc:false ~dev_setup:false ~dev:false)
-        |> get_names
-        |> OpamPackage.Name.Set.of_list
-      in
-      let all_deps = OpamPackage.Name.Set.union deps depopts in
-      let deps =
-        resolutions
-        |> List.filter (fun res ->
-                let name = OpamPackage.name res in
-                OpamPackage.Name.Set.mem name all_deps)
-      in
-      let result =
-        OpamPackage.Set.of_list deps
-      in
-      result
+    let name, version = (OpamPackage.name root, OpamPackage.version root) in
+    let opamfile : OpamFile.OPAM.t =
+      packages
+      |> OpamPackage.Name.Map.find name
+      |> OpamPackage.Version.Map.find version
+    in
+    let deps =
+      opamfile
+      |> OpamFile.OPAM.depends
+      |> OpamFilter.partial_filter_formula
+           (OpamFilter.deps_var_env ~build:true ~post:false ~test:false
+              ~doc:false ~dev_setup:false ~dev:false)
+      |> get_names
+      |> OpamPackage.Name.Set.of_list
+    in
+    let depopts =
+      opamfile
+      |> OpamFile.OPAM.depopts
+      |> OpamFilter.partial_filter_formula
+           (OpamFilter.deps_var_env ~build:true ~post:false ~test:false
+              ~doc:false ~dev_setup:false ~dev:false)
+      |> get_names
+      |> OpamPackage.Name.Set.of_list
+    in
+    let all_deps = OpamPackage.Name.Set.union deps depopts in
+    let deps =
+      resolutions
+      |> List.filter (fun res ->
+             let name = OpamPackage.name res in
+             OpamPackage.Name.Set.mem name all_deps)
+    in
+    let result = OpamPackage.Set.of_list deps in
+    result
+  in
+  let simple_deps =
+    List.fold_left
+      (fun acc pkg -> OpamPackage.Map.add pkg (aux pkg) acc)
+      OpamPackage.Map.empty resolutions
in
-  let simple_deps = List.fold_left (fun acc pkg -> OpamPackage.Map.add pkg (aux pkg) acc) OpamPackage.Map.empty resolutions in
-
+
let rec closure pkgs =
-    let deps = List.map (fun pkg -> OpamPackage.Map.find pkg simple_deps) (OpamPackage.Set.to_list pkgs) in
+    let deps =
+      List.map
+        (fun pkg -> OpamPackage.Map.find pkg simple_deps)
+        (OpamPackage.Set.to_list pkgs)
+    in
let all = List.fold_left OpamPackage.Set.union OpamPackage.Set.empty deps in
let new_deps = OpamPackage.Set.diff all pkgs in
-    if OpamPackage.Set.is_empty new_deps then pkgs else closure (OpamPackage.Set.union pkgs all)
+    if OpamPackage.Set.is_empty new_deps then pkgs
+    else closure (OpamPackage.Set.union pkgs all)
in
-
+
List.rev_map
(fun pkg ->
let name, version = (OpamPackage.name pkg, OpamPackage.version pkg) in
@@ -70,16 +76,23 @@ let universes ~packages (resolutions : OpamPackage.t list) =
|> OpamPackage.Version.Map.find version
in
let str = OpamFile.OPAM.write_to_string opamfile in
-      (pkg, str, closure (OpamPackage.Map.find pkg simple_deps) |> OpamPackage.Set.elements))
-      resolutions
+      ( pkg,
+        str,
+        closure (OpamPackage.Map.find pkg simple_deps)
+        |> OpamPackage.Set.elements ))
+    resolutions


-type solve_result = Worker.solve_result =
-  { compile_universes : (string * string * string list) list;
-    link_universes: (string * string * string list) list; } [@@deriving yojson]
+type solve_result = Worker.solve_result = {
+  compile_universes : (string * string * string list) list;
+  link_universes : (string * string * string list) list;
+}
+[@@deriving yojson]


let solve ~packages ~constraints ~root_pkgs (vars : Worker.Vars.t) =
let extended = Git_context.extend_packages packages in
-  let context = Git_context.create () ~packages:extended ~env:(env vars) ~constraints in
+  let context =
+    Git_context.create () ~packages:extended ~env:(env vars) ~constraints
+  in
let t0 = Unix.gettimeofday () in
let r = Solver.solve context root_pkgs in
let t1 = Unix.gettimeofday () in
@@ -99,12 +112,12 @@ let solve ~packages ~constraints ~root_pkgs (vars : Worker.Vars.t) =
univs
in
Ok
-        { compile_universes = map_universes compile_universes;
-          link_universes = map_universes link_universes }
+        {
+          compile_universes = map_universes compile_universes;
+          link_universes = map_universes link_universes;
+        }
| Error diagnostics -> Error (Solver.diagnostics diagnostics)


-
-
let test commit =
Format.eprintf "Running test\n%!";
let packages =
@@ -112,27 +125,38 @@ let test commit =
( Opam_repository.open_store () >>= fun store ->
Git_context.read_packages store commit )
in
-  let root_pkgs = List.map OpamPackage.Name.of_string ["ocaml";"ocaml-base-compiler";"vpnkit"] in
-  let constraints =
-   List.map (fun (name, rel, version) ->
-      ( OpamPackage.Name.of_string name,
-        (rel, OpamPackage.Version.of_string version) )) [("ocaml-base-compiler",`Geq, "4.08.0"); ("ocaml", `Leq, "5.2.0"); ("vpnkit", `Eq, "0.2.0")]
-        |> OpamPackage.Name.Map.of_list
-   in
-   let platform = {
-    Worker.Vars.arch = "x86_64";
-   os="linux";
-   os_distribution="linux";
-   os_family="ubuntu";
-   os_version="20.04";
-   } in
-   Format.eprintf "Calling solve\n%!";
-   match solve ~packages ~constraints ~root_pkgs platform with
-                 | Ok packages ->
-
-                     Printf.printf "%s\n" (solve_result_to_yojson packages |> Yojson.Safe.to_string)
-                 | Error msg -> Printf.printf "%s\n" msg
-
+  let root_pkgs =
+    List.map OpamPackage.Name.of_string
+      [ "ocaml"; "ocaml-base-compiler"; "vpnkit" ]
+  in
+  let constraints =
+    List.map
+      (fun (name, rel, version) ->
+        ( OpamPackage.Name.of_string name,
+          (rel, OpamPackage.Version.of_string version) ))
+      [
+        ("ocaml-base-compiler", `Geq, "4.08.0");
+        ("ocaml", `Leq, "5.2.0");
+        ("vpnkit", `Eq, "0.2.0");
+      ]
+    |> OpamPackage.Name.Map.of_list
+  in
+  let platform =
+    {
+      Worker.Vars.arch = "x86_64";
+      os = "linux";
+      os_distribution = "linux";
+      os_family = "ubuntu";
+      os_version = "20.04";
+    }
+  in
+  Format.eprintf "Calling solve\n%!";
+  match solve ~packages ~constraints ~root_pkgs platform with
+  | Ok packages ->
+      Printf.printf "%s\n"
+        (solve_result_to_yojson packages |> Yojson.Safe.to_string)
+  | Error msg -> Printf.printf "%s\n" msg
+
let main commit =
let packages =
Lwt_main.run
File "src/lib/storage.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/storage.ml b/_build/default/src/lib/.formatted/storage.ml
index 55903c6..9c42275 100644
--- a/_build/default/src/lib/storage.ml
+++ b/_build/default/src/lib/.formatted/storage.ml
@@ -1,16 +1,18 @@
module Base = struct
-  type repository = HtmlRaw of Epoch.t | Linked of Epoch.t | Compile of Epoch.t | Prep | Prep0
+  type repository =
+    | HtmlRaw of Epoch.t
+    | Linked of Epoch.t
+    | Compile of Epoch.t
+    | Prep
+    | Prep0


let generation_folder generation =
Fpath.(v ("epoch-" ^ Epoch.digest generation))


let folder = function
-    | HtmlRaw generation ->
-        Fpath.(generation_folder generation / "html-raw")
-    | Linked generation ->
-        Fpath.(generation_folder generation / "linked")
-    | Compile generation ->
-        Fpath.(generation_folder generation / "compile")
+    | HtmlRaw generation -> Fpath.(generation_folder generation / "html-raw")
+    | Linked generation -> Fpath.(generation_folder generation / "linked")
+    | Compile generation -> Fpath.(generation_folder generation / "compile")
| Prep -> Fpath.v "prep"
| Prep0 -> Fpath.v "prep0"
end
@@ -50,17 +52,16 @@ let folder repository package =
Base.folder (to_base_repo repository)
// base_folder ~blessed ~prep:(repository = Prep) package)


-let cache repository package =
-  folder repository package
-
+let cache repository package = folder repository package
+
let split packages =
let rec take n l =
-    match n,l with
-    | 0, _ -> [], l
-    | n, x::xs ->
-      let taken, rest = take (n-1) xs in
-      x :: taken, rest
-    | _, [] -> [], []
+    match (n, l) with
+    | 0, _ -> ([], l)
+    | n, x :: xs ->
+        let taken, rest = take (n - 1) xs in
+        (x :: taken, rest)
+    | _, [] -> ([], [])
in
let rec run remaining =
match take 10 remaining with
@@ -91,13 +92,15 @@ module Tar = struct
match extra_files with
| [] ->
Fmt.str
-          "HASH=$((sha256sum $1/content.tar 2>/dev/null | cut -d \" \" -f 1)  || echo -n \
-           'empty'); rm -f $1/content.tar; printf \"%s:$2:$HASH\\n\";"
+          "HASH=$((sha256sum $1/content.tar 2>/dev/null | cut -d \" \" -f 1)  \
+           || echo -n 'empty'); rm -f $1/content.tar; printf \
+           \"%s:$2:$HASH\\n\";"
prefix
| extra_files ->
Fmt.str
"HASH=$((sha256sum $1/content.tar %s | sort | sha256sum | cut -d \" \
-           \" -f 1)  || echo -n 'empty'); rm $1/content.tar; printf \"%s:$2:$HASH\\n\";"
+           \" -f 1)  || echo -n 'empty'); rm $1/content.tar; printf \
+           \"%s:$2:$HASH\\n\";"
(List.map (fun f -> "\"$1/" ^ f ^ "\"") extra_files
|> String.concat " ")
prefix
File "src/lib/voodoo.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/voodoo.ml b/_build/default/src/lib/.formatted/voodoo.ml
index fead1c5..719d27c 100644
--- a/_build/default/src/lib/voodoo.ml
+++ b/_build/default/src/lib/.formatted/voodoo.ml
@@ -12,13 +12,18 @@ module Prep = struct
base
|> Spec.add
[
-           run ~network ~cache "%s" @@ Misc.Cmd.list [
-             "sudo apt-get update && sudo apt-get install -yy m4 pkg-config";
-           Fmt.str "opam pin -ny opamh %s"
-             "https://github.com/jonludlam/opamh.git#d54dbe7991af6020c36f89c300d8109664541963 && opam install -y opamh";
-           "cp $(opam config var bin)/opamh /home/opam";
-           "rm -rf $(opam config var prefix)"
-         ]]
+           run ~network ~cache "%s"
+           @@ Misc.Cmd.list
+                [
+                  "sudo apt-get update && sudo apt-get install -yy m4 \
+                   pkg-config";
+                  Fmt.str "opam pin -ny opamh %s"
+                    "https://github.com/jonludlam/opamh.git#d54dbe7991af6020c36f89c300d8109664541963 \
+                     && opam install -y opamh";
+                  "cp $(opam config var bin)/opamh /home/opam";
+                  "rm -rf $(opam config var prefix)";
+                ];
+         ]
end


module Odoc = struct
@@ -27,35 +32,44 @@ module Odoc = struct
base
|> Spec.add
[
-           run ~network ~cache "%s" @@ Misc.Cmd.list [
-            "sudo apt-get update && sudo apt-get install -yy m4";
-            Fmt.str "opam pin -ny odoc-parser.dev %s && opam depext -iy odoc-parser"
-             (Config.odoc config);
-           Fmt.str  "opam pin -ny odoc.dev %s && opam depext -iy odoc"
-             (Config.odoc config);
-            "cp $(opam config var bin)/odoc /home/opam";
-           "rm -rf $(opam config var prefix)"
-         ]]
+           run ~network ~cache "%s"
+           @@ Misc.Cmd.list
+                [
+                  "sudo apt-get update && sudo apt-get install -yy m4";
+                  Fmt.str
+                    "opam pin -ny odoc-parser.dev %s && opam depext -iy \
+                     odoc-parser"
+                    (Config.odoc config);
+                  Fmt.str "opam pin -ny odoc.dev %s && opam depext -iy odoc"
+                    (Config.odoc config);
+                  "cp $(opam config var bin)/odoc /home/opam";
+                  "rm -rf $(opam config var prefix)";
+                ];
+         ]
end


module OdocDriver = struct
-
let spec ~base ~odoc_pin ~sherlodoc_pin =
let open Obuilder_spec in
base
|> Spec.add
[
-           run ~network ~cache "%s" @@
-            Misc.Cmd.list
-              ["sudo apt-get update";
-                Fmt.str "opam pin -ny sherlodoc.dev %s"
-                  sherlodoc_pin;
-                Fmt.str "opam pin -ny odoc-parser.dev %s && opam pin -ny odoc-md.dev %s &&  opam pin -ny odoc.dev %s && opam pin -ny odoc-driver.dev %s"
-                  odoc_pin odoc_pin odoc_pin odoc_pin;
-                "opam install -y odoc-md";
-                "opam install -y odoc-driver sherlodoc";
-                 "cp $(opam config var bin)/odoc_driver_voodoo $(opam config var bin)/sherlodoc $(opam config var bin)/odoc-md /home/opam";
-                "rm -rf $(opam config var prefix)"]
+           run ~network ~cache "%s"
+           @@ Misc.Cmd.list
+                [
+                  "sudo apt-get update";
+                  Fmt.str "opam pin -ny sherlodoc.dev %s" sherlodoc_pin;
+                  Fmt.str
+                    "opam pin -ny odoc-parser.dev %s && opam pin -ny \
+                     odoc-md.dev %s &&  opam pin -ny odoc.dev %s && opam pin \
+                     -ny odoc-driver.dev %s"
+                    odoc_pin odoc_pin odoc_pin odoc_pin;
+                  "opam install -y odoc-md";
+                  "opam install -y odoc-driver sherlodoc";
+                  "cp $(opam config var bin)/odoc_driver_voodoo $(opam config \
+                   var bin)/sherlodoc $(opam config var bin)/odoc-md \
+                   /home/opam";
+                  "rm -rf $(opam config var prefix)";
+                ];
]
-
end
File "src/lib/track.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/track.ml b/_build/default/src/lib/.formatted/track.ml
index eeb24ed..d7de969 100644
--- a/_build/default/src/lib/track.ml
+++ b/_build/default/src/lib/.formatted/track.ml
@@ -81,7 +81,8 @@ module Track = struct
let filter name =
match filter with [] -> true | lst -> List.mem (Fpath.basename name) lst
in
-    Log.info (fun f -> f "Tracking packages in %a" Fpath.pp (Git.Commit.repo repo));
+    Log.info (fun f ->
+        f "Tracking packages in %a" Fpath.pp (Git.Commit.repo repo));
let* () = Current.Job.start ~level:Harmless job in
Git.with_checkout ~job repo @@ fun dir ->
let result =
File "src/solver/service.ml", line 1, characters 0-0:
diff --git a/_build/default/src/solver/service.ml b/_build/default/src/solver/.formatted/service.ml
index 82386c9..d84705a 100644
--- a/_build/default/src/solver/service.ml
+++ b/_build/default/src/solver/.formatted/service.ml
@@ -92,15 +92,20 @@ end = struct
| _ -> Fmt.failwith "BUG: bad output: %s" results)


let handle ~log request t =
-    let { Worker.Solve_request.opam_repository_commit; platforms; pkgs; constraints } =
+    let {
+      Worker.Solve_request.opam_repository_commit;
+      platforms;
+      pkgs;
+      constraints;
+    } =
request
in
-    Log.info log "Solving for %a, constraints %a using opam_repository_commit %s"
+    Log.info log
+      "Solving for %a, constraints %a using opam_repository_commit %s"
Fmt.(list ~sep:comma string)
pkgs
Fmt.(list ~sep:comma Worker.Solve_request.pp_constraint)
-      constraints
-      opam_repository_commit;
+      constraints opam_repository_commit;
let opam_repository_commit = Store.Hash.of_hex opam_repository_commit in
platforms
|> Lwt_list.map_p (fun p ->
@@ -110,7 +115,9 @@ end = struct
| Error _ as e -> Lwt.return (id, e)
| Ok packages ->
let repo_packages =
-                 List.map (fun (pkg, _opam, _) -> OpamPackage.of_string pkg) packages.link_universes
+                 List.map
+                   (fun (pkg, _opam, _) -> OpamPackage.of_string pkg)
+                   packages.link_universes
in
Opam_repository.oldest_commit_with repo_packages
~from:opam_repository_commit ~log
File "src/lib/track.mli", line 1, characters 0-0:
diff --git a/_build/default/src/lib/track.mli b/_build/default/src/lib/.formatted/track.mli
index 9681d96..50774e3 100644
--- a/_build/default/src/lib/track.mli
+++ b/_build/default/src/lib/.formatted/track.mli
@@ -2,6 +2,7 @@ type t [@@deriving yojson]


val digest : t -> string
val pkg : t -> OpamPackage.t
+
val v :
limit:int option ->
filter:string list ->
File "src/solver/git_context.ml", line 1, characters 0-0:
diff --git a/_build/default/src/solver/git_context.ml b/_build/default/src/solver/.formatted/git_context.ml
index e3c302b..e5dd648 100644
--- a/_build/default/src/solver/git_context.ml
+++ b/_build/default/src/solver/.formatted/git_context.ml
@@ -28,8 +28,8 @@ let filter_deps t pkg f =
let test = OpamPackage.Name.Set.mem (OpamPackage.name pkg) t.test in
f
|> OpamFilter.partial_filter_formula (env t pkg)
-  |> OpamFilter.filter_deps ~build:true ~post:true ~test ~doc:false ~dev ~dev_setup:false
-       ~default:false
+  |> OpamFilter.filter_deps ~build:true ~post:true ~test ~doc:false ~dev
+       ~dev_setup:false ~default:false


let candidates t name =
match OpamPackage.Name.Map.find_opt name t.pins with
@@ -89,22 +89,34 @@ let read_package store pkg hash =
)


let extend_packages packages =
-  OpamPackage.Name.Map.map (fun versions ->
-    OpamPackage.Version.Map.map (fun opam ->
-      let extensions = OpamFile.OPAM.extensions opam in
-      let pp = OpamFormat.V.(package_formula `Conj (filtered_constraints ext_version)) in
-      (try
-        let extra_doc_deps = OpamStd.String.Map.find "x-extra-doc-deps" extensions in
-        let raw = OpamPp.parse pp ~pos:OpamTypesBase.pos_null extra_doc_deps in
-        let deps = OpamFile.OPAM.depends opam in
-        let x = (OpamFormula.ands_to_list raw) in
-        let y = (OpamFormula.ands_to_list deps) in
-        let deps = x @ y |> OpamFormula.ands in
-        let opam = OpamFile.OPAM.with_depends deps opam in
-        Format.eprintf "Extended dependencies for %s:\n%!" (OpamFile.OPAM.bug_reports opam |> String.concat ", ");
-        Format.eprintf "%s\n%!" (OpamFile.OPAM.write_to_string opam);
-        opam
-      with Not_found -> opam)) versions) packages
+  OpamPackage.Name.Map.map
+    (fun versions ->
+      OpamPackage.Version.Map.map
+        (fun opam ->
+          let extensions = OpamFile.OPAM.extensions opam in
+          let pp =
+            OpamFormat.V.(
+              package_formula `Conj (filtered_constraints ext_version))
+          in
+          try
+            let extra_doc_deps =
+              OpamStd.String.Map.find "x-extra-doc-deps" extensions
+            in
+            let raw =
+              OpamPp.parse pp ~pos:OpamTypesBase.pos_null extra_doc_deps
+            in
+            let deps = OpamFile.OPAM.depends opam in
+            let x = OpamFormula.ands_to_list raw in
+            let y = OpamFormula.ands_to_list deps in
+            let deps = x @ y |> OpamFormula.ands in
+            let opam = OpamFile.OPAM.with_depends deps opam in
+            Format.eprintf "Extended dependencies for %s:\n%!"
+              (OpamFile.OPAM.bug_reports opam |> String.concat ", ");
+            Format.eprintf "%s\n%!" (OpamFile.OPAM.write_to_string opam);
+            opam
+          with Not_found -> opam)
+        versions)
+    packages


(* Get a map of the versions inside [entry] (an entry under "packages") *)
let read_versions store (entry : Store.Value.Tree.entry) =
File "src/lib/index.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/index.ml b/_build/default/src/lib/.formatted/index.ml
index e4e6043..7d4ba76 100644
--- a/_build/default/src/lib/index.ml
+++ b/_build/default/src/lib/.formatted/index.ml
@@ -126,8 +126,8 @@ let db =
pipeline_id = ?"
and get_pipeline_data =
Sqlite3.prepare db
-         "SELECT epoch_html, epoch_linked, odoc_commit FROM docs_ci_pipeline_index \
-          WHERE id = ?"
+         "SELECT epoch_html, epoch_linked, odoc_commit FROM \
+          docs_ci_pipeline_index WHERE id = ?"
in


{
@@ -164,12 +164,7 @@ let record_new_pipeline ~odoc_commit ~epoch_html ~epoch_linked =
let t = Lazy.force db in
match
Db.query_one t.record_pipeline
-      Sqlite3.Data.
-        [
-          TEXT epoch_html;
-          TEXT epoch_linked;
-          TEXT odoc_commit;
-        ]
+      Sqlite3.Data.[ TEXT epoch_html; TEXT epoch_linked; TEXT odoc_commit ]
with
| Sqlite3.Data.[ INT pipeline_id ] -> Ok pipeline_id
| _ -> Error "Failed to record pipeline."
@@ -251,33 +246,15 @@ let get_pipeline_data pipeline_id =
NULL;
NULL;
] ->
-           ( epoch_html,
-             epoch_linked,
-             ""
-             )
-       | Sqlite3.Data.
-           [
-             TEXT epoch_html;
-             TEXT epoch_linked;
-             TEXT odoc_commit;
-           ] ->
-           ( epoch_html,
-             epoch_linked,
-             odoc_commit )
+           (epoch_html, epoch_linked, "")
+       | Sqlite3.Data.[ TEXT epoch_html; TEXT epoch_linked; TEXT odoc_commit ]
+         ->
+           (epoch_html, epoch_linked, odoc_commit)
| row -> Fmt.failwith "get_pipeline_data: invalid row %a" Db.dump_row row
in
match result with
-  | [
-   ( epoch_html,
-     epoch_linked,
-     odoc_commit );
-  ] ->
-      Some
-        {
-          epoch_html;
-          epoch_linked;
-          odoc_commit;
-        }
+  | [ (epoch_html, epoch_linked, odoc_commit) ] ->
+      Some { epoch_html; epoch_linked; odoc_commit }
| _ -> None


(* packages - (name, version) that are failing in the latest pipeline that are passing in the latest but one *)
File "src/lib/package.mli", line 1, characters 0-0:
diff --git a/_build/default/src/lib/package.mli b/_build/default/src/lib/.formatted/package.mli
index 912665e..cbcb906 100644
--- a/_build/default/src/lib/package.mli
+++ b/_build/default/src/lib/.formatted/package.mli
@@ -22,6 +22,7 @@ and Package : sig
end


type t = Package.t
+
val to_yojson : t -> Yojson.Safe.t
val of_yojson : Yojson.Safe.t -> t Ppx_deriving_yojson_runtime.error_or


File "src/lib/package.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/package.ml b/_build/default/src/lib/.formatted/package.ml
index 8462a4a..63d7d9a 100644
--- a/_build/default/src/lib/package.ml
+++ b/_build/default/src/lib/.formatted/package.ml
@@ -1,17 +1,17 @@
module Ocaml_version = struct
include Ocaml_version


-  let to_yojson x =
-    `String (Ocaml_version.to_string x)
+  let to_yojson x = `String (Ocaml_version.to_string x)


let of_yojson x =
match x with
-    | `String s ->
-      (match Ocaml_version.of_string s with | Ok x -> Ok x | Error (`Msg s) -> Error s)
-    | _ -> Error ("Ocaml_version.of_yojson")
+    | `String s -> (
+        match Ocaml_version.of_string s with
+        | Ok x -> Ok x
+        | Error (`Msg s) -> Error s)
+    | _ -> Error "Ocaml_version.of_yojson"
end


-
module rec Universe : sig
type t [@@deriving yojson]


@@ -24,15 +24,18 @@ module rec Universe : sig
val v : Ocaml_version.t -> Package.t list -> t
val compare : t -> t -> int
end = struct
-  type t = { ocaml_version : Ocaml_version.t; hash : string; deps : Package.t list; mutable extra_link_deps : Package.t list; } [@@deriving yojson]
+  type t = {
+    ocaml_version : Ocaml_version.t;
+    hash : string;
+    deps : Package.t list;
+    mutable extra_link_deps : Package.t list;
+  }
+  [@@deriving yojson]


let hash t = t.hash
let deps t = t.deps
-
let ocaml_version t = t.ocaml_version
-
let set_extra_link_deps t eld = t.extra_link_deps <- eld
-
let extra_link_deps t = t.extra_link_deps


let v ocaml_version deps =
@@ -65,7 +68,7 @@ and Package : sig
val v : Ocaml_version.t -> OpamPackage.t -> t list -> string -> t


val make :
-    ocaml_version : Ocaml_version.t ->
+    ocaml_version:Ocaml_version.t ->
blacklist:string list ->
commit:string ->
root:OpamPackage.t ->
@@ -73,7 +76,12 @@ and Package : sig
(OpamPackage.t * OpamPackage.t list) list ->
t
end = struct
-  type t = { ocaml_version : Ocaml_version.t; opam : O.OpamPackage.t; universe : Universe.t; commit : string }
+  type t = {
+    ocaml_version : Ocaml_version.t;
+    opam : O.OpamPackage.t;
+    universe : Universe.t;
+    commit : string;
+  }
[@@deriving yojson]


let universe t = t.universe
@@ -81,7 +89,9 @@ end = struct
let commit t = t.commit
let id t = OpamPackage.to_string t.opam ^ "-" ^ Universe.hash t.universe
let digest = id
-  let v ocaml_version opam deps commit = { ocaml_version; opam; universe = Universe.v ocaml_version deps; commit }
+
+  let v ocaml_version opam deps commit =
+    { ocaml_version; opam; universe = Universe.v ocaml_version deps; commit }


let pp f { universe; opam; _ } =
Fmt.pf f "%s; %a" (OpamPackage.to_string opam) Universe.pp universe
@@ -121,47 +131,60 @@ end = struct
pkg
in
let results = obtain root in
-    OpamPackage.Map.iter (fun opam_package pkg ->
-      let compile_deps = List.assoc opam_package compile_deps |> OpamPackage.Set.of_list in
-      let link_deps = List.assoc opam_package link_deps |> OpamPackage.Set.of_list in
-      let extras = OpamPackage.Set.diff link_deps compile_deps in
-      let extras =
-        if OpamPackage.Set.cardinal extras = 0 then []
-        else OpamPackage.Set.(elements (add opam_package extras))
-      in
-        let extras = List.map (fun opam_package -> obtain opam_package) extras in
-      Universe.set_extra_link_deps pkg.universe extras
-      ) !memo;
+    OpamPackage.Map.iter
+      (fun opam_package pkg ->
+        let compile_deps =
+          List.assoc opam_package compile_deps |> OpamPackage.Set.of_list
+        in
+        let link_deps =
+          List.assoc opam_package link_deps |> OpamPackage.Set.of_list
+        in
+        let extras = OpamPackage.Set.diff link_deps compile_deps in
+        let extras =
+          if OpamPackage.Set.cardinal extras = 0 then []
+          else OpamPackage.Set.(elements (add opam_package extras))
+        in
+        let extras =
+          List.map (fun opam_package -> obtain opam_package) extras
+        in
+        Universe.set_extra_link_deps pkg.universe extras)
+      !memo;
results
end


include Package


let topo_sort packages =
-  let graph = List.map (fun pkg ->
-    let universe = universe pkg in
-    let deps = Universe.deps universe in
-    (pkg, deps)
-    ) packages
+  let graph =
+    List.map
+      (fun pkg ->
+        let universe = universe pkg in
+        let deps = Universe.deps universe in
+        (pkg, deps))
+      packages
in
let rec loop graph =
match graph with
| [] -> []
-    | _ ->
-      let zero_deps,others = List.partition (fun (_,x) -> x = []) graph in
-      let zero_deps = List.map fst zero_deps in
-      let other = List.map (fun (x,y) -> (x, List.filter (fun dep -> not (List.mem dep zero_deps)) y)) others in
-      let sorted = List.sort compare zero_deps in
-      sorted :: loop other
+    | _ ->
+        let zero_deps, others = List.partition (fun (_, x) -> x = []) graph in
+        let zero_deps = List.map fst zero_deps in
+        let other =
+          List.map
+            (fun (x, y) ->
+              (x, List.filter (fun dep -> not (List.mem dep zero_deps)) y))
+            others
+        in
+        let sorted = List.sort compare zero_deps in
+        sorted :: loop other
in
List.flatten (loop graph)


-
+let all_deps pkg =
+  (pkg :: (pkg |> universe |> Universe.deps))
+  @ (pkg |> universe |> Universe.extra_link_deps)


-let all_deps pkg = pkg :: (pkg |> universe |> Universe.deps) @ (pkg |> universe |> Universe.extra_link_deps)
-
-let ocaml_version pkg =
-  pkg |> universe |> Universe.ocaml_version
+let ocaml_version pkg = pkg |> universe |> Universe.ocaml_version


module PackageMap = Map.Make (Package)
module PackageSet = Set.Make (Package)
@@ -240,8 +263,8 @@ module Map = PackageMap
module Set = PackageSet


let important_packages : Set.t ref = ref Set.empty
+
let add_important_packages packages =
important_packages := Set.union !important_packages packages
-let should_cache package =
-  Set.mem package !important_packages


+let should_cache package = Set.mem package !important_packages
File "src/lib/config.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/config.ml b/_build/default/src/lib/.formatted/config.ml
index c958614..abfa2bb 100644
--- a/_build/default/src/lib/config.ml
+++ b/_build/default/src/lib/.formatted/config.ml
@@ -1,11 +1,12 @@
open Cmdliner


let random =
-(*  In_channel.with_open_bin "/dev/urandom" (fun
-      ch ->
-        let str = String.init 4 (fun _ -> In_channel.input_byte ch |> Option.get |> Char.chr) in
-        let str = Base64.encode_exn str in
-        str)*) "NOTRANDOM"
+  (* In_channel.with_open_bin "/dev/urandom" (fun
+       ch ->
+         let str = String.init 4 (fun _ -> In_channel.input_byte ch |> Option.get |> Char.chr) in
+         let str = Base64.encode_exn str in
+         str)*)
+  "NOTRANDOM"


module Ssh = struct
type t = {
@@ -173,11 +174,10 @@ let take_n_last_versions =


let cache_threshold =
Arg.value
-  @@ Arg.opt Arg.(int) (10)
+  @@ Arg.opt Arg.(int) 10
@@ Arg.info ~doc:"Cache threshold" ~docv:"THRESHOLD" [ "cache-threshold" ]


-let v cap_file jobs track_packages
-    take_n_last_versions ssh cache_threshold =
+let v cap_file jobs track_packages take_n_last_versions ssh cache_threshold =
let vat = Capnp_rpc_unix.client_only_vat () in
let cap = Capnp_rpc_unix.Cap_file.load vat cap_file |> Result.get_ok in


@@ -217,7 +217,6 @@ let odoc _ =
"https://github.com/ocaml/odoc.git#90e679061f68c5e5ee5915e280f63d842f41f300"


let sherlodoc _ = odoc ()
-
let pool _ = "docs-pipeline"
let jobs t = t.jobs
let track_packages t = t.track_packages
@@ -226,4 +225,4 @@ let ocluster_connection_do t = t.ocluster_connection_do
let ocluster_connection_prep t = t.ocluster_connection_prep
let ocluster_connection_gen t = t.ocluster_connection_gen
let ssh t = t.ssh
-let cache_threshold t = t.cache_threshold
\ No newline at end of file
+let cache_threshold t = t.cache_threshold
File "src/lib/solver.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/solver.ml b/_build/default/src/lib/.formatted/solver.ml
index db63a0c..a727899 100644
--- a/_build/default/src/lib/solver.ml
+++ b/_build/default/src/lib/.formatted/solver.ml
@@ -74,7 +74,10 @@ let perform_constrained_solve ~solver ~pool ~job ~(platform : Platform.t) ~opam
(OpamPackage.of_string a, List.map OpamPackage.of_string b))
u
in
-          Ok (solution x.packages.compile_universes, solution x.packages.link_universes, x.commit)
+          Ok
+            ( solution x.packages.compile_universes,
+              solution x.packages.link_universes,
+              x.commit )
| Ok _ -> Fmt.error_msg "??"
| Error (`Msg msg) -> Fmt.error_msg "Error from solver: %s" msg)
(fun exn ->
@@ -92,8 +95,7 @@ let perform_solve ~solver ~pool ~job ~(platform : Platform.t) ~opam track =
in
let latest = Ocaml_version.Releases.latest |> Ocaml_version.to_string in
perform_constrained_solve ~solver ~pool ~job ~platform ~opam
-    (("ocaml-base-compiler", `Leq, latest)
-    :: constraints)
+    (("ocaml-base-compiler", `Leq, latest) :: constraints)


let solver_version = "v2"


@@ -128,10 +130,12 @@ module Cache = struct
match value with
| Error _ -> Printf.fprintf oc "Failed"
| Ok pkg ->
-        let all = Package.all_deps pkg in
-        List.iter (fun pkg ->
-          let opam = Package.opam pkg in
-          Printf.fprintf oc "%s\n" (OpamPackage.to_string opam)) all
+          let all = Package.all_deps pkg in
+          List.iter
+            (fun pkg ->
+              let opam = Package.opam pkg in
+              Printf.fprintf oc "%s\n" (OpamPackage.to_string opam))
+            all
in
close_out oc


@@ -149,14 +153,17 @@ type key = Track.t
type t = { successes : Track.t list; failures : Track.t list }


let keys t = t.successes
+
let get key =
-  Format.eprintf "Trying to 'get' %s\n%!" (Track.pkg key |> OpamPackage.to_string);
-   Cache.read key |> Option.get (* is in cache ? *) |> Result.get_ok
+  Format.eprintf "Trying to 'get' %s\n%!"
+    (Track.pkg key |> OpamPackage.to_string);
+  Cache.read key |> Option.get (* is in cache ? *) |> Result.get_ok


let failures t =
t.failures
|> List.filter_map (fun k ->
-         try Some (Track.pkg k, Cache.read k |> Option.get |> Result.get_error) with _ -> None)
+         try Some (Track.pkg k, Cache.read k |> Option.get |> Result.get_error)
+         with _ -> None)


(* is solved ? *)


@@ -214,22 +221,39 @@ module Solver = struct
let root = Track.pkg pkg in
let result =
match res with
-            | Ok (compile_packages, link_packages, commit) ->
+            | Ok (compile_packages, link_packages, commit) -> (
Current.Job.log job "Packages returned: ";
-                  begin try
-                    let root_deps = List.assoc root compile_packages in
-                    Current.Job.log job "Got the root package %s" (OpamPackage.to_string root);
-                    let ocaml_version = List.find
+                try
+                  let root_deps = List.assoc root compile_packages in
+                  Current.Job.log job "Got the root package %s"
+                    (OpamPackage.to_string root);
+                  let ocaml_version =
+                    List.find
(fun p ->
-                        Current.Job.log job "Checking %s" (OpamPackage.to_string p);
-                        List.mem (OpamPackage.name_to_string p) ["ocaml-base-compiler"; "ocaml"]) (root::root_deps) |> OpamPackage.version_to_string |> Ocaml_version.of_string_exn in
-                      Ok (Package.make ~ocaml_version ~blacklist ~commit ~root compile_packages link_packages)
-                    with Not_found ->
-                      Current.Job.log job "Package %s does not require OCaml" (OpamPackage.to_string root);
-                      let colon = Fmt.any ":" in
-                      Current.Job.log job "Packages returned: %a" Fmt.(list (pair ~sep:colon string (list ~sep:sp string))) (List.map (fun (a, b) -> (OpamPackage.to_string a, List.map OpamPackage.to_string b)) compile_packages);
-                      Error ("No OCaml dependency")
-                  end
+                        Current.Job.log job "Checking %s"
+                          (OpamPackage.to_string p);
+                        List.mem
+                          (OpamPackage.name_to_string p)
+                          [ "ocaml-base-compiler"; "ocaml" ])
+                      (root :: root_deps)
+                    |> OpamPackage.version_to_string
+                    |> Ocaml_version.of_string_exn
+                  in
+                  Ok
+                    (Package.make ~ocaml_version ~blacklist ~commit ~root
+                       compile_packages link_packages)
+                with Not_found ->
+                  Current.Job.log job "Package %s does not require OCaml"
+                    (OpamPackage.to_string root);
+                  let colon = Fmt.any ":" in
+                  Current.Job.log job "Packages returned: %a"
+                    Fmt.(list (pair ~sep:colon string (list ~sep:sp string)))
+                    (List.map
+                       (fun (a, b) ->
+                         ( OpamPackage.to_string a,
+                           List.map OpamPackage.to_string b ))
+                       compile_packages);
+                  Error "No OCaml dependency")
| Error (`Msg msg) ->
Current.Job.log job "Solving failed for %s: %s"
(OpamPackage.to_string root)
File "src/ocaml_docs_ci.ml", line 1, characters 0-0:
diff --git a/_build/default/src/ocaml_docs_ci.ml b/_build/default/src/.formatted/ocaml_docs_ci.ml
index 8b03642..720e87f 100644
--- a/_build/default/src/ocaml_docs_ci.ml
+++ b/_build/default/src/.formatted/ocaml_docs_ci.ml
@@ -108,7 +108,7 @@ let main () current_config github_auth mode capnp_public_address
run_capnp capnp_public_address capnp_listen_address
>>= fun (_vat, rpc_engine_resolver) ->
let repo_opam =
-          Git.clone ~schedule:hourly
+          Git.clone ~schedule:hourly
"https://github.com/ocaml/opam-repository.git"
in
let monitor = Docs_ci_lib.Monitor.make () in
File "src/lib/compile.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/compile.ml b/_build/default/src/lib/.formatted/compile.ml
index 2396983..06b0492 100644
--- a/_build/default/src/lib/compile.ml
+++ b/_build/default/src/lib/.formatted/compile.ml
@@ -1,8 +1,11 @@
-type hashes = { compile_hash : string option; linked_hash : string option; html_hash : string option }
+type hashes = {
+  compile_hash : string option;
+  linked_hash : string option;
+  html_hash : string option;
+}
[@@deriving yojson]


type t = { package : Package.t; blessing : Package.Blessing.t; hashes : hashes }
-
type jobty = CompileAndLink | CompileOnly | LinkOnly [@@deriving yojson]


let pp_jobty =
@@ -17,56 +20,72 @@ let hashes t = t.hashes
let blessing t = t.blessing
let package t = t.package


-let spec_success ~ssh ~base ~odoc_driver_base ~odoc_pin ~sherlodoc_pin ~config ~deps ~blessing ~generation ~jobty prep =
+let spec_success ~ssh ~base ~odoc_driver_base ~odoc_pin ~sherlodoc_pin ~config
+    ~deps ~blessing ~generation ~jobty prep =
let open Obuilder_spec in
let package = Prep.package prep in
let prep_folder = Storage.folder Prep package in
let prep0_folder = Storage.folder Prep0 package in
-  let compile_folder = Storage.folder (Compile (generation, blessing)) package in
+  let compile_folder =
+    Storage.folder (Compile (generation, blessing)) package
+  in
let linked_folder = Storage.folder (Linked (generation, blessing)) package in
let raw_folder = Storage.folder (HtmlRaw (generation, blessing)) package in
let opam = package |> Package.opam in
let name = opam |> OpamPackage.name_to_string in
let tools = Voodoo.Odoc.spec ~base config |> Spec.finish in
(* let compile_caches =
-    deps |> List.map (fun
-      {blessing; package; _} ->
-        let dir = Storage.folder (Compile blessing) package in
-        let fpath_strs = Fpath.segs dir in
-        let cache_name = String.concat "--" fpath_strs in
-        let dir = Fpath.(v "/home/opam/.cache/" // dir) in
-        Obuilder_spec.Cache.v cache_name ~target:(Fpath.to_string dir)
-        ) in *)
+     deps |> List.map (fun
+       {blessing; package; _} ->
+         let dir = Storage.folder (Compile blessing) package in
+         let fpath_strs = Fpath.segs dir in
+         let cache_name = String.concat "--" fpath_strs in
+         let dir = Fpath.(v "/home/opam/.cache/" // dir) in
+         Obuilder_spec.Cache.v cache_name ~target:(Fpath.to_string dir)
+         ) in *)
let common =
-    (List.map (fun { blessing; package; _ } ->
-      let dir = Storage.folder (Compile (generation, blessing)) package in
-      Fmt.str "~/docs/docs-ci-scripts/download_compiled.sh %s %s %s %s %b" (Config.Ssh.host ssh) (Config.Ssh.storage_folder ssh) (Fpath.to_string dir) (Package.digest package ^ "-" ^  Epoch.digest generation) (Package.should_cache package)
-      ) deps) @
-       [Fmt.str "~/docs/docs-ci-scripts/get_prep_for_compile.sh %s %s %s %s" (Config.Ssh.host ssh) (Config.Ssh.storage_folder ssh) (Fpath.to_string prep0_folder) (Fpath.to_string prep_folder);
+    List.map
+      (fun { blessing; package; _ } ->
+        let dir = Storage.folder (Compile (generation, blessing)) package in
+        Fmt.str "~/docs/docs-ci-scripts/download_compiled.sh %s %s %s %s %b"
+          (Config.Ssh.host ssh)
+          (Config.Ssh.storage_folder ssh)
+          (Fpath.to_string dir)
+          (Package.digest package ^ "-" ^ Epoch.digest generation)
+          (Package.should_cache package))
+      deps
+    @ [
+        Fmt.str "~/docs/docs-ci-scripts/get_prep_for_compile.sh %s %s %s %s"
+          (Config.Ssh.host ssh)
+          (Config.Ssh.storage_folder ssh)
+          (Fpath.to_string prep0_folder)
+          (Fpath.to_string prep_folder);
"export OCAMLRUNPAM=b";
-  ] in
+      ]
+  in
let post_compile =
[
-    Misc.tar_cmd compile_folder;
-    Fmt.str "time rsync -aR ./%s %s:%s/."
-      (Fpath.to_string compile_folder)
-      (Config.Ssh.host ssh)
-      (Config.Ssh.storage_folder ssh);
-    Fmt.str "set '%s'; %s"
-      (Fpath.to_string compile_folder)
-      (Storage.Tar.hash_command ~prefix:"COMPILE" ())]
+      Misc.tar_cmd compile_folder;
+      Fmt.str "time rsync -aR ./%s %s:%s/."
+        (Fpath.to_string compile_folder)
+        (Config.Ssh.host ssh)
+        (Config.Ssh.storage_folder ssh);
+      Fmt.str "set '%s'; %s"
+        (Fpath.to_string compile_folder)
+        (Storage.Tar.hash_command ~prefix:"COMPILE" ());
+    ]
in
let post_link_and_html =
[
-      Fmt.str "mkdir -p linked && mkdir -p %a && mv linked %a/"
-        Fpath.pp
+      Fmt.str "mkdir -p linked && mkdir -p %a && mv linked %a/" Fpath.pp
(Storage.Base.generation_folder generation)
Fpath.pp
(Storage.Base.generation_folder generation);
Fmt.str "mkdir -p %a" Fpath.pp linked_folder;
Misc.tar_cmd linked_folder;
Fmt.str "echo raw_folder: %s" (Fpath.to_string raw_folder);
-      Fmt.str "~/docs/docs-ci-scripts/gen_status_json.sh %s" (Fpath.to_string raw_folder);
+      Fmt.str "~/docs/docs-ci-scripts/gen_status_json.sh %s"
+        (Fpath.to_string raw_folder);
Fmt.str "time rsync -aR ./%s %s:%s/."
Fpath.(to_string (parent linked_folder))
(Config.Ssh.host ssh)
@@ -86,51 +105,88 @@ let spec_success ~ssh ~base ~odoc_driver_base ~odoc_pin ~sherlodoc_pin ~config ~
Fmt.str "set '%s' raw; %s"
(Fpath.to_string raw_folder)
(Storage.hash_command ~prefix:"RAW");
-      "rm -rf /home/opam/docs/*"
-     ]
+      "rm -rf /home/opam/docs/*";
+    ]
in
let compile_caches =
-    [Obuilder_spec.Cache.v "compile-cache" ~target:(Fmt.str "/home/opam/.cache/%a/compile" Fpath.pp (Storage.Base.generation_folder generation))] in
-  let odoc_driver = Voodoo.OdocDriver.spec ~base:odoc_driver_base ~odoc_pin ~sherlodoc_pin |> Spec.finish in
+    [
+      Obuilder_spec.Cache.v "compile-cache"
+        ~target:
+          (Fmt.str "/home/opam/.cache/%a/compile" Fpath.pp
+             (Storage.Base.generation_folder generation));
+    ]
+  in
+  let odoc_driver =
+    Voodoo.OdocDriver.spec ~base:odoc_driver_base ~odoc_pin ~sherlodoc_pin
+    |> Spec.finish
+  in
base
|> Spec.children ~name:"tools" tools
|> Spec.children ~name:"odoc_driver" odoc_driver
|> Spec.add
([
-         workdir "/home/opam/docs/";
-         run "sudo chown opam:opam . ";
-         (* Import odoc and voodoo-do *)
-         copy ~from:(`Build "tools")
-           [ "/home/opam/odoc";]
-           ~dst:"/home/opam/";
-         copy ~from:(`Build "odoc_driver")
-           [ "/home/opam/odoc_driver_voodoo"; "/home/opam/sherlodoc"; "/home/opam/odoc-md"; ]
-           ~dst:"/home/opam/";
-         run "mv ~/sherlodoc $(opam config var bin)/sherlodoc";
-         run ~network:Misc.network "sudo apt install -y jq";
-         run ~network:Misc.network "git clone https://github.com/jonludlam/docs-ci-scripts.git && echo %s" Config.random;
-         (* obtain the compiled dependencies, prep folder and extract it *)
-       ] @ [ run ~network:Misc.network ~cache:compile_caches ~secrets:Config.Ssh.secrets "%s" @@ Misc.Cmd.list
-            ((Fmt.str "ssh -MNf %s" (Config.Ssh.host ssh)) ::
-            (* "rm -rf /home/opam/.cache/compile/*" :: *)
-            (common @ [
-                Fmt.str
-                  "time opam exec -- /home/opam/odoc_driver_voodoo --verbose --odoc /home/opam/odoc --odoc-md /home/opam/odoc-md --odoc-dir %a/compile --odocl-dir linked --html-dir %s --stats %s %s %s"
-                  Fpath.pp (Storage.Base.generation_folder generation) (Fpath.to_string (Storage.Base.folder (HtmlRaw generation)))
-                  name
-                  (match jobty with CompileAndLink -> "" | CompileOnly -> "--actions compile-only" | LinkOnly -> "--actions link-and-gen")
-                  (match blessing with Blessed -> "--blessed" | Universe -> "");
-                (* Fmt.str "/home/opam/odoc support-files -o %s"
-                  (Fpath.to_string (Storage.Base.folder (HtmlRaw generation))); *)
-                Fmt.str "jq . driver-benchmarks.json || true";]
-                @ (match jobty with LinkOnly -> [] | _ -> post_compile)
-                @ (match jobty with CompileOnly -> [] | _ -> post_link_and_html))) ])
+          workdir "/home/opam/docs/";
+          run "sudo chown opam:opam . ";
+          (* Import odoc and voodoo-do *)
+          copy ~from:(`Build "tools") [ "/home/opam/odoc" ] ~dst:"/home/opam/";
+          copy ~from:(`Build "odoc_driver")
+            [
+              "/home/opam/odoc_driver_voodoo";
+              "/home/opam/sherlodoc";
+              "/home/opam/odoc-md";
+            ]
+            ~dst:"/home/opam/";
+          run "mv ~/sherlodoc $(opam config var bin)/sherlodoc";
+          run ~network:Misc.network "sudo apt install -y jq";
+          run ~network:Misc.network
+            "git clone https://github.com/jonludlam/docs-ci-scripts.git && \
+             echo %s"
+            Config.random;
+          (* obtain the compiled dependencies, prep folder and extract it *)
+        ]
+       @ [
+           run ~network:Misc.network ~cache:compile_caches
+             ~secrets:Config.Ssh.secrets "%s"
+           @@ Misc.Cmd.list
+                (Fmt.str "ssh -MNf %s" (Config.Ssh.host ssh)
+                :: (* "rm -rf /home/opam/.cache/compile/*" :: *)
+                   (common
+                   @ [
+                       Fmt.str
+                         "time opam exec -- /home/opam/odoc_driver_voodoo \
+                          --verbose --odoc /home/opam/odoc --odoc-md \
+                          /home/opam/odoc-md --odoc-dir %a/compile --odocl-dir \
+                          linked --html-dir %s --stats %s %s %s"
+                         Fpath.pp
+                         (Storage.Base.generation_folder generation)
+                         (Fpath.to_string
+                            (Storage.Base.folder (HtmlRaw generation)))
+                         name
+                         (match jobty with
+                         | CompileAndLink -> ""
+                         | CompileOnly -> "--actions compile-only"
+                         | LinkOnly -> "--actions link-and-gen")
+                         (match blessing with
+                         | Blessed -> "--blessed"
+                         | Universe -> "");
+                       (* Fmt.str "/home/opam/odoc support-files -o %s"
+                          (Fpath.to_string (Storage.Base.folder (HtmlRaw generation))); *)
+                       Fmt.str "jq . driver-benchmarks.json || true";
+                     ]
+                   @ (match jobty with LinkOnly -> [] | _ -> post_compile)
+                   @
+                   match jobty with
+                   | CompileOnly -> []
+                   | _ -> post_link_and_html));
+         ])


let spec_failure ~ssh ~base ~config ~blessing ~generation prep =
let open Obuilder_spec in
let package = Prep.package prep in
let prep_folder = Storage.folder Prep package in
-  let compile_folder = Storage.folder (Compile (generation, blessing)) package in
+  let compile_folder =
+    Storage.folder (Compile (generation, blessing)) package
+  in
let linked_folder = Storage.folder (Linked (generation, blessing)) package in
let opam = Package.opam package in
let name = OpamPackage.name_to_string opam in
@@ -144,7 +200,12 @@ let spec_failure ~ssh ~base ~config ~blessing ~generation prep =
run "sudo chown opam:opam . ";
(* Import odoc and voodoo-do *)
copy ~from:(`Build "tools")
-           [ "/home/opam/odoc"; "/home/opam/odoc_driver_voodoo"; "/home/opam/sherlodoc"; "/home/opam/odoc-md" ]
+           [
+             "/home/opam/odoc";
+             "/home/opam/odoc_driver_voodoo";
+             "/home/opam/sherlodoc";
+             "/home/opam/odoc-md";
+           ]
~dst:"/home/opam/";
run "mv ~/odoc $(opam config var bin)/odoc";
run "mv ~/sherlodoc $(opam config var bin)/sherlodoc";
@@ -269,20 +330,29 @@ module Compile = struct
blessing : Package.Blessing.t;
}


-    let key { config = _; odoc; sherlodoc; deps; prep; blessing; base = _; odoc_driver_base = _; jobty } =
+    let key
+        {
+          config = _;
+          odoc;
+          sherlodoc;
+          deps;
+          prep;
+          blessing;
+          base = _;
+          odoc_driver_base = _;
+          jobty;
+        } =
let odoc_sherl_hash =
-        Fmt.str "%s-%s" odoc sherlodoc |> Digest.string |> Digest.to_hex in
-      Fmt.str "v10-%s-%s-%s-%s-%a-%a"
-        odoc_sherl_hash
+        Fmt.str "%s-%s" odoc sherlodoc |> Digest.string |> Digest.to_hex
+      in
+      Fmt.str "v10-%s-%s-%s-%s-%a-%a" odoc_sherl_hash
(Package.Blessing.to_string blessing)
(Prep.package prep |> Package.digest)
(Prep.hash prep)
Fmt.(
list (fun f { hashes = { compile_hash; _ }; _ } ->
Fmt.pf f "%a" (Fmt.option string) compile_hash))
-        deps
-        pp_jobty
-        jobty
+        deps pp_jobty jobty


let digest t = key t |> Digest.string |> Digest.to_hex
end
@@ -293,7 +363,18 @@ module Compile = struct
let auto_cancel = true


let build { generation; _ } job
-      Key.{ deps; prep; blessing; config; base; odoc_driver_base; odoc; sherlodoc; jobty } =
+      Key.
+        {
+          deps;
+          prep;
+          blessing;
+          config;
+          base;
+          odoc_driver_base;
+          odoc;
+          sherlodoc;
+          jobty;
+        } =
let open Lwt.Syntax in
let ( let** ) = Lwt_result.bind in
let package = Prep.package prep in
@@ -306,7 +387,8 @@ module Compile = struct
| Success ->
Lwt.return_ok
(spec_success ~generation ~ssh:(Config.ssh config) ~config ~base
-              ~odoc_driver_base ~odoc_pin ~sherlodoc_pin ~deps ~blessing ~jobty prep)
+               ~odoc_driver_base ~odoc_pin ~sherlodoc_pin ~deps ~blessing ~jobty
+               prep)
| Failed ->
Lwt.return_ok
(spec_failure ~generation ~ssh:(Config.ssh config) ~config ~base
@@ -357,7 +439,8 @@ module Compile = struct
let compile = Option.map h compile in
let linked = Option.map h linked in
let html_raw = Option.map h html_raw in
-      Lwt.return_ok { compile_hash = compile; linked_hash = linked; html_hash=html_raw }
+      Lwt.return_ok
+        { compile_hash = compile; linked_hash = linked; html_hash = html_raw }
with Invalid_argument _ ->
Lwt.return_error (`Msg "Compile: failed to parse output")
end
@@ -367,16 +450,29 @@ module CompileCache = Current_cache.Make (Compile)
let v ~generation ~config ~name ~blessing ~deps ~jobty prep =
let open Current.Syntax in
Current.component "do %s" name
-  |> let> prep and> blessing and> deps
+  |> let> prep
+     and> blessing
+     and> deps
and> odoc_driver_base = Misc.default_base_image in
let package = Prep.package prep in
let base = Prep.base prep in
-     (Logs.debug (fun m -> m "Prep base: %s" (Spec.to_spec base)));
+     Logs.debug (fun m -> m "Prep base: %s" (Spec.to_spec base));
let odoc = Config.odoc config in
-     let sherlodoc = Config.sherlodoc config in
+     let sherlodoc = Config.sherlodoc config in
let output =
CompileCache.get { Compile.generation }
-         Compile.Key.{ prep; blessing; deps; config; base; odoc_driver_base; odoc; sherlodoc; jobty }
+         Compile.Key.
+           {
+             prep;
+             blessing;
+             deps;
+             config;
+             base;
+             odoc_driver_base;
+             odoc;
+             sherlodoc;
+             jobty;
+           }
in
Current.Primitive.map_result
(Result.map (fun hashes -> { package; blessing; hashes }))
File "test/monitor/test_monitor.ml", line 1, characters 0-0:
diff --git a/_build/default/test/monitor/test_monitor.ml b/_build/default/test/monitor/.formatted/test_monitor.ml
index 087306c..b8fb883 100644
--- a/_build/default/test/monitor/test_monitor.ml
+++ b/_build/default/test/monitor/.formatted/test_monitor.ml
@@ -19,7 +19,10 @@ let running =
let fakepkg ~blessing name =
let open Docs_ci_lib in
let root = OpamPackage.of_string name in
-  let pkg = Package.make ~ocaml_version:Ocaml_version.Releases.latest ~blacklist:[] ~commit:"0" ~root [] in
+  let pkg =
+    Package.make ~ocaml_version:Ocaml_version.Releases.latest ~blacklist:[]
+      ~commit:"0" ~root []
+  in
let blessing =
let set =
Package.Blessing.Set.v ~counts:(Package.Map.singleton pkg 0) [ pkg ]
File "src/lib/monitor.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/monitor.ml b/_build/default/src/lib/.formatted/monitor.ml
index 56672bf..e103b37 100644
--- a/_build/default/src/lib/monitor.ml
+++ b/_build/default/src/lib/.formatted/monitor.ml
@@ -86,16 +86,18 @@ let render_level =


let render_list ~bullet ~level ~items ~render =
let open Tyxml_html in
-  Some (ul
-    (List.filter_map
-       (fun (name, item) ->
-         match render ~level:(level + 1) item with
-         | None -> None
-         | Some elt ->
-           Some (li
-             ~a:[ a_style ("list-style-type: " ^ bullet) ]
-             [ (render_level level) [ txt name ]; elt ]))
-       items))
+  Some
+    (ul
+       (List.filter_map
+          (fun (name, item) ->
+            match render ~level:(level + 1) item with
+            | None -> None
+            | Some elt ->
+                Some
+                  (li
+                     ~a:[ a_style ("list-style-type: " ^ bullet) ]
+                     [ (render_level level) [ txt name ]; elt ]))
+          items))


let rec render ~level =
let open Tyxml_html in
@@ -113,7 +115,8 @@ let rec render ~level =
fun v -> Some (a ~a:[ a_href ("/job/" ^ job_id) ] [ txt v ])
| _ -> fun x -> Some (txt x)
with (* if current is not a primitive term *)
-        | Failure _ -> (fun x -> Some (txt x))
+        | Failure _ ->
+          fun x -> Some (txt x)
in
match result with
| Error (`Msg msg) -> container ("error: " ^ msg)
@@ -136,10 +139,14 @@ let get_opam_package_info t opam_package =
in
match Package.Blessing.Set.blessed blessing_set with
| None ->
-      let preps = Package.Map.filter (fun package _ ->
-        Package.opam package = opam_package) t.preps in
-      Or (Package.Map.bindings preps |> List.map (fun (package, tree) ->
-          (Package.id package, tree)))
+      let preps =
+        Package.Map.filter
+          (fun package _ -> Package.opam package = opam_package)
+          t.preps
+      in
+      Or
+        (Package.Map.bindings preps
+        |> List.map (fun (package, tree) -> (Package.id package, tree)))
| Some blessed_package ->
let blessed_pipeline = Package.Map.find blessed_package t.trees in
blessed_pipeline
@@ -179,7 +186,11 @@ let rec to_steps description arr = function


let render_package_state t opam_package =
let name = OpamPackage.name_to_string opam_package in
-  let all = Package.Map.filter_map (fun p x -> if Package.opam p = opam_package then Some x else None) t.preps in
+  let all =
+    Package.Map.filter_map
+      (fun p x -> if Package.opam p = opam_package then Some x else None)
+      t.preps
+  in
match OpamPackage.Map.find_opt opam_package t.solve_failures with
| Some reason ->
let open Tyxml_html in
@@ -193,14 +204,15 @@ let render_package_state t opam_package =
let* blessed_pipeline = get_opam_package_info t opam_package in
let open Tyxml_html in
Ok
-        ([
-          h1 [ txt ("Package " ^ name) ]] @
-          (render ~level:1 (simplify blessed_pipeline) |> Option.to_list)
-          @ [h2 [ txt ("All universes")]]
-
-          @ List.flatten (List.map (fun (pkg, pipeline) ->
-          ([ h3 [ txt (Package.universe pkg |> Package.Universe.hash) ] ]
-          @ (render ~level:2 (simplify pipeline) |> Option.to_list))) (Package.Map.bindings all)))
+        ([ h1 [ txt ("Package " ^ name) ] ]
+        @ (render ~level:1 (simplify blessed_pipeline) |> Option.to_list)
+        @ [ h2 [ txt "All universes" ] ]
+        @ List.flatten
+            (List.map
+               (fun (pkg, pipeline) ->
+                 [ h3 [ txt (Package.universe pkg |> Package.Universe.hash) ] ]
+                 @ (render ~level:2 (simplify pipeline) |> Option.to_list))
+               (Package.Map.bindings all)))


let handle t ~engine:_ str =
object
@@ -270,33 +282,44 @@ let lookup_failed_compiles t =
let error_active = ref 0 in
let error_blocked = ref 0 in
let ok = ref 0 in
-  let x = Package.Map.fold (fun _pkg current acc ->
-    let status : step_status =
-      match Current.observe current with
-      | Error (`Msg msg) -> incr error_msg; Err msg
-      | Error (`Active _) -> incr error_active; Active
-      | Error `Blocked -> incr error_blocked; Blocked
-      | Ok _ -> incr ok; OK
-    in
-    let container =
-      try
-        Current.Analysis.metadata current
-        |> Current.observe
-        |> Result.to_option
-        |> Option.join
-        |> function
-        | Some { job_id = Some job_id; _ } ->
-            fun v -> a ~a:[ a_href ("/job/" ^ job_id) ] [ txt v ]
-        | _ -> txt
-      with (* if current is not a primitive term *)
-      | Failure _ -> txt
-    in
-    match status with
-    | Err msg -> (container (Printf.sprintf "error: %s" msg)) :: acc
-    | _ -> acc)
-    t.html [] in
+  let x =
+    Package.Map.fold
+      (fun _pkg current acc ->
+        let status : step_status =
+          match Current.observe current with
+          | Error (`Msg msg) ->
+              incr error_msg;
+              Err msg
+          | Error (`Active _) ->
+              incr error_active;
+              Active
+          | Error `Blocked ->
+              incr error_blocked;
+              Blocked
+          | Ok _ ->
+              incr ok;
+              OK
+        in
+        let container =
+          try
+            Current.Analysis.metadata current
+            |> Current.observe
+            |> Result.to_option
+            |> Option.join
+            |> function
+            | Some { job_id = Some job_id; _ } ->
+                fun v -> a ~a:[ a_href ("/job/" ^ job_id) ] [ txt v ]
+            | _ -> txt
+          with (* if current is not a primitive term *)
+          | Failure _ -> txt
+        in
+        match status with
+        | Err msg -> container (Printf.sprintf "error: %s" msg) :: acc
+        | _ -> acc)
+      t.html []
+  in
(x, !error_active, !error_blocked, !error_msg, !ok)
-
+
let lookup_solve_failures t =
OpamPackage.Map.keys t.solve_failures |> List.map (fun k -> (k, Failed))


@@ -376,12 +399,11 @@ let render_passing_packages t =
let render_package_root t =
let max_version = map_max_versions t in
let failed, pending = lookup_failed_pending t in
-  let (failed_do, n1, n2, n3, n4) = lookup_failed_compiles t in
+  let failed_do, n1, n2, n3, n4 = lookup_failed_compiles t in
let open Tyxml_html in
[
-    h1 [ txt (Printf.sprintf "Failed 'do' jobs (%d, %d, %d, %d)" n1 n2 n3 n4)];
-    ul (List.map (fun x ->
-      li [x]) failed_do);
+    h1 [ txt (Printf.sprintf "Failed 'do' jobs (%d, %d, %d, %d)" n1 n2 n3 n4) ];
+    ul (List.map (fun x -> li [ x ]) failed_do);
h1 [ txt "Failed packages" ];
p [ txt ("total: " ^ Int.to_string (List.length failed)) ];
ul
File "src/lib/prep.ml", line 1, characters 0-0:
diff --git a/_build/default/src/lib/prep.ml b/_build/default/src/lib/.formatted/prep.ml
index 5dfd5bd..0f45f07 100644
--- a/_build/default/src/lib/prep.ml
+++ b/_build/default/src/lib/.formatted/prep.ml
@@ -15,16 +15,17 @@ module OpamPackage = struct
| _ -> Error "failed to run version"
end


-let opam_cache_version="v1"
+let opam_cache_version = "v1"
+
module Cache = struct
let fname id pkg =
let name = OpamPackage.to_string pkg in
let fname = name ^ "-opam.tar.bz2" in
-    Fpath.(Current.state_dir id / name / fname )
+    Fpath.(Current.state_dir id / name / fname)


let id = "opam-files-cache-" ^ opam_cache_version


-  type cache_value = (bool * string)
+  type cache_value = bool * string


let fname = fname id


@@ -34,8 +35,11 @@ module Cache = struct
| Ok true -> true
| Ok false -> false
| Error (`Msg m) ->
-      Current.Job.log job "Error checking for opam files cache for package %s: %s" (OpamPackage.to_string pkg) m;
-      false
+        Current.Job.log job
+          "Error checking for opam files cache for package %s: %s"
+          (OpamPackage.to_string pkg)
+          m;
+        false


let write ((pkg, value) : OpamPackage.t * cache_value) =
let fname = fname pkg in
@@ -51,111 +55,128 @@ module Cache = struct
let result = Marshal.from_channel file in
close_in file;
Some result
-    with Failure _  | Sys_error _ as e ->
-      Current.Job.log job "Error reading opam files cache for package %s: %s" (OpamPackage.to_string pkg) (Printexc.to_string e);
+    with (Failure _ | Sys_error _) as e ->
+      Current.Job.log job "Error reading opam files cache for package %s: %s"
+        (OpamPackage.to_string pkg)
+        (Printexc.to_string e);
None
end


-
module OpamFiles = struct
-
type t = No_context


let id = "opam-files"
-
let auto_cancel = true


module Key = struct
type t = { repo : Current_git.Commit.t; packages : OpamPackage.t list }
-
+
let digest { repo; packages } =
-      Current_git.Commit.hash repo ^ String.concat ";" (List.map OpamPackage.to_string packages)
+      Current_git.Commit.hash repo
+      ^ String.concat ";" (List.map OpamPackage.to_string packages)
end


module Value = struct
-    type ('a, 'b) r = ('a, 'b) result =
-      | Ok of 'a
-      | Error of 'b [@@deriving yojson]
+    type ('a, 'b) r = ('a, 'b) result = Ok of 'a | Error of 'b
+    [@@deriving yojson]


-    type serialisable = (OpamPackage.t * ((bool * string), [`Msg of string]) r) list
-      [@@deriving yojson]
+    type serialisable =
+      (OpamPackage.t * (bool * string, [ `Msg of string ]) r) list
+    [@@deriving yojson]


-    type t = ((bool * string), [`Msg of string]) r OpamPackage.Map.t
+    type t = (bool * string, [ `Msg of string ]) r OpamPackage.Map.t


let to_yojson t = t |> OpamPackage.Map.bindings |> serialisable_to_yojson
-    let of_yojson t = t |> serialisable_of_yojson |> Result.map OpamPackage.Map.of_list
-    let marshal t = t |> to_yojson |> Yojson.Safe.to_string
-    let unmarshal t = t |> Yojson.Safe.from_string |> of_yojson |> Result.get_ok


+    let of_yojson t =
+      t |> serialisable_of_yojson |> Result.map OpamPackage.Map.of_list
+
+    let marshal t = t |> to_yojson |> Yojson.Safe.to_string
+    let unmarshal t = t |> Yojson.Safe.from_string |> of_yojson |> Result.get_ok
end


let pool = Current.Pool.create ~label:"git_pool" 5


+  let build _ job { Key.repo; packages } =
+    let package_path pkg =
+      Fpath.(
+        v "packages"
+        / (OpamPackage.name pkg |> OpamPackage.Name.to_string)
+        / OpamPackage.to_string pkg)
+    in
+    let open Lwt.Infix in
+    Current.Job.start ~pool ~level:Harmless job >>= fun () ->
+    let to_do = List.filter (fun x -> not (Cache.mem job x)) packages in
+    Current_git.with_checkout ~job repo (fun path ->
+        Current.Process.with_tmpdir ~prefix:"opam-files" (fun fp ->
+            let open Lwt.Infix in
+            let r =
+              Lwt_list.map_s
+                (fun pkg ->
+                  let open Lwt.Syntax in
+                  let tarfile =
+                    Fpath.(
+                      fp / Fmt.str "%s-opam.tar.bz2" (OpamPackage.to_string pkg))
+                  in
+                  let has_depext =
+                    match
+                      Bos.OS.File.read Fpath.(path // package_path pkg / "opam")
+                    with
+                    | Ok content ->
+                        let f = OpamFile.OPAM.read_from_string content in
+                        let _x = OpamFile.OPAM.depends f in
+                        OpamFile.OPAM.depexts f <> []
+                    | _ -> false
+                  in
+                  let command =
+                    Bos.Cmd.(
+                      v "tar"
+                      % "-C"
+                      % Fpath.to_string path
+                      % "-jcf"
+                      % Fpath.to_string tarfile
+                      % Fpath.to_string (package_path pkg))
+                  in
+                  Current.Job.log job "About to exec";
+                  let* res =
+                    Current.Process.exec ~cancellable:true ~job
+                      ("", Bos.Cmd.to_list command |> Array.of_list)
+                  in
+                  Current.Job.log job "Finished";
+                  match res with
+                  | Ok () -> (
+                      let res = Bos.OS.File.read tarfile in
+                      match res with
+                      | Ok contents ->
+                          Cache.write
+                            (pkg, (has_depext, Base64.encode_string contents));
+                          Lwt.return (pkg, Ok ())
+                      | Error (`Msg m) -> Lwt.return (pkg, Error (`Msg m)))
+                  | Error (`Msg m) -> Lwt.return (pkg, Error (`Msg m)))
+                to_do
+            in
+            r >>= fun results ->
+            let results_map = OpamPackage.Map.of_list results in
+            List.map
+              (fun x ->
+                match Cache.read job x with
+                | Some v -> (x, Ok v)
+                | None -> (
+                    match OpamPackage.Map.find x results_map with
+                    | Error (`Msg m) -> (x, Error (`Msg m))
+                    | Ok () ->
+                        (x, Error (`Msg "Failed to read cache after writing"))
+                    | exception Not_found ->
+                        (x, Error (`Msg "Didn't even try to solve for package"))
+                    ))
+              packages
+            |> OpamPackage.Map.of_list
+            |> Lwt.return_ok))


-
-let build _ job { Key.repo; packages } =
-  let package_path pkg =
-    Fpath.(v "packages" / (OpamPackage.name pkg |> OpamPackage.Name.to_string) / OpamPackage.to_string pkg)
-  in
-  let open Lwt.Infix in
-  Current.Job.start ~pool ~level:Harmless job >>= fun () ->
-  let to_do = List.filter (fun x -> not (Cache.mem job x)) packages in
-  Current_git.with_checkout ~job repo (fun path ->
-    Current.Process.with_tmpdir ~prefix:"opam-files" (fun fp ->
-      let open Lwt.Infix in
-      let r = Lwt_list.map_s (fun pkg ->
-        let open Lwt.Syntax in
-        let tarfile = Fpath.(fp / (Fmt.str "%s-opam.tar.bz2" (OpamPackage.to_string pkg))) in
-        let has_depext =
-          match Bos.OS.File.read Fpath.(path // package_path pkg / "opam") with
-          | Ok content ->
-            let f = OpamFile.OPAM.read_from_string content in
-            let _x = OpamFile.OPAM.depends f in
-            OpamFile.OPAM.depexts f <> []
-          | _ -> false
-        in
-        let command =
-          Bos.Cmd.(
-            v "tar"
-            % "-C"
-            % Fpath.to_string path
-            % "-jcf"
-            % Fpath.to_string tarfile
-            % (Fpath.to_string (package_path pkg) )
-          )
-        in
-        Current.Job.log job "About to exec";
-        let* res = Current.Process.exec ~cancellable:true ~job
-        ("", Bos.Cmd.to_list command |> Array.of_list) in
-        Current.Job.log job "Finished";
-        match res with
-      | Ok () -> begin
-        let res = Bos.OS.File.read tarfile in
-        match res with
-        | Ok contents ->
-          Cache.write (pkg, (has_depext, Base64.encode_string contents));
-          Lwt.return (pkg, Ok ())
-        | Error (`Msg m) -> Lwt.return (pkg, Error (`Msg m))
-        end
-      | Error (`Msg m) -> Lwt.return (pkg, Error (`Msg m))
-      ) to_do in
-      r >>= fun results ->
-        let results_map = OpamPackage.Map.of_list results in
-        List.map (fun x ->
-          match Cache.read job x with
-          | Some v -> (x, Ok v)
-          | None -> begin
-            match OpamPackage.Map.find x results_map with
-            | Error (`Msg m) -> (x, Error (`Msg m))
-            | Ok () -> (x, Error (`Msg "Failed to read cache after writing"))
-            | exception Not_found ->
-              (x, Error (`Msg "Didn't even try to solve for package"))
-          end) packages |> OpamPackage.Map.of_list |> Lwt.return_ok
-      ))
let pp f { Key.repo; packages } =
Fmt.pf f "opamfiles\n%a\n%a" Current_git.Commit.pp_short repo
-      (Fmt.list (Fmt.of_to_string OpamPackage.to_string)) packages
-
+      (Fmt.list (Fmt.of_to_string OpamPackage.to_string))
+      packages
end


module type F = Current_cache.S.BUILDER
@@ -177,41 +198,50 @@ let not_base x =
])


let add_base ocaml_version init =
-  let add_one x pkgs =
-    if List.mem x pkgs then pkgs else x :: pkgs
-  in
+  let add_one x pkgs = if List.mem x pkgs then pkgs else x :: pkgs in
let mk n v =
OpamPackage.create
(OpamPackage.Name.of_string n)
(OpamPackage.Version.of_string v)
in
let v = ocaml_version in
-  let std = List.fold_right add_one [
-    mk "conf-graphviz" "0.1";
-    mk "conf-which" "1";
-    mk "base-unix" "base";
-    mk "base-bigarray" "base";
-    mk "base-threads" "base";
-    mk "ocaml-base-compiler" (Ocaml_version.to_string ocaml_version);
-    mk "ocaml" (Ocaml_version.to_string ocaml_version);
-  ] init in
-  let extra = List.assoc (Ocaml_version.major v) [
-    5, [mk "base-domains" "base";
-          mk "base-nnp" "base";
-          mk "base-effects" "base";
-          mk "host-arch-x86_64" "1";
-          mk "host-system-other" "1";
-          mk "ocaml-options-vanilla" "1";
-          ];
-    4, [
-    mk "ocaml-options-vanilla" "1";
-    mk "host-system-other" "1";
-    mk "host-arch-x86_64" "1";
-    ]
-
-  ] in
+  let std =
+    List.fold_right add_one
+      [
+        mk "conf-graphviz" "0.1";
+        mk "conf-which" "1";
+        mk "base-unix" "base";
+        mk "base-bigarray" "base";
+        mk "base-threads" "base";
+        mk "ocaml-base-compiler" (Ocaml_version.to_string ocaml_version);
+        mk "ocaml" (Ocaml_version.to_string ocaml_version);
+      ]
+      init
+  in
+  let extra =
+    List.assoc (Ocaml_version.major v)
+      [
+        ( 5,
+          [
+            mk "base-domains" "base";
+            mk "base-nnp" "base";
+            mk "base-effects" "base";
+            mk "host-arch-x86_64" "1";
+            mk "host-system-other" "1";
+            mk "ocaml-options-vanilla" "1";
+          ] );
+        ( 4,
+          [
+            mk "ocaml-options-vanilla" "1";
+            mk "host-system-other" "1";
+            mk "host-arch-x86_64" "1";
+          ] );
+      ]
+  in
let ocaml_config =
-    if Ocaml_version.major v = 5 then [ mk "ocaml-config" "3"] else if Ocaml_version.minor v >= 12 then [ mk "ocaml-config" "2"] else [ mk "ocaml-config" "1" ]
+    if Ocaml_version.major v = 5 then [ mk "ocaml-config" "3" ]
+    else if Ocaml_version.minor v >= 12 then [ mk "ocaml-config" "2" ]
+    else [ mk "ocaml-config" "1" ]
in
ocaml_config @ std @ extra


@@ -232,12 +262,13 @@ let spec ~ssh ~tools_base ~base ~opamfiles (prep : Package.t) =


let ocaml_version = Package.ocaml_version prep in
let prep_caches =
-    [Obuilder_spec.Cache.v "prep-cache" ~target:"/home/opam/.cache/prep"] in
+    [ Obuilder_spec.Cache.v "prep-cache" ~target:"/home/opam/.cache/prep" ]
+  in


let cache = cache @ prep_caches in


let packages_topo_list =
-  all_deps
+    all_deps
|> Package.topo_sort
|> List.filter (fun x -> Package.opam x |> not_base)
in
@@ -253,19 +284,17 @@ let spec ~ssh ~tools_base ~base ~opamfiles (prep : Package.t) =
### output ###
# Error: link: /home/opam/.cache/dune/db/v2/temp/promoting: Invalid cross-device link
*)
-
-
let prep_storage_folder = (Storage.Prep0, prep) in
let prep_folder = Storage.folder Prep0 prep in


let create_dir_and_copy_logs_if_not_exist =
let command =
Fmt.str
-        "([ -d $1 ] || (echo FAILED:$2 && mkdir -p $1 && cp ~/opam.err.log \
-         $1 && opam show $3 --raw > $1/opam)) && (%s)"
+        "([ -d $1 ] || (echo FAILED:$2 && mkdir -p $1 && cp ~/opam.err.log $1 \
+         && opam show $3 --raw > $1/opam)) && (%s)"
(Misc.tar_cmd (Fpath.v "$1"))
in
-    Storage.for_all [prep_storage_folder] command
+    Storage.for_all [ prep_storage_folder ] command
in


let install_opamfiles pkg tar_b64 =
@@ -273,79 +302,111 @@ let spec ~ssh ~tools_base ~base ~opamfiles (prep : Package.t) =
Fmt.str "echo %s ; echo %s | base64 -d | sudo tar -jxC /src" name tar_b64
in


-  let install_all_opamfiles = List.filter_map (fun pkg ->
-    match OpamPackage.Map.find (Package.opam pkg) opamfiles with
-    | Ok (_, opamfiles) ->
-      Some (install_opamfiles (Package.opam pkg) opamfiles)
-    | Error (`Msg _m) ->
-      None
-    | exception Not_found ->
-      None) packages_topo_list
+  let install_all_opamfiles =
+    List.filter_map
+      (fun pkg ->
+        match OpamPackage.Map.find (Package.opam pkg) opamfiles with
+        | Ok (_, opamfiles) ->
+            Some (install_opamfiles (Package.opam pkg) opamfiles)
+        | Error (`Msg _m) -> None
+        | exception Not_found -> None)
+      packages_topo_list
in


-  let install_cmds = List.map (run ~network "%s") (Misc.Cmd.list_list install_all_opamfiles) in
+  let install_cmds =
+    List.map (run ~network "%s") (Misc.Cmd.list_list install_all_opamfiles)
+  in


let install_packages =
-    "echo \"START OF INSTALL PACKAGES\" && date" :: (
-    List.flatten @@ List.map (fun pkg ->
-    match OpamPackage.Map.find (Package.opam pkg) opamfiles with
-    | Ok (_has_depext, _opamfiles) ->
-      [ Fmt.str "time ~/docs/docs-ci-scripts/download_prep.sh %s %s %s %s"
-          (Config.Ssh.host ssh)
-          (Config.Ssh.storage_folder ssh)
-          (Fpath.to_string (Storage.folder Storage.Prep0 pkg))
-          (if Package.should_cache pkg then "true" else "false")
-      ]
-    | Error _ | exception _ ->
-      [ Fmt.str "echo Failed to find opamfiles for %s"
-          (Package.opam pkg |> OpamPackage.to_string)
-      ]) packages_topo_list)
+    "echo \"START OF INSTALL PACKAGES\" && date"
+    :: (List.flatten
+       @@ List.map
+            (fun pkg ->
+              match OpamPackage.Map.find (Package.opam pkg) opamfiles with
+              | Ok (_has_depext, _opamfiles) ->
+                  [
+                    Fmt.str
+                      "time ~/docs/docs-ci-scripts/download_prep.sh %s %s %s %s"
+                      (Config.Ssh.host ssh)
+                      (Config.Ssh.storage_folder ssh)
+                      (Fpath.to_string (Storage.folder Storage.Prep0 pkg))
+                      (if Package.should_cache pkg then "true" else "false");
+                  ]
+              | Error _ | (exception _) ->
+                  [
+                    Fmt.str "echo Failed to find opamfiles for %s"
+                      (Package.opam pkg |> OpamPackage.to_string);
+                  ])
+            packages_topo_list)
in


-  let any_depexts = List.exists (fun pkg -> match OpamPackage.Map.find (Package.opam pkg) opamfiles with | Ok (has_depext, _) -> has_depext | Error _ | exception _ -> false) packages_topo_list in
+  let any_depexts =
+    List.exists
+      (fun pkg ->
+        match OpamPackage.Map.find (Package.opam pkg) opamfiles with
+        | Ok (has_depext, _) -> has_depext
+        | Error _ | (exception _) -> false)
+      packages_topo_list
+  in


let extra_opamfiles =
-    List.flatten (List.map (fun pkg ->
-      match OpamPackage.Map.find pkg opamfiles with
-      | Ok (_has_depext, opamfiles) ->
-          [ install_opamfiles pkg opamfiles ]
-      | _ | exception _ -> [ Fmt.str "echo Missing %s" (OpamPackage.to_string pkg)]) (add_base ocaml_version [])
-       )
+    List.flatten
+      (List.map
+         (fun pkg ->
+           match OpamPackage.Map.find pkg opamfiles with
+           | Ok (_has_depext, opamfiles) -> [ install_opamfiles pkg opamfiles ]
+           | _ | (exception _) ->
+               [ Fmt.str "echo Missing %s" (OpamPackage.to_string pkg) ])
+         (add_base ocaml_version []))
in


let pkg_opamfile =
-    (match OpamPackage.Map.find (Package.opam prep) opamfiles with
-      | Ok (_has_depext, opamfiles) ->
+    match OpamPackage.Map.find (Package.opam prep) opamfiles with
+    | Ok (_has_depext, opamfiles) ->
[ install_opamfiles (Package.opam prep) opamfiles ]
-      | Error _ | exception _ -> [])
+    | Error _ | (exception _) -> []
in


let post_steps =
-    [ "echo \"START OF BUILD PACKAGE\" && date";
-
-      "opam update && /home/opam/opamh make-state --output $(opam var prefix)/.opam-switch/switch-state";
-      if any_depexts then Fmt.str "opam depext %s" (OpamPackage.to_string (Package.opam prep)) else "echo no depexts";
-      Fmt.str "(opam update && opam install -vv --debug-level=2 --confirm-level=unsafe-yes --solver=builtin-0install %s 2>&1 && opam clean -s | tee ~/opam.err.log) || echo \
-          'Failed to install all packages'" (Package.opam prep |> OpamPackage.to_string);
+    [
+      "echo \"START OF BUILD PACKAGE\" && date";
+      "opam update && /home/opam/opamh make-state --output $(opam var \
+       prefix)/.opam-switch/switch-state";
+      (if any_depexts then
+         Fmt.str "opam depext %s" (OpamPackage.to_string (Package.opam prep))
+       else "echo no depexts");
+      Fmt.str
+        "(opam update && opam install -vv --debug-level=2 \
+         --confirm-level=unsafe-yes --solver=builtin-0install %s 2>&1 && opam \
+         clean -s | tee ~/opam.err.log) || echo 'Failed to install all \
+         packages'"
+        (Package.opam prep |> OpamPackage.to_string);
"echo \"END OF BUILD PACKAGE\" && date";
Fmt.str "mkdir -p %s" (Fpath.to_string prep_folder);
-      Fmt.str "/home/opam/opamh save --output=%s/content.tar %s" (Fpath.to_string prep_folder) (Package.opam prep |> OpamPackage.name |> OpamPackage.Name.to_string);
+      Fmt.str "/home/opam/opamh save --output=%s/content.tar %s"
+        (Fpath.to_string prep_folder)
+        (Package.opam prep |> OpamPackage.name |> OpamPackage.Name.to_string);
Fmt.str "time rsync -aR ./%s %s:%s/."
(Fpath.to_string prep_folder)
(Config.Ssh.host ssh)
(Config.Ssh.storage_folder ssh);
"rm -f /tmp/*.tar";
"rm -rf $(opam var prefix)";
-    ] in
+    ]
+  in


-  let persistent_ssh = [ Fmt.str "/usr/bin/time -f \"SSH time %%E\" ssh -MNf %s" (Config.Ssh.host ssh) ] in
+  let persistent_ssh =
+    [
+      Fmt.str "/usr/bin/time -f \"SSH time %%E\" ssh -MNf %s"
+        (Config.Ssh.host ssh);
+    ]
+  in


let copy_results =
-    (create_dir_and_copy_logs_if_not_exist)
-    @
-  (* Compute hashes *)
-    (Storage.for_all [prep_stoage_folder]
-      (Storage.Tar.hash_command ~prefix:"HASHES" ()))
+    create_dir_and_copy_logs_if_not_exist
+    @ (* Compute hashes *)
+    Storage.for_all [ prep_storage_folder ]
+      (Storage.Tar.hash_command ~prefix:"HASHES" ())
in


(* let install_packages = persistent_ssh @ pkg_opamfile @ extra_opamfiles @ install_packages @ post_steps @ copy_results in *)
@@ -354,39 +415,53 @@ let spec ~ssh ~tools_base ~base ~opamfiles (prep : Package.t) =
|> Spec.children ~name:"tools" tools
|> Spec.add
([
-         (* Install required packages *)
-         run "sudo mkdir /src";
-         run "echo b3BhbS12ZXJzaW9uOiAiMi4wIgpicm93c2U6ICJodHRwczovL29wYW0ub2NhbWwub3JnL3BrZy8iCnVwc3RyZWFtOiAiaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS90cmVlL21hc3Rlci8iCmFubm91bmNlOiBbCiIiIgpbV0FSTklOR10gb3BhbSBpcyBvdXQtb2YtZGF0ZS4gUGxlYXNlIGNvbnNpZGVyIHVwZGF0aW5nIGl0IChodHRwczovL29wYW0ub2NhbWwub3JnL2RvYy9JbnN0YWxsLmh0bWwpCiIiIiB7KG9wYW0tdmVyc2lvbiA+PSAiMi4xLjB+fiIgJiBvcGFtLXZlcnNpb24gPCAiMi4xLjUiKSB8IG9wYW0tdmVyc2lvbiA8ICIyLjAuMTAifQoiIiIKW0lORk9dIG9wYW0gMi4xIGluY2x1ZGVzIG1hbnkgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIG92ZXIgMi4wOyBwbGVhc2UgY29uc2lkZXIgdXBncmFkaW5nIChodHRwczovL29wYW0ub2NhbWwub3JnL2RvYy9JbnN0YWxsLmh0bWwpCiIiIiB7b3BhbS12ZXJzaW9uID49ICIyLjAuMTAiICYgb3BhbS12ZXJzaW9uIDwgIjIuMS4wfn4ifQpdCg== | base64 -d | sudo tee /src/repo";
-         run "ls -lR /src";
-         (* Re-initialise opam after switching from opam.2.0 to 2.3. *)
-         run ~network
-           "sudo ln -f /usr/bin/opam-2.3 /usr/bin/opam && opam repo remove default --all && opam init --reinit \
-            -ni";
-         run "sudo mkdir /src/packages";
-         run "opam repo add opam /src";
-         copy ~from:(`Build "tools")
-           [ "/home/opam/opamh" ]
-           ~dst:"/home/opam/";
-         (* Enable build cache conditionally on dune version *)
-         env "DUNE_CACHE" "disabled";
-         run "mkdir /home/opam/docs";
-         (* Pre-install some of the most popular packages *)
-         run ~network:Misc.network "sudo apt-get update && sudo apt-get install -qq -yy pkg-config libgmp-dev libev-dev libssl-dev zlib1g-dev libpcre3-dev libffi-dev m4 xdot autoconf libsqlite3-dev cmake libcurl4-gnutls-dev libpcre2-dev libsdl2-dev time python3 libexpat1-dev libcairo2-dev";
-
-         run ~network:Misc.network "git clone https://github.com/jonludlam/docs-ci-scripts.git /home/opam/docs/docs-ci-scripts && echo %s" Config.random;
-
-         (* run ~network ~cache ~secrets:Config.Ssh.secrets "%s" @@ Misc.Cmd.list install_packages *)
-       ] @ install_cmds @ [
-         run ~network ~cache ~secrets:Config.Ssh.secrets "%s" @@ Misc.Cmd.list (persistent_ssh @ pkg_opamfile @ extra_opamfiles @ install_packages) ] @ [
-        run ~network ~cache ~secrets:Config.Ssh.secrets "%s" @@ Misc.Cmd.list (post_steps @ copy_results);
-        ]
-       )
-
-
+          (* Install required packages *)
+          run "sudo mkdir /src";
+          run
+            "echo \
+             b3BhbS12ZXJzaW9uOiAiMi4wIgpicm93c2U6ICJodHRwczovL29wYW0ub2NhbWwub3JnL3BrZy8iCnVwc3RyZWFtOiAiaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS90cmVlL21hc3Rlci8iCmFubm91bmNlOiBbCiIiIgpbV0FSTklOR10gb3BhbSBpcyBvdXQtb2YtZGF0ZS4gUGxlYXNlIGNvbnNpZGVyIHVwZGF0aW5nIGl0IChodHRwczovL29wYW0ub2NhbWwub3JnL2RvYy9JbnN0YWxsLmh0bWwpCiIiIiB7KG9wYW0tdmVyc2lvbiA+PSAiMi4xLjB+fiIgJiBvcGFtLXZlcnNpb24gPCAiMi4xLjUiKSB8IG9wYW0tdmVyc2lvbiA8ICIyLjAuMTAifQoiIiIKW0lORk9dIG9wYW0gMi4xIGluY2x1ZGVzIG1hbnkgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIG92ZXIgMi4wOyBwbGVhc2UgY29uc2lkZXIgdXBncmFkaW5nIChodHRwczovL29wYW0ub2NhbWwub3JnL2RvYy9JbnN0YWxsLmh0bWwpCiIiIiB7b3BhbS12ZXJzaW9uID49ICIyLjAuMTAiICYgb3BhbS12ZXJzaW9uIDwgIjIuMS4wfn4ifQpdCg== \
+             | base64 -d | sudo tee /src/repo";
+          run "ls -lR /src";
+          (* Re-initialise opam after switching from opam.2.0 to 2.3. *)
+          run ~network
+            "sudo ln -f /usr/bin/opam-2.3 /usr/bin/opam && opam repo remove \
+             default --all && opam init --reinit -ni";
+          run "sudo mkdir /src/packages";
+          run "opam repo add opam /src";
+          copy ~from:(`Build "tools") [ "/home/opam/opamh" ] ~dst:"/home/opam/";
+          (* Enable build cache conditionally on dune version *)
+          env "DUNE_CACHE" "disabled";
+          run "mkdir /home/opam/docs";
+          (* Pre-install some of the most popular packages *)
+          run ~network:Misc.network
+            "sudo apt-get update && sudo apt-get install -qq -yy pkg-config \
+             libgmp-dev libev-dev libssl-dev zlib1g-dev libpcre3-dev \
+             libffi-dev m4 xdot autoconf libsqlite3-dev cmake \
+             libcurl4-gnutls-dev libpcre2-dev libsdl2-dev time python3 \
+             libexpat1-dev libcairo2-dev";
+          run ~network:Misc.network
+            "git clone https://github.com/jonludlam/docs-ci-scripts.git \
+             /home/opam/docs/docs-ci-scripts && echo %s"
+            Config.random;
+          (* run ~network ~cache ~secrets:Config.Ssh.secrets "%s" @@ Misc.Cmd.list install_packages *)
+        ]
+       @ install_cmds
+       @ [
+           run ~network ~cache ~secrets:Config.Ssh.secrets "%s"
+           @@ Misc.Cmd.list
+                (persistent_ssh
+                @ pkg_opamfile
+                @ extra_opamfiles
+                @ install_packages);
+         ]
+       @ [
+           run ~network ~cache ~secrets:Config.Ssh.secrets "%s"
+           @@ Misc.Cmd.list (post_steps @ copy_results);
+         ])
+
type prep_result = Success | Failed


-type prep_output =
- {
+type prep_output = {
base : Spec.t;
hash : string;
prep_hash : string;
@@ -400,10 +475,7 @@ module Prep = struct
let id = "voodoo-prep2"
let auto_cancel = true


-
module Key = struct
-
-
type t = {
prep : Package.t;
base : Spec.t;
@@ -412,14 +484,13 @@ module Prep = struct
opamfiles : (bool * string) Current.or_error OpamPackage.Map.t;
}


-    let digest { prep; base = _; tools_base = _; config = _; opamfiles = _; } =
+    let digest { prep; base = _; tools_base = _; config = _; opamfiles = _ } =
(* base is derived from 'prep' so we don't need to include it in the hash *)
Fmt.str "%s\n%s\n%s\n" prep_version (Package.digest prep)
(Package.digest prep)
end


-  let pp f Key.{ prep; _ } =
-    Fmt.pf f "Voodoo prep %a" Package.pp prep
+  let pp f Key.{ prep; _ } = Fmt.pf f "Voodoo prep %a" Package.pp prep


module Value = struct
type item = Storage.id_hash [@@deriving yojson]
@@ -429,8 +500,7 @@ module Prep = struct
let unmarshal t = t |> Yojson.Safe.from_string |> of_yojson |> Result.get_ok
end


-  let build No_context job Key.{ prep; base; tools_base; config; opamfiles; }
-      =
+  let build No_context job Key.{ prep; base; tools_base; config; opamfiles } =
let open Lwt.Syntax in
let ( let** ) = Lwt_result.bind in
(* Problem: no rebuild if the opam definition changes without affecting the universe hash.
@@ -438,7 +508,9 @@ module Prep = struct
requires changes in the solver.
For now we rebuild only if voodoo-prep changes.
*)
-    let spec = spec ~ssh:(Config.ssh config) ~base ~tools_base ~opamfiles prep in
+    let spec =
+      spec ~ssh:(Config.ssh config) ~base ~tools_base ~opamfiles prep
+    in
let action = Misc.to_ocluster_submission spec in
let version = Misc.cache_hint prep in
Current.Job.log job "Prep job: prep %a" Package.pp prep;
@@ -461,8 +533,7 @@ module Prep = struct
--connect ocluster-submission.cap --cache-hint %s \\@.--secret \
ssh_privkey:id_rsa --secret ssh_pubkey:id_rsa.pub--secret \
ssh_config:ssh_config@.@."
-         (Spec.to_spec spec)
-         cache_hint);
+         (Spec.to_spec spec) cache_hint);


Capnp_rpc_lwt.Capability.with_ref build_job @@ fun build_job ->
(* extract result from logs *)
@@ -521,7 +592,6 @@ end


module PrepCache = Current_cache.Make (Prep)


-
type t = prep_output


let hash t = t.hash
@@ -545,20 +615,29 @@ module StringSet = Set.Make (String)
let weekly = Current_cache.Schedule.v ~valid_for:(Duration.of_day 7) ()


let v ~config ~spec ~deps ~opamfiles ~prep =
-  let open Current.Syntax in
+  let open Current.Syntax in
let opamfiles : OpamFiles.Value.t Current.t = opamfiles in
Current.component "voodoo-prep %s" (prep |> Package.digest)
-  |> let> spec and> opamfiles and> deps
-  and> tools_base = Misc.default_base_image in
-    ignore deps;
-    PrepCache.get No_context { prep; config; base = spec; tools_base; opamfiles; }
-    |> Current.Primitive.map_result (Result.map (fun (artifacts_branches_output, _failed) ->
-      let _artifacts_branches_output =
-        artifacts_branches_output
-        |> List.to_seq
-        |> Seq.map (fun Storage.{ id; hash } -> (id, hash))
-        |> StringMap.of_seq
-      in
-
-      { base = spec; prep_hash = ""; result=Success; package=prep; hash="" }))
-
+  |> let> spec
+     and> opamfiles
+     and> deps
+     and> tools_base = Misc.default_base_image in
+     ignore deps;
+     PrepCache.get No_context
+       { prep; config; base = spec; tools_base; opamfiles }
+     |> Current.Primitive.map_result
+          (Result.map (fun (artifacts_branches_output, _failed) ->
+               let _artifacts_branches_output =
+                 artifacts_branches_output
+                 |> List.to_seq
+                 |> Seq.map (fun Storage.{ id; hash } -> (id, hash))
+                 |> StringMap.of_seq
+               in
+
+               {
+                 base = spec;
+                 prep_hash = "";
+                 result = Success;
+                 package = prep;
+                 hash = "";
+               }))
File "src/pipelines/docs.ml", line 1, characters 0-0:
diff --git a/_build/default/src/pipelines/docs.ml b/_build/default/src/pipelines/.formatted/docs.ml
index afd53e5..bcd14e3 100644
--- a/_build/default/src/pipelines/docs.ml
+++ b/_build/default/src/pipelines/.formatted/docs.ml
@@ -11,7 +11,6 @@ end
module OpamPackageNameCurrentMap = CurrentMap (OpamPackage.Name.Map)
module OpamPackageVersionCurrentMap = CurrentMap (OpamPackage.Version.Map)


-
let status = function
| Error (`Msg msg) -> Monitor.Err msg
| Error (`Active _) -> Active
@@ -51,8 +50,7 @@ let rec summarise description arr = function
items
|> current_list_flatten


-
-let count_refs (all:Package.Set.t) =
+let count_refs (all : Package.Set.t) =
let prep_jobs : int ref Package.Map.t ref = ref Package.Map.empty in


let rec get_prep_job package =
@@ -60,168 +58,169 @@ let count_refs (all:Package.Set.t) =
let ref = Package.Map.find package !prep_jobs in
incr ref
with Not_found ->
-        let dependencies =
-          Package.universe package |> Package.Universe.deps
-        in
-        let () =
-          List.iter
-            (fun p ->
-              get_prep_job p)
-            dependencies
-        in
+      let dependencies = Package.universe package |> Package.Universe.deps in
+      let () = List.iter (fun p -> get_prep_job p) dependencies in
prep_jobs := Package.Map.add package (ref 1) !prep_jobs
in
Package.Set.iter (fun x -> get_prep_job x) all;
!prep_jobs


-type 'a compile_job =
-  { job: 'a Current.t;
-    monitor : Monitor.pipeline_tree;
-  }
-
+type 'a compile_job = { job : 'a Current.t; monitor : Monitor.pipeline_tree }
+
let compile ~generation ~config
~(blessed : Package.Blessing.Set.t Current.t OpamPackage.Map.t)
-    (preps : (Prep.t compile_job Package.Map.t)) =
-  let compilation_jobs : Compile.t compile_job option Package.Map.t ref = ref Package.Map.empty in
-  let link_jobs : Compile.t compile_job option Package.Map.t ref = ref Package.Map.empty in
+    (preps : Prep.t compile_job Package.Map.t) =
+  let compilation_jobs : Compile.t compile_job option Package.Map.t ref =
+    ref Package.Map.empty
+  in
+  let link_jobs : Compile.t compile_job option Package.Map.t ref =
+    ref Package.Map.empty
+  in


let rec get_compilation_job link package =
let name = package |> Package.opam |> OpamPackage.to_string in
let extra_deps =
Package.universe package |> Package.Universe.extra_link_deps
-     in
+    in
let job_cache = if link then link_jobs else compilation_jobs in
try Package.Map.find package !job_cache
-    with Not_found ->
+    with Not_found -> (
let job =
Package.Map.find_opt package preps
-        |> Option.map @@ fun { job=prep; _ } ->
+        |> Option.map @@ fun { job = prep; _ } ->
let dependencies =
Package.universe package |> Package.Universe.deps
in
-           begin
-            if List.length extra_deps > 0 then
-              Logs.info (fun m -> m "Extra link deps for %s: %s (link: %b)"
-                name
-                (extra_deps |> List.map (fun x -> x |> Package.opam |> OpamPackage.to_string) |> String.concat ", ") link)
-            end;
+           if List.length extra_deps > 0 then
+             Logs.info (fun m ->
+                 m "Extra link deps for %s: %s (link: %b)" name
+                   (extra_deps
+                   |> List.map (fun x ->
+                          x |> Package.opam |> OpamPackage.to_string)
+                   |> String.concat ", ")
+                   link);
let compile_dependencies_names =
List.filter_map
(fun p ->
-                 get_compilation_job false p |> Option.map (fun { job; _ } -> (p, job)))
+                 get_compilation_job false p
+                 |> Option.map (fun { job; _ } -> (p, job)))
dependencies
in
let link_dependencies_names =
-            if link then
-              List.filter_map
-                (fun p ->
-                  get_compilation_job false p |> Option.map (fun { job; _ } -> (p, job)))
-                extra_deps
-            else
-              []
-            in
+             if link then
+               List.filter_map
+                 (fun p ->
+                   get_compilation_job false p
+                   |> Option.map (fun { job; _ } -> (p, job)))
+                 extra_deps
+             else []
+           in
let compile_dependencies =
compile_dependencies_names |> List.map snd
in
-           let link_dependencies =
-              link_dependencies_names |> List.map snd
-           in
+           let link_dependencies = link_dependencies_names |> List.map snd in


let blessing =
OpamPackage.Map.find (Package.opam package) blessed
|> Current.map (fun b -> Package.Blessing.Set.get b package)
in
-           let deps, jobty = match List.length extra_deps, link with
-             | 0, _ -> (Current.list_seq compile_dependencies), Compile.CompileAndLink
+           let deps, jobty =
+             match (List.length extra_deps, link) with
+             | 0, _ ->
+                 (Current.list_seq compile_dependencies, Compile.CompileAndLink)
| _, false ->
-              Logs.info (fun m -> m "Creating CompileOnly job");
-              (Current.list_seq compile_dependencies), Compile.CompileOnly
+                 Logs.info (fun m -> m "Creating CompileOnly job");
+                 (Current.list_seq compile_dependencies, Compile.CompileOnly)
| _, true ->
-              Logs.info (fun m -> m "Creating LinkOnly job");
-              (Current.list_seq (compile_dependencies @ link_dependencies)), Compile.LinkOnly
+                 Logs.info (fun m -> m "Creating LinkOnly job");
+                 ( Current.list_seq (compile_dependencies @ link_dependencies),
+                   Compile.LinkOnly )
in
let node =
-             Compile.v ~generation ~config ~name ~blessing
-               ~deps
-               ~jobty
-               prep
+             Compile.v ~generation ~config ~name ~blessing ~deps ~jobty prep
in
let monitor =
-             Monitor.(
-               Seq
-                 [
-                   ( "do-deps",
-                     Item prep);
-
-                   ("do-compile", Item node);
-                 ])
+             Monitor.(Seq [ ("do-deps", Item prep); ("do-compile", Item node) ])
in
-           (jobty, {job=node; monitor; })
+           (jobty, { job = node; monitor })
in
match job with
| None -> None
| Some (CompileAndLink, job) ->
-        compilation_jobs := Package.Map.add package (Some job) !compilation_jobs;
-        link_jobs := Package.Map.add package (Some job) !link_jobs;
-        Some job
+          compilation_jobs :=
+            Package.Map.add package (Some job) !compilation_jobs;
+          link_jobs := Package.Map.add package (Some job) !link_jobs;
+          Some job
| Some (CompileOnly, job) ->
-        compilation_jobs := Package.Map.add package (Some job) !compilation_jobs;
-        Some job
+          compilation_jobs :=
+            Package.Map.add package (Some job) !compilation_jobs;
+          Some job
| Some (LinkOnly, job) ->
-        link_jobs := Package.Map.add package (Some job) !link_jobs;
-        Some job
+          link_jobs := Package.Map.add package (Some job) !link_jobs;
+          Some job)
in
-  let get_compilation_node package _ =
-    get_compilation_job true package
+  let get_compilation_node package _ = get_compilation_job true package in
+  let compile_jobs =
+    Package.Map.filter_map get_compilation_node preps |> Package.Map.bindings
in
-  let compile_jobs = Package.Map.filter_map get_compilation_node preps |> Package.Map.bindings in
compile_jobs


-let prep ~config
-  ~opamfiles (all:Package.Set.t) =
-  let prep_jobs : Prep.t compile_job Package.Map.t ref = ref Package.Map.empty in
+let prep ~config ~opamfiles (all : Package.Set.t) =
+  let prep_jobs : Prep.t compile_job Package.Map.t ref =
+    ref Package.Map.empty
+  in


let rec get_prep_job package =
try Package.Map.find package !prep_jobs
with Not_found ->
let job =
-        let dependencies =
-          Package.universe package |> Package.Universe.deps
+        let dependencies = Package.universe package |> Package.Universe.deps in
+        let dep_opams =
+          List.map Package.opam dependencies |> OpamPackage.Set.of_list
+        in
+        let opams =
+          OpamPackage.Set.add (Package.opam package) dep_opams
+          |> OpamPackage.Set.to_list
in
-        let dep_opams = List.map Package.opam dependencies |> OpamPackage.Set.of_list in
-        let opams = OpamPackage.Set.add (Package.opam package) dep_opams |> OpamPackage.Set.to_list in
let ocaml_version = Package.ocaml_version package in
let all_opams = Prep.add_base ocaml_version opams in
-
+
let prep_dependencies_names =
List.map
-            (fun p ->
-              get_prep_job p |> (fun {job; _} -> (p, job)))
+            (fun p -> get_prep_job p |> fun { job; _ } -> (p, job))
dependencies
in
-        let prep_dependencies =
-          prep_dependencies_names |> List.map snd
-        in
+        let prep_dependencies = prep_dependencies_names |> List.map snd in
let base_image = Misc.get_base_image package in
-        let opamfiles = Current.map (fun x ->
-          List.filter_map (fun p -> try Some (p, OpamPackage.Map.find p x) with _ -> None) all_opams |> OpamPackage.Map.of_list) opamfiles in
+        let opamfiles =
+          Current.map
+            (fun x ->
+              List.filter_map
+                (fun p ->
+                  try Some (p, OpamPackage.Map.find p x) with _ -> None)
+                all_opams
+              |> OpamPackage.Map.of_list)
+            opamfiles
+        in
let node =
Prep.v ~config
-              ~deps:(Current.list_seq prep_dependencies)
-              ~spec:base_image ~opamfiles ~prep:package
+            ~deps:(Current.list_seq prep_dependencies)
+            ~spec:base_image ~opamfiles ~prep:package
in
let monitor =
Monitor.(
Seq
[
( "prep",
-                  And (("prep "^Package.id package, Item node)
-                  :: List.map (fun (pkg, compile) ->
-                    ("prep dependency "^Package.id pkg, Item compile)) prep_dependencies_names));
-              ]
-          )
+                  And
+                    (("prep " ^ Package.id package, Item node)
+                    :: List.map
+                         (fun (pkg, compile) ->
+                           ("prep dependency " ^ Package.id pkg, Item compile))
+                         prep_dependencies_names) );
+              ])
in
-        { job=node; monitor; }
+        { job = node; monitor }
in


prep_jobs := Package.Map.add package job !prep_jobs;
@@ -230,24 +229,24 @@ let prep ~config
let get_prep_node package =
get_prep_job package
(* |> Option.map @@ fun (compile, monitor) ->
-      let node =
-        Html.v ~generation ~config
-          ~name:(package |> Package.opam |> OpamPackage.to_string)
-          ~voodoo:voodoo_gen compile
-      in
-      let monitor =
-        match monitor with
-        | Monitor.Seq lst -> Monitor.Seq (lst @ [ ("do-html", Item node) ])
-        | _ -> assert false
-      in
-      let package_status = Monitor.pipeline_state monitor in
-      let _index =
-        (* let+ step_list = summarise "" [] monitor  *)
-        (* DEBUGGING THE MEMORY BLOAT -- Skip the summarising for now *)
-        let+ pipeline_id in
-        Index.record package pipeline_id package_status []
-      in
-      (node, monitor) *)
+       let node =
+         Html.v ~generation ~config
+           ~name:(package |> Package.opam |> OpamPackage.to_string)
+           ~voodoo:voodoo_gen compile
+       in
+       let monitor =
+         match monitor with
+         | Monitor.Seq lst -> Monitor.Seq (lst @ [ ("do-html", Item node) ])
+         | _ -> assert false
+       in
+       let package_status = Monitor.pipeline_state monitor in
+       let _index =
+         (* let+ step_list = summarise "" [] monitor  *)
+         (* DEBUGGING THE MEMORY BLOAT -- Skip the summarising for now *)
+         let+ pipeline_id in
+         Index.record package pipeline_id package_status []
+       in
+       (node, monitor) *)
in
Package.Set.iter (fun x -> ignore (get_prep_node x)) all;
!prep_jobs
@@ -338,9 +337,7 @@ let v ~config ~opam ~monitor ~migrations () =
| Some path -> Index.migrate path
| None -> Current.return ()
in
-  let generation =
-    Epoch.v config
-  in
+  let generation = Epoch.v config in
(* 0) Housekeeping - run migrations *)
let* _ = migrations in
Log.info (fun f -> f "0) Migrations");
@@ -359,7 +356,9 @@ let v ~config ~opam ~monitor ~migrations () =
Log.info (fun f -> f "2) Solver result");
(* 3.a) From solver results, obtain a list of package.version.universe corresponding to prep jobs *)
let all_packages_jobs =
-    solver_result |> Solver.keys |> List.filter_map (fun x -> try Some (Solver.get x) with _ -> None)
+    solver_result
+    |> Solver.keys
+    |> List.filter_map (fun x -> try Some (Solver.get x) with _ -> None)
in
Log.info (fun f -> f "2.5) Solver result...");
(* 3.b) Expand that list to all the obtainable package.version.universe *)
@@ -368,14 +367,19 @@ let v ~config ~opam ~monitor ~migrations () =
all_packages_jobs
|> List.rev_map Package.all_deps
|> List.flatten
-    |> List.filter (fun pkg -> Ocaml_version.compare (Package.ocaml_version pkg) (Ocaml_version.Releases.v4_04_2) >= 0)
+    |> List.filter (fun pkg ->
+           Ocaml_version.compare
+             (Package.ocaml_version pkg)
+             Ocaml_version.Releases.v4_04_2
+           >= 0)
|> Package.Set.of_list
in
-  Log.info (fun f -> f "3) All packages (%d)" (Package.Set.cardinal all_packages));
+  Log.info (fun f ->
+      f "3) All packages (%d)" (Package.Set.cardinal all_packages));
+
(* 4) Schedule a somewhat small set of jobs to obtain at least one universe for each package.version *)
(* 4a) Decide on a docker tag for each job *)
(* 5) Run the preparation step *)
-
let weekly = Current_cache.Schedule.v ~valid_for:(Duration.of_day 7) () in


let repo_opam =
@@ -383,24 +387,37 @@ let v ~config ~opam ~monitor ~migrations () =
"https://github.com/ocaml/opam-repository.git"
in


-  let opamfiles =
-    Current.component "opamfiles" |>
+  let opamfiles =
+    Current.component "opamfiles"
+    |>
let> repo_opam in
-    let packages = Package.Set.to_list all_packages |> List.map Package.opam |> OpamPackage.Set.of_list in
-    let extra = [
-      "conf-graphviz.0.1";
-      "conf-which.1";
-      "base-threads.base";
-      "ocaml-options-vanilla.1";
-      "base-bigarray.base";
-      "base-domains.base";
-      "base-nnp.base";
-      "base-effects.base";
-      "host-arch-x86_64.1";
-      "host-system-other.1";
-    ] in
-    let packages = OpamPackage.Set.union (List.map OpamPackage.of_string extra |> OpamPackage.Set.of_list) packages |> OpamPackage.Set.to_list in
-    Prep.OpamFilesCache.get No_context Prep.OpamFiles.Key.{ repo = repo_opam; packages }
+    let packages =
+      Package.Set.to_list all_packages
+      |> List.map Package.opam
+      |> OpamPackage.Set.of_list
+    in
+    let extra =
+      [
+        "conf-graphviz.0.1";
+        "conf-which.1";
+        "base-threads.base";
+        "ocaml-options-vanilla.1";
+        "base-bigarray.base";
+        "base-domains.base";
+        "base-nnp.base";
+        "base-effects.base";
+        "host-arch-x86_64.1";
+        "host-system-other.1";
+      ]
+    in
+    let packages =
+      OpamPackage.Set.union
+        (List.map OpamPackage.of_string extra |> OpamPackage.Set.of_list)
+        packages
+      |> OpamPackage.Set.to_list
+    in
+    Prep.OpamFilesCache.get No_context
+      Prep.OpamFiles.Key.{ repo = repo_opam; packages }
in


let counts = count_refs all_packages in
@@ -412,45 +429,46 @@ let v ~config ~opam ~monitor ~migrations () =


let counts = List.sort (fun (_, x) (_, y) -> compare !x !y) counts in


-  let (_, hd),tl = List.hd counts, List.tl counts in
-  let (last_count, last_val, count) = List.fold_left (fun (cur_count,cur_val,all) (_, count) ->
-    if cur_val = !count
-    then (cur_count + 1, cur_val, all)
-    else (1, !count, (cur_val, cur_count) :: all)) (1, !hd, []) tl in
+  let (_, hd), tl = (List.hd counts, List.tl counts) in
+  let last_count, last_val, count =
+    List.fold_left
+      (fun (cur_count, cur_val, all) (_, count) ->
+        if cur_val = !count then (cur_count + 1, cur_val, all)
+        else (1, !count, (cur_val, cur_count) :: all))
+      (1, !hd, []) tl
+  in


let all_counts = (last_val, last_count) :: count in
-  List.iter (fun (v, count) ->
-    Printf.printf "%d %d\n%!" v count) all_counts;
-
-  let cache_packages = List.fold_left (fun acc (v, count) ->
-    if !count > Config.cache_threshold config
-    then Package.Set.add v acc
-    else acc) Package.Set.empty counts
+  List.iter (fun (v, count) -> Printf.printf "%d %d\n%!" v count) all_counts;
+
+  let cache_packages =
+    List.fold_left
+      (fun acc (v, count) ->
+        if !count > Config.cache_threshold config then Package.Set.add v acc
+        else acc)
+      Package.Set.empty counts
in


Package.add_important_packages cache_packages;


Log.info (fun f ->
-    f "4) Cache packages (%d)" (Package.Set.cardinal cache_packages));
+      f "4) Cache packages (%d)" (Package.Set.cardinal cache_packages));


(* let cumulative =
-    let x = ref 0 in
-    List.map (fun (v, count) ->
-      let y = !x + count in
-      x := y;
-      (v, y)) all_counts in
+       let x = ref 0 in
+       List.map (fun (v, count) ->
+         let y = !x + count in
+         x := y;
+         (v, y)) all_counts in


-  List.iter (fun (v, count) ->
-    Printf.printf "%d %d\n%!" v count) cumulative;
-
-  ignore @@ exit 0; *)
+     List.iter (fun (v, count) ->
+       Printf.printf "%d %d\n%!" v count) cumulative;


+     ignore @@ exit 0; *)
let prepped' : Prep.t compile_job Package.Map.t =
-    prep ~config
-    ~opamfiles all_packages
+    prep ~config ~opamfiles all_packages
in
-  Log.info (fun f ->
-    f ".. %d prepped nodes" (Package.Map.cardinal prepped'));
+  Log.info (fun f -> f ".. %d prepped nodes" (Package.Map.cardinal prepped'));


Log.info (fun f -> f "5) Prep nodes");
(* 6) Promote packages to the main tree *)
@@ -470,7 +488,7 @@ let v ~config ~opam ~monitor ~migrations () =
in
let by_opam_package =
Package.Map.fold
-        (fun package {job=prep; _ } opam_map ->
+        (fun package { job = prep; _ } opam_map ->
let opam = Package.opam package in
let job =
let+ job = Current.state ~hidden:true prep in
@@ -497,29 +515,32 @@ let v ~config ~opam ~monitor ~migrations () =


(* 7) Odoc compile and html-generate artifacts *)
let html, html_input_node, package_pipeline_tree, html2 =
-    let compile_monitor =
-      compile ~generation ~config ~blessed
-       prepped'
+    let compile_monitor = compile ~generation ~config ~blessed prepped' in
+    let html2 =
+      List.map
+        (fun (pkg, { job = compile; _ }) -> (pkg, compile))
+        compile_monitor
in
-    let html2 = List.map (fun (pkg, { job=compile; _ }) -> (pkg, compile)) compile_monitor in
Log.info (fun f ->
f ".. %d compilation nodes" (List.length compile_monitor));
let c, compile_node =
compile_monitor
-      |> List.map (fun (a, {job=b; _}) -> (a, b))
+      |> List.map (fun (a, { job = b; _ }) -> (a, b))
|> compile_hierarchical_collapse ~input:solver_result_c
in
( c |> List.to_seq |> Package.Map.of_seq,
compile_node,
compile_monitor
-      |> List.map (fun (a, { monitor=b; _}) -> (a, b))
+      |> List.map (fun (a, { monitor = b; _ }) -> (a, b))
|> List.to_seq
|> Package.Map.of_seq,
-      html2 |> Package.Map.of_list)
+      html2 |> Package.Map.of_list )
in
Log.info (fun f -> f "7) Odoc compile nodes");


-  let prep_pipeline_tree = Package.Map.map (fun (p : Prep.t compile_job) -> p.monitor) prepped' in
+  let prep_pipeline_tree =
+    Package.Map.map (fun (p : Prep.t compile_job) -> p.monitor) prepped'
+  in


(* 7.b) Inform the monitor *)
let () =
dune build @fmt failed
"/usr/bin/env" "bash" "-c" "opam exec -- dune build @fmt --ignore-promoted-rules || (echo "dune build @fmt failed"; exit 2)" failed with exit status 2
2025-04-22 12:40.13: Job failed: Failed: Build failed