From d7ba294e3043114699cf9de491a82e394984b4cf Mon Sep 17 00:00:00 2001
From: Arman Bilge <armanbilge@gmail.com>
Date: Mon, 19 Jun 2023 04:27:43 +0000
Subject: [PATCH] Better `prePR` command

---
 .../org/typelevel/sbt/TypelevelPlugin.scala   | 52 ++++++++++---------
 docs/customization.md                         |  1 -
 docs/faq.md                                   |  2 +-
 3 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala b/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala
index 20e1c892..6684ed51 100644
--- a/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala
+++ b/core/src/main/scala/org/typelevel/sbt/TypelevelPlugin.scala
@@ -39,11 +39,11 @@ object TypelevelPlugin extends AutoPlugin {
   override def trigger = allRequirements
 
   object autoImport {
+    @deprecated("No longer has an effect. Use `tlFatalWarnings` instead.", "0.5.0")
     lazy val tlFatalWarningsInCi = settingKey[Boolean](
       "Convert compiler warnings into errors under CI builds (default: true)")
   }
 
-  import autoImport._
   import TypelevelKernelPlugin.mkCommand
   import TypelevelCiPlugin.autoImport._
   import TypelevelSettingsPlugin.autoImport._
@@ -51,10 +51,6 @@ object TypelevelPlugin extends AutoPlugin {
   import GenerativePlugin.autoImport._
   import GitHubActionsPlugin.autoImport._
 
-  override def globalSettings = Seq(
-    tlFatalWarningsInCi := true
-  )
-
   override def buildSettings = Seq(
     organization := "org.typelevel",
     organizationName := "Typelevel",
@@ -70,7 +66,7 @@ object TypelevelPlugin extends AutoPlugin {
     tlCiHeaderCheck := true,
     tlCiScalafmtCheck := true,
     tlCiReleaseBranches := Seq("main"),
-    Def.derive(tlFatalWarnings := (tlFatalWarningsInCi.value && githubIsWorkflowBuild.value)),
+    Def.derive(tlFatalWarnings := githubIsWorkflowBuild.value),
     githubWorkflowJavaVersions := {
       Seq(JavaSpec.temurin(tlJdkRelease.value.getOrElse(8).toString))
     },
@@ -81,24 +77,7 @@ object TypelevelPlugin extends AutoPlugin {
         java <- githubWorkflowJavaVersions.value.tail // default java is head
       } yield MatrixExclude(Map("scala" -> scala, "java" -> java.render))
     }
-  ) ++ addCommandAlias(
-    "prePR",
-    mkCommand(
-      List(
-        "reload",
-        "project /",
-        "clean",
-        "githubWorkflowGenerate",
-        "headerCreateAll",
-        "scalafmtAll",
-        "scalafmtSbt",
-        "set ThisBuild / tlFatalWarnings := tlFatalWarningsInCi.value",
-        "Test / compile",
-        "doc",
-        "session clear"
-      )
-    )
-  ) ++ addCommandAlias(
+  ) ++ addPrePRCommandAlias ++ addCommandAlias(
     "tlPrePrBotHook",
     mkCommand(
       List(
@@ -110,4 +89,29 @@ object TypelevelPlugin extends AutoPlugin {
     )
   )
 
+  // partially re-implemnents addCommandAlias
+  // this is so we can use the value of other settings to generate command
+  private def addPrePRCommandAlias: Seq[Setting[_]] = Seq(
+    GlobalScope / onLoad := {
+      val header = tlCiHeaderCheck.value
+      val scalafmt = tlCiScalafmtCheck.value
+      val scalafix = tlCiScalafixCheck.value
+
+      (GlobalScope / Keys.onLoad).value.compose { (state: State) =>
+        val command = mkCommand(
+          List("project /", "githubWorkflowGenerate") ++
+            List("+headerCreateAll").filter(_ => header) ++
+            List("+scalafmtAll", "scalafmtSbt").filter(_ => scalafmt) ++
+            List("+scalafixAll").filter(_ => scalafix)
+        )
+        BasicCommands.addAlias(state, "prePR", command)
+      }
+    },
+    GlobalScope / Keys.onUnload := {
+      (GlobalScope / Keys.onUnload)
+        .value
+        .compose((state: State) => BasicCommands.removeAlias(state, "prePR"))
+    }
+  )
+
 }
diff --git a/docs/customization.md b/docs/customization.md
index 2ad08de2..8a319c18 100644
--- a/docs/customization.md
+++ b/docs/customization.md
@@ -58,7 +58,6 @@ Instead of using the super-plugins, for finer-grained control you can always add
 
 ### sbt-typelevel
 - `TypelevelPlugin`: The super-super-plugin intended for bootstrapping the typical Typelevel project. Sets up CI release including snapshots, scalac settings, headers, and formatting.
-- `tlFatalWarningsInCi` (setting): Convert compiler warnings into errors under CI builds (default: true).
 
 ### sbt-typelevel-site
 -  `TypelevelSitePlugin`: Sets up an [mdoc](https://scalameta.org/mdoc/)/[Laika](https://typelevel.org/Laika/)-generated website, automatically published to GitHub pages in CI.
diff --git a/docs/faq.md b/docs/faq.md
index 1da09450..b5bb70da 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -44,7 +44,7 @@ You may also want to (globally) install the [sbt-rewarn](https://github.com/rtim
 If you are using **sbt-typelevel** fatal warnings are on by default in CI.
 
 ```scala
-ThisBuild / tlFatalWarningsInCi := false
+ThisBuild / tlFatalWarnings := false
 ```
 
 If you are only using **sbt-typelevel-ci-release**, you are completely in charge of your own `scalacOptions`, including fatal warnings.