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
|
(* Example from the documentation, this code is in public domain. *)
(* Implementation of the command, we just print the args. *)
type prompt = Always | Once | Never
let prompt_str = function
| Always -> "always" | Once -> "once" | Never -> "never"
let rm prompt recurse files =
Printf.printf "prompt = %s\nrecurse = %b\nfiles = %s\n"
(prompt_str prompt) recurse (String.concat ", " files)
(* Command line interface *)
open Cmdliner;;
let files = Arg.(non_empty & pos_all file [] & info [] ~docv:"FILE")
let prompt =
let doc = "Prompt before every removal." in
let always = Always, Arg.info ["i"] ~doc in
let doc = "Ignore nonexistent files and never prompt." in
let never = Never, Arg.info ["f"; "force"] ~doc in
let doc = "Prompt once before removing more than three files, or when
removing recursively. Less intrusive than $(b,-i), while
still giving protection against most mistakes."
in
let once = Once, Arg.info ["I"] ~doc in
Arg.(last & vflag_all [Always] [always; never; once])
let recursive =
let doc = "Remove directories and their contents recursively." in
Arg.(value & flag & info ["r"; "R"; "recursive"] ~doc)
let cmd =
let doc = "remove files or directories" in
let man = [
`S "DESCRIPTION";
`P "$(tname) removes each specified $(i,FILE). By default it does not
remove directories, to also remove them and their contents, use the
option $(b,--recursive) ($(b,-r) or $(b,-R)).";
`P "To remove a file whose name starts with a `-', for example
`-foo', use one of these commands:";
`P "rm -- -foo"; `Noblank;
`P "rm ./-foo";
`P "$(tname) removes symbolic links, not the files referenced by the
links.";
`S "BUGS"; `P "Report bugs to <hehey at example.org>.";
`S "SEE ALSO"; `P "$(b,rmdir)(1), $(b,unlink)(2)" ]
in
Term.(pure rm $ prompt $ recursive $ files),
Term.info "rm" ~version:"1.6.1" ~doc ~man
let () = match Term.eval cmd with `Error _ -> exit 1 | _ -> exit 0
|