From 27500001ea47bf4147fa718e1b34ebe8314e3a70 Mon Sep 17 00:00:00 2001 From: hepin1989 Date: Sat, 12 Jan 2019 01:41:54 +0800 Subject: [PATCH] Add sbt-java-formatter for java code formatting. --- .sbt-java-formatter.conf | 35 ++++++++++ build.sbt | 12 ++-- project/Formatting.scala | 3 +- project/JavaFormatter.scala | 31 +++++++++ project/ProjectFileIgnoreSupport.scala | 89 ++++++++++++++++++++++++++ project/ScalafixSupport.scala | 75 +++------------------- project/plugins.sbt | 2 +- 7 files changed, 172 insertions(+), 75 deletions(-) create mode 100644 .sbt-java-formatter.conf create mode 100644 project/JavaFormatter.scala create mode 100644 project/ProjectFileIgnoreSupport.scala diff --git a/.sbt-java-formatter.conf b/.sbt-java-formatter.conf new file mode 100644 index 0000000000..544e659226 --- /dev/null +++ b/.sbt-java-formatter.conf @@ -0,0 +1,35 @@ +//ignore by files +// 1. the protobuf generated messages +ignored-files = [ + "ArteryControlFormats.java", + "ContainerFormats.java", + "SystemMessageFormats.java", + "WireFormats.java", + "StreamRefMessages.java", + //in tests + "ProtobufProtocol.java" +] + +//ignore by pacakges: +// 1. adated source code +// 2. protobuf generated messages +ignored-packages = [ + "akka.dispatch", + "akka.protobuf", + "sun.reflect", + "akka.cluster.protobuf.msg", + "akka.cluster.metrics.protobuf.msg", + "akka.cluster.sharding.protobuf.msg", + "akka.cluster.sharding.typed.internal.protobuf", + "akka.cluster.client.protobuf.msg", + "akka.cluster.pubsub.protobuf.msg", + "akka.cluster.typed.internal.protobuf", + "akka.cluster.ddata.protobuf.msg", + "akka.remote.testconductor", + "akka.persistence.serialization", + //in tests + "akka.remote.artery.protobuf", + //in docs + "docs.ddata.protobuf.msg", + "docs.persistence.proto" +] \ No newline at end of file diff --git a/build.sbt b/build.sbt index 59b44d818b..03622166ab 100644 --- a/build.sbt +++ b/build.sbt @@ -1,17 +1,19 @@ import akka.{AutomaticModuleName, CopyrightHeaderForBuild, ParadoxSupport, ScalafixIgnoreFilePlugin} -enablePlugins(UnidocRoot, TimeStampede, UnidocWithPrValidation, NoPublish, CopyrightHeader, CopyrightHeaderInPr, - ScalafixIgnoreFilePlugin) +enablePlugins(UnidocRoot, TimeStampede, UnidocWithPrValidation, NoPublish, CopyrightHeader, + CopyrightHeaderInPr, + ScalafixIgnoreFilePlugin, + JavaFormatterPlugin) disablePlugins(MimaPlugin) addCommandAlias( name ="fixall", value = ";scalafixEnable;compile:scalafix;test:scalafix;multi-jvm:scalafix;test:compile;reload") -import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys.MultiJvm -import com.typesafe.tools.mima.plugin.MimaPlugin -import spray.boilerplate.BoilerplatePlugin import akka.AkkaBuild._ import akka.{AkkaBuild, Dependencies, GitHub, OSGi, Protobuf, SigarLoader, VersionGenerator} +import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys.MultiJvm +import com.typesafe.tools.mima.plugin.MimaPlugin import sbt.Keys.{initialCommands, parallelExecution} +import spray.boilerplate.BoilerplatePlugin initialize := { // Load system properties from a file to make configuration from Jenkins easier diff --git a/project/Formatting.scala b/project/Formatting.scala index b40ea4d732..b9d51c4344 100644 --- a/project/Formatting.scala +++ b/project/Formatting.scala @@ -4,10 +4,9 @@ package akka -import sbt._ import com.typesafe.sbt.SbtMultiJvm.MultiJvmKeys.MultiJvm -import com.typesafe.sbt.SbtScalariform import com.typesafe.sbt.SbtScalariform.ScalariformKeys +import sbt._ object Formatting { import scalariform.formatter.preferences._ diff --git a/project/JavaFormatter.scala b/project/JavaFormatter.scala new file mode 100644 index 0000000000..c7293f3db9 --- /dev/null +++ b/project/JavaFormatter.scala @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2019 Lightbend Inc. + */ + +import akka.ProjectFileIgnoreSupport +import com.lightbend.sbt.JavaFormatterPlugin +import sbt.{AutoPlugin, PluginTrigger, Plugins} + +object JavaFormatter extends AutoPlugin with ProjectFileIgnoreSupport { + + override def trigger = PluginTrigger.AllRequirements + + override def requires: Plugins = JavaFormatterPlugin + + final override protected val ignoreConfigFileName: String = ".sbt-java-formatter.conf" + + final override protected val descriptor: String = "sbt-java-formatter" + + import JavaFormatterPlugin.autoImport._ + import sbt.Keys._ + import sbt._ + import sbt.io._ + + override def projectSettings: Seq[Def.Setting[_]] = Seq( + //below is for sbt java formatter + (excludeFilter in format) := { + val simpleFileFilter = new SimpleFileFilter(file => isIgnoredByFileOrPackages(file)) + simpleFileFilter || (excludeFilter in format).value + } + ) +} diff --git a/project/ProjectFileIgnoreSupport.scala b/project/ProjectFileIgnoreSupport.scala new file mode 100644 index 0000000000..8b2906c041 --- /dev/null +++ b/project/ProjectFileIgnoreSupport.scala @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2019 Lightbend Inc. + */ + +package akka + +import java.io.File + +import com.typesafe.config.ConfigFactory +import sbt.file +import sbt.internal.sbtscalafix.Compat + +trait ProjectFileIgnoreSupport { + protected val stdoutLogger = Compat.ConsoleLogger(System.out) + + protected def ignoreConfigFileName: String + + protected def descriptor: String + + lazy val ignoredFiles: Set[String] = { + import scala.collection.JavaConverters._ + val config = ConfigFactory.parseFile(file(ignoreConfigFileName)) + stdoutLogger.info(s"Loading ignored-files from $ignoreConfigFileName:[${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(ignoreConfigFileName)) + stdoutLogger.info(s"Loading ignored-packages from $ignoreConfigFileName:[${config.origin().url().toURI.getPath}]") + config + .getStringList("ignored-packages") + .asScala + .toSet + } + + protected def isIgnoredByFile(file: File): Boolean = { + val ignoredByFile = ignoredFiles(file.getName) + if (ignoredByFile) { + stdoutLogger.info(s"$descriptor ignored file with file name:${file.getName} file:[${file.toPath}]") + } + ignoredByFile + } + + protected def isIgnoredByPackages(file: File): Boolean = { + val ignoredByPackages = ignoredPackages.exists(pkg => { + getPackageName(file.toURI.toString) match { + case Some(packageName) => + val ignored = packageName.startsWith(pkg) + if (ignored) { + stdoutLogger.info(s"$descriptor ignored file with pkg:$pkg file:[${file.toPath}] ") + } + ignored + case None => false + } + }) + ignoredByPackages + } + + protected def isIgnoredByFileOrPackages(file: File): Boolean = { + isIgnoredByFile(file) || isIgnoredByPackages(file) + } + + protected def getPackageName(fileName: String): Option[String] = { + def getPackageName0(fileType: String): String = { + import java.io.{File => JFile} + fileName.split(JFile.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 + } + } +} diff --git a/project/ScalafixSupport.scala b/project/ScalafixSupport.scala index 1e33df5aac..4795467631 100644 --- a/project/ScalafixSupport.scala +++ b/project/ScalafixSupport.scala @@ -4,82 +4,23 @@ package sbt -import java.io.{ File => JFile } - -import com.typesafe.config.ConfigFactory +import akka.ProjectFileIgnoreSupport import sbt.Keys.unmanagedSources -import sbt.internal.sbtscalafix.Compat -trait ScalafixSupport { +trait ScalafixSupport extends ProjectFileIgnoreSupport { - import scalafix.sbt.ScalafixPlugin.autoImport._ + final override protected val ignoreConfigFileName: String = ".scalafix.conf" + + final override protected val descriptor: String = "scalafix" 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 - } - + import scalafix.sbt.ScalafixPlugin.autoImport._ + 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 - }) + .filterNot(file => isIgnoredByFileOrPackages(file)) } - private def getPackageName(fileName: String): Option[String] = { - def getPackageName0(fileType: String): String = { - fileName.split(JFile.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._ diff --git a/project/plugins.sbt b/project/plugins.sbt index f43e47d2d7..3cddef4fa7 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -8,6 +8,7 @@ libraryDependencies += "org.kohsuke" % "github-api" % "1.95" addSbtPlugin("com.typesafe.sbt" % "sbt-multi-jvm" % "0.4.0") //#sbt-multi-jvm +addSbtPlugin("com.lightbend.sbt" % "sbt-java-formatter" % "0.4.1") addSbtPlugin("org.scalariform" % "sbt-scalariform" % "1.8.2") addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.1") addSbtPlugin("com.typesafe.sbt" % "sbt-osgi" % "0.9.4") @@ -24,6 +25,5 @@ addSbtPlugin("com.lightbend" % "sbt-whitesource" % "0.1.13") addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "1.0.0") addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.9.1") // for advanced PR validation features addSbtPlugin("de.heikoseeberger" % "sbt-header" % "5.0.0") // for maintenance of copyright file header - // used for @unidoc directive libraryDependencies += "io.github.classgraph" % "classgraph" % "4.4.12"