diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/CommandRunner.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/CommandRunner.java index 69057a971f..2175d639fc 100644 --- a/spring-boot-cli/src/main/java/org/springframework/boot/cli/CommandRunner.java +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/CommandRunner.java @@ -158,6 +158,9 @@ public class CommandRunner implements Iterable { 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 { private String[] removeDebugFlags(String[] args) { List rtn = new ArrayList(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()]); } diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/run/RunCommand.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/run/RunCommand.java index 759d81f46a..bb48672a87 100644 --- a/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/run/RunCommand.java +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/command/run/RunCommand.java @@ -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; } } diff --git a/spring-boot-cli/src/test/java/org/springframework/boot/cli/CommandRunnerIntegrationTests.java b/spring-boot-cli/src/test/java/org/springframework/boot/cli/CommandRunnerIntegrationTests.java new file mode 100644 index 0000000000..cc64ecee63 --- /dev/null +++ b/spring-boot-cli/src/test/java/org/springframework/boot/cli/CommandRunnerIntegrationTests.java @@ -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:")); + } +} diff --git a/spring-boot-cli/src/test/java/org/springframework/boot/cli/CommandRunnerTests.java b/spring-boot-cli/src/test/java/org/springframework/boot/cli/CommandRunnerTests.java index 097b8bf2b2..31da06759c 100644 --- a/spring-boot-cli/src/test/java/org/springframework/boot/cli/CommandRunnerTests.java +++ b/spring-boot-cli/src/test/java/org/springframework/boot/cli/CommandRunnerTests.java @@ -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) 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) EnumSet.of(Call.ERROR_MESSAGE, Call.PRINT_STACK_TRACE)));