[OCaml] Mobile-friendly clone of cgit.
Change Views render function return type.
All Views submodules' render functions now return a Dream_html node promise, rather than the node itself.
Changed files
bin/main.ml
@@ -2,8 +2,9 @@
2
2
Dream.run @@ Dream.logger
3
3
@@ Dream.router
4
4
[
5
Removed:
Dream.get "/" (fun _ -> Ogit.Handlers.ogit_root ());
6
Removed:
Dream.get "/:repo_name" (fun request ->
7
Removed:
Ogit.Handlers.repo_root @@ Dream.param request "repo_name");
5
Added:
Dream.get "/" (fun _req -> Ogit.Handlers.ogit_root _req);
6
Added:
Dream.get "/:repo_name" (fun req ->
7
Added:
let repo_name = Dream.param req "repo_name" in
8
Added:
Ogit.Handlers.repo_root repo_name);
8
9
Dream.get "/static/**" (Dream.static "./lib/static");
9
10
]
lib/config.ml
@@ -1,1 +1,2 @@
1
1
let git_directory = Filename.concat (Unix.getenv "HOME") "git"
2
Added:
let author = "Marius Peter"
lib/dune
@@ -1,5 +1,5 @@
1
1
(library
2
2
(name ogit)
3
Removed:
(libraries dream dream-html lwt_ppx git-unix)
3
Added:
(libraries dream dream-html git-unix)
4
4
(preprocess
5
5
(pps lwt_ppx)))
lib/handlers.ml
@@ -1,4 +1,6 @@
1
Removed:
let ogit_root _ = Dream_html.respond @@ Views.Ogit_root.render ()
1
Added:
open Lwt.Infix
2
2
3
Added:
let ogit_root _ = Views.Ogit_root.render () >>= Dream_html.respond
4
Added:
3
5
let repo_root repo_name =
4
Removed:
Dream_html.respond @@ Lwt_main.run @@ Views.Repo_root.render repo_name
6
Added:
Views.Repo_root.render repo_name >>= Dream_html.respond
lib/views.ml
@@ -1,31 +1,19 @@
1
Removed:
type page_data = { title : string; main_content : Dream_html.node list }
1
Added:
type head_data = { page_title : string }
2
2
3
Added:
type body_data = {
4
Added:
title : string;
5
Added:
subtitle : string;
6
Added:
topnav : Dream_html.node;
7
Added:
content : Dream_html.node list;
8
Added:
}
9
Added:
3
10
module Layout = struct
4
11
open Dream_html
5
12
open HTML
6
13
7
Removed:
let header =
8
Removed:
null
9
Removed:
[
10
Removed:
h1 [] [ txt "ogit" ];
11
Removed:
h2 [] [ txt "A mobile-friendly Git repository viewer" ];
12
Removed:
]
14
Added:
let header title subtitle =
15
Added:
null [ h1 [] [ txt "%s" title ]; h2 [] [ txt "%s" subtitle ] ]
13
16
14
Removed:
let topnav =
15
Removed:
nav
16
Removed:
[ id "top" ]
17
Removed:
[
18
Removed:
ul []
19
Removed:
[
20
Removed:
li [] [ a [ href "/" ] [ txt "Home" ] ];
21
Removed:
li [] [ a [ href "/" ] [ txt "Refs" ] ];
22
Removed:
li [] [ a [ href "/" ] [ txt "Log" ] ];
23
Removed:
li [] [ a [ href "/" ] [ txt "Tree" ] ];
24
Removed:
li [] [ a [ href "/" ] [ txt "Commit" ] ];
25
Removed:
li [] [ a [ href "/" ] [ txt "Diff" ] ];
26
Removed:
];
27
Removed:
]
28
Removed:
29
17
let footer name =
30
18
let today = Unix.localtime (Unix.time ()) in
31
19
let year = today.Unix.tm_year + 1900 |> string_of_int in
@@ -33,16 +21,21 @@
33
21
let footer_text = String.concat space [ "©"; year; name ] in
34
22
footer [] [ txt "%s" footer_text ]
35
23
36
Removed:
let application page =
24
Added:
let head_data = { page_title = "Ogit" }
25
Added:
26
Added:
let application ?(head_data = head_data) body_data =
37
27
html []
38
28
[
39
Removed:
head [] [ title [] "%s" page.title ];
40
Removed:
link [ rel "stylesheet"; href "/static/styles.css" ];
29
Added:
head []
30
Added:
[
31
Added:
title [] "%s" head_data.page_title;
32
Added:
link [ rel "stylesheet"; href "/static/styles.css" ];
33
Added:
];
41
34
body []
42
35
[
43
Removed:
header;
44
Removed:
topnav;
45
Removed:
div [ id "main" ] page.main_content;
36
Added:
header body_data.title body_data.subtitle;
37
Added:
body_data.topnav;
38
Added:
div [ id "main" ] body_data.content;
46
39
footer "Marius PETER";
47
40
];
48
41
]
@@ -57,13 +50,15 @@
57
50
and li_of_repo repo = li [] [ a [ href "%s" repo ] [ txt "%s" repo ] ] in
58
51
div [ id "repositories" ] [ ul [] @@ List.map li_of_repo repositories ]
59
52
60
Removed:
let page_data =
53
Added:
let body_data =
61
54
{
62
55
title = "My repositories";
63
Removed:
main_content = [ repositories_in Config.git_directory ];
56
Added:
subtitle = "Repositories for " ^ Config.author;
57
Added:
topnav = null [];
58
Added:
content = [ repositories_in Config.git_directory ];
64
59
}
65
60
66
Removed:
let render () = Layout.application page_data
61
Added:
let render () = Lwt.return @@ Layout.application body_data
67
62
end
68
63
69
64
module Repo_root = struct
@@ -72,7 +67,22 @@
72
67
open Git
73
68
open Lwt.Infix
74
69
75
Removed:
let page_promise repo_name =
70
Added:
let topnav =
71
Added:
nav
72
Added:
[ id "top" ]
73
Added:
[
74
Added:
ul []
75
Added:
[
76
Added:
li [] [ a [ href "/" ] [ txt "Home" ] ];
77
Added:
li [] [ a [ href "/" ] [ txt "Refs" ] ];
78
Added:
li [] [ a [ href "/" ] [ txt "Log" ] ];
79
Added:
li [] [ a [ href "/" ] [ txt "Tree" ] ];
80
Added:
li [] [ a [ href "/" ] [ txt "Commit" ] ];
81
Added:
li [] [ a [ href "/" ] [ txt "Diff" ] ];
82
Added:
];
83
Added:
]
84
Added:
85
Added:
let render repo_name =
76
86
let repo_path = Filename.concat Config.git_directory repo_name in
77
87
78
88
(* 1. Open the Git repository *)
@@ -84,7 +94,7 @@
84
94
85
95
(* 2. Resolve HEAD to get the latest commit hash *)
86
96
let%lwt commit_hash =
87
Removed:
Git_unix.Store.Ref.resolve repo Reference.head >>= function
97
Added:
Git_unix.Store.Ref.resolve repo Reference.master >>= function
88
98
| Ok hash -> Lwt.return hash
89
99
| Error _ -> Lwt.fail_with "Failed to resolve HEAD"
90
100
in
@@ -114,23 +124,23 @@
114
124
(* in *)
115
125
116
126
(* 6. Assemble the page *)
117
Removed:
let main_content =
118
Removed:
[
119
Removed:
ul []
120
Removed:
[ li [] [ txt "%s" (commit_hash |> Digestif.SHA1.to_raw_string) ] ];
121
Removed:
]
127
Added:
let content =
128
Added:
[ ul [] [ li [] [ txt "%s" (commit_hash |> Digestif.SHA1.to_hex) ] ] ]
122
129
in
123
Removed:
let page_data = { title = repo_name; main_content } in
124
Removed:
Lwt.return (Layout.application page_data)
125
Removed:
126
Removed:
let render repo_name = page_promise repo_name >>= fun page -> Lwt.return page
130
Added:
let title = repo_name in
131
Added:
let subtitle = Git_unix.(repo |> Store.root |> Fpath.to_string) in
132
Added:
let body_data = { title; subtitle; topnav; content } in
133
Added:
Lwt.return @@ Layout.application body_data
127
134
end
128
135
129
136
module Repo_tree = struct
130
137
open Dream_html
138
Added:
open HTML
131
139
132
140
let render repo_name =
133
Removed:
let title = repo_name and main_content = [ txt "foobar" ] in
134
Removed:
let page_data = { title; main_content } in
135
Removed:
Layout.application page_data
141
Added:
let title = repo_name and content = [ txt "foobar" ] in
142
Added:
let subtitle = "Dinglefops" in
143
Added:
let topnav = null [] in
144
Added:
let body_data = { title; subtitle; topnav; content } in
145
Added:
Lwt.return @@ Layout.application body_data
136
146
end