From f94d27e3df990d9dd7dae69191dd05e5f691b0bb Mon Sep 17 00:00:00 2001 From: Marius Peter Date: Thu, 1 May 2025 19:28:20 +0200 Subject: Perform deep refactoring. Better separation of concern; this paves the way for better testing down the road. --- lib/git_helpers.ml | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'lib/git_helpers.ml') diff --git a/lib/git_helpers.ml b/lib/git_helpers.ml index 0626d02..4e2215e 100644 --- a/lib/git_helpers.ml +++ b/lib/git_helpers.ml @@ -1,11 +1,39 @@ open Lwt.Infix -let get_head_commit_hash repo_path = - let full_path = Filename.concat Config.git_directory repo_path in - let%lwt store_result = Git_unix.Store.v @@ Fpath.v full_path in +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)) -- cgit v1.2.3