project/TestChanged.scala (41 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * license agreements; and to You under the Apache License, version 2.0: * * https://www.apache.org/licenses/LICENSE-2.0 * * This file is part of the Apache Pekko project, which was derived from Akka. */ package org.apache.pekko.stream.connectors import scala.collection.immutable import scala.sys.process._ import sbt._ import sbt.Keys._ object TestChanged extends AutoPlugin { override def trigger = allRequirements override def requires = plugins.JvmPlugin val changedDirectories = taskKey[immutable.Set[String]]("List of touched modules in this PR branch") val testChanged = taskKey[Unit]("Test all subprojects with changes compared to main branch") override lazy val buildSettings = Seq( changedDirectories := { val log = streams.value.log val target = "origin/main" // TODO could use jgit val diffOutput = s"git diff $target --name-only".!!.split("\n") val changedDirectories = diffOutput .map(l => l.trim) .map(l => l.takeWhile(_ != '/')) .map(new File(_)) .map(file => if (file.isDirectory) file.toString else "") .toSet log.info("Detected changes in directories: " + changedDirectories.mkString("[", ", ", "]")) changedDirectories }) override lazy val projectSettings = Seq( testChanged := Def.taskDyn { val skip = Def.setting { task(()) } if (shouldBuild(name.value, changedDirectories.value)) Test / test else skip }.value) implicit class RegexHelper(val sc: StringContext) extends AnyVal { def re: scala.util.matching.Regex = sc.parts.mkString.r } private def shouldBuild(projectName: String, changedDirectories: Set[String]) = projectName match { case "connectors" => false case re"pekko-connectors-(.+)$subproject" => changedDirectories.contains(subproject) || changedDirectories.contains("") || changedDirectories.contains( "project") } }