Skip to content

Commit

Permalink
Merge pull request #1114 from pasieronen/cli-exit-code
Browse files Browse the repository at this point in the history
Add --failure-level command line option to force non-zero exit code (fixes #1113)
  • Loading branch information
robertpanzer authored Sep 9, 2022
2 parents 166aa8b + beb9f6b commit b466a81
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Improvement::

* BREAKING: Fix Macro APIs to take StructuralNodes and return Phrase- or StructuralNodes. (#1084)
* BREAKING: Allow Preprocessor extensions to create new Readers and replace the original Reader. (#1081)
* Add command line option --failure-level to force non-zero exit code from AsciidoctorJ CLI if specified logging level is reached. (#1114)
* Upgrade to asciidoctorj-pdf 2.3.0 (#1109)
* Upgrade to JRuby 9.3.7.0 (#1109)
* Upgrade to tilt 2.0.11 (#1109)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.beust.jcommander.Parameter;
import org.asciidoctor.*;
import org.asciidoctor.log.Severity;

import java.io.File;
import java.util.*;
Expand Down Expand Up @@ -95,6 +96,9 @@ public class AsciidoctorCliOptions {
@Parameter(names = {QUIET, "--quiet"}, description = "suppress warnings (default: false)")
private boolean quiet = false;

@Parameter(names = {"--failure-level"}, converter = SeverityConverter.class, description = "set minimum log level that yields a non-zero exit code: [info, warning, error, fatal] (default: fatal) ")
private Severity failureLevel = Severity.FATAL;

@Parameter(names = {REQUIRE, "--require"}, description = "require the specified library before executing the processor (using require)")
private List<String> require;

Expand All @@ -111,6 +115,8 @@ public boolean isQuiet() {
return quiet;
}

public Severity getFailureLevel() { return failureLevel; }

public boolean isRequire() {
return this.require != null && this.require.size() > 0;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class AsciidoctorInvoker {

private static final String LINE_SEPARATOR = System.getProperty("line.separator");

public void invoke(String... parameters) {
public int invoke(String... parameters) {

AsciidoctorCliOptions asciidoctorCliOptions = new AsciidoctorCliOptions();
JCommander jCommander = new JCommander(asciidoctorCliOptions);
Expand All @@ -43,7 +43,7 @@ public void invoke(String... parameters) {
System.out.println("AsciidoctorJ " + getAsciidoctorJVersion() + " (Asciidoctor " + asciidoctor.asciidoctorVersion() + ") [https://asciidoctor.org]");
Object rubyVersionString = JRubyRuntimeContext.get(asciidoctor).evalScriptlet("\"#{JRUBY_VERSION} (#{RUBY_VERSION})\"");
System.out.println("Runtime Environment: jruby " + rubyVersionString);
return;
return 0;
}

List<File> inputFiles = getInputFiles(asciidoctorCliOptions);
Expand All @@ -58,6 +58,9 @@ public void invoke(String... parameters) {
+ "' missing or cannot be read");
}

MaxSeverityLogHandler maxSeverityLogHandler = new MaxSeverityLogHandler();
asciidoctor.registerLogHandler(maxSeverityLogHandler);

Options options = asciidoctorCliOptions.parse();

if (asciidoctorCliOptions.isRequire()) {
Expand All @@ -72,12 +75,17 @@ public void invoke(String... parameters) {

convertInput(asciidoctor, options, inputFiles);

if (asciidoctorCliOptions.getFailureLevel().compareTo(maxSeverityLogHandler.getMaxSeverity()) <= 0) {
return 1;
}

if (asciidoctorCliOptions.isTimings()) {
Map<String, Object> optionsMap = options.map();
IRubyObject timings = (IRubyObject) optionsMap.get(TIMINGS_OPTION_NAME);
timings.callMethod(JRubyRuntimeContext.get(asciidoctor).getCurrentContext(), "print_report");
}
}
return 0;
}

private String getAsciidoctorJVersion() {
Expand Down Expand Up @@ -196,7 +204,10 @@ public static void main(String args[]) {
// Process .jrubyrc file
Main.processDotfile();

new AsciidoctorInvoker().invoke(args);
int status = new AsciidoctorInvoker().invoke(args);
if (status != 0) {
System.exit(status);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.asciidoctor.jruby.cli;

import org.asciidoctor.log.LogHandler;
import org.asciidoctor.log.LogRecord;
import org.asciidoctor.log.Severity;

public class MaxSeverityLogHandler implements LogHandler {
private Severity maxSeverity = Severity.DEBUG;

@Override
public void log(LogRecord logRecord) {
if (this.maxSeverity.compareTo(logRecord.getSeverity()) < 0) {
this.maxSeverity = logRecord.getSeverity();
}
}

public Severity getMaxSeverity() {
return this.maxSeverity;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.asciidoctor.jruby.cli;

import com.beust.jcommander.converters.EnumConverter;
import org.asciidoctor.log.Severity;

public class SeverityConverter extends EnumConverter<Severity> {

public SeverityConverter() {
super("--failure-level", Severity.class);
}

@Override
public Severity convert(String argument) {
return super.convert(argument.toUpperCase());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,22 @@ public void quiet_option_should_not_write_to_console() {

}

@Test
public void should_exit_with_zero_status_even_if_errors_were_logged() {
File inputFile = classpath.getResource("brokeninclude.asciidoc");
String inputPath = inputFile.getPath().substring(pwd.length() + 1);
int status = new AsciidoctorInvoker().invoke(inputPath);
assertThat(status, is(0));
}

@Test
public void should_exit_with_nonzero_status_if_logged_severity_was_at_least_failure_level() {
File inputFile = classpath.getResource("brokeninclude.asciidoc");
String inputPath = inputFile.getPath().substring(pwd.length() + 1);
int status = new AsciidoctorInvoker().invoke("--failure-level", "warn", inputPath);
assertThat(status, is(1));
}

@Test
public void with_absolute_path_file_should_be_rendered() {

Expand Down

0 comments on commit b466a81

Please sign in to comment.