157 lines
5.6 KiB
OCaml
157 lines
5.6 KiB
OCaml
|
|
(*---------------------------------------------------------------------------
|
||
|
|
Copyright (c) 2011 The cmdliner programmers. All rights reserved.
|
||
|
|
SPDX-License-Identifier: CC0-1.0
|
||
|
|
---------------------------------------------------------------------------*)
|
||
|
|
|
||
|
|
(* Implementations, just print the args. *)
|
||
|
|
|
||
|
|
type verb = Normal | Quiet | Verbose
|
||
|
|
type copts = { debug : bool; verb : verb; prehook : string option }
|
||
|
|
|
||
|
|
let str = Printf.sprintf
|
||
|
|
let opt_str sv = function None -> "None" | Some v -> str "Some(%s)" (sv v)
|
||
|
|
let opt_str_str = opt_str (fun s -> s)
|
||
|
|
let verb_str = function
|
||
|
|
| Normal -> "normal" | Quiet -> "quiet" | Verbose -> "verbose"
|
||
|
|
|
||
|
|
let pr_copts oc copts = Printf.fprintf oc
|
||
|
|
"debug = %B\nverbosity = %s\nprehook = %s\n"
|
||
|
|
copts.debug (verb_str copts.verb) (opt_str_str copts.prehook)
|
||
|
|
|
||
|
|
let initialize copts repodir = Printf.printf
|
||
|
|
"%arepodir = %s\n" pr_copts copts repodir
|
||
|
|
|
||
|
|
let record copts name email all ask_deps files = Printf.printf
|
||
|
|
"%aname = %s\nemail = %s\nall = %B\nask-deps = %B\nfiles = %s\n"
|
||
|
|
pr_copts copts (opt_str_str name) (opt_str_str email) all ask_deps
|
||
|
|
(String.concat ", " files)
|
||
|
|
|
||
|
|
let help copts man_format cmds topic = match topic with
|
||
|
|
| None -> `Help (`Pager, None) (* help about the program. *)
|
||
|
|
| Some topic ->
|
||
|
|
let topics = "topics" :: "patterns" :: "environment" :: cmds in
|
||
|
|
let conv = Cmdliner.Arg.enum (List.rev_map (fun s -> (s, s)) topics) in
|
||
|
|
let parse = Cmdliner.Arg.Conv.parser conv in
|
||
|
|
match parse topic with
|
||
|
|
| Error e -> `Error (false, e)
|
||
|
|
| Ok t when t = "topics" -> List.iter print_endline topics; `Ok ()
|
||
|
|
| Ok t when List.mem t cmds -> `Help (man_format, Some t)
|
||
|
|
| Ok t ->
|
||
|
|
let page = (topic, 7, "", "", ""), [`S topic; `P "Say something";] in
|
||
|
|
`Ok (Cmdliner.Manpage.print man_format Format.std_formatter page)
|
||
|
|
|
||
|
|
open Cmdliner
|
||
|
|
open Cmdliner.Term.Syntax
|
||
|
|
|
||
|
|
(* Help sections common to all commands *)
|
||
|
|
|
||
|
|
let help_secs = [
|
||
|
|
`S Manpage.s_common_options;
|
||
|
|
`P "These options are common to all commands.";
|
||
|
|
`S "MORE HELP";
|
||
|
|
`P "Use $(tool) $(i,COMMAND) --help for help on a single command.";`Noblank;
|
||
|
|
`P "Use $(tool) $(b,help patterns) for help on patch matching."; `Noblank;
|
||
|
|
`P "Use $(tool) $(b,help environment) for help on environment variables.";
|
||
|
|
`S Manpage.s_bugs; `P "Check bug reports at http://bugs.example.org.";]
|
||
|
|
|
||
|
|
(* Options common to all commands *)
|
||
|
|
|
||
|
|
let copts debug verb prehook = { debug; verb; prehook }
|
||
|
|
let copts_t =
|
||
|
|
let docs = Manpage.s_common_options in
|
||
|
|
let debug =
|
||
|
|
let doc = "Give only debug output." in
|
||
|
|
Arg.(value & flag & info ["debug"] ~docs ~doc)
|
||
|
|
in
|
||
|
|
let verb =
|
||
|
|
let doc = "Suppress informational output." in
|
||
|
|
let quiet = Quiet, Arg.info ["q"; "quiet"] ~docs ~doc in
|
||
|
|
let doc = "Give verbose output." in
|
||
|
|
let verbose = Verbose, Arg.info ["v"; "verbose"] ~docs ~doc in
|
||
|
|
Arg.(last & vflag_all [Normal] [quiet; verbose])
|
||
|
|
in
|
||
|
|
let prehook =
|
||
|
|
let doc = "Specify command to run before this $(tool) command." in
|
||
|
|
Arg.(value & opt (some string) None & info ["prehook"] ~docs ~doc)
|
||
|
|
in
|
||
|
|
Term.(const copts $ debug $ verb $ prehook)
|
||
|
|
|
||
|
|
(* Commands *)
|
||
|
|
|
||
|
|
let sdocs = Manpage.s_common_options
|
||
|
|
|
||
|
|
let initialize_cmd =
|
||
|
|
let repodir =
|
||
|
|
let doc = "Run the program in repository directory $(docv)." in
|
||
|
|
Arg.(value & opt file Filename.current_dir_name & info ["repodir"]
|
||
|
|
~docv:"DIR" ~doc)
|
||
|
|
in
|
||
|
|
let doc = "make the current directory a repository" in
|
||
|
|
let man = [
|
||
|
|
`S Manpage.s_description;
|
||
|
|
`P "Turns the current directory into a Darcs repository. Any
|
||
|
|
existing files and subdirectories become …";
|
||
|
|
`Blocks help_secs; ]
|
||
|
|
in
|
||
|
|
Cmd.make (Cmd.info "initialize" ~doc ~sdocs ~man) @@
|
||
|
|
let+ copts_t and+ repodir in
|
||
|
|
initialize copts_t repodir
|
||
|
|
|
||
|
|
let record_cmd =
|
||
|
|
let pname =
|
||
|
|
let doc = "Name of the patch." in
|
||
|
|
Arg.(value & opt (some string) None & info ["m"; "patch-name"] ~docv:"NAME"
|
||
|
|
~doc)
|
||
|
|
in
|
||
|
|
let author =
|
||
|
|
let doc = "Specifies the author's identity." in
|
||
|
|
Arg.(value & opt (some string) None & info ["A"; "author"] ~docv:"EMAIL"
|
||
|
|
~doc)
|
||
|
|
in
|
||
|
|
let all =
|
||
|
|
let doc = "Answer yes to all patches." in
|
||
|
|
Arg.(value & flag & info ["a"; "all"] ~doc)
|
||
|
|
in
|
||
|
|
let ask_deps =
|
||
|
|
let doc = "Ask for extra dependencies." in
|
||
|
|
Arg.(value & flag & info ["ask-deps"] ~doc)
|
||
|
|
in
|
||
|
|
let files = Arg.(value & (pos_all file) [] & info [] ~docv:"FILE or DIR") in
|
||
|
|
let doc = "create a patch from unrecorded changes" in
|
||
|
|
let man =
|
||
|
|
[`S Manpage.s_description;
|
||
|
|
`P "Creates a patch from changes in the working tree. If you specify
|
||
|
|
a set of files…";
|
||
|
|
`Blocks help_secs; ]
|
||
|
|
in
|
||
|
|
Cmd.make (Cmd.info "record" ~doc ~sdocs ~man) @@
|
||
|
|
let+ copts_t and+ pname and+ author and+ all and+ ask_deps and+ files in
|
||
|
|
record copts_t pname author all ask_deps files
|
||
|
|
|
||
|
|
let help_cmd =
|
||
|
|
let topic =
|
||
|
|
let doc = "The topic to get help on. $(b,topics) lists the topics." in
|
||
|
|
Arg.(value & pos 0 (some string) None & info [] ~docv:"TOPIC" ~doc)
|
||
|
|
in
|
||
|
|
let doc = "display help about darcs and darcs commands" in
|
||
|
|
let man =
|
||
|
|
[`S Manpage.s_description;
|
||
|
|
`P "Prints help about darcs commands and other subjects…";
|
||
|
|
`Blocks help_secs; ]
|
||
|
|
in
|
||
|
|
Cmd.make (Cmd.info "help" ~doc ~man) @@
|
||
|
|
Term.ret @@
|
||
|
|
let+ copts_t and+ man_format = Arg.man_format
|
||
|
|
and+ choice_names = Term.choice_names and+ topic in
|
||
|
|
help copts_t man_format choice_names topic
|
||
|
|
|
||
|
|
let main_cmd =
|
||
|
|
let doc = "a revision control system" in
|
||
|
|
let man = help_secs in
|
||
|
|
let info = Cmd.info "darcs" ~version:"v2.0.0+dune" ~doc ~sdocs ~man in
|
||
|
|
let default = Term.(ret (const (fun _ -> `Help (`Pager, None)) $ copts_t)) in
|
||
|
|
Cmd.group info ~default [initialize_cmd; record_cmd; help_cmd]
|
||
|
|
|
||
|
|
let main () = Cmd.eval main_cmd
|
||
|
|
let () = if !Sys.interactive then () else exit (main ())
|