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