diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d5b3ee90..823ba963 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -64,9 +64,9 @@ jobs: - name: Check that workflows are up to date run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' 'project /' githubWorkflowCheck - - name: Check headers and formatting + - name: Check headers, migrations and formatting if: matrix.java == 'temurin@8' - run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' headerCheckAll scalafmtCheckAll 'project /' scalafmtSbtCheck + run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' headerCheckAll scalafmtCheckAll 'scalafixAll --check' 'project /' scalafmtSbtCheck - name: Test run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' test @@ -81,11 +81,11 @@ jobs: - name: Make target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: mkdir -p github/target github-actions/target kernel/target versioning/target ci-release/target .jvm/target mdocs/target site/target ci-signing/target mergify/target unidoc/target .native/target mima/target no-publish/target sonatype/target ci/target sonatype-ci-release/target core/target settings/target target .js/target project/target + run: mkdir -p github/target github-actions/target kernel/target versioning/target ci-release/target scalafix/target .jvm/target mdocs/target site/target ci-signing/target mergify/target unidoc/target .native/target mima/target no-publish/target sonatype/target ci/target sonatype-ci-release/target core/target settings/target target .js/target project/target - name: Compress target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: tar cf targets.tar github/target github-actions/target kernel/target versioning/target ci-release/target .jvm/target mdocs/target site/target ci-signing/target mergify/target unidoc/target .native/target mima/target no-publish/target sonatype/target ci/target sonatype-ci-release/target core/target settings/target target .js/target project/target + run: tar cf targets.tar github/target github-actions/target kernel/target versioning/target ci-release/target scalafix/target .jvm/target mdocs/target site/target ci-signing/target mergify/target unidoc/target .native/target mima/target no-publish/target sonatype/target ci/target sonatype-ci-release/target core/target settings/target target .js/target project/target - name: Upload target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') diff --git a/.gitignore b/.gitignore index c7681b7d..6a7cd2b3 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,6 @@ tags .bloop/ metals.sbt .vscode + +# Mac OS +.DS_Store diff --git a/.mergify.yml b/.mergify.yml index de3ae80a..5be458ca 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -112,6 +112,14 @@ pull_request_rules: add: - no-publish remove: [] +- name: Label scalafix PRs + conditions: + - files~=^scalafix/ + actions: + label: + add: + - scalafix + remove: [] - name: Label settings PRs conditions: - files~=^settings/ diff --git a/.scalafix.conf b/.scalafix.conf new file mode 100644 index 00000000..af25a903 --- /dev/null +++ b/.scalafix.conf @@ -0,0 +1,7 @@ +rules = [ + OrganizeImports +] + +OrganizeImports { + preset = INTELLIJ_2020_3 +} diff --git a/build.sbt b/build.sbt index 85649435..367774bf 100644 --- a/build.sbt +++ b/build.sbt @@ -24,6 +24,7 @@ lazy val `sbt-typelevel` = tlCrossRootProject.aggregate( versioning, mima, sonatype, + scalafix, ciSigning, sonatypeCiRelease, ci, @@ -104,6 +105,14 @@ lazy val sonatype = project ) .dependsOn(kernel) +lazy val scalafix = project + .in(file("scalafix")) + .enablePlugins(SbtPlugin) + .settings( + name := "sbt-typelevel-scalafix" + ) + .dependsOn(kernel) + lazy val ciSigning = project .in(file("ci-signing")) .enablePlugins(SbtPlugin) @@ -152,6 +161,7 @@ lazy val core = project ) .dependsOn( ciRelease, + scalafix, settings ) diff --git a/ci-signing/src/main/scala/org/typelevel/sbt/TypelevelCiSigningPlugin.scala b/ci-signing/src/main/scala/org/typelevel/sbt/TypelevelCiSigningPlugin.scala index bc4ec4d3..a3c87c6e 100644 --- a/ci-signing/src/main/scala/org/typelevel/sbt/TypelevelCiSigningPlugin.scala +++ b/ci-signing/src/main/scala/org/typelevel/sbt/TypelevelCiSigningPlugin.scala @@ -17,10 +17,11 @@ package org.typelevel.sbt import io.crashbox.gpg.SbtGpg -import sbt._, Keys._ -import org.typelevel.sbt.gha.GenerativePlugin -import org.typelevel.sbt.gha.GitHubActionsPlugin import org.typelevel.sbt.gha.GenerativePlugin.autoImport._ +import org.typelevel.sbt.gha.{GenerativePlugin, GitHubActionsPlugin} +import sbt._ + +import Keys._ object TypelevelCiSigningPlugin extends AutoPlugin { diff --git a/ci/src/main/scala/org/typelevel/sbt/CrossRootProject.scala b/ci/src/main/scala/org/typelevel/sbt/CrossRootProject.scala index f2c3de3e..98223bf0 100644 --- a/ci/src/main/scala/org/typelevel/sbt/CrossRootProject.scala +++ b/ci/src/main/scala/org/typelevel/sbt/CrossRootProject.scala @@ -16,8 +16,8 @@ package org.typelevel.sbt -import sbt._ import org.typelevel.sbt.gha.GenerativePlugin.autoImport._ +import sbt._ /** * Simultaneously creates a root project, a Scala JVM aggregate project, a Scala.js aggregate diff --git a/ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala b/ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala index 335f99ac..2c5cb59b 100644 --- a/ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala +++ b/ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala @@ -16,11 +16,11 @@ package org.typelevel.sbt -import sbt._ -import org.typelevel.sbt.gha.GenerativePlugin -import org.typelevel.sbt.gha.GitHubActionsPlugin -import org.typelevel.sbt.gha.GenerativePlugin.autoImport._ import com.typesafe.tools.mima.plugin.MimaPlugin +import org.typelevel.sbt.gha.GenerativePlugin.autoImport._ +import org.typelevel.sbt.gha.{GenerativePlugin, GitHubActionsPlugin} +import sbt._ + import scala.language.experimental.macros object TypelevelCiPlugin extends AutoPlugin { diff --git a/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala b/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala index 39968638..701e4e47 100644 --- a/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala +++ b/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala @@ -16,19 +16,21 @@ package org.typelevel.sbt -import sbt._, Keys._ -import org.typelevel.sbt.gha.GenerativePlugin -import org.typelevel.sbt.gha.GitHubActionsPlugin import de.heikoseeberger.sbtheader.HeaderPlugin +import org.typelevel.sbt.gha.{GenerativePlugin, GitHubActionsPlugin} +import sbt._ import scala.collection.immutable +import Keys._ + object TypelevelPlugin extends AutoPlugin { override def requires = TypelevelKernelPlugin && TypelevelSettingsPlugin && TypelevelCiReleasePlugin && + TypelevelScalafixPlugin && GitHubActionsPlugin && HeaderPlugin @@ -73,8 +75,8 @@ object TypelevelPlugin extends AutoPlugin { }, githubWorkflowBuild := { WorkflowStep.Sbt( - List("headerCheckAll", "scalafmtCheckAll", "project /", "scalafmtSbtCheck"), - name = Some("Check headers and formatting"), + List("headerCheckAll", "scalafmtCheckAll", "scalafixAll --check", "project /", "scalafmtSbtCheck"), + name = Some("Check headers, migrations and formatting"), cond = Some(primaryJavaCond.value) ) +: githubWorkflowBuild.value } diff --git a/github-actions/src/main/scala/org/typelevel/sbt/gha/GitHubActionsPlugin.scala b/github-actions/src/main/scala/org/typelevel/sbt/gha/GitHubActionsPlugin.scala index 20c49d95..8f3d822b 100644 --- a/github-actions/src/main/scala/org/typelevel/sbt/gha/GitHubActionsPlugin.scala +++ b/github-actions/src/main/scala/org/typelevel/sbt/gha/GitHubActionsPlugin.scala @@ -16,13 +16,14 @@ package org.typelevel.sbt.gha -import sbt._, Keys._ -import sbt.io.Using - import org.yaml.snakeyaml.Yaml +import sbt._ +import sbt.io.Using import scala.collection.JavaConverters._ +import Keys._ + object GitHubActionsPlugin extends AutoPlugin { override def requires = plugins.JvmPlugin diff --git a/github/src/main/scala/org/typelevel/sbt/TypelevelGitHubPlugin.scala b/github/src/main/scala/org/typelevel/sbt/TypelevelGitHubPlugin.scala index dd9cfe10..ad20450a 100644 --- a/github/src/main/scala/org/typelevel/sbt/TypelevelGitHubPlugin.scala +++ b/github/src/main/scala/org/typelevel/sbt/TypelevelGitHubPlugin.scala @@ -16,10 +16,12 @@ package org.typelevel.sbt -import sbt._, Keys._ +import sbt._ import scala.util.Try +import Keys._ + object TypelevelGitHubPlugin extends AutoPlugin { override def trigger = allRequirements diff --git a/github/src/main/scala/org/typelevel/sbt/TypelevelScalaJSGitHubPlugin.scala b/github/src/main/scala/org/typelevel/sbt/TypelevelScalaJSGitHubPlugin.scala index bdfb06a8..ae4aae3c 100644 --- a/github/src/main/scala/org/typelevel/sbt/TypelevelScalaJSGitHubPlugin.scala +++ b/github/src/main/scala/org/typelevel/sbt/TypelevelScalaJSGitHubPlugin.scala @@ -16,10 +16,12 @@ package org.typelevel.sbt -import sbt._, Keys._ -import org.scalajs.sbtplugin.ScalaJSPlugin import com.github.sbt.git.SbtGit.git +import org.scalajs.sbtplugin.ScalaJSPlugin import org.typelevel.sbt.kernel.GitHelper +import sbt._ + +import Keys._ object TypelevelScalaJSGitHubPlugin extends AutoPlugin { override def trigger = allRequirements diff --git a/kernel/src/main/scala/org/typelevel/sbt/TypelevelKernelPlugin.scala b/kernel/src/main/scala/org/typelevel/sbt/TypelevelKernelPlugin.scala index dbd31610..1d66fec7 100644 --- a/kernel/src/main/scala/org/typelevel/sbt/TypelevelKernelPlugin.scala +++ b/kernel/src/main/scala/org/typelevel/sbt/TypelevelKernelPlugin.scala @@ -16,9 +16,11 @@ package org.typelevel.sbt -import sbt._, Keys._ +import sbt._ import sbt.plugins.JvmPlugin +import Keys._ + object TypelevelKernelPlugin extends AutoPlugin { override def requires = JvmPlugin diff --git a/kernel/src/main/scala/org/typelevel/sbt/kernel/GitHelper.scala b/kernel/src/main/scala/org/typelevel/sbt/kernel/GitHelper.scala index 638d70d9..1a67605a 100644 --- a/kernel/src/main/scala/org/typelevel/sbt/kernel/GitHelper.scala +++ b/kernel/src/main/scala/org/typelevel/sbt/kernel/GitHelper.scala @@ -16,9 +16,8 @@ package org.typelevel.sbt.kernel -import scala.util.Try - import scala.sys.process._ +import scala.util.Try private[sbt] object GitHelper { diff --git a/mergify/src/main/scala/org/typelevel/sbt/mergify/MergifyPlugin.scala b/mergify/src/main/scala/org/typelevel/sbt/mergify/MergifyPlugin.scala index 91706851..2ea40353 100644 --- a/mergify/src/main/scala/org/typelevel/sbt/mergify/MergifyPlugin.scala +++ b/mergify/src/main/scala/org/typelevel/sbt/mergify/MergifyPlugin.scala @@ -16,11 +16,13 @@ package org.typelevel.sbt.mergify -import sbt._, Keys._ import org.typelevel.sbt.gha._ +import sbt._ import java.nio.file.Path +import Keys._ + object MergifyPlugin extends AutoPlugin { object autoImport { diff --git a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala index fa44bf7f..2fd30085 100644 --- a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala +++ b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala @@ -16,11 +16,12 @@ package org.typelevel.sbt -import sbt._, Keys._ import com.typesafe.tools.mima.plugin.MimaPlugin +import org.typelevel.sbt.kernel.{GitHelper, V} +import sbt._ + +import Keys._ import MimaPlugin.autoImport._ -import org.typelevel.sbt.kernel.GitHelper -import org.typelevel.sbt.kernel.V object TypelevelMimaPlugin extends AutoPlugin { diff --git a/no-publish/src/main/scala/org/typelevel/sbt/NoPublishPlugin.scala b/no-publish/src/main/scala/org/typelevel/sbt/NoPublishPlugin.scala index e4fb9f31..d5a339e5 100644 --- a/no-publish/src/main/scala/org/typelevel/sbt/NoPublishPlugin.scala +++ b/no-publish/src/main/scala/org/typelevel/sbt/NoPublishPlugin.scala @@ -16,7 +16,9 @@ package org.typelevel.sbt -import sbt._, Keys._ +import sbt._ + +import Keys._ object NoPublishPlugin extends AutoPlugin { override def trigger = noTrigger diff --git a/project/build.sbt b/project/build.sbt index 673bf53b..86899e11 100644 --- a/project/build.sbt +++ b/project/build.sbt @@ -13,6 +13,7 @@ val modules = List( "site", "sonatype", "sonatype-ci-release", + "scalafix", "versioning" ) diff --git a/project/scalafix.sbt b/project/scalafix.sbt new file mode 120000 index 00000000..8fd9faa0 --- /dev/null +++ b/project/scalafix.sbt @@ -0,0 +1 @@ +../scalafix/build.sbt \ No newline at end of file diff --git a/scalafix/build.sbt b/scalafix/build.sbt new file mode 100644 index 00000000..57c34290 --- /dev/null +++ b/scalafix/build.sbt @@ -0,0 +1 @@ +addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.10.0") diff --git a/scalafix/src/main/scala/org/typelevel/sbt/TypelevelScalafixPlugin.scala b/scalafix/src/main/scala/org/typelevel/sbt/TypelevelScalafixPlugin.scala new file mode 100644 index 00000000..8dd67c23 --- /dev/null +++ b/scalafix/src/main/scala/org/typelevel/sbt/TypelevelScalafixPlugin.scala @@ -0,0 +1,43 @@ +/* + * Copyright 2022 Typelevel + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.typelevel.sbt + +import sbt._ +import scalafix.sbt.ScalafixPlugin + +import Keys._ +import ScalafixPlugin.autoImport._ + +object TypelevelScalafixPlugin extends AutoPlugin { + + override def requires = ScalafixPlugin + + override def trigger = allRequirements + + object autoImport {} + + import autoImport._ + + override def buildSettings = Seq[Setting[_]]( + semanticdbEnabled := true, + semanticdbVersion := scalafixSemanticdb.revision, + scalafixScalaBinaryVersion := CrossVersion.binaryScalaVersion(scalaVersion.value), + scalafixDependencies ++= Seq( + "com.github.liancheng" %% "organize-imports" % "0.6.0" + ) + ) +} diff --git a/settings/src/main/scala/org/typelevel/sbt/TypelevelSettingsPlugin.scala b/settings/src/main/scala/org/typelevel/sbt/TypelevelSettingsPlugin.scala index 1534c36f..c40a6b71 100644 --- a/settings/src/main/scala/org/typelevel/sbt/TypelevelSettingsPlugin.scala +++ b/settings/src/main/scala/org/typelevel/sbt/TypelevelSettingsPlugin.scala @@ -16,11 +16,12 @@ package org.typelevel.sbt -import sbt._, Keys._ import com.github.sbt.git.GitPlugin import com.github.sbt.git.SbtGit.git -import org.typelevel.sbt.kernel.V -import org.typelevel.sbt.kernel.GitHelper +import org.typelevel.sbt.kernel.{GitHelper, V} +import sbt._ + +import Keys._ object TypelevelSettingsPlugin extends AutoPlugin { override def trigger = allRequirements diff --git a/site/src/main/scala/org/typelevel/sbt/TypelevelSitePlugin.scala b/site/src/main/scala/org/typelevel/sbt/TypelevelSitePlugin.scala index cdaf6f2c..5c9fa038 100644 --- a/site/src/main/scala/org/typelevel/sbt/TypelevelSitePlugin.scala +++ b/site/src/main/scala/org/typelevel/sbt/TypelevelSitePlugin.scala @@ -19,10 +19,7 @@ package org.typelevel.sbt import laika.ast.LengthUnit._ import laika.ast._ import laika.helium.Helium -import laika.helium.config.Favicon -import laika.helium.config.HeliumIcon -import laika.helium.config.IconLink -import laika.helium.config.ImageLink +import laika.helium.config.{Favicon, HeliumIcon, IconLink, ImageLink} import laika.sbt.LaikaPlugin import laika.theme.ThemeProvider import mdoc.MdocPlugin diff --git a/site/src/main/scala/org/typelevel/sbt/site/ThemeProviderOps.scala b/site/src/main/scala/org/typelevel/sbt/site/ThemeProviderOps.scala index 6d3750d6..b3842e7b 100644 --- a/site/src/main/scala/org/typelevel/sbt/site/ThemeProviderOps.scala +++ b/site/src/main/scala/org/typelevel/sbt/site/ThemeProviderOps.scala @@ -20,8 +20,7 @@ import cats.effect.Sync import laika.bundle.ExtensionBundle import laika.factory.Format import laika.io.model.InputTree -import laika.theme.Theme -import laika.theme.ThemeProvider +import laika.theme.{Theme, ThemeProvider} final class LaikaThemeProviderOps private[sbt] (provider: ThemeProvider) { diff --git a/site/src/main/scala/org/typelevel/sbt/site/TypelevelHeliumExtensions.scala b/site/src/main/scala/org/typelevel/sbt/site/TypelevelHeliumExtensions.scala index 08f14a20..be9df100 100644 --- a/site/src/main/scala/org/typelevel/sbt/site/TypelevelHeliumExtensions.scala +++ b/site/src/main/scala/org/typelevel/sbt/site/TypelevelHeliumExtensions.scala @@ -16,8 +16,7 @@ package org.typelevel.sbt.site -import cats.effect.Resource -import cats.effect.Sync +import cats.effect.{Resource, Sync} import laika.ast.Path import laika.config.Config import laika.io.model.InputTree @@ -25,9 +24,7 @@ import laika.markdown.github.GitHubFlavor import laika.parse.code.SyntaxHighlighting import laika.parse.code.languages.DottySyntax import laika.rewrite.DefaultTemplatePath -import laika.theme.Theme -import laika.theme.ThemeBuilder -import laika.theme.ThemeProvider +import laika.theme.{Theme, ThemeBuilder, ThemeProvider} import java.net.URL diff --git a/sonatype-ci-release/src/main/scala/org/typelevel/sbt/TypelevelSonatypeCiReleasePlugin.scala b/sonatype-ci-release/src/main/scala/org/typelevel/sbt/TypelevelSonatypeCiReleasePlugin.scala index 9c145ab6..eacadf10 100644 --- a/sonatype-ci-release/src/main/scala/org/typelevel/sbt/TypelevelSonatypeCiReleasePlugin.scala +++ b/sonatype-ci-release/src/main/scala/org/typelevel/sbt/TypelevelSonatypeCiReleasePlugin.scala @@ -16,10 +16,9 @@ package org.typelevel.sbt -import sbt._ -import org.typelevel.sbt.gha.GenerativePlugin -import org.typelevel.sbt.gha.GitHubActionsPlugin import org.typelevel.sbt.gha.GenerativePlugin.autoImport._ +import org.typelevel.sbt.gha.{GenerativePlugin, GitHubActionsPlugin} +import sbt._ object TypelevelSonatypeCiReleasePlugin extends AutoPlugin { diff --git a/sonatype/src/main/scala/org/typelevel/sbt/TypelevelSonatypePlugin.scala b/sonatype/src/main/scala/org/typelevel/sbt/TypelevelSonatypePlugin.scala index 2a836551..b53e16ee 100644 --- a/sonatype/src/main/scala/org/typelevel/sbt/TypelevelSonatypePlugin.scala +++ b/sonatype/src/main/scala/org/typelevel/sbt/TypelevelSonatypePlugin.scala @@ -16,9 +16,12 @@ package org.typelevel.sbt -import sbt._, Keys._ import com.typesafe.tools.mima.plugin.MimaPlugin -import xerial.sbt.Sonatype, Sonatype.autoImport._ +import sbt._ +import xerial.sbt.Sonatype + +import Keys._ +import Sonatype.autoImport._ import TypelevelKernelPlugin.mkCommand object TypelevelSonatypePlugin extends AutoPlugin { diff --git a/sonatype/src/main/scala/org/typelevel/sbt/TypelevelUnidocPlugin.scala b/sonatype/src/main/scala/org/typelevel/sbt/TypelevelUnidocPlugin.scala index ec738b83..e421e250 100644 --- a/sonatype/src/main/scala/org/typelevel/sbt/TypelevelUnidocPlugin.scala +++ b/sonatype/src/main/scala/org/typelevel/sbt/TypelevelUnidocPlugin.scala @@ -16,10 +16,12 @@ package org.typelevel.sbt -import sbt._, Keys._ import com.typesafe.tools.mima.plugin.MimaPlugin.autoImport._ +import sbt._ import sbtunidoc.ScalaUnidocPlugin +import Keys._ + object TypelevelUnidocPlugin extends AutoPlugin { override def requires = ScalaUnidocPlugin diff --git a/versioning/src/main/scala/org/typelevel/sbt/TypelevelVersioningPlugin.scala b/versioning/src/main/scala/org/typelevel/sbt/TypelevelVersioningPlugin.scala index cdbd5443..9cd7baa6 100644 --- a/versioning/src/main/scala/org/typelevel/sbt/TypelevelVersioningPlugin.scala +++ b/versioning/src/main/scala/org/typelevel/sbt/TypelevelVersioningPlugin.scala @@ -16,13 +16,14 @@ package org.typelevel.sbt -import sbt._, Keys._ import com.github.sbt.git.GitPlugin import com.github.sbt.git.SbtGit.git -import org.typelevel.sbt.kernel.V +import org.typelevel.sbt.kernel.{GitHelper, V} +import sbt._ import scala.util.Try -import org.typelevel.sbt.kernel.GitHelper + +import Keys._ object TypelevelVersioningPlugin extends AutoPlugin {