From 746d0adb45fe17d65dee3173ce1b580e089aaf4a Mon Sep 17 00:00:00 2001 From: hepin1989 Date: Sun, 9 Dec 2018 05:13:11 +0800 Subject: [PATCH] Setup different fix alias on different sub projects and add support to ignore dedicated packages when do scalafix. Because some sub projects does not enable the MultiNode plugin. Add ignore packages support for scalafix. --- .scalafix.conf | 6 + build.sbt | 5 +- ...scala => ScalafixForMultiNodePlugin.scala} | 14 ++- project/ScalafixIgnoreFilePlugin.scala | 9 +- project/ScalafixIgnoreFileSupport.scala | 35 ------ project/ScalafixSupport.scala | 112 ++++++++++++++++++ 6 files changed, 135 insertions(+), 46 deletions(-) rename project/{ScalafixForMultiNodeScalaTestPlugin.scala => ScalafixForMultiNodePlugin.scala} (54%) delete mode 100644 project/ScalafixIgnoreFileSupport.scala create mode 100644 project/ScalafixSupport.scala diff --git a/.scalafix.conf b/.scalafix.conf index 1ccc2301d9..d796fa597e 100644 --- a/.scalafix.conf +++ b/.scalafix.conf @@ -14,3 +14,9 @@ ignored-files = [ "FlowZipWithSpec.scala", "FlowZipWithIndexSpec.scala" ] + +//ignored pacakges +ignored-packages = [ + "doc", + "jdoc" +] diff --git a/build.sbt b/build.sbt index e49d15c0f3..7da4f9d6db 100644 --- a/build.sbt +++ b/build.sbt @@ -4,9 +4,8 @@ enablePlugins(UnidocRoot, TimeStampede, UnidocWithPrValidation, NoPublish, Copyr ScalafixIgnoreFilePlugin) disablePlugins(MimaPlugin) addCommandAlias( - name ="fix", + name ="fixall", value = ";scalafixEnable;compile:scalafix;test:scalafix;multi-jvm:scalafix;test:compile") - import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys.MultiJvm import com.typesafe.tools.mima.plugin.MimaPlugin import spray.boilerplate.BoilerplatePlugin @@ -57,7 +56,7 @@ lazy val root = Project( .settings(unidocRootIgnoreProjects := (CrossVersion.partialVersion(scalaVersion.value) match { case Some((2, n)) if n == 11 ⇒ aggregatedProjects // ignore all, don't unidoc when scalaVersion is 2.11 - case _ ⇒ Seq(remoteTests, benchJmh, protobuf, akkaScalaNightly, docs) + case _ ⇒ Seq(remoteTests, benchJmh, protobuf, akkaScalaNightly, docs) }) ) .settings( diff --git a/project/ScalafixForMultiNodeScalaTestPlugin.scala b/project/ScalafixForMultiNodePlugin.scala similarity index 54% rename from project/ScalafixForMultiNodeScalaTestPlugin.scala rename to project/ScalafixForMultiNodePlugin.scala index 2c1db64873..7f83f4b064 100644 --- a/project/ScalafixForMultiNodeScalaTestPlugin.scala +++ b/project/ScalafixForMultiNodePlugin.scala @@ -5,14 +5,14 @@ package akka import com.typesafe.sbt.MultiJvmPlugin -import sbt.{AutoPlugin, Def, PluginTrigger, Plugins, Setting, inConfig} +import sbt.{AutoPlugin, Def, PluginTrigger, Plugins, ScalafixSupport, Setting, inConfig} import scalafix.sbt.ScalafixPlugin.autoImport.scalafixConfigSettings -object ScalafixForMultiNodeScalaTestPlugin extends AutoPlugin with ScalafixIgnoreFileSupport { +object ScalafixForMultiNodePlugin extends AutoPlugin with ScalafixSupport { override def trigger: PluginTrigger = allRequirements - override def requires: Plugins = MultiNodeScalaTest - + override def requires: Plugins = MultiNode + import MultiJvmPlugin.autoImport._ lazy val scalafixIgnoredSetting: Seq[Setting[_]] = Seq( @@ -20,5 +20,9 @@ object ScalafixForMultiNodeScalaTestPlugin extends AutoPlugin with ScalafixIgnor ) override def projectSettings: Seq[Def.Setting[_]] = - Seq(MultiJvm).flatMap(c => inConfig(c)(scalafixConfigSettings(c))) ++ scalafixIgnoredSetting + Seq(MultiJvm).flatMap(c => inConfig(c)(scalafixConfigSettings(c))) ++ + scalafixIgnoredSetting ++ Seq( + updateProjectCommands( + alias = "fix", + value = ";scalafixEnable;compile:scalafix;test:scalafix;multi-jvm:scalafix;test:compile")) } diff --git a/project/ScalafixIgnoreFilePlugin.scala b/project/ScalafixIgnoreFilePlugin.scala index a05362f4f4..4aa40e4eb2 100644 --- a/project/ScalafixIgnoreFilePlugin.scala +++ b/project/ScalafixIgnoreFilePlugin.scala @@ -4,9 +4,9 @@ package akka import sbt.plugins.JvmPlugin -import sbt.{AutoPlugin, PluginTrigger, Plugins} +import sbt.{AutoPlugin, PluginTrigger, Plugins, ScalafixSupport} -object ScalafixIgnoreFilePlugin extends AutoPlugin with ScalafixIgnoreFileSupport { +object ScalafixIgnoreFilePlugin extends AutoPlugin with ScalafixSupport { override def trigger: PluginTrigger = allRequirements override def requires: Plugins = JvmPlugin @@ -15,5 +15,8 @@ object ScalafixIgnoreFilePlugin extends AutoPlugin with ScalafixIgnoreFileSuppor ignore(Test) ) - override def projectSettings: Seq[Def.Setting[_]] = scalafixIgnoredSetting + override def projectSettings: Seq[Def.Setting[_]] = scalafixIgnoredSetting ++ Seq( + addProjectCommandsIfAbsent( + alias = "fix", + value = ";scalafixEnable;compile:scalafix;test:scalafix;test:compile")) } diff --git a/project/ScalafixIgnoreFileSupport.scala b/project/ScalafixIgnoreFileSupport.scala deleted file mode 100644 index b4263dd2ac..0000000000 --- a/project/ScalafixIgnoreFileSupport.scala +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2018 Lightbend Inc. - */ -package akka - -import com.typesafe.config.ConfigFactory -import sbt.Keys.unmanagedSources -import sbt.{ConfigKey, file} -import sbt.internal.sbtscalafix.Compat - -trait ScalafixIgnoreFileSupport { - import scalafix.sbt.ScalafixPlugin.autoImport._ - protected def ignore(configKey:ConfigKey) = { - lazy val stdoutLogger = Compat.ConsoleLogger(System.out) - - lazy val ignoredFiles:Set[String] = { - import scala.collection.JavaConverters._ - val config = ConfigFactory.parseFile(file(".scalafix.conf")) - stdoutLogger.info("ignored-files from .scalaifx.config:" + config.origin().filename()) - config - .getStringList("ignored-files") - .asScala - .toSet - } - unmanagedSources.in(configKey, scalafix) := - unmanagedSources.in(configKey, scalafix).value - .filterNot(file => { - val ignored = ignoredFiles(file.getName) - if (ignored){ - stdoutLogger.info("scalafix ignored file:"+file.toURI) - } - ignored - }) - } -} diff --git a/project/ScalafixSupport.scala b/project/ScalafixSupport.scala new file mode 100644 index 0000000000..1ab01a28b2 --- /dev/null +++ b/project/ScalafixSupport.scala @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2018 Lightbend Inc. + */ +package sbt + +import java.io.File + +import com.typesafe.config.ConfigFactory +import sbt.Keys.unmanagedSources +import sbt.internal.sbtscalafix.Compat + +trait ScalafixSupport { + + import scalafix.sbt.ScalafixPlugin.autoImport._ + + protected def ignore(configKey: ConfigKey): Def.Setting[Task[Seq[File]]] = { + lazy val stdoutLogger = Compat.ConsoleLogger(System.out) + + lazy val ignoredFiles: Set[String] = { + import scala.collection.JavaConverters._ + val config = ConfigFactory.parseFile(file(".scalafix.conf")) + stdoutLogger.info(s"Loading ignored-files from .scalaifx.config:[${config.origin().url().toURI.getPath}]") + config + .getStringList("ignored-files") + .asScala + .toSet + } + + lazy val ignoredPackages: Set[String] = { + import scala.collection.JavaConverters._ + val config = ConfigFactory.parseFile(file(".scalafix.conf")) + stdoutLogger.info(s"Loading ignored-packages from .scalaifx.config:[${config.origin().url().toURI.getPath}]") + config + .getStringList("ignored-packages") + .asScala + .toSet + } + + unmanagedSources.in(configKey, scalafix) := + unmanagedSources.in(configKey, scalafix).value + .filterNot(file => { + val ignoredByFile = ignoredFiles(file.getName) + if (ignoredByFile) { + stdoutLogger.info(s"scalafix ignored file: ${file.toURI} with file name: ${file.getName}") + } + val ignoredByPackages = ignoredPackages.exists(pkg => { + getPackageName(file.toURI.toString) match { + case Some(packageName) => + val ignored = packageName.startsWith(pkg) + if (ignored) { + stdoutLogger.info(s"scalafix ignored file with pkg:$pkg file:[${file.toPath}] ") + } + ignored + case None => false + } + }) + ignoredByFile || ignoredByPackages + }) + } + + private def getPackageName(fileName: String): Option[String] = { + def getPackageName0(fileType: String): String = { + fileName.split(File.separatorChar) + .dropWhile(part ⇒ part != fileType) + .drop(1) + .dropRight(1) + .mkString(".") + } + + fileName.split('.').lastOption match { + case Some(fileType) ⇒ + fileType match { + case "java" ⇒ + Option(getPackageName0("java")) + case "scala" ⇒ + Option(getPackageName0("scala")) + case _ ⇒ None + } + case None ⇒ None + } + } + + import sbt.Keys._ + + def addProjectCommandsIfAbsent(alias: String, value: String): Def.Setting[Seq[Command]] = { + commands := { + val currentCommands = commands.value.collect { + case command: SimpleCommand => command.name + }.toSet + val isPresent = currentCommands(alias) + if (isPresent) + commands.value + else + commands.value :+ BasicCommands.newAlias( + name = alias, + value = value + ) + } + } + + def updateProjectCommands(alias: String, value: String): Def.Setting[Seq[Command]] = { + commands := { + commands.value.filterNot({ + case command: SimpleCommand => command.name == alias + case _ => false + }) :+ BasicCommands.newAlias( + name = alias, + value = value + ) + } + } +}