Something went wrong. Try again.
Odoc docs forked from jon.recoil.org/odd
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152type t = { prefix : Fpath.t }
let prefix t = t.prefix
let v prefix = let prefix = if Fpath.is_abs prefix then prefix else match Bos.OS.Dir.current () with | Ok cwd -> Fpath.(normalize (cwd // prefix)) | Error _ -> prefix in { prefix }
let detect () = match Sys.getenv_opt "OPAM_SWITCH_PREFIX" with | Some p when p <> "" -> Ok (v (Fpath.v p)) | _ -> ( let cmd = Bos.Cmd.(v "opam" % "var" % "prefix") in match Bos.OS.Cmd.(run_out cmd |> to_string ~trim:true) with | Ok p when p <> "" -> Ok (v (Fpath.v p)) | Ok _ -> Error (`Msg "empty output from `opam var prefix`") | Error (`Msg m) -> Error (`Msg (Printf.sprintf "cannot determine the switch prefix (%s); set \ $OPAM_SWITCH_PREFIX or pass --prefix" m)))
let state_dir t = Fpath.(t.prefix / "var" / "cache" / "odd")let log_file t = Fpath.(state_dir t / "log")let lock_file t = Fpath.(state_dir t / "lock")let work_dir t = Fpath.(state_dir t / "work")let odoc_dir t = Fpath.(t.prefix / "odoc")let packages_dir t = Fpath.(t.prefix / ".opam-switch" / "packages")
(* Directory entries are <name>.<version>; package names cannot contain dots, so cut at the first one. *)let split_name_version s = match String.index_opt s '.' with | Some i when i > 0 -> Some (String.sub s 0 i, String.sub s (i + 1) (String.length s - i - 1)) | _ -> None
let installed t = match Bos.OS.Dir.contents ~rel:true (packages_dir t) with | Error _ -> [] | Ok entries -> List.filter_map (fun p -> split_name_version (Fpath.to_string p)) entries |> List.sort compare