From 847703cd5ec2dd403ba43b89d9d937d329449f00 Mon Sep 17 00:00:00 2001 From: MkDev11 Date: Mon, 12 Jan 2026 22:14:01 -0500 Subject: [PATCH] [2.x] fix: Allow ++ command to accept project/command patterns not in current state (#8505) When using '++version project/task', the parser now accepts project/command patterns (e.g., 'docs/docusaurusPublishGhpages') even if the project doesn't exist in the current state. This is achieved by adding a fallback parser that accepts any 'project/command' pattern alongside the combinedParser. Previously, '++2.12.19 docs/task' would fail with 'Project not found' if 'docs' project wasn't available in the current Scala version, but '++2.12.19; docs/task' worked. Now both syntaxes work correctly. The fix is targeted to only accept slash-delimited patterns, avoiding interference with other parser components like the -v verbose flag. Fixes #7574 --- main/src/main/scala/sbt/Cross.scala | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/main/src/main/scala/sbt/Cross.scala b/main/src/main/scala/sbt/Cross.scala index 398566abf..44568f4ae 100644 --- a/main/src/main/scala/sbt/Cross.scala +++ b/main/src/main/scala/sbt/Cross.scala @@ -58,7 +58,11 @@ object Cross { } val spacedVersion = if (spacePresent) version else version & spacedFirst(SwitchCommand) val verboseOpt = Parser.opt(token(Space ~> "-v")) - val optionalCommand = Parser.opt(token(Space ~> matched(state.combinedParser))) + // Accept valid commands, or project/command patterns that may reference projects + // not yet available after version switch (fixes #7574) + val slashCommand = (NotSpace ~ ('/' ~> any.+)).map { case p ~ c => p + "/" + c.mkString } + val commandParser = state.combinedParser | slashCommand + val optionalCommand = Parser.opt(token(Space ~> matched(commandParser))) val switch1 = (token(Space ~> "-v") ~> (Space ~> version) ~ optionalCommand) map { case v ~ command => Switch(v, true, command)