A CLI tool that generates an opam repository and monorepo from a list of git repos
at master 80 lines 2.8 kB view raw
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)