From 6664cbe2ae18cb24aef173dd67f4d0378ab052ba Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Tue, 17 Sep 2019 23:04:10 -0400 Subject: [PATCH] add includePluginResolvers Fixes #5070 This adds a new setting called `includePluginResolvers` (default `false`). When set to `true`, it the project will include resolvers from the metabuild. This allows the build user to declare a resolver in one place (`project/plugins.sbt`) that gets applied to both the metabuild as well as all the subprojects. The scenario comes up when someone distributes a software on their own repo. Ref #4103 --- main/src/main/scala/sbt/Defaults.scala | 14 +++++++++++++- main/src/main/scala/sbt/Keys.scala | 3 ++- .../resolvers-plugin/build.sbt | 7 +++++++ .../resolvers-plugin/project/plugins.sbt | 1 + .../dependency-management/resolvers-plugin/test | 1 + 5 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 sbt/src/sbt-test/dependency-management/resolvers-plugin/build.sbt create mode 100644 sbt/src/sbt-test/dependency-management/resolvers-plugin/project/plugins.sbt create mode 100644 sbt/src/sbt-test/dependency-management/resolvers-plugin/test diff --git a/main/src/main/scala/sbt/Defaults.scala b/main/src/main/scala/sbt/Defaults.scala index 072a7595d..a98837ac6 100755 --- a/main/src/main/scala/sbt/Defaults.scala +++ b/main/src/main/scala/sbt/Defaults.scala @@ -2174,6 +2174,7 @@ object Classpaths { moduleConfigurations :== Nil, publishTo :== None, resolvers :== Vector.empty, + includePluginResolvers :== false, useJCenter :== false, retrievePattern :== Resolver.defaultRetrievePattern, transitiveClassifiers :== Seq(SourceClassifier, DocClassifier), @@ -2246,10 +2247,21 @@ object Classpaths { (Def.task { val proj = projectResolver.value val rs = externalResolvers.value + def pluginResolvers: Vector[Resolver] = + buildStructure.value + .units(thisProjectRef.value.build) + .unit + .plugins + .pluginData + .resolvers + .getOrElse(Vector.empty) + val pr = + if (includePluginResolvers.value) pluginResolvers + else Vector.empty bootResolvers.value match { case Some(repos) if overrideBuildResolvers.value => proj +: repos case _ => - val base = if (sbtPlugin.value) sbtResolvers.value ++ rs else rs + val base = if (sbtPlugin.value) sbtResolvers.value ++ rs ++ pr else rs ++ pr (proj +: base).distinct } }).value, diff --git a/main/src/main/scala/sbt/Keys.scala b/main/src/main/scala/sbt/Keys.scala index a54df46c6..e2de48a7b 100644 --- a/main/src/main/scala/sbt/Keys.scala +++ b/main/src/main/scala/sbt/Keys.scala @@ -411,7 +411,8 @@ object Keys { val fullResolvers = taskKey[Seq[Resolver]]("Combines the project resolver, default resolvers, and user-defined resolvers.").withRank(CTask) val otherResolvers = taskKey[Seq[Resolver]]("Resolvers not included in the main resolver chain, such as those in module configurations.").withRank(CSetting) val scalaCompilerBridgeResolvers = taskKey[Seq[Resolver]]("Resolvers used to resolve compiler bridges.").withRank(CSetting) - val useJCenter = settingKey[Boolean]("Use JCenter as the default repository.").withRank(BSetting) + val includePluginResolvers = settingKey[Boolean]("Include the resolvers from the metabuild.").withRank(CSetting) + val useJCenter = settingKey[Boolean]("Use JCenter as the default repository.").withRank(CSetting) val moduleConfigurations = settingKey[Seq[ModuleConfiguration]]("Defines module configurations, which override resolvers on a per-module basis.").withRank(BMinusSetting) val retrievePattern = settingKey[String]("Pattern used to retrieve managed dependencies to the current build.").withRank(DSetting) val retrieveConfiguration = settingKey[Option[RetrieveConfiguration]]("Configures retrieving dependencies to the current build.").withRank(DSetting) diff --git a/sbt/src/sbt-test/dependency-management/resolvers-plugin/build.sbt b/sbt/src/sbt-test/dependency-management/resolvers-plugin/build.sbt new file mode 100644 index 000000000..5d76d6c17 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/resolvers-plugin/build.sbt @@ -0,0 +1,7 @@ +lazy val check = taskKey[Unit]("") +ThisBuild / includePluginResolvers := true + +check := { + val rs = fullResolvers.value + assert(rs exists (_.name == "bintray-eed3si9n-sbt-plugins"), s"$rs does not include bintray") +} diff --git a/sbt/src/sbt-test/dependency-management/resolvers-plugin/project/plugins.sbt b/sbt/src/sbt-test/dependency-management/resolvers-plugin/project/plugins.sbt new file mode 100644 index 000000000..ec0f62ee9 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/resolvers-plugin/project/plugins.sbt @@ -0,0 +1 @@ +resolvers += Resolver.bintrayRepo("eed3si9n", "sbt-plugins") diff --git a/sbt/src/sbt-test/dependency-management/resolvers-plugin/test b/sbt/src/sbt-test/dependency-management/resolvers-plugin/test new file mode 100644 index 000000000..15675b169 --- /dev/null +++ b/sbt/src/sbt-test/dependency-management/resolvers-plugin/test @@ -0,0 +1 @@ +> check