From fd4bf0e635a95e8365f1fc2e616ea9a9f1afe599 Mon Sep 17 00:00:00 2001 From: jvican Date: Wed, 24 May 2017 11:15:22 +0200 Subject: [PATCH] Replace previous scalafmt plugin by neo-scalafmt The previous scalafmt plugin had two problems: * Caching with Coursier did not work correctly * It failed after the upgrade to 1.0 in my computer (from a clean fork): ``` [error] (testingProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (runProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (taskProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (stdTaskProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (actionsProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (protocolProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (commandProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (mainSettingsProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (mainProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (sbtProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (scriptedPluginProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] (scriptedSbtProj/compile:scalafmtInc) java.lang.NoClassDefFoundError: Could not initialize class scala.meta.package$ [error] Total time: 19 s, completed May 24, 2017 10:44:56 AM ``` This commit replaces the previous scalafmt integration by the one created by Lucidsoftware, big shoutout! (/cc @pauldraper) https://github.com/lucidsoftware/neo-sbt-scalafmt --- .travis.yml | 2 +- build.sbt | 44 ++++++++++-------- project/AutomateScalafmtPlugin.scala | 67 ---------------------------- project/plugins.sbt | 3 +- 4 files changed, 28 insertions(+), 88 deletions(-) delete mode 100644 project/AutomateScalafmtPlugin.scala diff --git a/.travis.yml b/.travis.yml index 4ff6cce3a..59423554e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ matrix: env: matrix: - - SBT_CMD=";test:compile;scalafmtCheck;safeUnitTests;otherUnitTests" + - SBT_CMD=";test:compile;scalafmt::test;test:scalafmt::test;safeUnitTests;otherUnitTests" # - SBT_CMD="mimaReportBinaryIssues" - SBT_CMD="scripted actions/*" - SBT_CMD="scripted apiinfo/* compiler-project/* ivy-deps-management/*" diff --git a/build.sbt b/build.sbt index 4a5f29d57..10060a6e4 100644 --- a/build.sbt +++ b/build.sbt @@ -71,6 +71,7 @@ def testedBaseSettings: Seq[Setting[_]] = lazy val sbtRoot: Project = (project in file(".")) .enablePlugins(ScriptedPlugin) // , SiteScaladocPlugin, GhpagesPlugin) + .enablePlugins(ScalafmtPlugin) .configs(Sxr.sxrConf) .aggregateSeq(nonRoots) .settings( @@ -107,6 +108,7 @@ lazy val bundledLauncherProj = Release.launcherSettings(sbtLaunchJar) ) .enablePlugins(SbtLauncherPlugin) + .enablePlugins(ScalafmtPlugin) .settings( name := "sbt-launch", moduleName := "sbt-launch", @@ -125,6 +127,7 @@ lazy val bundledLauncherProj = // Runner for uniform test interface lazy val testingProj = (project in file("testing")) .enablePlugins(ContrabandPlugin, JsonCodecPlugin) + .enablePlugins(ScalafmtPlugin) .dependsOn(testAgentProj) .settings( baseSettings, @@ -138,17 +141,20 @@ lazy val testingProj = (project in file("testing")) .configure(addSbtIO, addSbtCompilerClasspath, addSbtUtilLogging) // Testing agent for running tests in a separate process. -lazy val testAgentProj = (project in file("testing") / "agent").settings( - minimalSettings, - crossScalaVersions := Seq(baseScalaVersion), - crossPaths := false, - autoScalaLibrary := false, - name := "Test Agent", - libraryDependencies += testInterface -) +lazy val testAgentProj = (project in file("testing") / "agent") + .enablePlugins(ScalafmtPlugin) + .settings( + minimalSettings, + crossScalaVersions := Seq(baseScalaVersion), + crossPaths := false, + autoScalaLibrary := false, + name := "Test Agent", + libraryDependencies += testInterface + ) // Basic task engine lazy val taskProj = (project in file("tasks")) + .enablePlugins(ScalafmtPlugin) .settings( testedBaseSettings, name := "Tasks" @@ -157,6 +163,7 @@ lazy val taskProj = (project in file("tasks")) // Standard task system. This provides map, flatMap, join, and more on top of the basic task model. lazy val stdTaskProj = (project in file("tasks-standard")) + .enablePlugins(ScalafmtPlugin) .dependsOn(taskProj % "compile;test->test") .settings( testedBaseSettings, @@ -167,7 +174,7 @@ lazy val stdTaskProj = (project in file("tasks-standard")) // Embedded Scala code runner lazy val runProj = (project in file("run")) - .enablePlugins(ContrabandPlugin) + .enablePlugins(ContrabandPlugin, ScalafmtPlugin) .settings( testedBaseSettings, name := "Run", @@ -178,6 +185,7 @@ lazy val runProj = (project in file("run")) .configure(addSbtIO, addSbtUtilLogging, addSbtCompilerClasspath) lazy val scriptedSbtProj = (project in scriptedPath / "sbt") + .enablePlugins(ScalafmtPlugin) .dependsOn(commandProj) .settings( baseSettings, @@ -187,6 +195,7 @@ lazy val scriptedSbtProj = (project in scriptedPath / "sbt") .configure(addSbtIO, addSbtUtilLogging, addSbtCompilerInterface, addSbtUtilScripted) lazy val scriptedPluginProj = (project in scriptedPath / "plugin") + .enablePlugins(ScalafmtPlugin) .dependsOn(sbtProj) .settings( baseSettings, @@ -196,6 +205,7 @@ lazy val scriptedPluginProj = (project in scriptedPath / "plugin") // Implementation and support code for defining actions. lazy val actionsProj = (project in file("main-actions")) + .enablePlugins(ScalafmtPlugin) .dependsOn(runProj, stdTaskProj, taskProj, testingProj) .settings( testedBaseSettings, @@ -217,7 +227,7 @@ lazy val actionsProj = (project in file("main-actions")) ) lazy val protocolProj = (project in file("protocol")) - .enablePlugins(ContrabandPlugin, JsonCodecPlugin) + .enablePlugins(ContrabandPlugin, JsonCodecPlugin, ScalafmtPlugin) .settings( testedBaseSettings, name := "Protocol", @@ -231,7 +241,7 @@ lazy val protocolProj = (project in file("protocol")) // General command support and core commands not specific to a build system lazy val commandProj = (project in file("main-command")) - .enablePlugins(ContrabandPlugin, JsonCodecPlugin) + .enablePlugins(ContrabandPlugin, JsonCodecPlugin, ScalafmtPlugin) .dependsOn(protocolProj) .settings( testedBaseSettings, @@ -252,6 +262,7 @@ lazy val commandProj = (project in file("main-command")) // The core macro project defines the main logic of the DSL, abstracted // away from several sbt implementators (tasks, settings, et cetera). lazy val coreMacrosProj = (project in file("core-macros")) + .enablePlugins(ScalafmtPlugin) .settings( commonSettings, name := "Core Macros", @@ -279,6 +290,7 @@ lazy val generateToolboxClasspath = Def.task { // Fixes scope=Scope for Setting (core defined in collectionProj) to define the settings system used in build definitions lazy val mainSettingsProj = (project in file("main-settings")) + .enablePlugins(ScalafmtPlugin) .dependsOn(commandProj, stdTaskProj, coreMacrosProj) .settings( testedBaseSettings, @@ -298,7 +310,7 @@ lazy val mainSettingsProj = (project in file("main-settings")) // The main integration project for sbt. It brings all of the projects together, configures them, and provides for overriding conventions. lazy val mainProj = (project in file("main")) - .enablePlugins(ContrabandPlugin) + .enablePlugins(ContrabandPlugin, ScalafmtPlugin) .dependsOn(actionsProj, mainSettingsProj, runProj, commandProj) .settings( testedBaseSettings, @@ -319,6 +331,7 @@ lazy val mainProj = (project in file("main")) // technically, we need a dependency on all of mainProj's dependencies, but we don't do that since this is strictly an integration project // with the sole purpose of providing certain identifiers without qualification (with a package object) lazy val sbtProj = (project in file("sbt")) + .enablePlugins(ScalafmtPlugin) .dependsOn(mainProj, scriptedSbtProj % "test->test") .settings( baseSettings, @@ -464,13 +477,6 @@ def customCommands: Seq[Setting[_]] = Seq( otherUnitTests := { test.all(otherProjects).value }, - commands += Command.command("scalafmtCheck") { state => - sys.process.Process("git diff --name-only --exit-code").! match { - case 0 => // ok - case x => sys.error("git diff detected! Did you compile before committing?") - } - state - }, commands += Command.command("release-sbt-local") { state => "clean" :: "so compile" :: diff --git a/project/AutomateScalafmtPlugin.scala b/project/AutomateScalafmtPlugin.scala deleted file mode 100644 index 5d8f8718f..000000000 --- a/project/AutomateScalafmtPlugin.scala +++ /dev/null @@ -1,67 +0,0 @@ -import org.scalafmt.cli.Cli -import org.scalafmt.sbt.ScalafmtPlugin -import sbt._ -import sbt.Keys._ -import sbt.internal.inc.Analysis - -// Taken from https://github.com/akka/alpakka/blob/master/project/AutomateScalafmtPlugin.scala -object AutomateScalafmtPlugin extends AutoPlugin { - - object autoImport { - def automateScalafmtFor(configurations: Configuration*): Seq[Setting[_]] = - configurations.flatMap { c => - inConfig(c)( - Seq( - compileInputs.in(compile) := { - scalafmtInc.value - compileInputs.in(compile).value - }, - sourceDirectories.in(scalafmtInc) := Seq(scalaSource.value), - scalafmtInc := { - val cache = streams.value.cacheStoreFactory / "scalafmt" - val include = includeFilter.in(scalafmtInc).value - val exclude = excludeFilter.in(scalafmtInc).value - val sources = - sourceDirectories - .in(scalafmtInc) - .value - .descendantsExcept(include, exclude) - .get - .toSet - def format(handler: Set[File] => Unit, msg: String) = { - def update(handler: Set[File] => Unit, msg: String)(in: ChangeReport[File], - out: ChangeReport[File]) = { - val label = Reference.display(thisProjectRef.value) - val files = in.modified -- in.removed - Analysis - .counted("Scala source", "", "s", files.size) - .foreach(count => streams.value.log.info(s"$msg $count in $label ...")) - handler(files) - files - } - FileFunction.cached(cache, FilesInfo.hash, FilesInfo.exists)(update(handler, msg))( - sources - ) - } - def formattingHandler(files: Set[File]) = - if (files.nonEmpty) { - val filesArg = files.map(_.getAbsolutePath).mkString(",") - Cli.main(Array("--quiet", "-i", "-f", filesArg)) - } - format(formattingHandler, "Formatting") - format(_ => (), "Reformatted") // Recalculate the cache - } - ) - ) - } - } - - private val scalafmtInc = taskKey[Unit]("Incrementally format modified sources") - - override def requires = ScalafmtPlugin - - override def trigger = allRequirements - - override def projectSettings = - (includeFilter.in(scalafmtInc) := "*.scala") +: autoImport.automateScalafmtFor(Compile, Test) -} diff --git a/project/plugins.sbt b/project/plugins.sbt index 44b25400d..38b70af79 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -5,7 +5,8 @@ scalacOptions ++= Seq("-feature", "-language:postfixOps") // addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.0") // addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "0.9.2") // addSbtPlugin("com.typesafe.sbt" % "sbt-javaversioncheck" % "0.1.0") -addSbtPlugin("com.geirsson" % "sbt-scalafmt" % "0.7.0-RC1") +//addSbtPlugin("com.geirsson" % "sbt-scalafmt" % "0.7.0-RC1") +addSbtPlugin("com.lucidchart" % "sbt-scalafmt" % "0.3") // addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.2.0") addSbtPlugin("org.foundweekends" % "sbt-bintray" % "0.4.0") addSbtPlugin("org.scala-sbt" % "sbt-contraband" % "0.3.0-M5")