ruby-changes:60753
From: Nobuyoshi <ko1@a...>
Date: Sun, 12 Apr 2020 14:58:32 +0900 (JST)
Subject: [ruby-changes:60753] f22c4ff359 (master): View the help message with PAGER [Feature #16754]
https://git.ruby-lang.org/ruby.git/commit/?id=f22c4ff359 From f22c4ff359498ab342e4b6d6feb21af6004ee270 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada <nobu@r...> Date: Tue, 4 Feb 2020 09:47:58 +0900 Subject: View the help message with PAGER [Feature #16754] View the help message wth pager designed by RUBY_PAGER or PAGER environment variable, unless that value is empty. diff --git a/NEWS.md b/NEWS.md index 15c7125..890306c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -54,6 +54,13 @@ sufficient information, see the ChangeLog file or Redmine https://github.com/ruby/ruby/blob/trunk/NEWS.md#L54 ## Command line options +### `--help` option + +When the environment variable `RUBY_PAGER` or `PAGER` is present and has +non-empty value, and the standard input and output are tty, `--help` +option shows the help message via the pager designated by the value. +[[Feature #16754]] + ## Core classes updates Outstanding ones only. @@ -192,4 +199,5 @@ Excluding feature bug fixes. https://github.com/ruby/ruby/blob/trunk/NEWS.md#L199 [Feature #15921]: https://bugs.ruby-lang.org/issues/15921 [Feature #16555]: https://bugs.ruby-lang.org/issues/16555 [Feature #16746]: https://bugs.ruby-lang.org/issues/16746 +[Feature #16754]: https://bugs.ruby-lang.org/issues/16754 [GH-2991]: https://github.com/ruby/ruby/pull/2991 diff --git a/ruby.c b/ruby.c index 78127cb..a3d67d3 100644 --- a/ruby.c +++ b/ruby.c @@ -1606,6 +1606,35 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt) https://github.com/ruby/ruby/blob/trunk/ruby.c#L1606 (argc > 0 && argv && argv[0] ? argv[0] : origarg.argc > 0 && origarg.argv && origarg.argv[0] ? origarg.argv[0] : ruby_engine); +#ifdef HAVE_WORKING_FORK + if (opt->dump & DUMP_BIT(help)) { + const char *pager_env = getenv("RUBY_PAGER"); + if (!pager_env) pager_env = getenv("PAGER"); + if (pager_env && *pager_env && isatty(0) && isatty(1)) { + VALUE pager = rb_str_new_cstr(pager_env); + int fds[2]; + if (rb_pipe(fds) == 0) { + rb_pid_t pid = fork(); + if (pid > 0) { + /* exec PAGER with reading from child */ + dup2(fds[0], 0); + } + else if (pid == 0) { + /* send the help message to the parent PAGER */ + dup2(fds[1], 1); + dup2(fds[1], 2); + } + close(fds[0]); + close(fds[1]); + if (pid > 0) { + rb_f_exec(1, &pager); + kill(SIGTERM, pid); + rb_waitpid(pid, 0, 0); + } + } + } + } +#endif usage(progname, (opt->dump & DUMP_BIT(help))); return Qtrue; } -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/