Classify refs by Git namespace

Commit
8899fd9ab228a1ece8b54516983fddcfd6c29464
Author
Marius Peter <dev@marius-peter.com>
Author date
Committer
Marius Peter <dev@marius-peter.com>
Committer date
Changed files
lib/handlers.ml
index 86bc1a2a..1d6ee3e8 100644..100644
@@ -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
index e6302956..d3826860 100644..100644
@@ -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
index 81edb95d..a82c73a2 100644..100644
@@ -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)