From 7fc2790458b2844bedf5b42a78f1564e9df45832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Mickevi=C4=8Dius?= Date: Thu, 21 May 2015 09:48:49 +0300 Subject: [PATCH] =pro run multi-jvm tests when validating pr * addunidoc task via an AutoPlugin that depends on PrValidation and Unidoc autoplugins * separate cli option logic to a case class * remove autoplugin for root project --- akka-actor-tests/build.sbt | 4 +- akka-actor/build.sbt | 7 +- akka-agent/build.sbt | 8 +- akka-bench-jmh/build.sbt | 1 + akka-camel/build.sbt | 6 +- akka-cluster-metrics/build.sbt | 14 +-- .../metrics/ClusterMetricsRoutingSpec.scala | 2 +- akka-cluster-sharding/build.sbt | 10 +- ...terShardingCustomShardAllocationSpec.scala | 1 - akka-cluster-tools/build.sbt | 10 +- akka-cluster/build.sbt | 14 +-- akka-contrib/build.sbt | 10 +- akka-docs/build.sbt | 4 + akka-kernel/build.sbt | 8 +- akka-multi-node-testkit/build.sbt | 6 +- akka-osgi/build.sbt | 6 +- akka-persistence-tck/build.sbt | 9 +- akka-persistence/build.sbt | 11 +- akka-remote-tests/build.sbt | 14 +-- akka-remote/build.sbt | 6 +- akka-slf4j/build.sbt | 6 +- akka-testkit/build.sbt | 6 +- akka-typed/build.sbt | 7 +- build.sbt | 4 +- project/AkkaBuild.scala | 18 ++- project/CliOptions.scala | 27 +++++ project/CommandLineOptions.scala | 13 --- project/{Unidoc.scala => Doc.scala} | 106 +++++++++++++----- project/MiMa.scala | 22 ++-- project/MultiNode.scala | 101 ++++++++++------- project/RootSettings.scala | 22 ---- project/Sample.scala | 11 ++ project/TimeStampede.scala | 3 +- project/ValidatePullRequest.scala | 69 ++++++++++-- 34 files changed, 291 insertions(+), 275 deletions(-) create mode 100644 project/CliOptions.scala delete mode 100644 project/CommandLineOptions.scala rename project/{Unidoc.scala => Doc.scala} (53%) delete mode 100644 project/RootSettings.scala diff --git a/akka-actor-tests/build.sbt b/akka-actor-tests/build.sbt index 4db11d0d5d..6797937285 100644 --- a/akka-actor-tests/build.sbt +++ b/akka-actor-tests/build.sbt @@ -1,11 +1,9 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting } AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - publishArtifact in Compile := false Dependencies.actorTests diff --git a/akka-actor/build.sbt b/akka-actor/build.sbt index f009316b6a..6a91adc89b 100644 --- a/akka-actor/build.sbt +++ b/akka-actor/build.sbt @@ -1,14 +1,10 @@ -import akka.{ AkkaBuild, Formatting, OSGi, Unidoc, Dependencies } +import akka.{ AkkaBuild, Formatting, OSGi, Dependencies } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - OSGi.actor Dependencies.actor @@ -16,4 +12,3 @@ Dependencies.actor MimaKeys.previousArtifact := akkaPreviousArtifact("akka-actor").value spray.boilerplate.BoilerplatePlugin.Boilerplate.settings - diff --git a/akka-agent/build.sbt b/akka-agent/build.sbt index 431eda29e2..cab4a1ca79 100644 --- a/akka-agent/build.sbt +++ b/akka-agent/build.sbt @@ -1,16 +1,14 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, ScaladocNoVerificationOfDiagrams } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettingsNoVerificationOfDiagrams - -Unidoc.javadocSettings - OSGi.agent Dependencies.agent MimaKeys.previousArtifact := akkaPreviousArtifact("akka-agent").value + +enablePlugins(ScaladocNoVerificationOfDiagrams) diff --git a/akka-bench-jmh/build.sbt b/akka-bench-jmh/build.sbt index bb17cb12ca..7196283e2e 100644 --- a/akka-bench-jmh/build.sbt +++ b/akka-bench-jmh/build.sbt @@ -1 +1,2 @@ enablePlugins(JmhPlugin) +disablePlugins(Unidoc) diff --git a/akka-camel/build.sbt b/akka-camel/build.sbt index e72d1c59ae..08bed3366b 100644 --- a/akka-camel/build.sbt +++ b/akka-camel/build.sbt @@ -1,14 +1,10 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting, OSGi } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - OSGi.camel Dependencies.camel diff --git a/akka-cluster-metrics/build.sbt b/akka-cluster-metrics/build.sbt index 03a5a2f74d..9039bf1939 100644 --- a/akka-cluster-metrics/build.sbt +++ b/akka-cluster-metrics/build.sbt @@ -1,4 +1,4 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, MultiNode, Unidoc, SigarLoader } +import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, MultiNodeScalaTest, SigarLoader } import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys._ import com.typesafe.tools.mima.plugin.MimaKeys @@ -6,12 +6,6 @@ AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - -MultiNode.multiJvmSettings - SigarLoader.sigarSettings OSGi.clusterMetrics @@ -22,8 +16,4 @@ Dependencies.clusterMetrics parallelExecution in Test := false -extraOptions in MultiJvm <<= (sourceDirectory in MultiJvm) { src => - (name: String) => (src ** (name + ".conf")).get.headOption.map("-Dakka.config=" + _.absolutePath).toSeq -} - -scalatestOptions in MultiJvm := MultiNode.defaultMultiJvmScalatestOptions.value +enablePlugins(MultiNodeScalaTest) diff --git a/akka-cluster-metrics/src/multi-jvm/scala/akka/cluster/metrics/ClusterMetricsRoutingSpec.scala b/akka-cluster-metrics/src/multi-jvm/scala/akka/cluster/metrics/ClusterMetricsRoutingSpec.scala index 28dfb23417..731db6213d 100644 --- a/akka-cluster-metrics/src/multi-jvm/scala/akka/cluster/metrics/ClusterMetricsRoutingSpec.scala +++ b/akka-cluster-metrics/src/multi-jvm/scala/akka/cluster/metrics/ClusterMetricsRoutingSpec.scala @@ -69,7 +69,7 @@ object AdaptiveLoadBalancingRouterConfig extends MultiNodeConfig { # Disable legacy metrics. akka.cluster.metrics.enabled=off - + # Enable metrics estension. akka.extensions=["akka.cluster.metrics.ClusterMetricsExtension"] diff --git a/akka-cluster-sharding/build.sbt b/akka-cluster-sharding/build.sbt index 51733f2fc8..96df92a747 100644 --- a/akka-cluster-sharding/build.sbt +++ b/akka-cluster-sharding/build.sbt @@ -1,18 +1,14 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, MultiNode, Unidoc, OSGi } +import akka.{ AkkaBuild, Dependencies, Formatting, MultiNode, ScaladocNoVerificationOfDiagrams, OSGi } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettingsNoVerificationOfDiagrams - -Unidoc.javadocSettings - OSGi.clusterSharding -MultiNode.multiJvmSettings - Dependencies.clusterSharding //MimaKeys.previousArtifact := akkaPreviousArtifact("akka-cluster-sharding").value + +enablePlugins(MultiNode, ScaladocNoVerificationOfDiagrams) diff --git a/akka-cluster-sharding/src/multi-jvm/scala/akka/cluster/sharding/ClusterShardingCustomShardAllocationSpec.scala b/akka-cluster-sharding/src/multi-jvm/scala/akka/cluster/sharding/ClusterShardingCustomShardAllocationSpec.scala index aab37288d9..eb1221331b 100644 --- a/akka-cluster-sharding/src/multi-jvm/scala/akka/cluster/sharding/ClusterShardingCustomShardAllocationSpec.scala +++ b/akka-cluster-sharding/src/multi-jvm/scala/akka/cluster/sharding/ClusterShardingCustomShardAllocationSpec.scala @@ -231,4 +231,3 @@ class ClusterShardingCustomShardAllocationSpec extends MultiNodeSpec(ClusterShar } } - diff --git a/akka-cluster-tools/build.sbt b/akka-cluster-tools/build.sbt index 6515b5f8ea..cc96358e65 100644 --- a/akka-cluster-tools/build.sbt +++ b/akka-cluster-tools/build.sbt @@ -1,18 +1,14 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, MultiNode, Unidoc, OSGi } +import akka.{ AkkaBuild, Dependencies, Formatting, MultiNode, ScaladocNoVerificationOfDiagrams, OSGi } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettingsNoVerificationOfDiagrams - -Unidoc.javadocSettings - OSGi.clusterTools -MultiNode.multiJvmSettings - Dependencies.clusterTools //MimaKeys.previousArtifact := akkaPreviousArtifact("akka-cluster-tools").value + +enablePlugins(MultiNode, ScaladocNoVerificationOfDiagrams) diff --git a/akka-cluster/build.sbt b/akka-cluster/build.sbt index bd807f9f44..827f720f00 100644 --- a/akka-cluster/build.sbt +++ b/akka-cluster/build.sbt @@ -1,4 +1,4 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, MultiNode, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, MultiNodeScalaTest } import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys._ import com.typesafe.tools.mima.plugin.MimaKeys @@ -6,12 +6,6 @@ AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - -MultiNode.multiJvmSettings - OSGi.cluster Dependencies.cluster @@ -21,8 +15,4 @@ MimaKeys.previousArtifact := akkaPreviousArtifact("akka-cluster").value // disable parallel tests parallelExecution in Test := false -extraOptions in MultiJvm <<= (sourceDirectory in MultiJvm) { src => - (name: String) => (src ** (name + ".conf")).get.headOption.map("-Dakka.config=" + _.absolutePath).toSeq -} - -scalatestOptions in MultiJvm := MultiNode.defaultMultiJvmScalatestOptions.value +enablePlugins(MultiNodeScalaTest) diff --git a/akka-contrib/build.sbt b/akka-contrib/build.sbt index 0dc27e26f5..d35a1e271a 100644 --- a/akka-contrib/build.sbt +++ b/akka-contrib/build.sbt @@ -1,16 +1,10 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, MultiNode, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting, MultiNode, ScaladocNoVerificationOfDiagrams } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettingsNoVerificationOfDiagrams - -Unidoc.javadocSettings - -MultiNode.multiJvmSettings - Dependencies.contrib MimaKeys.reportBinaryIssues := () // disable bin comp check @@ -25,3 +19,5 @@ description := """| |without prior deprecation. The Typesafe subscription does not cover |support for these modules. |""".stripMargin + +enablePlugins(MultiNode, ScaladocNoVerificationOfDiagrams) diff --git a/akka-docs/build.sbt b/akka-docs/build.sbt index 5f92baa973..068a68f3a2 100644 --- a/akka-docs/build.sbt +++ b/akka-docs/build.sbt @@ -1,6 +1,8 @@ import akka.{ AkkaBuild, Dependencies, Formatting, SphinxDoc } +import akka.ValidatePullRequest._ import com.typesafe.sbt.SbtScalariform.ScalariformKeys import com.typesafe.sbt.SbtSite.site +import com.typesafe.sbt.site.SphinxSupport._ import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings @@ -24,3 +26,5 @@ publishArtifact in Compile := false unmanagedSourceDirectories in ScalariformKeys.format in Test <<= unmanagedSourceDirectories in Test MimaKeys.reportBinaryIssues := () // disable bin comp check + +additionalTasks in ValidatePR += generate in Sphinx diff --git a/akka-kernel/build.sbt b/akka-kernel/build.sbt index 2aafebecb2..f0c6a042f7 100644 --- a/akka-kernel/build.sbt +++ b/akka-kernel/build.sbt @@ -1,14 +1,12 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting, ScaladocNoVerificationOfDiagrams } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettingsNoVerificationOfDiagrams - -Unidoc.javadocSettings - Dependencies.kernel MimaKeys.previousArtifact := akkaPreviousArtifact("akka-kernel").value + +enablePlugins(ScaladocNoVerificationOfDiagrams) diff --git a/akka-multi-node-testkit/build.sbt b/akka-multi-node-testkit/build.sbt index 0e53370a08..d4682761dc 100644 --- a/akka-multi-node-testkit/build.sbt +++ b/akka-multi-node-testkit/build.sbt @@ -1,12 +1,8 @@ -import akka.{AkkaBuild, Formatting, Unidoc, OSGi} +import akka.{AkkaBuild, Formatting, OSGi} import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - MimaKeys.previousArtifact := akkaPreviousArtifact("akka-multi-node-testkit").value diff --git a/akka-osgi/build.sbt b/akka-osgi/build.sbt index bedcd28408..a47e82d693 100644 --- a/akka-osgi/build.sbt +++ b/akka-osgi/build.sbt @@ -1,14 +1,10 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting, OSGi } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - OSGi.osgi Dependencies.osgi diff --git a/akka-persistence-tck/build.sbt b/akka-persistence-tck/build.sbt index c4f2674401..c31672846c 100644 --- a/akka-persistence-tck/build.sbt +++ b/akka-persistence-tck/build.sbt @@ -1,6 +1,5 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting, OSGi } import com.typesafe.tools.mima.plugin.MimaKeys -import akka.MultiNode AkkaBuild.defaultSettings @@ -8,10 +7,6 @@ AkkaBuild.experimentalSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - // OSGi.persistenceTck TODO: we do need to export this as OSGi bundle too? Dependencies.persistenceTck @@ -19,5 +14,3 @@ Dependencies.persistenceTck MimaKeys.previousArtifact := None fork in Test := true - -javaOptions in Test := MultiNode.defaultMultiJvmOptions diff --git a/akka-persistence/build.sbt b/akka-persistence/build.sbt index bad4921303..978c6a0b83 100644 --- a/akka-persistence/build.sbt +++ b/akka-persistence/build.sbt @@ -1,6 +1,5 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting, OSGi } import com.typesafe.tools.mima.plugin.MimaKeys -import akka.MultiNode AkkaBuild.defaultSettings @@ -8,10 +7,6 @@ AkkaBuild.experimentalSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - OSGi.persistence Dependencies.persistence @@ -19,7 +14,3 @@ Dependencies.persistence MimaKeys.previousArtifact := akkaPreviousArtifact("akka-persistence-experimental").value fork in Test := true - -javaOptions in Test := MultiNode.defaultMultiJvmOptions - - diff --git a/akka-remote-tests/build.sbt b/akka-remote-tests/build.sbt index 5b21c848f2..ab5dc701ba 100644 --- a/akka-remote-tests/build.sbt +++ b/akka-remote-tests/build.sbt @@ -1,4 +1,4 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, MultiNode, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting, MultiNodeScalaTest, Unidoc } import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys._ import com.typesafe.tools.mima.plugin.MimaKeys @@ -6,21 +6,13 @@ AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - -MultiNode.multiJvmSettings - Dependencies.remoteTests // disable parallel tests parallelExecution in Test := false -extraOptions in MultiJvm <<= (sourceDirectory in MultiJvm) { src => - (name: String) => (src ** (name + ".conf")).get.headOption.map("-Dakka.config=" + _.absolutePath).toSeq -} - -scalatestOptions in MultiJvm := MultiNode.defaultMultiJvmScalatestOptions.value - publishArtifact in Compile := false MimaKeys.reportBinaryIssues := () // disable bin comp check + +enablePlugins(MultiNodeScalaTest) diff --git a/akka-remote/build.sbt b/akka-remote/build.sbt index de4e6b3c43..524e0ee1e6 100644 --- a/akka-remote/build.sbt +++ b/akka-remote/build.sbt @@ -1,14 +1,10 @@ -import akka.{AkkaBuild, Dependencies, Formatting, Unidoc, OSGi} +import akka.{AkkaBuild, Dependencies, Formatting, OSGi} import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - OSGi.remote Dependencies.remote diff --git a/akka-slf4j/build.sbt b/akka-slf4j/build.sbt index 65b7a17d1a..a5c5db8197 100644 --- a/akka-slf4j/build.sbt +++ b/akka-slf4j/build.sbt @@ -1,14 +1,10 @@ -import akka.{ AkkaBuild, Dependencies, Formatting, OSGi, Unidoc } +import akka.{ AkkaBuild, Dependencies, Formatting, OSGi } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - OSGi.slf4j Dependencies.slf4j diff --git a/akka-testkit/build.sbt b/akka-testkit/build.sbt index 8a9f998a10..3c9a54410b 100644 --- a/akka-testkit/build.sbt +++ b/akka-testkit/build.sbt @@ -1,14 +1,10 @@ -import akka.{ AkkaBuild, Formatting, OSGi, Unidoc, Dependencies } +import akka.{ AkkaBuild, Formatting, OSGi, Dependencies } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings Formatting.formatSettings -Unidoc.scaladocSettings - -Unidoc.javadocSettings - OSGi.testkit // to fix scaladoc generation diff --git a/akka-typed/build.sbt b/akka-typed/build.sbt index c745597255..ed0858db51 100644 --- a/akka-typed/build.sbt +++ b/akka-typed/build.sbt @@ -1,4 +1,4 @@ -import akka.{ AkkaBuild, Formatting, OSGi, Unidoc, Dependencies } +import akka.{ AkkaBuild, Formatting, OSGi, Dependencies } import com.typesafe.tools.mima.plugin.MimaKeys AkkaBuild.defaultSettings @@ -6,8 +6,3 @@ AkkaBuild.defaultSettings AkkaBuild.experimentalSettings Formatting.formatSettings - -Unidoc.scaladocSettings - -Unidoc.javadocSettings - diff --git a/build.sbt b/build.sbt index 1dae7350d4..a1e5e7c136 100644 --- a/build.sbt +++ b/build.sbt @@ -1,3 +1,3 @@ -enablePlugins(akka.RootSettings) +enablePlugins(akka.UnidocRoot, akka.TimeStampede, akka.UnidocWithPrValidation) -net.virtualvoid.sbt.graph.Plugin.graphSettings \ No newline at end of file +net.virtualvoid.sbt.graph.Plugin.graphSettings diff --git a/project/AkkaBuild.scala b/project/AkkaBuild.scala index 5951c29e52..588bd2b5e6 100644 --- a/project/AkkaBuild.scala +++ b/project/AkkaBuild.scala @@ -11,8 +11,6 @@ import java.util.Properties import akka.TestExtras.GraphiteBuildEvents import akka.TestExtras.JUnitFileReporting import akka.TestExtras.StatsDMetrics -import akka.Unidoc.scaladocSettings -import akka.Unidoc.unidocSettings import com.typesafe.sbt.S3Plugin.S3 import com.typesafe.sbt.S3Plugin.s3Settings import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys.MultiJvm @@ -39,9 +37,9 @@ object AkkaBuild extends Build { lazy val root = Project( id = "akka", base = file("."), - settings = parentSettings ++ Release.settings ++ unidocSettings ++ - SphinxDoc.akkaSettings ++ Dist.settings ++ s3Settings ++ scaladocSettings ++ - GraphiteBuildEvents.settings ++ Protobuf.settings ++ Unidoc.settings(Seq(samples), Seq(remoteTests)) ++ Seq( + settings = parentSettings ++ Release.settings ++ + SphinxDoc.akkaSettings ++ Dist.settings ++ s3Settings ++ + GraphiteBuildEvents.settings ++ Protobuf.settings ++ Seq( parallelExecution in GlobalScope := System.getProperty("akka.parallelExecution", parallelExecutionByDefault.toString).toBoolean, Dist.distExclude := Seq(actorTests.id, docs.id, samples.id, osgi.id), @@ -130,11 +128,11 @@ object AkkaBuild extends Build { base = file("akka-cluster-tools"), dependencies = Seq(cluster % "compile->compile;test->test;multi-jvm->multi-jvm") ) configs (MultiJvm) - + lazy val clusterSharding = Project( id = "akka-cluster-sharding", base = file("akka-cluster-sharding"), - dependencies = Seq(cluster % "compile->compile;test->test;multi-jvm->multi-jvm", + dependencies = Seq(cluster % "compile->compile;test->test;multi-jvm->multi-jvm", persistence % "compile;test->provided", clusterTools) ) configs (MultiJvm) @@ -200,7 +198,7 @@ object AkkaBuild extends Build { base = file("akka-samples"), settings = parentSettings ++ ActivatorDist.settings, // FIXME osgiDiningHakkersSampleMavenTest temporarily removed from aggregate due to #16703 - aggregate = if (!CommandLineOptions.aggregateSamples) Nil else + aggregate = if (!Sample.CliOptions.aggregateSamples) Nil else Seq(sampleCamelJava, sampleCamelScala, sampleClusterJava, sampleClusterScala, sampleFsmScala, sampleFsmJavaLambda, sampleMainJava, sampleMainScala, sampleMainJavaLambda, sampleMultiNodeScala, samplePersistenceJava, samplePersistenceScala, samplePersistenceJavaLambda, @@ -228,7 +226,7 @@ object AkkaBuild extends Build { lazy val sampleRemoteJava = Sample.project("akka-sample-remote-java") lazy val sampleRemoteScala = Sample.project("akka-sample-remote-scala") - + lazy val sampleSupervisionJavaLambda = Sample.project("akka-sample-supervision-java-lambda") lazy val osgiDiningHakkersSampleMavenTest = Project(id = "akka-sample-osgi-dining-hakkers-maven-test", @@ -306,7 +304,7 @@ object AkkaBuild extends Build { private def allWarnings: Boolean = System.getProperty("akka.allwarnings", "false").toBoolean - lazy val defaultSettings = baseSettings ++ resolverSettings ++ TestExtras.Filter.settings ++ + lazy val defaultSettings = resolverSettings ++ TestExtras.Filter.settings ++ Protobuf.settings ++ Seq( // compile options scalacOptions in Compile ++= Seq("-encoding", "UTF-8", "-target:jvm-1.8", "-feature", "-unchecked", "-Xlog-reflective-calls", "-Xlint"), diff --git a/project/CliOptions.scala b/project/CliOptions.scala new file mode 100644 index 0000000000..a71f3f982d --- /dev/null +++ b/project/CliOptions.scala @@ -0,0 +1,27 @@ +/** + * Copyright (C) 2009-2015 Typesafe Inc. + */ +package akka + +case class CliOption[T](private val value: T) { + def get: T = value +} + +object CliOption { + def apply[T](path: String, default: T)(implicit ev: CliOptionParser[T]): CliOption[T] = ev.parse(path, default) + + implicit class BooleanCliOption(cliOption: CliOption[Boolean]) { + def ifTrue[A](a: => A): Option[A] = if (cliOption.get) Some(a) else None + } + + trait CliOptionParser[T] { + def parse(path: String, default: T): CliOption[T] + } + + object CliOptionParser { + implicit object BooleanCliOptionParser extends CliOptionParser[Boolean] { + def parse(path: String, default: Boolean) = + CliOption(sys.props.getOrElse(path, default.toString).toBoolean) + } + } +} diff --git a/project/CommandLineOptions.scala b/project/CommandLineOptions.scala deleted file mode 100644 index 12d6ff29e1..0000000000 --- a/project/CommandLineOptions.scala +++ /dev/null @@ -1,13 +0,0 @@ -package akka - -object CommandLineOptions { - - /** - * Aggregated sample builds are transformed by swapping library dependencies to project ones. - * This does work play well with dbuild and breaks scala community build. Therefore it was made - * optional. - * - * Default: true - */ - val aggregateSamples = sys.props.getOrElse("akka.build.aggregateSamples", "true") == "true" -} diff --git a/project/Unidoc.scala b/project/Doc.scala similarity index 53% rename from project/Unidoc.scala rename to project/Doc.scala index 21ef389c2f..6a1de8219d 100644 --- a/project/Unidoc.scala +++ b/project/Doc.scala @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2009-2015 Typesafe Inc. + */ package akka import sbt._ @@ -7,47 +10,36 @@ import sbt.Keys._ import sbt.File import scala.annotation.tailrec -object Unidoc { +object Scaladoc extends AutoPlugin { - def settings(ignoreAggregates: Seq[Project], ignoreProjects: Seq[Project]) = { - val withoutAggregates = ignoreAggregates.foldLeft(inAnyProject) { _ -- inAggregates(_, transitive = true, includeRoot = true) } - val docProjectFilter = ignoreProjects.foldLeft(withoutAggregates) { _ -- inProjects(_) } - - inTask(unidoc)(Seq( - unidocProjectFilter in ScalaUnidoc := docProjectFilter, - unidocProjectFilter in JavaUnidoc := docProjectFilter, - apiMappings in ScalaUnidoc := (apiMappings in (Compile, doc)).value - )) + object CliOptions { + val scaladocDiagramsEnabled = CliOption("akka.scaladoc.diagrams", true) + val scaladocAutoAPI = CliOption("akka.scaladoc.autoapi", true) } - val genjavadocEnabled = sys.props.get("akka.genjavadoc.enabled").getOrElse("false").toBoolean - val (unidocSettings, javadocSettings) = - if (genjavadocEnabled) - (scalaJavaUnidocSettings, genjavadocExtraSettings ++ Seq( - scalacOptions in Compile += "-P:genjavadoc:fabricateParams=true", - unidocGenjavadocVersion in Global := "0.9")) - else (scalaUnidocSettings, Nil) + override def trigger = allRequirements + override def requires = plugins.JvmPlugin - lazy val scaladocDiagramsEnabled = sys.props.get("akka.scaladoc.diagrams").getOrElse("true").toBoolean - lazy val scaladocAutoAPI = sys.props.get("akka.scaladoc.autoapi").getOrElse("true").toBoolean + val validateDiagrams = settingKey[Boolean]("Validate generated scaladoc diagrams") - def scaladocSettings: Seq[sbt.Setting[_]] = { - scaladocSettingsNoVerificationOfDiagrams ++ - (if (scaladocDiagramsEnabled) Seq(doc in Compile ~= scaladocVerifier) else Seq.empty) - } - - // for projects with few (one) classes there might not be any diagrams - def scaladocSettingsNoVerificationOfDiagrams: Seq[sbt.Setting[_]] = { + override lazy val projectSettings = { inTask(doc)(Seq( scalacOptions in Compile <++= (version, baseDirectory in ThisBuild) map scaladocOptions, - autoAPIMappings := scaladocAutoAPI - )) + autoAPIMappings := CliOptions.scaladocAutoAPI.get + )) ++ + Seq(validateDiagrams in Compile := true) ++ + CliOptions.scaladocDiagramsEnabled.ifTrue(doc in Compile := { + val docs = (doc in Compile).value + if ((validateDiagrams in Compile).value) + scaladocVerifier(docs) + docs + }) } def scaladocOptions(ver: String, base: File): List[String] = { val urlString = GitHub.url(ver) + "/€{FILE_PATH}.scala" val opts = List("-implicits", "-doc-source-url", urlString, "-sourcepath", base.getAbsolutePath) - if (scaladocDiagramsEnabled) "-diagrams"::opts else opts + CliOptions.scaladocDiagramsEnabled.ifTrue("-diagrams").toList ::: opts } def scaladocVerifier(file: File): File= { @@ -82,3 +74,59 @@ object Unidoc { file } } + +/** + * For projects with few (one) classes there might not be any diagrams. + */ +object ScaladocNoVerificationOfDiagrams extends AutoPlugin { + + override def trigger = noTrigger + override def requires = Scaladoc + + override lazy val projectSettings = Seq( + Scaladoc.validateDiagrams in Compile := false + ) +} + +/** + * Unidoc settings for root project. Adds unidoc command. + */ +object UnidocRoot extends AutoPlugin { + + object CliOptions { + val genjavadocEnabled = CliOption("akka.genjavadoc.enabled", false) + } + + override def trigger = noTrigger + + def settings(ignoreAggregates: Seq[Project], ignoreProjects: Seq[Project]) = { + val withoutAggregates = ignoreAggregates.foldLeft(inAnyProject) { _ -- inAggregates(_, transitive = true, includeRoot = true) } + val docProjectFilter = ignoreProjects.foldLeft(withoutAggregates) { _ -- inProjects(_) } + + inTask(unidoc)(Seq( + unidocProjectFilter in ScalaUnidoc := docProjectFilter, + unidocProjectFilter in JavaUnidoc := docProjectFilter, + apiMappings in ScalaUnidoc := (apiMappings in (Compile, doc)).value + )) + } + + override lazy val projectSettings = + CliOptions.genjavadocEnabled.ifTrue(scalaJavaUnidocSettings).getOrElse(scalaUnidocSettings) ++ + settings(Seq(AkkaBuild.samples), Seq(AkkaBuild.remoteTests, AkkaBuild.benchJmh)) +} + +/** + * Unidoc settings for every multi-project. Adds genjavadoc specific settings. + */ +object Unidoc extends AutoPlugin { + + override def trigger = allRequirements + override def requires = plugins.JvmPlugin + + override lazy val projectSettings = UnidocRoot.CliOptions.genjavadocEnabled.ifTrue( + genjavadocExtraSettings ++ Seq( + scalacOptions in Compile += "-P:genjavadoc:fabricateParams=true", + unidocGenjavadocVersion in Global := "0.9" + ) + ).getOrElse(Seq.empty) +} diff --git a/project/MiMa.scala b/project/MiMa.scala index b680670009..f0b5962f14 100644 --- a/project/MiMa.scala +++ b/project/MiMa.scala @@ -15,7 +15,7 @@ object MiMa extends AutoPlugin { previousArtifact := None, binaryIssueFilters ++= mimaIgnoredProblems ) - + case class FilterAnyProblem(name: String) extends com.typesafe.tools.mima.core.ProblemFilter { import com.typesafe.tools.mima.core._ override def apply(p: Problem): Boolean = p match { @@ -23,7 +23,7 @@ object MiMa extends AutoPlugin { case m: MemberProblem => m.ref.owner.fullName != name && m.ref.owner.fullName != (name + '$') } } - + val mimaIgnoredProblems = { import com.typesafe.tools.mima.core._ Seq( @@ -85,7 +85,7 @@ object MiMa extends AutoPlugin { ProblemFilters.exclude[MissingMethodProblem]("akka.remote.ReliableDeliverySupervisor.lastCumulativeAck"), ProblemFilters.exclude[IncompatibleResultTypeProblem]("akka.remote.ReliableDeliverySupervisor.bailoutAt"), ProblemFilters.exclude[MissingMethodProblem]("akka.remote.ReliableDeliverySupervisor.lastCumulativeAck_="), - + // Change to improve cluster heartbeat sender, #16638 FilterAnyProblem("akka.cluster.HeartbeatNodeRing"), FilterAnyProblem("akka.cluster.ClusterHeartbeatSenderState"), @@ -98,7 +98,7 @@ object MiMa extends AutoPlugin { ProblemFilters.exclude[FinalMethodProblem]("akka.dispatch.BatchingExecutor#Batch.run"), ProblemFilters.exclude[MissingMethodProblem]("akka.dispatch.BatchingExecutor#Batch.akka$dispatch$BatchingExecutor$Batch$$parentBlockContext_="), ProblemFilters.exclude[MissingMethodProblem]("akka.dispatch.BatchingExecutor#Batch.this"), - + // Exclude observations from downed, #13875 ProblemFilters.exclude[MissingMethodProblem]("akka.cluster.ClusterEvent.diffReachable"), ProblemFilters.exclude[MissingMethodProblem]("akka.cluster.ClusterEvent.diffSeen"), @@ -110,9 +110,9 @@ object MiMa extends AutoPlugin { ProblemFilters.exclude[MissingMethodProblem]("akka.cluster.Gossip.isLeader"), ProblemFilters.exclude[MissingMethodProblem]("akka.cluster.Gossip.leader"), ProblemFilters.exclude[MissingMethodProblem]("akka.cluster.Gossip.roleLeader"), - + // copied everything above from release-2.3 branch - + // final case classes ProblemFilters.exclude[FinalClassProblem]("akka.dispatch.ThreadPoolConfig"), ProblemFilters.exclude[FinalClassProblem]("akka.dispatch.UnboundedDequeBasedMailbox"), @@ -416,11 +416,11 @@ object MiMa extends AutoPlugin { // synthetic method akka$remote$testkit$MultiNodeSpec$Replacement$$$outer()akka.remote.testkit.MultiNodeSpec in class akka.remote.testkit.MultiNodeSpec#Replacement does not have a correspondent in new version ProblemFilters.exclude[MissingMethodProblem]("akka.remote.testkit.MultiNodeSpec#Replacement.akka$remote$testkit$MultiNodeSpec$Replacement$$$outer"), - + // method nrOfInstances(akka.actor.ActorSystem)Int in trait akka.routing.Pool does not have a correspondent in old version // ok to exclude, since we don't call nrOfInstances(sys) for old implementations ProblemFilters.exclude[MissingMethodProblem]("akka.routing.Pool.nrOfInstances"), - + // removed deprecated ProblemFilters.exclude[MissingClassProblem]("akka.actor.UntypedActorFactory"), ProblemFilters.exclude[MissingMethodProblem]("akka.util.Timeout.longToTimeout"), @@ -480,8 +480,8 @@ object MiMa extends AutoPlugin { // deprecated method this(Int,java.lang.String,Boolean,scala.Option)Unit in class akka.cluster.routing.ClusterRouterGroupSettings does not have a correspondent with same parameter signature among (Int,java.lang.Iterable,Boolean,java.lang.String)Unit, (Int,scala.collection.immutable.Seq,Boolean,scala.Option)Unit ProblemFilters.exclude[IncompatibleMethTypeProblem]("akka.cluster.routing.ClusterRouterGroupSettings.this"), ProblemFilters.exclude[MissingMethodProblem]("akka.testkit.TestKit.dilated"), - - + + // changed internals ProblemFilters.exclude[MissingMethodProblem]("akka.actor.ActorSystem.terminate"), ProblemFilters.exclude[MissingMethodProblem]("akka.actor.ActorSystem.whenTerminated"), @@ -529,7 +529,7 @@ object MiMa extends AutoPlugin { ProblemFilters.exclude[MissingMethodProblem]("akka.dispatch.MessageDispatcher.akka$dispatch$BatchingExecutor$$_blockContext"), // issue #16736 ProblemFilters.exclude[MissingClassProblem]("akka.cluster.OnMemberUpListener"), - + //changes introduced by #16911 ProblemFilters.exclude[MissingMethodProblem]("akka.remote.RemoteActorRefProvider.afterSendSystemMessage"), FilterAnyProblem("akka.remote.RemoteWatcher"), diff --git a/project/MultiNode.scala b/project/MultiNode.scala index 1da1ff1ac3..28fd00bb64 100644 --- a/project/MultiNode.scala +++ b/project/MultiNode.scala @@ -1,18 +1,36 @@ +/** + * Copyright (C) 2009-2015 Typesafe Inc. + */ package akka import akka.TestExtras.Filter import akka.TestExtras.Filter.Keys._ import com.typesafe.sbt.{SbtScalariform, SbtMultiJvm} -import sbt._ import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys._ -import sbt.Keys._ import com.typesafe.sbt.SbtScalariform.ScalariformKeys +import sbt._ +import sbt.Keys._ -object MultiNode { +object MultiNode extends AutoPlugin { - val multiNodeEnabled = sys.props.get("akka.test.multi-node").getOrElse("false").toBoolean + object CliOptions { + val multiNode = CliOption("akka.test.multi-node", false) + val sbtLogNoFormat = CliOption("sbt.log.noformat", false) - lazy val defaultMultiJvmOptions: Seq[String] = { + val hostsFileName = sys.props.get("akka.test.multi-node.hostsFileName").toSeq + val javaName = sys.props.get("akka.test.multi-node.java").toSeq + val targetDirName = sys.props.get("akka.test.multi-node.targetDirName").toSeq + } + + val multiExecuteTests = CliOptions.multiNode.ifTrue(multiNodeExecuteTests in MultiJvm).getOrElse(executeTests in MultiJvm) + val multiTest = CliOptions.multiNode.ifTrue(multiNodeTest in MultiJvm).getOrElse(test in MultiJvm) + + override def trigger = noTrigger + override def requires = plugins.JvmPlugin + + override lazy val projectSettings = multiJvmSettings + + private val defaultMultiJvmOptions: Seq[String] = { import scala.collection.JavaConverters._ // multinode.D= and multinode.X= makes it possible to pass arbitrary // -D or -X arguments to the forked jvm, e.g. @@ -27,17 +45,10 @@ object MultiNode { case key: String if knownPrefix.exists(pre => key.startsWith(pre)) => "-D" + key + "=" + System.getProperty(key) } - "-Xmx256m" :: akkaProperties ::: - (if (sys.props.get("sbt.log.noformat").getOrElse("false").toBoolean) List("-Dakka.test.nocolor=true") else Nil) + "-Xmx256m" :: akkaProperties ::: CliOptions.sbtLogNoFormat.ifTrue("-Dakka.test.nocolor=true").toList } - lazy val defaultMultiJvmScalatestOptions = Def.setting { - Seq("-C", "org.scalatest.extra.QuietReporter") ++ - (if (excludeTestTags.value.isEmpty) Seq.empty else Seq("-l", if (multiNodeEnabled) excludeTestTags.value.mkString("\"", " ", "\"") else excludeTestTags.value.mkString(" "))) ++ - (if (onlyTestTags.value.isEmpty) Seq.empty else Seq("-n", if (multiNodeEnabled) onlyTestTags.value.mkString("\"", " ", "\"") else onlyTestTags.value.mkString(" "))) - } - - lazy val multiJvmSettings = + private val multiJvmSettings = SbtMultiJvm.multiJvmSettings ++ inConfig(MultiJvm)(SbtScalariform.configScalariformSettings) ++ Seq( @@ -46,35 +57,39 @@ object MultiNode { scalacOptions in MultiJvm <<= scalacOptions in Test, compile in MultiJvm <<= (compile in MultiJvm) triggeredBy (compile in Test) ) ++ - Option(System.getProperty("akka.test.multi-node.hostsFileName")).map(x => Seq(multiNodeHostsFileName in MultiJvm := x)).getOrElse(Seq.empty) ++ - Option(System.getProperty("akka.test.multi-node.java")).map(x => Seq(multiNodeJavaName in MultiJvm := x)).getOrElse(Seq.empty) ++ - Option(System.getProperty("akka.test.multi-node.targetDirName")).map(x => Seq(multiNodeTargetDirName in MultiJvm := x)).getOrElse(Seq.empty) ++ - // make sure that MultiJvm tests are executed by the default test target, + CliOptions.hostsFileName.map(multiNodeHostsFileName in MultiJvm := _) ++ + CliOptions.javaName.map(multiNodeJavaName in MultiJvm := _) ++ + CliOptions.targetDirName.map(multiNodeTargetDirName in MultiJvm := _) ++ + // make sure that MultiJvm tests are executed by the default test target, // and combine the results from ordinary test and multi-jvm tests - (if (multiNodeEnabled) { - executeTests in Test <<= (executeTests in Test, multiNodeExecuteTests in MultiJvm) map { - case (testResults, multiNodeResults) => - val overall = - if (testResults.overall.id < multiNodeResults.overall.id) - multiNodeResults.overall - else - testResults.overall - Tests.Output(overall, - testResults.events ++ multiNodeResults.events, - testResults.summaries ++ multiNodeResults.summaries) - } - } else { - executeTests in Test <<= (executeTests in Test, executeTests in MultiJvm) map { - case (testResults, multiNodeResults) => - val overall = - if (testResults.overall.id < multiNodeResults.overall.id) - multiNodeResults.overall - else - testResults.overall - Tests.Output(overall, - testResults.events ++ multiNodeResults.events, - testResults.summaries ++ multiNodeResults.summaries) - } + (executeTests in Test <<= (executeTests in Test, multiExecuteTests) map { + case (testResults, multiNodeResults) => + val overall = + if (testResults.overall.id < multiNodeResults.overall.id) + multiNodeResults.overall + else + testResults.overall + Tests.Output(overall, + testResults.events ++ multiNodeResults.events, + testResults.summaries ++ multiNodeResults.summaries) }) - +} + +/** + * Additional settings for scalatest. + */ +object MultiNodeScalaTest extends AutoPlugin { + + override def requires = MultiNode + + override lazy val projectSettings = Seq( + extraOptions in MultiJvm <<= (sourceDirectory in MultiJvm) { src => + (name: String) => (src ** (name + ".conf")).get.headOption.map("-Dakka.config=" + _.absolutePath).toSeq + }, + scalatestOptions in MultiJvm := { + Seq("-C", "org.scalatest.extra.QuietReporter") ++ + (if (excludeTestTags.value.isEmpty) Seq.empty else Seq("-l", if (MultiNode.CliOptions.multiNode.get) excludeTestTags.value.mkString("\"", " ", "\"") else excludeTestTags.value.mkString(" "))) ++ + (if (onlyTestTags.value.isEmpty) Seq.empty else Seq("-n", if (MultiNode.CliOptions.multiNode.get) onlyTestTags.value.mkString("\"", " ", "\"") else onlyTestTags.value.mkString(" "))) + } + ) } diff --git a/project/RootSettings.scala b/project/RootSettings.scala deleted file mode 100644 index 773a83b739..0000000000 --- a/project/RootSettings.scala +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (C) 2009-2015 Typesafe Inc. - */ -package akka - -import sbt._ -import sbt.Keys._ -import akka.ValidatePullRequest.validatePullRequest -import sbtunidoc.Plugin.UnidocKeys.unidoc -import com.typesafe.sbt.site.SphinxSupport -import com.typesafe.sbt.site.SphinxSupport.Sphinx - -object RootSettings extends AutoPlugin { - - lazy val docs = ProjectRef(file("."), "akka-docs") - - // settings for root project goes here - override val projectSettings = Seq( - validatePullRequest <<= validatePullRequest.dependsOn(unidoc in Compile), - validatePullRequest <<= validatePullRequest.dependsOn(SphinxSupport.generate in Sphinx in docs) - ) -} diff --git a/project/Sample.scala b/project/Sample.scala index 8545dc92ab..5d537ca2bb 100644 --- a/project/Sample.scala +++ b/project/Sample.scala @@ -5,6 +5,17 @@ import sbt.Keys._ object Sample { + object CliOptions { + /** + * Aggregated sample builds are transformed by swapping library dependencies to project ones. + * This does work play well with dbuild and breaks scala community build. Therefore it was made + * optional. + * + * Default: true + */ + val aggregateSamples = sys.props.getOrElse("akka.build.aggregateSamples", "true").toBoolean + } + final val akkaOrganization = "com.typesafe.akka" def buildTransformer = (ti: BuildLoader.TransformInfo) => ti.base.name match { diff --git a/project/TimeStampede.scala b/project/TimeStampede.scala index 0206698adf..85374e9461 100644 --- a/project/TimeStampede.scala +++ b/project/TimeStampede.scala @@ -8,8 +8,7 @@ import sbt.Keys._ object TimeStampede extends AutoPlugin { - override def requires = RootSettings - override def trigger = allRequirements + override def trigger = noTrigger override lazy val projectSettings = Seq( commands += stampVersion diff --git a/project/ValidatePullRequest.scala b/project/ValidatePullRequest.scala index cf56fa0e1a..479bb01697 100644 --- a/project/ValidatePullRequest.scala +++ b/project/ValidatePullRequest.scala @@ -7,6 +7,7 @@ import com.typesafe.tools.mima.plugin.MimaKeys.reportBinaryIssues import net.virtualvoid.sbt.graph.IvyGraphMLDependencies import net.virtualvoid.sbt.graph.IvyGraphMLDependencies.ModuleId import org.kohsuke.github._ +import sbtunidoc.Plugin.UnidocKeys.unidoc import sbt.Keys._ import sbt._ @@ -16,36 +17,33 @@ import scala.util.matching.Regex object ValidatePullRequest extends AutoPlugin { override def trigger = allRequirements - override def requires = plugins.JvmPlugin sealed trait BuildMode { - val Zero = Def.task { () } // when you stare into the void, the void stares back at you - def task: Def.Initialize[Task[Unit]] + def task: Option[TaskKey[_]] def log(projectName: String, l: Logger): Unit } case object BuildSkip extends BuildMode { - override def task = Zero + override def task = None def log(projectName: String, l: Logger) = l.info(s"Skipping validation of [$projectName], as PR does NOT affect this project...") } case object BuildQuick extends BuildMode { - override def task = Zero.dependsOn(test in ValidatePR) - def log(projectName: String, l: Logger) = + override def task = Some(test in ValidatePR) + def log(projectName: String, l: Logger) = l.info(s"Building [$projectName] in quick mode, as it's dependencies were affected by PR.") } case object BuildProjectChangedQuick extends BuildMode { - override def task = Zero.dependsOn(test in ValidatePR) + override def task = Some(test in ValidatePR) def log(projectName: String, l: Logger) = l.info(s"Building [$projectName] as the root `project/` directory was affected by this PR.") } final case class BuildCommentForcedAll(phrase: String, c: GHIssueComment) extends BuildMode { - override def task = Zero.dependsOn(test in Test) + override def task = Some(test in Test) def log(projectName: String, l: Logger) = l.info(s"GitHub PR comment [ ${c.getUrl} ] contains [$phrase], forcing BUILD ALL mode!") } - val ValidatePR = config("pr-validation") extend Test override lazy val projectConfigurations = Seq(ValidatePR) @@ -73,10 +71,11 @@ object ValidatePullRequest extends AutoPlugin { // determining touched dirs and projects val changedDirectories = taskKey[immutable.Set[String]]("List of touched modules in this PR branch") - val projectBuildMode = taskKey[BuildMode]("True if this project is affected by the PR and should be rebuilt") + val projectBuildMode = taskKey[BuildMode]("Determines what will run when this project is affected by the PR and should be rebuilt") // running validation - val validatePullRequest = taskKey[Unit]("Additional tasks for pull request validation") + val validatePullRequest = taskKey[Unit]("Validate pull request") + val additionalTasks = taskKey[Seq[TaskKey[_]]]("Additional tasks for pull request validation") def changedDirectoryIsDependency(changedDirs: Set[String], target: File, @@ -198,15 +197,61 @@ object ValidatePullRequest extends AutoPlugin { BuildSkip }, + additionalTasks in ValidatePR := Seq.empty, + validatePullRequest := Def.taskDyn { val log = streams.value.log val buildMode = (projectBuildMode in ValidatePR).value buildMode.log(name.value, log) - buildMode.task + + val validationTasks = buildMode.task.toSeq ++ (buildMode match { + case BuildSkip => Seq.empty // do not run the additional task if project is skipped during pr validation + case _ => (additionalTasks in ValidatePR).value + }) + + // Create a task for every validation task key and + // then zip all of the tasks together discarding outputs. + // Task failures are propagated as normal. + val zero: Def.Initialize[Seq[Task[Any]]] = Def.setting { Seq(task())} + validationTasks.map(taskKey => Def.task { taskKey.value } ).foldLeft(zero) { (acc, current) => + acc.zipWith(current) { case (taskSeq, task) => + taskSeq :+ task.asInstanceOf[Task[Any]] + } + } apply { tasks: Seq[Task[Any]] => + tasks.join map { seq => () /* Ignore the sequence of unit returned */ } + } }.value, // add reportBinaryIssues to validatePullRequest on minor version maintenance branch validatePullRequest <<= validatePullRequest.dependsOn(reportBinaryIssues) ) } + +/** + * This autoplugin adds Multi Jvm tests to validatePullRequest task. + * It is needed, because ValidatePullRequest autoplugin does not depend on MultiNode and + * therefore test:executeTests is not yet modified to include multi-jvm tests when ValidatePullRequest + * build strategy is being determined. + * + * Making ValidatePullRequest depend on MultiNode is impossible, as then ValidatePullRequest + * autoplugin would trigger only on projects which have both of these plugins enabled. + */ +object MultiNodeWithPrValidation extends AutoPlugin { + import ValidatePullRequest._ + + override def trigger = allRequirements + override def requires = ValidatePullRequest && MultiNode + override lazy val projectSettings = Seq( + additionalTasks in ValidatePR += MultiNode.multiTest + ) +} + +object UnidocWithPrValidation extends AutoPlugin { + import ValidatePullRequest._ + + override def trigger = noTrigger + override lazy val projectSettings = Seq( + additionalTasks in ValidatePR += unidoc in Compile + ) +}