[OCaml] Mobile-friendly clone of cgit.
Update views.
This doesn't even work. Why is OCaml so complicated?!
lib/views/dune
@@ -1,4 +1,4 @@
1
1
(library
2
2
(name views)
3
3
(public_name ogit.views)
4
Removed:
(libraries dream-html git))
4
Added:
(libraries dream-html git-unix))
lib/views/ogit_root.ml
@@ -3,16 +3,10 @@
3
3
4
4
let git_directory = Filename.concat (Unix.getenv "HOME") "git"
5
5
6
Removed:
let repositories_in dir =
7
Removed:
let links =
8
Removed:
(* if Sys.file_exists dir && Sys.is_directory dir then *)
9
Removed:
let repositories = Sys.readdir dir |> Array.to_list
10
Removed:
and repo_to_li repo = li [] [ a [ href "%s" repo ] [ txt "%s" repo ] ] in
11
Removed:
let repositories_as_items = List.map repo_to_li repositories in
12
Removed:
ul [] repositories_as_items
13
Removed:
(* else txt "No repositories found in %s" dir *)
14
Removed:
in
15
Removed:
div [ id "repositories" ] [ links ]
6
Added:
let repositories_in directory =
7
Added:
let repositories = Sys.readdir directory |> Array.to_list
8
Added:
and li_of_repo repo = li [] [ a [ href "%s" repo ] [ txt "%s" repo ] ] in
9
Added:
div [ id "repositories" ] [ ul [] @@ List.map li_of_repo repositories ]
16
10
17
Removed:
let main_content = div [] [ txt "Hello World!"; repositories_in git_directory ]
11
Added:
let main_content = null [ txt "Hello World!"; repositories_in git_directory ]
18
12
let render = Layouts.application ~page_title:"My repositories" ~main_content
lib/views/repo.ml
@@ -1,38 +0,0 @@
1
Removed:
open Dream_html
2
Removed:
open HTML
3
Removed:
open Git_unix (* Import Git_unix for working with repositories *)
4
Removed:
5
Removed:
let git_directory = Filename.concat (Unix.getenv "HOME") "git"
6
Removed:
let repo_path repo_name = Filename.concat git_directory repo_name
7
Removed:
8
Removed:
let list_commits repo_name =
9
Removed:
let repo_dir = repo_path repo_name in
10
Removed:
if Sys.file_exists repo_dir && Sys.is_directory repo_dir then
11
Removed:
let store = Store.v (Fpath.v repo_dir) |> Result.get_ok in
12
Removed:
let head = Store.Head.get store |> Result.get_ok in
13
Removed:
let rec read_commits commits acc =
14
Removed:
match commits with
15
Removed:
| [] -> acc
16
Removed:
| hash :: rest ->
17
Removed:
let commit = Store.read_commit store hash |> Result.get_ok in
18
Removed:
let hash_str = Hash.to_hex hash in
19
Removed:
let message = Commit.message commit in
20
Removed:
let author = Commit.author commit in
21
Removed:
let date = Commit.date commit in
22
Removed:
let formatted_commit =
23
Removed:
li []
24
Removed:
[
25
Removed:
txt (Printf.sprintf "%s - %s (%s)" hash_str message author);
26
Removed:
txt (" on " ^ date);
27
Removed:
]
28
Removed:
in
29
Removed:
read_commits rest (formatted_commit :: acc)
30
Removed:
in
31
Removed:
let all_commits = Store.Commit.list store head in
32
Removed:
ul [] (read_commits all_commits [])
33
Removed:
else ul [] [ li [] [ txt "Error: Repository not found." ] ]
34
Removed:
35
Removed:
(* Render the repository's commit list as HTML *)
36
Removed:
let render repo_name =
37
Removed:
let commits = list_commits repo_name in
38
Removed:
Layouts.application ~page_title:("Commits for " ^ repo_name) commits
lib/views/repo_root.ml
@@ -0,0 +1,41 @@
1
Added:
open Dream_html
2
Added:
open HTML
3
Added:
open Git_unix
4
Added:
5
Added:
let git_directory = Filename.concat (Unix.getenv "HOME") "git"
6
Added:
7
Added:
let err_to_string err = Fmt.to_to_string Store.pp_error err
8
Added:
9
Added:
let get_head_commit repo_path =
10
Added:
Lwt_main.run (
11
Added:
let open Lwt.Infix in
12
Added:
match Git.Reference.of_string "HEAD" with
13
Added:
| Error err ->
14
Added:
Lwt.return (Error ("Invalid HEAD reference string: " ^ err_to_string err))
15
Added:
| Ok head_ref_name ->
16
Added:
Store.v (Fpath.v repo_path) >>= function
17
Added:
| Error err ->
18
Added:
Lwt.return (Error ("Failed to open repository: " ^ err_to_string err))
19
Added:
| Ok store ->
20
Added:
Store.Ref.resolve store head_ref_name >>= function
21
Added:
| Error err ->
22
Added:
Lwt.return (Error ("Failed to resolve HEAD: " ^ err_to_string err))
23
Added:
| Ok head_oid -> Lwt.return (Ok head_oid)
24
Added:
(* Git.Commit.v store head_oid >>= function *)
25
Added:
(* | Error err -> *)
26
Added:
(* Lwt.return (Error ("Failed to get commit from hash: " ^ err_to_string err)) *)
27
Added:
(* | Ok commit -> *)
28
Added:
(* Lwt.return (Ok commit) *)
29
Added:
)
30
Added:
31
Added:
let main_content =
32
Added:
let open Lwt.Infix in
33
Added:
Lwt.async (fun _ ->
34
Added:
get_head_commit git_directory >>= function
35
Added:
| Error msg ->
36
Added:
Lwt.map (fun content -> [ p [] [ txt content ]]) (Error msg)
37
Added:
| Ok head_oid ->
38
Added:
Lwt.map (fun content -> [ p [] [ txt "HEAD commit hash: %s" content ]]) (Store.Hash.to_string head_oid)
39
Added:
)
40
Added:
41
Added:
let render = Layouts.application ~page_title:"My repositories" ~main_content