Add some more smarts around --debug

--verbose seems to be only for CLI logging (so really only
for dependency resolution). --debug is interpreted by SpringApplication
but up to now has been extracted and deleted from the command line
by the CommandRunner. This change makes --debug set a System property
*and* pass it down to the application (if used with -- separator).

Fixes gh-266
pull/272/head
Dave Syer 11 years ago
parent 607b371706
commit c5584b490a

@ -158,6 +158,9 @@ public class CommandRunner implements Iterable<Command> {
public int runAndHandleErrors(String... args) { public int runAndHandleErrors(String... args) {
String[] argsWithoutDebugFlags = removeDebugFlags(args); String[] argsWithoutDebugFlags = removeDebugFlags(args);
boolean debug = argsWithoutDebugFlags.length != args.length; boolean debug = argsWithoutDebugFlags.length != args.length;
if (debug) {
System.setProperty("debug", "true");
}
try { try {
run(argsWithoutDebugFlags); run(argsWithoutDebugFlags);
return 0; return 0;
@ -173,10 +176,14 @@ public class CommandRunner implements Iterable<Command> {
private String[] removeDebugFlags(String[] args) { private String[] removeDebugFlags(String[] args) {
List<String> rtn = new ArrayList<String>(args.length); List<String> rtn = new ArrayList<String>(args.length);
boolean appArgsDetected = false;
for (String arg : args) { for (String arg : args) {
if (!("-d".equals(arg) || "--debug".equals(arg))) { // Allow apps to have a -d argument
rtn.add(arg); appArgsDetected |= "--".equals(arg);
if (("-d".equals(arg) || "--debug".equals(arg)) && !appArgsDetected) {
continue;
} }
rtn.add(arg);
} }
return rtn.toArray(new String[rtn.size()]); return rtn.toArray(new String[rtn.size()]);
} }

@ -77,7 +77,8 @@ public class RunCommand extends OptionParsingCommand {
this.watchOption = option("watch", "Watch the specified file for changes"); this.watchOption = option("watch", "Watch the specified file for changes");
this.editOption = option(asList("edit", "e"), this.editOption = option(asList("edit", "e"),
"Open the file with the default system editor"); "Open the file with the default system editor");
this.verboseOption = option(asList("verbose", "v"), "Verbose logging"); this.verboseOption = option(asList("verbose", "v"),
"Verbose logging of dependency resolution");
this.quietOption = option(asList("quiet", "q"), "Quiet logging"); this.quietOption = option(asList("quiet", "q"), "Quiet logging");
} }
@ -141,12 +142,12 @@ public class RunCommand extends OptionParsingCommand {
@Override @Override
public Level getLogLevel() { public Level getLogLevel() {
if (getOptions().has(RunOptionHandler.this.verboseOption)) {
return Level.FINEST;
}
if (getOptions().has(RunOptionHandler.this.quietOption)) { if (getOptions().has(RunOptionHandler.this.quietOption)) {
return Level.OFF; return Level.OFF;
} }
if (getOptions().has(RunOptionHandler.this.verboseOption)) {
return Level.FINEST;
}
return Level.INFO; return Level.INFO;
} }
} }

@ -0,0 +1,52 @@
/*
* Copyright 2012-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.cli;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.boot.cli.command.run.RunCommand;
import org.springframework.boot.cli.util.OutputCapture;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* @author Dave Syer
*/
public class CommandRunnerIntegrationTests {
@Rule
public OutputCapture output = new OutputCapture();
@Test
public void debugAddsAutoconfigReport() {
CommandRunner runner = new CommandRunner("spring");
runner.addCommand(new RunCommand());
// -d counts as "debug" for the spring command, but not for the
// LoggingApplicationListener
runner.runAndHandleErrors("run", "samples/app.groovy", "-d");
assertTrue(this.output.toString().contains("Negative matches:"));
}
@Test
public void debugSwitchedOffForAppArgs() {
CommandRunner runner = new CommandRunner("spring");
runner.addCommand(new RunCommand());
runner.runAndHandleErrors("run", "samples/app.groovy", "--", "-d");
assertFalse(this.output.toString().contains("Negative matches:"));
}
}

@ -29,6 +29,7 @@ import org.mockito.MockitoAnnotations;
import org.springframework.boot.cli.command.Command; import org.springframework.boot.cli.command.Command;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.willThrow; import static org.mockito.BDDMockito.willThrow;
@ -63,6 +64,7 @@ public class CommandRunnerTests {
@After @After
public void close() { public void close() {
Thread.currentThread().setContextClassLoader(this.loader); Thread.currentThread().setContextClassLoader(this.loader);
System.clearProperty("debug");
} }
@Before @Before
@ -115,6 +117,15 @@ public class CommandRunnerTests {
this.commandRunner.run("missing"); this.commandRunner.run("missing");
} }
@Test
public void appArguments() throws Exception {
this.commandRunner.runAndHandleErrors("command", "--", "--debug", "bar");
verify(this.regularCommand).run("--", "--debug", "bar");
// When handled by the command itself it shouldn't cause the system property to be
// set
assertEquals(null, System.getProperty("debug"));
}
@Test @Test
public void handlesSuccess() throws Exception { public void handlesSuccess() throws Exception {
int status = this.commandRunner.runAndHandleErrors("command"); int status = this.commandRunner.runAndHandleErrors("command");
@ -150,6 +161,7 @@ public class CommandRunnerTests {
public void handlesExceptionWithDashD() throws Exception { public void handlesExceptionWithDashD() throws Exception {
willThrow(new RuntimeException()).given(this.regularCommand).run(); willThrow(new RuntimeException()).given(this.regularCommand).run();
int status = this.commandRunner.runAndHandleErrors("command", "-d"); int status = this.commandRunner.runAndHandleErrors("command", "-d");
assertEquals("true", System.getProperty("debug"));
assertThat(status, equalTo(1)); assertThat(status, equalTo(1));
assertThat(this.calls, equalTo((Set<Call>) EnumSet.of(Call.ERROR_MESSAGE, assertThat(this.calls, equalTo((Set<Call>) EnumSet.of(Call.ERROR_MESSAGE,
Call.PRINT_STACK_TRACE))); Call.PRINT_STACK_TRACE)));
@ -159,6 +171,7 @@ public class CommandRunnerTests {
public void handlesExceptionWithDashDashDebug() throws Exception { public void handlesExceptionWithDashDashDebug() throws Exception {
willThrow(new RuntimeException()).given(this.regularCommand).run(); willThrow(new RuntimeException()).given(this.regularCommand).run();
int status = this.commandRunner.runAndHandleErrors("command", "--debug"); int status = this.commandRunner.runAndHandleErrors("command", "--debug");
assertEquals("true", System.getProperty("debug"));
assertThat(status, equalTo(1)); assertThat(status, equalTo(1));
assertThat(this.calls, equalTo((Set<Call>) EnumSet.of(Call.ERROR_MESSAGE, assertThat(this.calls, equalTo((Set<Call>) EnumSet.of(Call.ERROR_MESSAGE,
Call.PRINT_STACK_TRACE))); Call.PRINT_STACK_TRACE)));

Loading…
Cancel
Save