[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]