Source file cmd__tools__github__summary_comment.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
let main =
Command.make
~summary:"Print a comment with a summary of CRs in the repo."
~readme:(fun () ->
"This command searches for CRs in the tree and prints a summary using the GitHub \
Flavored Markdown syntax.\n\n\
This command is meant to be used to generate contents to include to the history \
of a pull request on GitHub, for example in conversation comments or checks \
panels.")
(let open Command.Std in
let+ with_user_mentions = Common_helpers.with_user_mentions_arg
and+ config =
Arg.named_opt [ "config" ] Param.file ~doc:"Config file to customize crs."
and+ review_mode = Review_mode.arg ~emit_github_annotations:true in
let cwd = Unix.getcwd () |> Absolute_path.v in
let { Enclosing_repo.vcs_kind = _; repo_root; vcs } =
Common_helpers.find_enclosing_repo ~from:cwd
in
let config =
match config with
| None -> Config.empty
| Some path -> Config.load_exn ~path:(Fpath.v path) ~emit_github_annotations:true
in
let annotated_crs =
Crs_parser.grep ~vcs ~repo_root ~below:Vcs.Path_in_repo.root
|> Cr_comment.sort
|> List.filter_map ~f:(fun cr ->
match Annotation.of_cr ~cr ~config ~review_mode ~with_user_mentions with
| None -> None
| Some annotation -> Some (cr, annotation))
in
let crs, annotations = List.unzip annotated_crs in
let by_type =
Summary_table.By_type.make crs |> Summary_table.By_type.to_print_table
in
let summary = Summary_table.make crs |> Summary_table.to_print_table in
let tables =
List.filter_opt [ by_type; summary ]
|> List.map ~f:Print_table.to_string_markdown
|> String.concat ~sep:"\n"
in
let assignees =
List.filter_map annotations ~f:(fun t ->
let assignee = (Annotation.assignee t).user in
match assignee with
| None -> None
| Some user -> Some (user, t))
|> List.Assoc.sort_and_group ~compare:Vcs.User_handle.compare
|> List.map ~f:(fun (user, ts) ->
let with_user_mention = List.exists ts ~f:Annotation.with_user_mention in
Annotation.write_username ~user ~with_user_mention)
in
print_endline tables;
let () =
if not (List.is_empty assignees)
then
print_endline
(Printf.sprintf
"Users with assigned CRs/XCRs: %s"
(String.concat ~sep:", " assignees))
in
())
;;