mirror of https://github.com/sbt/sbt.git
[2.x] fix: Append -root to synthetic root (#7716)
**Problem** I notice that the synthetic root project ends up conflicting with the projectMatrix on Scala 3, when the name of the matrix matches the directory name, which is fairly common. **Solution** Append `-root` to the root project when there are multiple subprojects found.
This commit is contained in:
parent
81347dc908
commit
bb32c385fb
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"]"""
|
||||
})
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue