diff options
author | Marius Peter <marius.peter@tutanota.com> | 2025-05-25 15:49:46 +0200 |
---|---|---|
committer | Marius Peter <marius.peter@tutanota.com> | 2025-05-25 15:49:46 +0200 |
commit | d5d725630fb8eca2b8eb79a479044646f312b056 (patch) | |
tree | 942bfa1aa7f0916289a352a4430670b1c4cc9950 /lib/git_presenters.ml | |
parent | 1f904a2eb07c5d98288aeb6d762f8f4668df79ca (diff) |
Refactor helpers as presenters.
Rather than generically ``helping'', this module provides intermediate
representations of ocaml-git objects usable by the Views module.
Diffstat (limited to 'lib/git_presenters.ml')
-rw-r--r-- | lib/git_presenters.ml | 76 |
1 files changed, 76 insertions, 0 deletions
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 |