open Lwt.Infix let full_path path = Filename.concat Config.git_directory path let head_commit_hash repo_path = let%lwt store_result = Git_unix.Store.v @@ Fpath.v @@ full_path repo_path in match store_result with | Error _ -> Lwt.return_error "Could not open the Git repository." | Ok store -> ( Git_unix.Store.Ref.resolve store Git.Reference.head >|= function | Error _ -> Error ("Failed to resolve HEAD for repo " ^ repo_path) | Ok hash -> Ok (Git_unix.Store.Hash.to_hex hash)) let latest_commits repo_path count = let cmd = Printf.sprintf "git -C %s log --pretty=format:'%%ad %%s' --date=short -n %d" (full_path repo_path) count in Lwt.catch (fun () -> let%lwt output = Lwt_process.pread ("", [| "sh"; "-c"; cmd |]) in let lines = String.split_on_char '\n' output in Lwt.return_ok lines) (fun exn -> Lwt.return_error (Printexc.to_string exn)) let all_branches repo_path = let cmd = Printf.sprintf "git -C %s branch --format=%%(refname:short)" @@ full_path repo_path in Lwt.catch (fun () -> let%lwt output = Lwt_process.pread ("", [| "sh"; "-c"; cmd |]) in let branches = String.split_on_char '\n' output |> List.filter (fun s -> String.trim s <> "") in Lwt.return_ok branches) (fun exn -> Lwt.return_error (Printexc.to_string exn))