From 9634a872cd60ca7fa7353bf830209639a3f64d4c Mon Sep 17 00:00:00 2001 From: Ethan Atkins Date: Thu, 27 Dec 2018 12:51:13 -0800 Subject: [PATCH] Allow trailing semicolon in multi commands It was a mistake to disallow trailing semicolons for multi commands. Firstly this was a mistake because previous versions of sbt supported a trailing semi colon. It was also inconsistent with how commands work in a regular shell (e.g. bash or zsh). --- main-command/src/main/scala/sbt/BasicCommands.scala | 2 +- main-command/src/test/scala/sbt/MultiParserSpec.scala | 5 +++++ sbt/src/sbt-test/watch/watch-parser/test | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/main-command/src/main/scala/sbt/BasicCommands.scala b/main-command/src/main/scala/sbt/BasicCommands.scala index f5432333e..daea8ed99 100644 --- a/main-command/src/main/scala/sbt/BasicCommands.scala +++ b/main-command/src/main/scala/sbt/BasicCommands.scala @@ -163,7 +163,7 @@ object BasicCommands { ) def commandParser = state.map(s => (s.combinedParser & cmdPart) | cmdPart).getOrElse(cmdPart) val part = semi.flatMap(_ => matched(commandParser) <~ token(OptSpace)).map(_.trim) - (cmdPart.? ~ part.+).map { + (cmdPart.? ~ part.+ <~ semi.?).map { case (Some(h), t) => h.mkString.trim +: t.toList case (_, t) => t.toList } diff --git a/main-command/src/test/scala/sbt/MultiParserSpec.scala b/main-command/src/test/scala/sbt/MultiParserSpec.scala index ec18b1c58..106490cbd 100644 --- a/main-command/src/test/scala/sbt/MultiParserSpec.scala +++ b/main-command/src/test/scala/sbt/MultiParserSpec.scala @@ -61,5 +61,10 @@ class MultiParserSpec extends FlatSpec with Matchers { "foo bar baz".parseEither shouldBe Left("Expected ';'\nfoo bar baz\n ^") "foo bar baz;".parseEither shouldBe Left("Expected not ';'\nExpected '\"'\nfoo bar baz;\n ^") + "foo;".parseEither shouldBe Left("Expected not ';'\nExpected '\"'\nfoo;\n ^") + } + it should "parse commands with trailing semi-colon" in { + "foo;bar;".parse shouldBe Seq("foo", "bar") + "foo; bar ;".parse shouldBe Seq("foo", "bar") } } diff --git a/sbt/src/sbt-test/watch/watch-parser/test b/sbt/src/sbt-test/watch/watch-parser/test index 63a58eb8a..4d5358af7 100644 --- a/sbt/src/sbt-test/watch/watch-parser/test +++ b/sbt/src/sbt-test/watch/watch-parser/test @@ -17,5 +17,5 @@ # All of the other tests have involved input tasks, so include commands with regular tasks as well. > ~; compile; setStringValue baz; checkStringValue baz -# No trailing semicolons are allowed --> ~; compile; setStringValue baz; checkStringValue baz; +# Ensure that trailing semi colons work +> ~ compile; setStringValue baz; checkStringValue baz;