summaryrefslogtreecommitdiff
path: root/lib/git_presenters.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/git_presenters.ml')
-rw-r--r--lib/git_presenters.ml76
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
Copyright 2019--2025 Marius PETER