The unpac monorepo manager self-hosting as a monorepo using unpac
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Help output: better graceful degradation on groff or pager errors.

Close #140

+36 -33
+3
vendor/opam/cmdliner/CHANGES.md
··· 9 9 - Improve bash completion on files and directories (#238). 10 10 Thanks to Brian Ward for the report and fix. 11 11 12 + - Help output, improve graceful degration on groffer errors (#140). 13 + Thanks to Sergey Fedorov for the report. 14 + 12 15 v2.0.0 2025-09-26 Zagreb 13 16 ------------------------ 14 17
+33 -33
vendor/opam/cmdliner/src/cmdliner_manpage.ml
··· 487 487 in 488 488 find_cmd cmds 489 489 490 - let pp_to_pager env print ppf v = match find_pager env with 491 - | None -> print `Plain ppf v 492 - | Some (pager, opts) -> 493 - let pager = 494 - let set_less_env = match env "LESS" with 495 - | None -> if Sys.win32 then "set LESS=FRX && " else "LESS=FRX " 496 - | Some _ -> "" (* Sys.command will pass it *) 497 - in 498 - set_less_env ^ pager ^ opts 499 - in 490 + let pp_to_pager env print ppf v = 491 + let run cmd = Sys.command cmd = 0 in 492 + let plain_pager pager = match pp_to_temp_file (print `Plain) v with 493 + | None -> false 494 + | Some f -> run (strf "%s < %s" pager f) 495 + in 496 + let groffed_pager pager = 500 497 let groffer = 501 498 let cmds = 502 499 ["mandoc", " -m man -K utf-8 -T utf8"; ··· 505 502 in 506 503 find_cmd cmds 507 504 in 508 - let cmd = match groffer with 509 - | None -> 510 - begin match pp_to_temp_file (print `Plain) v with 511 - | None -> None 512 - | Some f -> Some (strf "%s < %s" pager f) 513 - end 505 + match groffer with 506 + | None -> false 514 507 | Some (groffer, opts) -> 515 508 let groffer = groffer ^ opts in 516 - begin match pp_to_temp_file (print `Groff) v with 517 - | None -> None 518 - | Some f when Sys.win32 -> 519 - (* For some obscure reason the pipe below does not 520 - work. We need to use a temporary file. 521 - https://github.com/dbuenzli/cmdliner/issues/166 *) 522 - begin match tmp_file_for_pager () with 523 - | None -> None 524 - | Some tmp -> 525 - Some (strf "%s <%s >%s && %s <%s" groffer f tmp pager tmp) 526 - end 509 + match pp_to_temp_file (print `Groff) v with 510 + | None -> false 527 511 | Some f -> 528 - Some (strf "%s < %s | %s" groffer f pager) 529 - end 530 - in 531 - match cmd with 532 - | None -> print `Plain ppf v 533 - | Some cmd -> if (Sys.command cmd) <> 0 then print `Plain ppf v 512 + (* This used to go through a pipe on non-Windows 513 + platforms, but this would hide errors with the groffer 514 + and inhibit the graceful degradation to plain text 515 + since POSIX shells do not "pipefail" *) 516 + match tmp_file_for_pager () with 517 + | None -> false 518 + | Some tmp -> 519 + run (strf "%s <%s >%s && %s <%s" groffer f tmp pager tmp) 520 + in 521 + match find_pager env with 522 + | None -> print `Plain ppf v 523 + | Some (pager, opts) -> 524 + let pager = 525 + let set_less_env = match env "LESS" with 526 + | None -> if Sys.win32 then "set LESS=FRX && " else "LESS=FRX " 527 + | Some _ -> "" (* Sys.command will pass it *) 528 + in 529 + set_less_env ^ pager ^ opts 530 + in 531 + if groffed_pager pager then () else 532 + if plain_pager pager then () else 533 + print `Plain ppf v 534 534 535 535 (* Output *) 536 536