From ce01bac547b0929a213980d9123a9af1b4fe4c83 Mon Sep 17 00:00:00 2001 From: Sergey Fedorov Date: Tue, 30 Nov 2021 22:10:33 +0100 Subject: [PATCH] Add pager support into RubyLauncher --- .../truffleruby/launcher/RubyLauncher.java | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/src/launcher/java/org/truffleruby/launcher/RubyLauncher.java b/src/launcher/java/org/truffleruby/launcher/RubyLauncher.java index 981222e4e5ee..8ccdcd7d00da 100644 --- a/src/launcher/java/org/truffleruby/launcher/RubyLauncher.java +++ b/src/launcher/java/org/truffleruby/launcher/RubyLauncher.java @@ -10,12 +10,14 @@ package org.truffleruby.launcher; import java.io.PrintStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; +import java.lang.ProcessBuilder.Redirect; import org.graalvm.launcher.AbstractLanguageLauncher; import org.graalvm.nativeimage.ProcessProperties; @@ -33,6 +35,7 @@ public class RubyLauncher extends AbstractLanguageLauncher { private CommandLineOptions config; private String implementationName = null; + private boolean helpOptionUsed; public static void main(String[] args) { new RubyLauncher().launch(args); @@ -163,7 +166,7 @@ protected void collectArguments(Set options) { @Override protected void printHelp(OptionCategory maxCategory) { - printHelp(System.out); + printHelp(getOutput()); } @Override @@ -173,6 +176,47 @@ protected AbortException abortUnrecognizedArgument(String argument) { "truffleruby: invalid option " + argument + " (Use --help for usage instructions.)"); } + @Override + protected boolean parseCommonOption(String defaultOptionPrefix, Map polyglotOptions, + boolean experimentalOptions, String arg) { + if (arg.startsWith("--help")) { + helpOptionUsed = true; + } + + return super.parseCommonOption(defaultOptionPrefix, polyglotOptions, experimentalOptions, arg); + } + + @Override + protected boolean runLauncherAction() { + if (!helpOptionUsed || System.console() == null) { + return super.runLauncherAction(); + } + + String pager = getPagerFromEnv(); + if (pager == null || pager.length() == 0) { + return super.runLauncherAction(); + } + + try { + Process process = new ProcessBuilder(pager) + .redirectOutput(Redirect.INHERIT) + .redirectErrorStream(true) + .start(); + PrintStream out = new PrintStream(process.getOutputStream()); + + setOutput(out); + boolean code = super.runLauncherAction(); + + out.flush(); + out.close(); + process.waitFor(); + + return code; + } catch (IOException | InterruptedException e) { + throw abort(e); + } + } + private int runRubyMain(Context.Builder contextBuilder, CommandLineOptions config) { if (config.executionAction == ExecutionAction.UNSET) { switch (config.defaultExecutionAction) { @@ -299,6 +343,20 @@ private static List getPathListFromEnvVariable(String name) { return Collections.emptyList(); } + private static String getPagerFromEnv() { + String pager = System.getenv("RUBY_PAGER"); + if (pager != null) { + return pager.strip(); + } + + pager = System.getenv("PAGER"); + if (pager != null) { + return pager.strip(); + } + + return null; + } + private void printPreRunInformation(CommandLineOptions config) { if (config.showVersion) { System.out.println(TruffleRuby.getVersionString(getImplementationNameFromEngine()));