[OCaml] Mobile-friendly clone of cgit.
Apply Dune formatting
Changed files
lib/resolvers.ml
@@ -29,8 +29,7 @@
29
29
30
30
type repository_layout = { worktree : string; git_dir : string }
31
31
32
Removed:
let is_directory path =
33
Removed:
try Sys.is_directory path with Sys_error _ -> false
32
Added:
let is_directory path = try Sys.is_directory path with Sys_error _ -> false
34
33
35
34
let is_git_directory path =
36
35
is_directory path
@@ -75,13 +74,10 @@
75
74
else default_repo_description
76
75
77
76
let short_hash hash = String.sub hash 0 8
78
Removed:
79
77
let branch_ref name = Git.Reference.v ("refs/heads/" ^ name)
80
78
81
79
let fallback_branch_candidates () =
82
Removed:
let add acc name =
83
Removed:
if List.mem name acc then acc else acc @ [ name ]
84
Removed:
in
80
Added:
let add acc name = if List.mem name acc then acc else acc @ [ name ] in
85
81
let candidates = [] in
86
82
let candidates = add candidates config.default_branch in
87
83
let candidates = add candidates "main" in
@@ -96,29 +92,30 @@
96
92
let open Lwt.Syntax in
97
93
let* references = Store.Ref.list store in
98
94
let branches =
99
Removed:
references
100
Removed:
|> List.map fst
95
Added:
references |> List.map fst
101
96
|> List.filter_map (fun reference ->
102
Removed:
let name = Git.Reference.to_string reference in
103
Removed:
if String.starts_with ~prefix:"refs/heads/" name then
104
Removed:
Some (name, reference)
105
Removed:
else None)
97
Added:
let name = Git.Reference.to_string reference in
98
Added:
if String.starts_with ~prefix:"refs/heads/" name then
99
Added:
Some (name, reference)
100
Added:
else None)
106
101
|> List.sort (fun (a, _) (b, _) -> String.compare a b)
107
102
in
108
103
let rec try_branches = function
109
Removed:
| [] -> Lwt_result.fail (`Msg "no branch could be resolved for repository")
110
Removed:
| (_, reference) :: rest ->
104
Added:
| [] ->
105
Added:
Lwt_result.fail
106
Added:
(`Msg "no branch could be resolved for repository")
107
Added:
| (_, reference) :: rest -> (
111
108
Lwt.bind (Store.Ref.resolve store reference) @@ function
112
109
| Ok hash -> Lwt_result.return hash
113
110
| Error (`Reference_not_found _) -> try_branches rest
114
Removed:
| Error err -> fail_store_error err
111
Added:
| Error err -> fail_store_error err)
115
112
in
116
113
try_branches branches
117
Removed:
| reference :: rest ->
114
Added:
| reference :: rest -> (
118
115
Lwt.bind (Store.Ref.resolve store reference) @@ function
119
116
| Ok hash -> Lwt_result.return hash
120
117
| Error (`Reference_not_found _) -> try_references rest
121
Removed:
| Error err -> fail_store_error err
118
Added:
| Error err -> fail_store_error err)
122
119
in
123
120
Lwt.bind (Store.Ref.resolve store Git.Reference.head) @@ function
124
121
| Ok hash -> Lwt_result.return hash
@@ -205,8 +202,9 @@
205
202
let branches =
206
203
references
207
204
|> List.filter_map (fun ((reference, _) as raw) ->
208
Removed:
Git.Reference.to_string reference |> branch_name
209
Removed:
|> Option.map (fun name -> to_t_with_name name raw))
205
Added:
Git.Reference.to_string reference
206
Added:
|> branch_name
207
Added:
|> Option.map (fun name -> to_t_with_name name raw))
210
208
in
211
209
Lwt_result.return branches
212
210
@@ -217,16 +215,15 @@
217
215
let tags =
218
216
references
219
217
|> List.filter_map (fun ((reference, _) as raw) ->
220
Removed:
Git.Reference.to_string reference |> tag_name
221
Removed:
|> Option.map (fun name -> to_t_with_name name raw))
218
Added:
Git.Reference.to_string reference
219
Added:
|> tag_name
220
Added:
|> Option.map (fun name -> to_t_with_name name raw))
222
221
in
223
222
Lwt_result.return tags
224
223
225
224
let of_id repo id =
226
225
let* branches = branches repo in
227
Removed:
let branch =
228
Removed:
branches |> List.find_opt (fun branch -> branch.name = id)
229
Removed:
in
226
Added:
let branch = branches |> List.find_opt (fun branch -> branch.name = id) in
230
227
match branch with
231
228
| Some branch -> Lwt_result.return branch
232
229
| None -> Lwt_result.fail @@ `Msg ("no reference matches id " ^ id)
@@ -363,23 +360,22 @@
363
360
}
364
361
:: acc)
365
362
in
366
Removed:
if matrix_size > 4_000_000 then
367
Removed:
all_deletions 0 [] @ all_additions 0 []
363
Added:
if matrix_size > 4_000_000 then all_deletions 0 [] @ all_additions 0 []
368
364
else
369
365
let lengths = Array.make_matrix (old_length + 1) (new_length + 1) 0 in
370
366
for old_index = old_length - 1 downto 0 do
371
367
for new_index = new_length - 1 downto 0 do
372
368
lengths.(old_index).(new_index) <-
373
Removed:
if old_lines.(old_index) = new_lines.(new_index) then
374
Removed:
lengths.(old_index + 1).(new_index + 1) + 1
375
Removed:
else
376
Removed:
max lengths.(old_index + 1).(new_index)
377
Removed:
lengths.(old_index).(new_index + 1)
369
Added:
(if old_lines.(old_index) = new_lines.(new_index) then
370
Added:
lengths.(old_index + 1).(new_index + 1) + 1
371
Added:
else
372
Added:
max
373
Added:
lengths.(old_index + 1).(new_index)
374
Added:
lengths.(old_index).(new_index + 1))
378
375
done
379
376
done;
380
377
let rec build old_index new_index acc =
381
Removed:
if old_index = old_length then
382
Removed:
List.rev acc @ all_additions new_index []
378
Added:
if old_index = old_length then List.rev acc @ all_additions new_index []
383
379
else if new_index = new_length then
384
380
List.rev acc @ all_deletions old_index []
385
381
else if old_lines.(old_index) = new_lines.(new_index) then
@@ -421,8 +417,8 @@
421
417
let changed =
422
418
Array.to_list (Array.mapi (fun index line -> (index, line.kind)) lines)
423
419
|> List.filter_map (function
424
Removed:
| index, (Addition | Deletion) -> Some index
425
Removed:
| _, Context -> None)
420
Added:
| index, (Addition | Deletion) -> Some index
421
Added:
| _, Context -> None)
426
422
in
427
423
let ranges =
428
424
let add_range ranges index =
@@ -489,12 +485,12 @@
489
485
| None -> Lwt_result.return ""
490
486
| Some { hash; perm = `Commit } ->
491
487
Lwt_result.return ("Subproject commit " ^ hash ^ "\n")
492
Removed:
| Some { hash; _ } ->
488
Added:
| Some { hash; _ } -> (
493
489
let* hash = hash_of_hex hash in
494
490
Lwt_result.bind (Store.read store hash) @@ function
495
491
| Git.Value.Blob blob ->
496
492
Lwt_result.return (Store.Value.Blob.to_string blob)
497
Removed:
| _ -> Lwt_result.fail (`Msg "file entry does not point to a blob")
493
Added:
| _ -> Lwt_result.fail (`Msg "file entry does not point to a blob"))
498
494
499
495
let of_commit repo (commit : Commit.t) =
500
496
let* store = store repo in
@@ -502,7 +498,7 @@
502
498
let* old_files =
503
499
match commit.parents with
504
500
| [] -> Lwt_result.return Path_map.empty
505
Removed:
| parent :: _ ->
501
Added:
| parent :: _ -> (
506
502
let* parent_hash = hash_of_hex parent in
507
503
Lwt_result.bind (Store.read store parent_hash) @@ function
508
504
| Git.Value.Commit parent_commit ->
@@ -510,15 +506,15 @@
510
506
Store.Value.Commit.tree parent_commit |> Store.Hash.to_hex
511
507
in
512
508
flatten_tree store "" tree Path_map.empty
513
Removed:
| _ -> Lwt_result.fail (`Msg ("parent is not a commit " ^ parent))
509
Added:
| _ -> Lwt_result.fail (`Msg ("parent is not a commit " ^ parent)))
514
510
in
515
511
let changed_files =
516
512
Path_map.merge
517
513
(fun _ old_file new_file ->
518
514
match (old_file, new_file) with
519
515
| Some old_file, Some new_file
520
Removed:
when old_file.hash = new_file.hash
521
Removed:
&& old_file.perm = new_file.perm ->
516
Added:
when old_file.hash = new_file.hash && old_file.perm = new_file.perm
517
Added:
->
522
518
None
523
519
| None, None -> None
524
520
| _ -> Some (old_file, new_file))
@@ -539,11 +535,14 @@
539
535
path;
540
536
old_hash = Option.map (fun file -> file.hash) old_file;
541
537
new_hash = Option.map (fun file -> file.hash) new_file;
542
Removed:
old_mode = Option.map (fun file -> mode_of_perm file.perm) old_file;
543
Removed:
new_mode = Option.map (fun file -> mode_of_perm file.perm) new_file;
538
Added:
old_mode =
539
Added:
Option.map (fun file -> mode_of_perm file.perm) old_file;
540
Added:
new_mode =
541
Added:
Option.map (fun file -> mode_of_perm file.perm) new_file;
544
542
binary;
545
543
hunks =
546
Removed:
if binary then [] else line_diff old_content new_content |> hunks;
544
Added:
(if binary then []
545
Added:
else line_diff old_content new_content |> hunks);
547
546
}
548
547
in
549
548
build (file :: acc) files
lib/views.ml
@@ -106,9 +106,9 @@
106
106
Sys.readdir config.git_project_root
107
107
|> Array.to_list
108
108
|> List.filter (fun name ->
109
Removed:
not (name.[0] = '.')
110
Removed:
&& Resolvers.is_repository
111
Removed:
(Filename.concat config.git_project_root name))
109
Added:
(not (name.[0] = '.'))
110
Added:
&& Resolvers.is_repository
111
Added:
(Filename.concat config.git_project_root name))
112
112
|> List.sort String.compare
113
113
in
114
114
let li_of_repo repo =
@@ -242,19 +242,21 @@
242
242
| Resolvers.Diff.Addition -> ("addition", "+")
243
243
| Resolvers.Diff.Deletion -> ("deletion", "-")
244
244
in
245
Removed:
HTML.
246
Removed:
(div [ class_ "diff-line %s" class_name ]
247
Removed:
[
248
Removed:
span [ class_ "line-number" ] [ txt "%s" (number line.old_number) ];
249
Removed:
span [ class_ "line-number" ] [ txt "%s" (number line.new_number) ];
250
Removed:
span [ class_ "diff-marker" ] [ txt "%s" marker ];
251
Removed:
span [ class_ "diff-text" ] [ txt "%s" line.text ];
252
Removed:
])
245
Added:
HTML.(
246
Added:
div
247
Added:
[ class_ "diff-line %s" class_name ]
248
Added:
[
249
Added:
span [ class_ "line-number" ] [ txt "%s" (number line.old_number) ];
250
Added:
span [ class_ "line-number" ] [ txt "%s" (number line.new_number) ];
251
Added:
span [ class_ "diff-marker" ] [ txt "%s" marker ];
252
Added:
span [ class_ "diff-text" ] [ txt "%s" line.text ];
253
Added:
])
253
254
in
254
255
let hunk (hunk : Resolvers.Diff.hunk) =
255
256
HTML.
256
257
[
257
Removed:
div [ class_ "hunk-header" ]
258
Added:
div
259
Added:
[ class_ "hunk-header" ]
258
260
[
259
261
txt "@@ -%d,%d +%d,%d @@" hunk.old_start hunk.old_count
260
262
hunk.new_start hunk.new_count;
@@ -276,18 +278,20 @@
276
278
HTML.[ p [ class_ "binary-diff" ] [ txt "Binary files differ" ] ]
277
279
else List.concat_map hunk file.hunks
278
280
in
279
Removed:
HTML.
280
Removed:
(section [ class_ "diff-file" ]
281
Removed:
([
282
Removed:
h4 [ class_ "diff-file-header" ] [ txt "%s" file.path ];
283
Removed:
div [ class_ "diff-meta" ]
284
Removed:
[
285
Removed:
txt "index %s..%s %s..%s" (hash file.old_hash)
286
Removed:
(hash file.new_hash) (mode file.old_mode)
287
Removed:
(mode file.new_mode);
288
Removed:
];
289
Removed:
]
290
Removed:
@ file_body))
281
Added:
HTML.(
282
Added:
section
283
Added:
[ class_ "diff-file" ]
284
Added:
([
285
Added:
h4 [ class_ "diff-file-header" ] [ txt "%s" file.path ];
286
Added:
div
287
Added:
[ class_ "diff-meta" ]
288
Added:
[
289
Added:
txt "index %s..%s %s..%s" (hash file.old_hash)
290
Added:
(hash file.new_hash) (mode file.old_mode)
291
Added:
(mode file.new_mode);
292
Added:
];
293
Added:
]
294
Added:
@ file_body))
291
295
in
292
296
let diff_content =
293
297
match diff with
@@ -303,18 +307,19 @@
303
307
subtitle = Resolvers.repo_description repo;
304
308
active = Summary;
305
309
content =
306
Removed:
HTML.
307
Removed:
([
308
Removed:
h3 [] [ txt "%s" message ];
309
Removed:
dl [ class_ "commit-meta" ]
310
Removed:
[
311
Removed:
dt [] [ txt "Commit" ];
312
Removed:
dd [] [ txt "%s" commit.hash ];
313
Removed:
dt [] [ txt "Author" ];
314
Removed:
dd []
315
Removed:
[ txt "%s <%s>" commit.author.name commit.author.email ];
316
Removed:
];
317
Removed:
]
310
Added:
HTML.(
311
Added:
[
312
Added:
h3 [] [ txt "%s" message ];
313
Added:
dl
314
Added:
[ class_ "commit-meta" ]
315
Added:
[
316
Added:
dt [] [ txt "Commit" ];
317
Added:
dd [] [ txt "%s" commit.hash ];
318
Added:
dt [] [ txt "Author" ];
319
Added:
dd []
320
Added:
[ txt "%s <%s>" commit.author.name commit.author.email ];
321
Added:
];
322
Added:
]
318
323
@ diff_content);
319
324
}
320
325
test/test_ogit.ml
@@ -19,8 +19,7 @@
19
19
Unix.putenv "XDG_CONFIG_HOME" "/tmp/xdg-config";
20
20
assert (
21
21
Ogit.Config.locate_config_file ()
22
Removed:
= Filename.concat (Filename.concat "/tmp/xdg-config" "ogit")
23
Removed:
"config.toml"));
22
Added:
= Filename.concat (Filename.concat "/tmp/xdg-config" "ogit") "config.toml"));
24
23
Unix.putenv "OGIT_CONFIG" "/tmp/custom-ogit.toml";
25
24
assert (Ogit.Config.locate_config_file () = "/tmp/custom-ogit.toml")
26
25
@@ -79,31 +78,11 @@
79
78
let open Ogit.Resolvers.Diff in
80
79
match line_diff "first\nold\nlast\n" "first\nnew\nlast\n" with
81
80
| [
82
Removed:
{
83
Removed:
kind = Context;
84
Removed:
old_number = Some 1;
85
Removed:
new_number = Some 1;
86
Removed:
text = "first";
87
Removed:
};
88
Removed:
{
89
Removed:
kind = Deletion;
90
Removed:
old_number = Some 2;
91
Removed:
new_number = None;
92
Removed:
text = "old";
93
Removed:
};
94
Removed:
{
95
Removed:
kind = Addition;
96
Removed:
old_number = None;
97
Removed:
new_number = Some 2;
98
Removed:
text = "new";
99
Removed:
};
100
Removed:
{
101
Removed:
kind = Context;
102
Removed:
old_number = Some 3;
103
Removed:
new_number = Some 3;
104
Removed:
text = "last";
105
Removed:
};
106
Removed:
] ->
81
Added:
{ kind = Context; old_number = Some 1; new_number = Some 1; text = "first" };
82
Added:
{ kind = Deletion; old_number = Some 2; new_number = None; text = "old" };
83
Added:
{ kind = Addition; old_number = None; new_number = Some 2; text = "new" };
84
Added:
{ kind = Context; old_number = Some 3; new_number = Some 3; text = "last" };
85
Added:
] ->
107
86
()
108
87
| _ -> failwith "unexpected line diff"
109
88
@@ -117,7 +96,8 @@
117
96
in
118
97
match
119
98
hunks
120
Removed:
(line_diff (String.concat "\n" old_content)
99
Added:
(line_diff
100
Added:
(String.concat "\n" old_content)
121
101
(String.concat "\n" new_content))
122
102
with
123
103
| [ hunk ] ->
@@ -143,14 +123,12 @@
143
123
assert (not (Ogit.Resolvers.is_valid_hash_hex (String.make 39 'a')));
144
124
assert (not (Ogit.Resolvers.is_valid_hash_hex (String.make 41 'a')));
145
125
assert (not (Ogit.Resolvers.is_valid_hash_hex (String.make 39 'a' ^ "x")));
126
Added:
assert (Ogit.Resolvers.Reference.branch_name "refs/heads/main" = Some "main");
146
127
assert (
147
Removed:
Ogit.Resolvers.Reference.branch_name "refs/heads/main" = Some "main");
148
Removed:
assert (
149
128
Ogit.Resolvers.Reference.branch_name "refs/heads/feature/topic"
150
129
= Some "feature/topic");
151
130
assert (Ogit.Resolvers.Reference.branch_name "HEAD" = None);
152
Removed:
assert (
153
Removed:
Ogit.Resolvers.Reference.tag_name "refs/tags/v1.0.0" = Some "v1.0.0");
131
Added:
assert (Ogit.Resolvers.Reference.tag_name "refs/tags/v1.0.0" = Some "v1.0.0");
154
132
assert (Ogit.Resolvers.Reference.tag_name "refs/heads/v1.0.0" = None);
155
133
test_config_round_trip ();
156
134
test_config_location ();