diff options
author | Marius Peter <marius.peter@tutanota.com> | 2025-05-29 16:30:24 +0200 |
---|---|---|
committer | Marius Peter <marius.peter@tutanota.com> | 2025-05-29 16:30:24 +0200 |
commit | 21cbcf2e8b69403f3973fa19e5e96bee5ba870b7 (patch) | |
tree | 456af4ff0f2c75fe3ce2ad9375d5ad2f96166597 /lib/git_presenters.ml | |
parent | ffae61af1a13862ffc2bf9415313f5da3d90d38e (diff) |
Start work on Trees.
Making slow but steady progress... Bulldozer mindset.
Diffstat (limited to 'lib/git_presenters.ml')
-rw-r--r-- | lib/git_presenters.ml | 75 |
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 |