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.ml75
1 files changed, 64 insertions, 11 deletions
diff --git a/lib/git_presenters.ml b/lib/git_presenters.ml
index feff7ac..f0a0317 100644
--- a/lib/git_presenters.ml
+++ b/lib/git_presenters.ml
@@ -27,11 +27,11 @@ type commit = {
message : string option;
}
-let to_commit store h =
- let* v = Store.read store h in
+let to_commit store hash =
+ let* v = Store.read store hash in
match v with
| Git.Value.Commit c ->
- let hash = Store.Hash.to_hex h in
+ let hash = Store.Hash.to_hex hash in
Lwt_result.return
{
hash;
@@ -40,7 +40,12 @@ let to_commit store h =
author = Store.Value.Commit.author c;
message = Store.Value.Commit.message c;
}
- | _ -> Lwt_result.fail @@ `Msg "value is not a commit"
+ | _ -> Lwt_result.fail (`Msg "value is not a commit")
+
+let commit_of_id repo id =
+ let* store = store repo in
+ let hash = Store.Hash.of_hex id in
+ to_commit store hash
let recent_commits repo n =
let* store = store repo in
@@ -56,18 +61,66 @@ let recent_commits repo n =
in
walk [] head n
-let of_id repo id =
- let* store = store repo in
- let id = Store.Hash.of_hex id in
- to_commit store id
-
-type branch = { name : string }
+type branch = { hash : string; name : string }
let all_branches repo =
let* store = store repo in
let open Lwt.Syntax in
let* refs = Store.Ref.list store in
let branches =
- List.map (fun (ref, _) -> { name = Git.Reference.to_string ref }) refs
+ List.map
+ (fun (ref, hash) ->
+ { name = Git.Reference.to_string ref; hash = Store.Hash.to_hex hash })
+ refs
in
Lwt_result.return branches
+
+type tree_entry = {
+ hash : string;
+ short_hash : string;
+ name : string;
+ perm : int;
+}
+
+type tree = { hash : string; short_hash : string; entries : tree_entry list }
+
+let to_entry _ =
+ {
+ hash = "foo";
+ short_hash = String.sub "foobar" 0 8;
+ name = "foobarbino";
+ perm = 122;
+ }
+
+let present_tree tree = Store.Value.Tree.to_list tree |> List.map to_entry
+
+let to_tree store hash =
+ let* v = Store.read store hash in
+ match v with
+ | Git.Value.Tree tree ->
+ let hash = Store.Hash.to_hex hash in
+ Lwt_result.return
+ { hash; short_hash = String.sub hash 0 8; entries = present_tree tree }
+ | _ ->
+ Dream.log "Value is not a tree";
+ Lwt_result.fail (`Msg "value is not a tree")
+
+let head_tree_id store =
+ let* commit_hash = Store.Ref.resolve store Git.Reference.head in
+ let* v = Store.read store commit_hash in
+ match v with
+ | Git.Value.Commit commit ->
+ Store.Value.Commit.tree commit |> Lwt_result.return
+ | _ ->
+ Dream.log "no head tree id";
+ Lwt_result.fail (`Msg "")
+
+let head_tree repo =
+ let* store = store repo in
+ let* hash = head_tree_id store in
+ to_tree store hash
+
+let tree_of_id repo id =
+ let* store = store repo in
+ let* hash = Lwt_result.return (Store.Hash.of_hex id) in
+ to_tree store hash
Copyright 2019--2025 Marius PETER