forked from
mtelvers.tunbury.org/repo-tool
A CLI tool that generates an opam repository and monorepo from a list of git repos
1(*---------------------------------------------------------------------------
2 Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>. All rights reserved.
3 SPDX-License-Identifier: ISC
4 ---------------------------------------------------------------------------*)
5
6open Cmdliner
7
8let input_file =
9 let doc =
10 "Path to the input file containing git repository URLs (one per line)."
11 in
12 Arg.(value & pos 0 (some file) None & info [] ~docv:"INPUT_FILE" ~doc)
13
14let opam_overlay =
15 let doc =
16 "Path to an opam overlay repository. Git URLs will be extracted from \
17 dev-repo fields in package opam files."
18 in
19 Arg.(value & opt (some dir) None & info [ "opam-overlay" ] ~docv:"DIR" ~doc)
20
21let output_dir =
22 let doc = "Output directory for the generated opam repository." in
23 Arg.(
24 value
25 & opt string "opam-repository"
26 & info [ "o"; "output" ] ~docv:"DIR" ~doc)
27
28let verbose =
29 let doc = "Enable verbose output." in
30 Arg.(value & flag & info [ "v"; "verbose" ] ~doc)
31
32let use_submodules =
33 let doc =
34 "Add vendored repositories as git submodules instead of cloning them. This \
35 initializes the output directory as a git repository if needed."
36 in
37 Arg.(value & flag & info [ "submodules" ] ~doc)
38
39let run input_file opam_overlay output_dir use_submodules verbose =
40 let exit_code =
41 Monopam.run ~input_file ~opam_overlay ~output_dir ~use_submodules ~verbose
42 in
43 exit exit_code
44
45let run_t =
46 Term.(
47 const run $ input_file $ opam_overlay $ output_dir $ use_submodules
48 $ verbose)
49
50let cmd =
51 let doc = "Generate an opam repository from git repositories" in
52 let man =
53 [
54 `S Manpage.s_description;
55 `P
56 "$(tname) reads git repository URLs and generates an opam repository \
57 structure. URLs can be provided via a text file (one per line) and/or \
58 extracted from dev-repo fields in an opam overlay repository.";
59 `S Manpage.s_examples;
60 `P "Create an opam repository from repos.txt:";
61 `Pre " $(tname) repos.txt -o my-opam-repo";
62 `P "Create from an opam overlay repository:";
63 `Pre " $(tname) --opam-overlay ~/opam-repo -o my-opam-repo";
64 `P "Combine both sources (deduplicates by URL):";
65 `Pre " $(tname) repos.txt --opam-overlay ~/opam-repo -o my-opam-repo";
66 `P "Use git submodules instead of cloning:";
67 `Pre " $(tname) repos.txt --submodules -o my-opam-repo";
68 `P "Input file format:";
69 `Pre
70 " https://github.com/user/repo1.git\n\
71 \ https://github.com/user/repo2.git main\n\
72 \ # This is a comment";
73 `S Manpage.s_bugs;
74 `P "Report bugs at https://github.com/mtelvers/monopam/issues";
75 ]
76 in
77 let info = Cmd.info "monopam" ~version:"0.1.0" ~doc ~man in
78 Cmd.v info run_t
79
80let () = exit (Cmd.eval cmd)