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
This commit is contained in:
Dave Syer 2014-01-24 12:35:25 +00:00
parent 607b371706
commit c5584b490a
4 changed files with 79 additions and 6 deletions

View File

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

View File

@ -77,7 +77,8 @@ public class RunCommand extends OptionParsingCommand {
this.watchOption = option("watch", "Watch the specified file for changes");
this.editOption = option(asList("edit", "e"),
"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");
}
@ -141,12 +142,12 @@ public class RunCommand extends OptionParsingCommand {
@Override
public Level getLogLevel() {
if (getOptions().has(RunOptionHandler.this.verboseOption)) {
return Level.FINEST;
}
if (getOptions().has(RunOptionHandler.this.quietOption)) {
return Level.OFF;
}
if (getOptions().has(RunOptionHandler.this.verboseOption)) {
return Level.FINEST;
}
return Level.INFO;
}
}

View File

@ -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:"));
}
}

View File

@ -29,6 +29,7 @@ import org.mockito.MockitoAnnotations;
import org.springframework.boot.cli.command.Command;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.willThrow;
@ -63,6 +64,7 @@ public class CommandRunnerTests {
@After
public void close() {
Thread.currentThread().setContextClassLoader(this.loader);
System.clearProperty("debug");
}
@Before
@ -115,6 +117,15 @@ public class CommandRunnerTests {
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
public void handlesSuccess() throws Exception {
int status = this.commandRunner.runAndHandleErrors("command");
@ -150,6 +161,7 @@ public class CommandRunnerTests {
public void handlesExceptionWithDashD() throws Exception {
willThrow(new RuntimeException()).given(this.regularCommand).run();
int status = this.commandRunner.runAndHandleErrors("command", "-d");
assertEquals("true", System.getProperty("debug"));
assertThat(status, equalTo(1));
assertThat(this.calls, equalTo((Set<Call>) EnumSet.of(Call.ERROR_MESSAGE,
Call.PRINT_STACK_TRACE)));
@ -159,6 +171,7 @@ public class CommandRunnerTests {
public void handlesExceptionWithDashDashDebug() throws Exception {
willThrow(new RuntimeException()).given(this.regularCommand).run();
int status = this.commandRunner.runAndHandleErrors("command", "--debug");
assertEquals("true", System.getProperty("debug"));
assertThat(status, equalTo(1));
assertThat(this.calls, equalTo((Set<Call>) EnumSet.of(Call.ERROR_MESSAGE,
Call.PRINT_STACK_TRACE)));