diff options
| author | Marius Peter <marius.peter@tutanota.com> | 2025-01-25 19:16:32 +0100 | 
|---|---|---|
| committer | Marius Peter <marius.peter@tutanota.com> | 2025-01-25 19:16:32 +0100 | 
| commit | 4edccf9a2504e8798df160e04a0820a7256f82b1 (patch) | |
| tree | 371db4e0dbeaf8a62f1b2adb5b7f445b6bb799a0 /lib/views | |
| parent | d817e1e464d1fb0c251c0d5e97b15466b0b1621c (diff) | |
Restructure Views library.
Diffstat (limited to 'lib/views')
| -rw-r--r-- | lib/views/dune | 4 | ||||
| -rw-r--r-- | lib/views/layouts.ml | 45 | ||||
| -rw-r--r-- | lib/views/ogit_root.ml | 18 | ||||
| -rw-r--r-- | lib/views/repo.ml | 38 | 
4 files changed, 105 insertions, 0 deletions
| diff --git a/lib/views/dune b/lib/views/dune new file mode 100644 index 0000000..1b722c5 --- /dev/null +++ b/lib/views/dune @@ -0,0 +1,4 @@ +(library + (name views) + (public_name ogit.views) + (libraries dream-html git)) diff --git a/lib/views/layouts.ml b/lib/views/layouts.ml new file mode 100644 index 0000000..d9def3c --- /dev/null +++ b/lib/views/layouts.ml @@ -0,0 +1,45 @@ +open Dream_html +open HTML + +let header = +  div [] +    [ +      h1 [] [ txt "ogit" ]; +      h2 [] [ txt "A mobile-friendly Git repository viewer" ]; +    ] + +let topnav = +  nav +    [ id "top" ] +    [ +      ul [] +        [ +          li [] [ a [ href "/" ] [ txt "Home" ] ]; +          li [] [ a [ href "/" ] [ txt "Refs" ] ]; +          li [] [ a [ href "/" ] [ txt "Log" ] ]; +          li [] [ a [ href "/" ] [ txt "Tree" ] ]; +          li [] [ a [ href "/" ] [ txt "Commit" ] ]; +          li [] [ a [ href "/" ] [ txt "Diff" ] ]; +        ]; +    ] + +let footer name = +  let today = Unix.localtime (Unix.time ()) in +  let year = string_of_int (today.Unix.tm_year + 1900) in +  let space = " " in +  let footer_text = String.concat space [ "©"; year; name ] in +  footer [] [ txt "%s" footer_text ] + +let application ?(page_title = "ogit") ?(head_content = null []) ~main_content +    () = +  html [] +    [ +      head [] [ title [] "%s" page_title; head_content ]; +      body [] +        [ +          header; +          topnav; +          div [ id "main" ] [ main_content ]; +          footer "Marius PETER"; +        ]; +    ] diff --git a/lib/views/ogit_root.ml b/lib/views/ogit_root.ml new file mode 100644 index 0000000..02928c9 --- /dev/null +++ b/lib/views/ogit_root.ml @@ -0,0 +1,18 @@ +open Dream_html +open HTML + +let git_directory = Filename.concat (Unix.getenv "HOME") "git" + +let repositories_in dir = +  let links = +    (* if Sys.file_exists dir && Sys.is_directory dir then *) +    let repositories = Sys.readdir dir |> Array.to_list +    and repo_to_li repo = li [] [ a [ href "%s" repo ] [ txt "%s" repo ] ] in +    let repositories_as_items = List.map repo_to_li repositories in +    ul [] repositories_as_items +    (* else txt "No repositories found in %s" dir *) +  in +  div [ id "repositories" ] [ links ] + +let main_content = div [] [ txt "Hello World!"; repositories_in git_directory ] +let render = Layouts.application ~page_title:"My repositories" ~main_content 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 | 
