diff --git a/main/src/main/scala/sbt/internal/BuildDef.scala b/main/src/main/scala/sbt/internal/BuildDef.scala index b68008dbb..a2efed7d5 100644 --- a/main/src/main/scala/sbt/internal/BuildDef.scala +++ b/main/src/main/scala/sbt/internal/BuildDef.scala @@ -16,7 +16,6 @@ import Def.Setting import sbt.io.Hash import sbt.internal.util.{ Attributed, StringAttributeMap } import sbt.internal.inc.{ FileAnalysisStore, ReflectUtilities } -import sbt.SlashSyntax0.* import xsbti.{ FileConverter, VirtualFileRef } import xsbti.compile.CompileAnalysis @@ -59,10 +58,9 @@ private[sbt] object BuildDef: private[sbt] def generatedRootSkipPublish( id: String, base: File, - agg: Seq[ProjectRef] ): Project = Project - .mkGeneratedRoot(id, base, agg) + .mkGeneratedRoot(id, base, Nil) .settings( defaultProjectSettings, publish / skip := true, diff --git a/main/src/main/scala/sbt/internal/Load.scala b/main/src/main/scala/sbt/internal/Load.scala index ee0a38365..b9a66cdb6 100755 --- a/main/src/main/scala/sbt/internal/Load.scala +++ b/main/src/main/scala/sbt/internal/Load.scala @@ -866,22 +866,25 @@ private[sbt] object Load { localBase: File, context: PluginManagement.Context, existingIDs: Seq[String] - ): String = { - def normalizeID(f: File) = Project.normalizeProjectID(f.getName) match { + ): String = + def normalizeID(f: File) = Project.normalizeProjectID(f.getName) match case Right(id) => id case Left(msg) => sys.error(autoIDError(f, msg)) - } @tailrec def nthParentName(f: File, i: Int): String = - if (f eq null) BuildDef.defaultID(localBase) - else if (i <= 0) normalizeID(f) + if f eq null then BuildDef.defaultID(localBase) + else if i <= 0 then normalizeID(f) else nthParentName(f.getParentFile, i - 1) val pluginDepth = context.pluginProjectDepth - val postfix = "-build" * pluginDepth val idBase = - if (context.globalPluginProject) "global-plugins" else nthParentName(localBase, pluginDepth) - val tryID = idBase + postfix - if (existingIDs.contains(tryID)) BuildDef.defaultID(localBase) else tryID - } + if context.globalPluginProject then "global-plugins" + else nthParentName(localBase, pluginDepth) + val tryID = + if pluginDepth == 0 then + if existingIDs.isEmpty then idBase + else idBase + "-root" + else idBase + "-build" * pluginDepth + if existingIDs.contains(tryID) then BuildDef.defaultID(localBase) + else tryID private def autoIDError(base: File, reason: String): String = "Could not derive root project ID from directory " + base.getAbsolutePath + ":\n" + @@ -1066,10 +1069,10 @@ private[sbt] object Load { log.debug(s"[Loading] Found non-root projects $discoveredIdsStr") // Here we do something interesting... We need to create an aggregate root project val root = { - val defaultID = autoID(buildBase, context, Nil) + val defaultID = autoID(buildBase, context, discovered.map(_.id)) if discovered.isEmpty || java.lang.Boolean.getBoolean("sbt.root.ivyplugin") then BuildDef.defaultProject(defaultID, buildBase) - else BuildDef.generatedRootSkipPublish(defaultID, buildBase, Nil) + else BuildDef.generatedRootSkipPublish(defaultID, buildBase) } val otherProjects = loadTransitive1( diff --git a/server-test/src/test/scala/testpkg/BuildServerTest.scala b/server-test/src/test/scala/testpkg/BuildServerTest.scala index 199d87800..a7f5857c9 100644 --- a/server-test/src/test/scala/testpkg/BuildServerTest.scala +++ b/server-test/src/test/scala/testpkg/BuildServerTest.scala @@ -52,8 +52,10 @@ class BuildServerTest extends AbstractServerTest { // runAndTest should declare the dependency to util even if optional assert(runAndTestTarget.dependencies.contains(utilTargetIdentifier)) val buildServerBuildTarget = - result.targets.find(_.displayName.contains("buildserver-build")).get - assert(buildServerBuildTarget.id.uri.toString.endsWith("#buildserver-build")) + result.targets.find(_.displayName.contains("buildserver-root-build")) match + case Some(t) => t + case None => sys.error(s"buildserver-root-build not in ${result.targets}") + assert(buildServerBuildTarget.id.uri.toString.endsWith("#buildserver-root-build")) assert(!result.targets.exists(_.displayName.contains("badBuildTarget"))) } @@ -65,8 +67,9 @@ class BuildServerTest extends AbstractServerTest { val sources = s.items.head.sources.map(_.uri) assert(sources.contains(new File(svr.baseDirectory, "util/src/main/scala").toURI)) } + test("buildTarget/sources: base sources") { - val buildTarget = buildTargetUri("buildserver", "Compile") + val buildTarget = buildTargetUri("buildserver-root", "Compile") buildTargetSources(Seq(buildTarget)) val s = svr.waitFor[SourcesResult](10.seconds) val sources = s.items.head.sources @@ -79,7 +82,7 @@ class BuildServerTest extends AbstractServerTest { } test("buildTarget/sources: sbt") { - val x = new URI(s"${svr.baseDirectory.getAbsoluteFile.toURI}#buildserver-build") + val x = new URI(s"${svr.baseDirectory.getAbsoluteFile.toURI}#buildserver-root-build") buildTargetSources(Seq(x)) val s = svr.waitFor[SourcesResult](10.seconds) val sources = s.items.head.sources.map(_.uri).sorted diff --git a/server-test/src/test/scala/testpkg/ServerCompletionsTest.scala b/server-test/src/test/scala/testpkg/ServerCompletionsTest.scala index 2165de63d..8ba720b78 100644 --- a/server-test/src/test/scala/testpkg/ServerCompletionsTest.scala +++ b/server-test/src/test/scala/testpkg/ServerCompletionsTest.scala @@ -33,6 +33,9 @@ class ServerCompletionsTest extends AbstractServerTest { }) } + /* + // TODO: https://github.com/sbt/sbt/issues/7718 + // Note that this test currently relies on a fake target artifact that's checked in test("return completions for user classes") { val completionStr = """{ "query": "testOnly org." }""" svr.sendJsonRpc( @@ -42,4 +45,5 @@ class ServerCompletionsTest extends AbstractServerTest { s contains """"result":{"items":["testOnly org.sbt.ExampleSpec"]""" }) } + */ }