From d5d725630fb8eca2b8eb79a479044646f312b056 Mon Sep 17 00:00:00 2001 From: Marius Peter Date: Sun, 25 May 2025 15:49:46 +0200 Subject: Refactor helpers as presenters. Rather than generically ``helping'', this module provides intermediate representations of ocaml-git objects usable by the Views module. --- lib/git_presenters.ml | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 lib/git_presenters.ml (limited to 'lib/git_presenters.ml') diff --git a/lib/git_presenters.ml b/lib/git_presenters.ml new file mode 100644 index 0000000..cdd9caa --- /dev/null +++ b/lib/git_presenters.ml @@ -0,0 +1,76 @@ +module Store = Git_unix.Store + +let full_path path = Filename.concat Config.git_directory path + +let store repo = + let path = Fpath.v @@ full_path repo in + Store.v ~dotgit:path path + +let short_hash hash = String.sub hash 0 8 + +let repo_description repo = + let description_path = Filename.concat (full_path repo) "description" in + In_channel.with_open_text description_path In_channel.input_all + +module User = struct + type t = Git.User.t +end + +module Commit = struct + open Lwt_result.Syntax + + type t = { + hash : string; + parents : string list; + author : User.t; + message : string option; + } + + let of_hash store h = + let* v = Store.read store h in + match v with + | Git.Value.Commit c -> + Lwt_result.return + { + hash = Store.Hash.to_hex h; + parents = Store.Value.Commit.parents c |> List.map Store.Hash.to_hex; + author = Store.Value.Commit.author c; + message = Store.Value.Commit.message c; + } + | _ -> Lwt_result.fail @@ `Msg "value is not a commit" + + let recent_commits repo n = + let* store = store repo in + let* head = Store.Ref.resolve store Git.Reference.head in + let rec walk acc hash count = + if count = 0 then Lwt_result.return (List.rev acc) + else + let* commit = of_hash store hash in + match commit.parents with + | parent :: _ -> + walk (commit :: acc) (Store.Hash.of_hex parent) (count - 1) + | [] -> Lwt_result.return (List.rev (commit :: acc)) + in + walk [] head n + + let of_id repo id = + let open Lwt_result.Syntax in + let* store = store repo in + let id = Store.Hash.of_hex id in + of_hash store id +end + +module Branch = struct + type t = { name : string } + + let all_branches repo = + let open Lwt_result.Syntax in + let* store = Git_unix.Store.v (Fpath.v repo) in + let open Lwt.Syntax in + let* refs = Store.Ref.list store in + let branches = + (* Filter these references for branches! *) + List.map (function _, x -> x |> Store.Hash.to_hex) refs + in + Lwt_result.return branches +end -- cgit v1.2.3