···99- Improve bash completion on files and directories (#238).
1010 Thanks to Brian Ward for the report and fix.
11111212+- Help output, improve graceful degration on groffer errors (#140).
1313+ Thanks to Sergey Fedorov for the report.
1414+1215v2.0.0 2025-09-26 Zagreb
1316------------------------
1417
+33-33
vendor/opam/cmdliner/src/cmdliner_manpage.ml
···487487 in
488488 find_cmd cmds
489489490490-let pp_to_pager env print ppf v = match find_pager env with
491491-| None -> print `Plain ppf v
492492-| Some (pager, opts) ->
493493- let pager =
494494- let set_less_env = match env "LESS" with
495495- | None -> if Sys.win32 then "set LESS=FRX && " else "LESS=FRX "
496496- | Some _ -> "" (* Sys.command will pass it *)
497497- in
498498- set_less_env ^ pager ^ opts
499499- in
490490+let pp_to_pager env print ppf v =
491491+ let run cmd = Sys.command cmd = 0 in
492492+ let plain_pager pager = match pp_to_temp_file (print `Plain) v with
493493+ | None -> false
494494+ | Some f -> run (strf "%s < %s" pager f)
495495+ in
496496+ let groffed_pager pager =
500497 let groffer =
501498 let cmds =
502499 ["mandoc", " -m man -K utf-8 -T utf8";
···505502 in
506503 find_cmd cmds
507504 in
508508- let cmd = match groffer with
509509- | None ->
510510- begin match pp_to_temp_file (print `Plain) v with
511511- | None -> None
512512- | Some f -> Some (strf "%s < %s" pager f)
513513- end
505505+ match groffer with
506506+ | None -> false
514507 | Some (groffer, opts) ->
515508 let groffer = groffer ^ opts in
516516- begin match pp_to_temp_file (print `Groff) v with
517517- | None -> None
518518- | Some f when Sys.win32 ->
519519- (* For some obscure reason the pipe below does not
520520- work. We need to use a temporary file.
521521- https://github.com/dbuenzli/cmdliner/issues/166 *)
522522- begin match tmp_file_for_pager () with
523523- | None -> None
524524- | Some tmp ->
525525- Some (strf "%s <%s >%s && %s <%s" groffer f tmp pager tmp)
526526- end
509509+ match pp_to_temp_file (print `Groff) v with
510510+ | None -> false
527511 | Some f ->
528528- Some (strf "%s < %s | %s" groffer f pager)
529529- end
530530- in
531531- match cmd with
532532- | None -> print `Plain ppf v
533533- | Some cmd -> if (Sys.command cmd) <> 0 then print `Plain ppf v
512512+ (* This used to go through a pipe on non-Windows
513513+ platforms, but this would hide errors with the groffer
514514+ and inhibit the graceful degradation to plain text
515515+ since POSIX shells do not "pipefail" *)
516516+ match tmp_file_for_pager () with
517517+ | None -> false
518518+ | Some tmp ->
519519+ run (strf "%s <%s >%s && %s <%s" groffer f tmp pager tmp)
520520+ in
521521+ match find_pager env with
522522+ | None -> print `Plain ppf v
523523+ | Some (pager, opts) ->
524524+ let pager =
525525+ let set_less_env = match env "LESS" with
526526+ | None -> if Sys.win32 then "set LESS=FRX && " else "LESS=FRX "
527527+ | Some _ -> "" (* Sys.command will pass it *)
528528+ in
529529+ set_less_env ^ pager ^ opts
530530+ in
531531+ if groffed_pager pager then () else
532532+ if plain_pager pager then () else
533533+ print `Plain ppf v
534534535535(* Output *)
536536