summaryrefslogtreecommitdiff
path: root/lib/views/repo.ml
blob: 7fefce88daa4fcaaad0cb0c721a65941899b88cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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
Copyright 2019--2025 Marius PETER