diff options
Diffstat (limited to 'lib/views/repo.ml')
-rw-r--r-- | lib/views/repo.ml | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/views/repo.ml b/lib/views/repo.ml new file mode 100644 index 0000000..7fefce8 --- /dev/null +++ b/lib/views/repo.ml @@ -0,0 +1,38 @@ +open Dream_html +open HTML +open Git_unix (* Import Git_unix for working with repositories *) + +let git_directory = Filename.concat (Unix.getenv "HOME") "git" +let repo_path repo_name = Filename.concat git_directory repo_name + +let list_commits repo_name = + let repo_dir = repo_path repo_name in + if Sys.file_exists repo_dir && Sys.is_directory repo_dir then + let store = Store.v (Fpath.v repo_dir) |> Result.get_ok in + let head = Store.Head.get store |> Result.get_ok in + let rec read_commits commits acc = + match commits with + | [] -> acc + | hash :: rest -> + let commit = Store.read_commit store hash |> Result.get_ok in + let hash_str = Hash.to_hex hash in + let message = Commit.message commit in + let author = Commit.author commit in + let date = Commit.date commit in + let formatted_commit = + li [] + [ + txt (Printf.sprintf "%s - %s (%s)" hash_str message author); + txt (" on " ^ date); + ] + in + read_commits rest (formatted_commit :: acc) + in + let all_commits = Store.Commit.list store head in + ul [] (read_commits all_commits []) + else ul [] [ li [] [ txt "Error: Repository not found." ] ] + +(* Render the repository's commit list as HTML *) +let render repo_name = + let commits = list_commits repo_name in + Layouts.application ~page_title:("Commits for " ^ repo_name) commits |