diff --git a/build.sbt b/build.sbt index e9c291328..5d03153b8 100644 --- a/build.sbt +++ b/build.sbt @@ -187,6 +187,8 @@ lazy val sbtRoot: Project = (project in file(".")) skip in publish := true, commands in Global += Command .single("sbtOn")((state, dir) => s"sbtProj/test:runMain sbt.RunFromSourceMain $dir" :: state), + mimaSettings, + mimaPreviousArtifacts := Set.empty, ) // This is used to configure an sbt-launcher for this version of sbt. @@ -207,7 +209,9 @@ lazy val bundledLauncherProj = // mimaSettings, // TODO: Configure MiMa, deal with Proguard publish := Release.deployLauncher.value, publishLauncher := Release.deployLauncher.value, - packageBin in Compile := sbtLaunchJar.value + packageBin in Compile := sbtLaunchJar.value, + mimaSettings, + mimaPreviousArtifacts := Set() ) /* ** subproject declarations ** */ @@ -235,6 +239,17 @@ val collectionProj = (project in file("internal") / "util-collection") // it's now abstract in KList and defined in both KCons & KNil. exclude[FinalMethodProblem]("sbt.internal.util.KNil.foldr"), exclude[DirectAbstractMethodProblem]("sbt.internal.util.KList.foldr"), + + exclude[IncompatibleSignatureProblem]("sbt.internal.util.Init*.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.util.Settings0.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.util.EvaluateSettings#INode.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.util.TypeFunctions.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.util.EvaluateSettings.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.util.Settings.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.util.EvaluateSettings#MixedNode.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.util.EvaluateSettings#BindNode.this"), + exclude[IncompatibleSignatureProblem]("sbt.internal.util.EvaluateSettings#BindNode.dependsOn"), + exclude[IncompatibleSignatureProblem]("sbt.internal.util.Types.some") ), ) .configure(addSbtUtilPosition) @@ -249,7 +264,14 @@ val completeProj = (project in file("internal") / "util-complete") mimaSettings, // Parser is used publicly, so we can't break bincompat. mimaBinaryIssueFilters := Seq( + exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.SoftInvalid.apply"), + exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.Invalid.apply"), + exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.Finite.apply"), + exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.Infinite.decrement"), exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.History.this"), + exclude[IncompatibleMethTypeProblem]("sbt.internal.util.complete.Completion.suggestion"), + exclude[IncompatibleMethTypeProblem]("sbt.internal.util.complete.Completion.token"), + exclude[IncompatibleMethTypeProblem]("sbt.internal.util.complete.Completion.displayOnly") ), ) .configure(addSbtIO, addSbtUtilControl, addSbtUtilLogging) @@ -334,10 +356,20 @@ lazy val taskProj = (project in file("tasks")) name := "Tasks", mimaSettings, mimaBinaryIssueFilters ++= Seq( + exclude[IncompatibleSignatureProblem]("sbt.Triggers.this"), + exclude[IncompatibleSignatureProblem]("sbt.Triggers.runBefore"), + exclude[IncompatibleSignatureProblem]("sbt.Triggers.injectFor"), + exclude[IncompatibleSignatureProblem]("sbt.Triggers.onComplete"), + exclude[DirectMissingMethodProblem]("sbt.Inc.apply"), // ok because sbt.ExecuteProgress has been under private[sbt] exclude[IncompatibleResultTypeProblem]("sbt.ExecuteProgress.initial"), exclude[DirectMissingMethodProblem]("sbt.ExecuteProgress.*"), exclude[ReversedMissingMethodProblem]("sbt.ExecuteProgress.*"), + exclude[IncompatibleSignatureProblem]("sbt.ExecuteProgress.*"), + // ok because sbt.Execute has been under private[sbt] + exclude[IncompatibleSignatureProblem]("sbt.Execute.*"), + exclude[IncompatibleSignatureProblem]("sbt.Execute#CyclicException.*"), + exclude[IncompatibleSignatureProblem]("sbt.NodeView.*"), ) ) .configure(addSbtUtilControl) @@ -424,6 +456,7 @@ lazy val scriptedSbtOldProj = (project in file("scripted-sbt-old")) exclude[MissingClassProblem]("sbt.test.*"), exclude[DirectMissingMethodProblem]("sbt.test.*"), exclude[IncompatibleMethTypeProblem]("sbt.test.*"), + exclude[IncompatibleSignatureProblem]("sbt.test.*"), ), ) @@ -524,6 +557,9 @@ lazy val commandProj = (project in file("main-command")) contrabandFormatsForType in generateContrabands in Compile := ContrabandConfig.getFormats, mimaSettings, mimaBinaryIssueFilters ++= Vector( + exclude[DirectMissingMethodProblem]("sbt.Exit.apply"), + exclude[DirectMissingMethodProblem]("sbt.Reboot.apply"), + exclude[DirectMissingMethodProblem]("sbt.TemplateResolverInfo.apply"), // dropped private[sbt] method exclude[DirectMissingMethodProblem]("sbt.BasicCommands.compatCommands"), // dropped mainly internal command strings holder @@ -596,6 +632,31 @@ lazy val mainSettingsProj = (project in file("main-settings")) ), mimaSettings, mimaBinaryIssueFilters ++= Seq( + exclude[IncompatibleSignatureProblem]("sbt.Previous#References.getReferences"), + exclude[IncompatibleSignatureProblem]("sbt.Def.delegate"), + exclude[IncompatibleSignatureProblem]("sbt.Def.add"), + exclude[IncompatibleSignatureProblem]("sbt.Def.grouped"), + exclude[IncompatibleSignatureProblem]("sbt.Def.compile"), + exclude[IncompatibleSignatureProblem]("sbt.Def.asTransform"), + exclude[DirectMissingMethodProblem]("sbt.Def.StaticScopes"), + exclude[IncompatibleSignatureProblem]("sbt.Previous.this"), + exclude[DirectMissingMethodProblem]("sbt.BuildRef.apply"), + exclude[DirectMissingMethodProblem]("sbt.ScopeMask.apply"), + exclude[DirectMissingMethodProblem]("sbt.Def.intersect"), + exclude[DirectMissingMethodProblem]("sbt.LocalProject.apply"), + exclude[DirectMissingMethodProblem]("sbt.std.InitializeInstance.pure"), + exclude[DirectMissingMethodProblem]("sbt.std.InitializeInstance.flatten"), + exclude[DirectMissingMethodProblem]("sbt.std.InitializeInstance.map"), + exclude[DirectMissingMethodProblem]("sbt.std.InitializeInstance.app"), + exclude[DirectMissingMethodProblem]("sbt.std.ParserInstance.pure"), + exclude[DirectMissingMethodProblem]("sbt.std.ParserInstance.map"), + exclude[DirectMissingMethodProblem]("sbt.std.ParserInstance.app"), + exclude[DirectMissingMethodProblem]("sbt.std.ParserInstance.pure"), + exclude[DirectMissingMethodProblem]("sbt.std.TaskInstance.pure"), + exclude[DirectMissingMethodProblem]("sbt.std.TaskInstance.flatten"), + exclude[DirectMissingMethodProblem]("sbt.std.TaskInstance.map"), + exclude[DirectMissingMethodProblem]("sbt.std.TaskInstance.app"), + exclude[DirectMissingMethodProblem]("sbt.std.FullInstance.flatten"), exclude[DirectMissingMethodProblem]("sbt.Scope.display012StyleMasked"), // added a method to a sealed trait exclude[InheritedNewAbstractMethodProblem]("sbt.Scoped.canEqual"), @@ -680,19 +741,57 @@ lazy val mainProj = (project in file("main")) exclude[IncompatibleMethTypeProblem]("sbt.Defaults.allTestGroupsTask"), exclude[DirectMissingMethodProblem]("sbt.StandardMain.shutdownHook"), exclude[MissingClassProblem]("sbt.internal.ResourceLoaderImpl"), + exclude[IncompatibleSignatureProblem]("sbt.internal.ConfigIndex.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.Inspect.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.ProjectIndex.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.BuildIndex.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.server.LanguageServerReporter.*"), + exclude[VirtualStaticMemberProblem]("sbt.internal.server.LanguageServerProtocol.*"), + exclude[IncompatibleSignatureProblem]("sbt.internal.librarymanagement.IvyXml.*"), // Removed private internal classes exclude[MissingClassProblem]("sbt.internal.ReverseLookupClassLoaderHolder$BottomClassLoader"), exclude[MissingClassProblem]("sbt.internal.ReverseLookupClassLoaderHolder$ReverseLookupClassLoader$ResourceLoader"), exclude[MissingClassProblem]("sbt.internal.ReverseLookupClassLoaderHolder$ClassLoadingLock"), exclude[MissingClassProblem]("sbt.internal.ReverseLookupClassLoaderHolder$ReverseLookupClassLoader"), exclude[MissingClassProblem]("sbt.internal.LayeredClassLoaderImpl"), + + // false positives + exclude[DirectMissingMethodProblem]("sbt.plugins.IvyPlugin.requires"), + exclude[DirectMissingMethodProblem]("sbt.plugins.JUnitXmlReportPlugin.requires"), + exclude[DirectMissingMethodProblem]("sbt.plugins.Giter8TemplatePlugin.requires"), + exclude[DirectMissingMethodProblem]("sbt.plugins.JvmPlugin.requires"), + exclude[DirectMissingMethodProblem]("sbt.plugins.SbtPlugin.requires"), + exclude[DirectMissingMethodProblem]("sbt.ResolvedClasspathDependency.apply"), + exclude[DirectMissingMethodProblem]("sbt.ClasspathDependency.apply"), + exclude[IncompatibleSignatureProblem]("sbt.plugins.SemanticdbPlugin.globalSettings"), + + // File -> Source + exclude[DirectMissingMethodProblem]("sbt.Defaults.cleanFilesTask"), + exclude[IncompatibleSignatureProblem]("sbt.Defaults.resourceConfigPaths"), + exclude[IncompatibleSignatureProblem]("sbt.Defaults.sourceConfigPaths"), + exclude[IncompatibleSignatureProblem]("sbt.Defaults.configPaths"), + exclude[IncompatibleSignatureProblem]("sbt.Defaults.paths"), + + exclude[IncompatibleSignatureProblem]("sbt.Keys.csrPublications"), + exclude[IncompatibleSignatureProblem]("sbt.coursierint.CoursierArtifactsTasks.coursierPublicationsTask"), + exclude[IncompatibleSignatureProblem]("sbt.coursierint.CoursierArtifactsTasks.coursierPublicationsTask"), + exclude[IncompatibleSignatureProblem]("sbt.coursierint.LMCoursier.coursierConfiguration"), + exclude[IncompatibleSignatureProblem]("sbt.coursierint.LMCoursier.publicationsSetting"), + exclude[IncompatibleSignatureProblem]("sbt.Project.inThisBuild"), + exclude[IncompatibleSignatureProblem]("sbt.Project.inConfig"), + exclude[IncompatibleSignatureProblem]("sbt.Project.inTask"), + exclude[IncompatibleSignatureProblem]("sbt.Project.inScope"), + exclude[IncompatibleSignatureProblem]("sbt.ProjectExtra.inThisBuild"), + exclude[IncompatibleSignatureProblem]("sbt.ProjectExtra.inConfig"), + exclude[IncompatibleSignatureProblem]("sbt.ProjectExtra.inTask"), + exclude[IncompatibleSignatureProblem]("sbt.ProjectExtra.inScope"), ) ) .configure( addSbtIO, addSbtUtilLogging, addSbtLmCore, - addSbtLmImpl, + addSbtLmIvy, addSbtCompilerInterface, addSbtZincCompile ) @@ -773,6 +872,11 @@ lazy val sbtBig = (project in file(".big")) lazy val sbtIgnoredProblems = { Vector( + exclude[IncompatibleSignatureProblem]("sbt.package.some"), + exclude[IncompatibleSignatureProblem]("sbt.package.inThisBuild"), + exclude[IncompatibleSignatureProblem]("sbt.package.inConfig"), + exclude[IncompatibleSignatureProblem]("sbt.package.inTask"), + exclude[IncompatibleSignatureProblem]("sbt.package.inScope"), exclude[MissingClassProblem]("buildinfo.BuildInfo"), exclude[MissingClassProblem]("buildinfo.BuildInfo$"), // Added more items to Import trait. @@ -1040,7 +1144,7 @@ def customCommands: Seq[Setting[_]] = Seq( ThisBuild / whitesourceProduct := "Lightbend Reactive Platform" ThisBuild / whitesourceAggregateProjectName := { // note this can get detached on tag build etc - val b = (ThisBuild / git.gitCurrentBranch).value + val b = sys.process.Process("git rev-parse --abbrev-ref HEAD").!! val Stable = """1\.([0-9]+)\.x""".r b match { case Stable(y) => "sbt-1." + y.toString + "-stable" diff --git a/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala b/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala index bb80501dc..faba09d09 100644 --- a/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala +++ b/main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala @@ -17,18 +17,18 @@ object SemanticdbPlugin extends AutoPlugin { override def requires = JvmPlugin override def trigger = allRequirements - override lazy val globalSettings = Seq( + override lazy val globalSettings: Seq[Def.Setting[_]] = Seq( semanticdbEnabled := false, semanticdbIncludeInJar := false, semanticdbOptions := List("-Yrangepos"), - semanticdbVersion := "4.1.0", + semanticdbVersion := "4.1.0" + ) + + override lazy val projectSettings: Seq[Def.Setting[_]] = Seq( semanticdbCompilerPlugin := { val v = semanticdbVersion.value ("org.scalameta" % "semanticdb-scalac" % v).cross(CrossVersion.full) - } - ) - - override lazy val projectSettings = Seq( + }, allDependencies ++= { val sdb = semanticdbEnabled.value val m = semanticdbCompilerPlugin.value diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 225a23ee3..4d3458e7e 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -93,8 +93,8 @@ object Dependencies { def addSbtLmCore(p: Project): Project = addSbtModule(p, sbtLmPath, "lmCore", libraryManagementCore) - def addSbtLmImpl(p: Project): Project = - addSbtModule(p, sbtLmPath, "lmImpl", libraryManagementIvy) + def addSbtLmIvy(p: Project): Project = + addSbtModule(p, sbtLmPath, "lmIvy", libraryManagementIvy) def addSbtLmIvyTest(p: Project): Project = addSbtModule(p, sbtLmPath, "lmIvy", libraryManagementIvy, Some(Test)) diff --git a/project/HouseRulesPlugin.scala b/project/HouseRulesPlugin.scala new file mode 100644 index 000000000..8c8958c4f --- /dev/null +++ b/project/HouseRulesPlugin.scala @@ -0,0 +1,58 @@ +import sbt._ +import Keys._ +import bintray.BintrayPlugin +import bintray.BintrayPlugin.autoImport._ + +object HouseRulesPlugin extends AutoPlugin { + override def requires = plugins.JvmPlugin && BintrayPlugin + override def trigger = allRequirements + + override def buildSettings: Seq[Def.Setting[_]] = baseBuildSettings + override def projectSettings: Seq[Def.Setting[_]] = baseSettings + + lazy val baseBuildSettings: Seq[Def.Setting[_]] = Seq( + bintrayOrganization := Some("sbt"), + bintrayRepository := "maven-releases", + ) + + lazy val baseSettings: Seq[Def.Setting[_]] = Seq( + bintrayPackage := (ThisBuild / bintrayPackage).value, + bintrayRepository := (ThisBuild / bintrayRepository).value, + scalacOptions ++= Seq("-encoding", "utf8"), + scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-Xlint"), + scalacOptions += "-language:higherKinds", + scalacOptions += "-language:implicitConversions", + scalacOptions ++= "-Xfuture".ifScala213OrMinus.value.toList, + scalacOptions += "-Xlint", + scalacOptions ++= "-Xfatal-warnings" + .ifScala(v => { + sys.props.get("sbt.build.fatal") match { + case Some(_) => java.lang.Boolean.getBoolean("sbt.build.fatal") + case _ => v == 12 + } + }) + .value + .toList, + scalacOptions ++= "-Yinline-warnings".ifScala211OrMinus.value.toList, + scalacOptions ++= "-Yno-adapted-args".ifScala212OrMinus.value.toList, + scalacOptions += "-Ywarn-dead-code", + scalacOptions += "-Ywarn-numeric-widen", + scalacOptions += "-Ywarn-value-discard", + scalacOptions ++= "-Ywarn-unused-import".ifScala(v => 11 <= v && v <= 12).value.toList + ) ++ Seq(Compile, Test).flatMap( + c => scalacOptions in (c, console) --= Seq("-Ywarn-unused-import", "-Xlint") + ) + + private def scalaPartV = Def setting (CrossVersion partialVersion scalaVersion.value) + + private implicit final class AnyWithIfScala[A](val __x: A) { + def ifScala(p: Long => Boolean) = + Def setting (scalaPartV.value collect { case (2, y) if p(y) => __x }) + def ifScalaLte(v: Long) = ifScala(_ <= v) + def ifScalaGte(v: Long) = ifScala(_ >= v) + def ifScala211OrMinus = ifScalaLte(11) + def ifScala211OrPlus = ifScalaGte(11) + def ifScala212OrMinus = ifScalaLte(12) + def ifScala213OrMinus = ifScalaLte(13) + } +} diff --git a/project/build.properties b/project/build.properties index 080a737ed..6adcdc753 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.3.0 +sbt.version=1.3.3 diff --git a/project/plugins.sbt b/project/plugins.sbt index 67659a3df..c5959a110 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,10 +1,12 @@ -scalaVersion := "2.12.10" scalacOptions ++= Seq("-feature", "-language:postfixOps") -addSbtPlugin("org.scala-sbt" % "sbt-houserules" % "0.3.9") +addSbtPlugin("com.dwijnand" % "sbt-dynver" % "4.0.0") +addSbtPlugin("org.foundweekends" % "sbt-bintray" % "0.5.5") +addSbtPlugin("com.jsuereth" % "sbt-pgp" % "2.0.0") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.0.2") addSbtPlugin("org.scala-sbt" % "sbt-contraband" % "0.4.1") addSbtPlugin("de.heikoseeberger" % "sbt-header" % "3.0.2") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.9.0") addSbtPlugin("com.lightbend" % "sbt-whitesource" % "0.1.14") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.9") +addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.6.1") diff --git a/sbt/src/sbt-test/project/semanticdb-version/build.sbt b/sbt/src/sbt-test/project/semanticdb-version/build.sbt new file mode 100644 index 000000000..c447644ca --- /dev/null +++ b/sbt/src/sbt-test/project/semanticdb-version/build.sbt @@ -0,0 +1,18 @@ +ThisBuild / scalaVersion := "2.12.8" +ThisBuild / semanticdbEnabled := true +ThisBuild / semanticdbVersion := "4.2.3" +ThisBuild / semanticdbIncludeInJar := false + +lazy val root = (project in file(".")) + +lazy val check = taskKey[Unit]("Checks the configured semanticdbVersion") + +check := { + val expected = Some("4.2.3") + val actual = allDependencies + .value + .find(_.name == "semanticdb-scalac") + .map(_.revision) + + assert(actual == expected, s"Expected version to be $expected, was $actual") +} diff --git a/sbt/src/sbt-test/project/semanticdb-version/src/main/scala/foo/Test.scala b/sbt/src/sbt-test/project/semanticdb-version/src/main/scala/foo/Test.scala new file mode 100644 index 000000000..0bf6e4111 --- /dev/null +++ b/sbt/src/sbt-test/project/semanticdb-version/src/main/scala/foo/Test.scala @@ -0,0 +1,7 @@ +package foo + +object Test { + def main(args: Array[String]): Unit = { + println("hello world") + } +} diff --git a/sbt/src/sbt-test/project/semanticdb-version/test b/sbt/src/sbt-test/project/semanticdb-version/test new file mode 100644 index 000000000..15675b169 --- /dev/null +++ b/sbt/src/sbt-test/project/semanticdb-version/test @@ -0,0 +1 @@ +> check