[OCaml] Mobile-friendly clone of cgit.
Classify refs by Git namespace
Changed files
lib/handlers.ml
@@ -12,7 +12,7 @@
12
12
13
13
let summary req =
14
14
let repo = Dream.param req "repo" in
15
Removed:
let* branches = Resolvers.Reference.all repo in
15
Added:
let* branches = Resolvers.Reference.branches repo in
16
16
let* commits = Resolvers.Commit.recent repo 10 in
17
17
Views.Repo.summary repo branches commits
18
18
lib/resolvers.ml
@@ -75,9 +75,21 @@
75
75
module Reference = struct
76
76
type t = { name : string; hash : string }
77
77
78
Added:
let drop_prefix ~prefix name =
79
Added:
if String.starts_with ~prefix name then
80
Added:
Some
81
Added:
(String.sub name (String.length prefix)
82
Added:
(String.length name - String.length prefix))
83
Added:
else None
84
Added:
85
Added:
let branch_name name = drop_prefix ~prefix:"refs/heads/" name
86
Added:
let tag_name name = drop_prefix ~prefix:"refs/tags/" name
87
Added:
78
88
let to_t (reference, hash) =
79
89
{ name = Git.Reference.to_string reference; hash = Store.Hash.to_hex hash }
80
90
91
Added:
let to_t_with_name name (_, hash) = { name; hash = Store.Hash.to_hex hash }
92
Added:
81
93
let all repo =
82
94
let* store = store repo in
83
95
let open Lwt.Syntax in
@@ -86,22 +98,33 @@
86
98
Lwt_result.return references
87
99
88
100
let branches repo =
89
Removed:
let* references = all repo in
90
Removed:
let is_branch reference =
91
Removed:
not (String.starts_with ~prefix:"v" reference.name)
101
Added:
let* store = store repo in
102
Added:
let open Lwt.Syntax in
103
Added:
let* references = Store.Ref.list store in
104
Added:
let branches =
105
Added:
references
106
Added:
|> List.filter_map (fun ((reference, _) as raw) ->
107
Added:
Git.Reference.to_string reference |> branch_name
108
Added:
|> Option.map (fun name -> to_t_with_name name raw))
92
109
in
93
Removed:
Lwt_result.return @@ List.filter is_branch references
110
Added:
Lwt_result.return branches
94
111
95
112
let tags repo =
96
Removed:
let* references = all repo in
97
Removed:
let is_tag reference = String.starts_with ~prefix:"v" reference.name in
98
Removed:
Lwt_result.return @@ List.filter is_tag references
113
Added:
let* store = store repo in
114
Added:
let open Lwt.Syntax in
115
Added:
let* references = Store.Ref.list store in
116
Added:
let tags =
117
Added:
references
118
Added:
|> List.filter_map (fun ((reference, _) as raw) ->
119
Added:
Git.Reference.to_string reference |> tag_name
120
Added:
|> Option.map (fun name -> to_t_with_name name raw))
121
Added:
in
122
Added:
Lwt_result.return tags
99
123
100
124
let of_id repo id =
101
125
let* branches = branches repo in
102
126
let branch =
103
Removed:
branches
104
Removed:
|> List.find_opt (fun branch -> Filename.basename branch.name = id)
127
Added:
branches |> List.find_opt (fun branch -> branch.name = id)
105
128
in
106
129
match branch with
107
130
| Some branch -> Lwt_result.return branch
test/test_ogit.ml
@@ -8,4 +8,13 @@
8
8
assert (not (Ogit.Resolvers.is_valid_repo_name "../outside"));
9
9
assert (not (Ogit.Resolvers.is_valid_repo_name "nested/repo"));
10
10
assert (not (Ogit.Resolvers.is_valid_repo_name "nested\\repo"));
11
Removed:
assert (not (Ogit.Resolvers.is_valid_repo_name "bad\x00repo"))
11
Added:
assert (not (Ogit.Resolvers.is_valid_repo_name "bad\x00repo"));
12
Added:
assert (
13
Added:
Ogit.Resolvers.Reference.branch_name "refs/heads/main" = Some "main");
14
Added:
assert (
15
Added:
Ogit.Resolvers.Reference.branch_name "refs/heads/feature/topic"
16
Added:
= Some "feature/topic");
17
Added:
assert (Ogit.Resolvers.Reference.branch_name "HEAD" = None);
18
Added:
assert (
19
Added:
Ogit.Resolvers.Reference.tag_name "refs/tags/v1.0.0" = Some "v1.0.0");
20
Added:
assert (Ogit.Resolvers.Reference.tag_name "refs/heads/v1.0.0" = None)