diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b8e67de..b4a013ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,6 +76,10 @@ jobs: - name: Test run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' test + - name: Check scalafix lints + if: matrix.java == 'temurin@8' + run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' 'scalafixAll --check' + - name: Check binary compatibility if: matrix.java == 'temurin@8' run: sbt 'project ${{ matrix.project }}' '++${{ matrix.scala }}' mimaReportBinaryIssues @@ -86,11 +90,11 @@ jobs: - name: Make target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/series/0.4') - run: mkdir -p github/target github-actions/target kernel/target versioning/target ci-release/target target .js/target mdocs/target site/target ci-signing/target mergify/target unidoc/target mima/target .jvm/target .native/target no-publish/target sonatype/target ci/target sonatype-ci-release/target core/target settings/target project/target + run: mkdir -p github/target github-actions/target kernel/target versioning/target ci-release/target scalafix/target target .js/target mdocs/target site/target ci-signing/target mergify/target unidoc/target mima/target .jvm/target .native/target no-publish/target sonatype/target ci/target sonatype-ci-release/target core/target settings/target project/target - name: Compress target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/series/0.4') - run: tar cf targets.tar github/target github-actions/target kernel/target versioning/target ci-release/target target .js/target mdocs/target site/target ci-signing/target mergify/target unidoc/target mima/target .jvm/target .native/target no-publish/target sonatype/target ci/target sonatype-ci-release/target core/target settings/target project/target + run: tar cf targets.tar github/target github-actions/target kernel/target versioning/target ci-release/target scalafix/target target .js/target mdocs/target site/target ci-signing/target mergify/target unidoc/target mima/target .jvm/target .native/target no-publish/target sonatype/target ci/target sonatype-ci-release/target core/target settings/target project/target - name: Upload target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/series/0.4') diff --git a/.mergify.yml b/.mergify.yml index 9533a3ab..c09782f6 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..edf55aee --- /dev/null +++ b/.scalafix.conf @@ -0,0 +1,3 @@ +rules = [ + OrganizeImports +] diff --git a/build.sbt b/build.sbt index acee116c..5f851f08 100644 --- a/build.sbt +++ b/build.sbt @@ -15,6 +15,10 @@ ThisBuild / mergifyStewardConfig ~= { _.map(_.copy(mergeMinors = true)) } ThisBuild / mergifySuccessConditions += MergifyCondition.Custom("#approved-reviews-by>=1") ThisBuild / mergifyLabelPaths += { "docs" -> file("docs") } +ThisBuild / scalafixDependencies ++= Seq( + "com.github.liancheng" %% "organize-imports" % "0.6.0" +) + lazy val root = tlCrossRootProject.aggregate( kernel, noPublish, @@ -25,6 +29,7 @@ lazy val root = tlCrossRootProject.aggregate( versioning, mima, sonatype, + scalafix, ciSigning, sonatypeCiRelease, ci, @@ -105,6 +110,14 @@ lazy val sonatype = project ) .dependsOn(kernel) +lazy val scalafix = project + .in(file("scalafix")) + .enablePlugins(SbtPlugin) + .settings( + name := "sbt-typelevel-scalafix", + tlVersionIntroduced := Map("2.12" -> "0.4.10") + ) + lazy val ciSigning = project .in(file("ci-signing")) .enablePlugins(SbtPlugin) 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 869eb1a1..848352f1 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,12 @@ 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.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 6cc4e678..1fbaed70 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`, `rootJVM`, `rootJS`, and `rootNative` project, and diff --git a/ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala b/ci/src/main/scala/org/typelevel/sbt/TypelevelCiPlugin.scala index fa9d99f4..189ae2e3 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 com.typesafe.tools.mima.plugin.MimaPlugin 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.GitHubActionsPlugin +import sbt._ object TypelevelCiPlugin extends AutoPlugin { @@ -34,6 +34,8 @@ object TypelevelCiPlugin extends AutoPlugin { settingKey[Boolean]("Whether to do header check in CI (default: false)") lazy val tlCiScalafmtCheck = settingKey[Boolean]("Whether to do scalafmt check in CI (default: false)") + lazy val tlCiScalafixCheck = + settingKey[Boolean]("Whether to do scalafix check in CI (default: false)") lazy val tlCiMimaBinaryIssueCheck = settingKey[Boolean]("Whether to do MiMa binary issues check in CI (default: true)") lazy val tlCiDocCheck = @@ -45,6 +47,7 @@ object TypelevelCiPlugin extends AutoPlugin { override def buildSettings = Seq( tlCiHeaderCheck := false, tlCiScalafmtCheck := false, + tlCiScalafixCheck := false, tlCiMimaBinaryIssueCheck := true, tlCiDocCheck := true, githubWorkflowPublishTargetBranches := Seq(), @@ -82,6 +85,17 @@ object TypelevelCiPlugin extends AutoPlugin { WorkflowStep.Sbt(List("test"), name = Some("Test")) ) + val scalafix = + if (tlCiScalafixCheck.value) + List( + WorkflowStep.Sbt( + List("scalafixAll --check"), + name = Some("Check scalafix lints"), + cond = Some(primaryJavaCond.value) + ) + ) + else Nil + val mima = if (tlCiMimaBinaryIssueCheck.value) List( @@ -103,7 +117,7 @@ object TypelevelCiPlugin extends AutoPlugin { ) else Nil - style ++ test ++ mima ++ doc + style ++ test ++ scalafix ++ mima ++ doc }, githubWorkflowJavaVersions := Seq(JavaSpec.temurin("8")) ) diff --git a/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala b/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala index b3fad016..e9b1e847 100644 --- a/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala +++ b/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala @@ -16,13 +16,15 @@ package org.typelevel.sbt -import sbt._, Keys._ +import de.heikoseeberger.sbtheader.HeaderPlugin import org.typelevel.sbt.gha.GenerativePlugin import org.typelevel.sbt.gha.GitHubActionsPlugin -import de.heikoseeberger.sbtheader.HeaderPlugin +import sbt._ import scala.collection.immutable +import Keys._ + /** * The [[TypelevelPlugin]] brings together the [[TypelevelCiReleasePlugin]] and the * [[TypelevelSettingsPlugin]] 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 49530dc5..96c87d17 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 6686c6f9..8f53882c 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.typesafe.sbt.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 fac057e6..dcec2960 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..4f173102 100644 --- a/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala +++ b/mima/src/main/scala/org/typelevel/sbt/TypelevelMimaPlugin.scala @@ -16,11 +16,13 @@ package org.typelevel.sbt -import sbt._, Keys._ import com.typesafe.tools.mima.plugin.MimaPlugin -import MimaPlugin.autoImport._ import org.typelevel.sbt.kernel.GitHelper import org.typelevel.sbt.kernel.V +import sbt._ + +import Keys._ +import MimaPlugin.autoImport._ 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..0e42c079 100644 --- a/project/build.sbt +++ b/project/build.sbt @@ -9,6 +9,7 @@ val modules = List( "mergify", "mima", "no-publish", + "scalafix", "settings", "site", "sonatype", 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..158e1738 --- /dev/null +++ b/scalafix/src/main/scala/org/typelevel/sbt/TypelevelScalafixPlugin.scala @@ -0,0 +1,36 @@ +/* + * 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 + + override def buildSettings = Seq[Setting[_]]( + semanticdbEnabled := true, + semanticdbVersion := scalafixSemanticdb.revision, + SettingKey[Boolean]("tlCiScalafixCheck") := true + ) +} diff --git a/settings/src/main/scala/org/typelevel/sbt/TypelevelSettingsPlugin.scala b/settings/src/main/scala/org/typelevel/sbt/TypelevelSettingsPlugin.scala index 565a538c..f8bc1fba 100644 --- a/settings/src/main/scala/org/typelevel/sbt/TypelevelSettingsPlugin.scala +++ b/settings/src/main/scala/org/typelevel/sbt/TypelevelSettingsPlugin.scala @@ -16,17 +16,20 @@ package org.typelevel.sbt -import sbt._, Keys._ import com.typesafe.sbt.GitPlugin import com.typesafe.sbt.SbtGit.git -import java.io.File -import java.lang.management.ManagementFactory -import org.typelevel.sbt.kernel.V import org.typelevel.sbt.kernel.GitHelper +import org.typelevel.sbt.kernel.V +import sbt._ import sbtcrossproject.CrossPlugin.autoImport._ import sbtcrossproject.CrossType + +import java.io.File +import java.lang.management.ManagementFactory import scala.util.Try +import Keys._ + object TypelevelSettingsPlugin extends AutoPlugin { override def trigger = allRequirements override def requires = TypelevelKernelPlugin && GitPlugin 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 d1a668d0..36bd941d 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,10 @@ 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.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 ffd25239..7b010be1 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 ca792d13..8fb1bcfe 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 f72de97c..6e17ee2e 100644 --- a/versioning/src/main/scala/org/typelevel/sbt/TypelevelVersioningPlugin.scala +++ b/versioning/src/main/scala/org/typelevel/sbt/TypelevelVersioningPlugin.scala @@ -16,13 +16,15 @@ package org.typelevel.sbt -import sbt._, Keys._ import com.typesafe.sbt.GitPlugin import com.typesafe.sbt.SbtGit.git +import org.typelevel.sbt.kernel.GitHelper import org.typelevel.sbt.kernel.V +import sbt._ import scala.util.Try -import org.typelevel.sbt.kernel.GitHelper + +import Keys._ object TypelevelVersioningPlugin extends AutoPlugin {