From 554a3e27e79033eabd5705629a5cdeb7be70926f Mon Sep 17 00:00:00 2001 From: Jamie Thompson Date: Wed, 18 Oct 2023 12:18:07 +0200 Subject: [PATCH 01/11] update scala cli directives for dependencies --- README.md | 3 ++- .../core/buildtool/scalacli/ScalaCliAlg.scala | 25 +++++++++++++++++-- .../buildtool/scalacli/ScalaCliAlgTest.scala | 21 ++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d665462f93..4b262914ec 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,7 @@ Thanks goes to these wonderful people for contributing to Scala Steward: * [Ikenna Darlington Ogbajie](https://github.com/idarlington) * [Ingar Abrahamsen](https://github.com/ingarabr) * [Jakub Kozłowski](https://github.com/kubukoz) +* [Jamie Thompson](https://github.com/bishabosha) * [Javier Arrieta](https://github.com/javierarrieta) * [JCollier](https://github.com/Slakah) * [Jeff Martin](https://github.com/custommonkey) @@ -125,7 +126,7 @@ Thanks goes to these wonderful people for contributing to Scala Steward: * [Leonhard Riedißer](https://github.com/L7R7) * [Maksym Ochenashko](https://github.com/iRevive) * [Manuel Cueto](https://github.com/manuelcueto) -* [Marco Zühlke](https://github.com/mzuehlke) +* [Marco Zühlke](https://github.com/mzuehlke) * [Mark Canlas](https://github.com/mcanlas) * [Mark van der Tol](https://github.com/markvandertol) * [MaT1g3R](https://github.com/MaT1g3R) diff --git a/modules/core/src/main/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlg.scala b/modules/core/src/main/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlg.scala index ca572170f5..0976dbf9cb 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlg.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlg.scala @@ -28,6 +28,27 @@ import org.scalasteward.core.io.{FileAlg, ProcessAlg, WorkspaceAlg} import org.scalasteward.core.util.Nel import org.typelevel.log4cats.Logger +object ScalaCliAlg { + val directives = + // sourced from https://github.com/VirtusLab/scala-cli/blob/9e22d4a91ba8699ac2727d2ac3042d64abe951e1/modules/directives/src/main/scala/scala/build/preprocessing/directives/Dependency.scala#L33-L48 + List( + "lib", + "libs", + "dep", + "deps", + "dependencies", + "test.dependency", + "test.dep", + "test.deps", + "test.dependencies", + "compileOnly.lib", + "compileOnly.libs", + "compileOnly.dep", + "compileOnly.deps", + "compileOnly.dependencies" + ).map(alias => s"//> $alias ") +} + final class ScalaCliAlg[F[_]](implicit fileAlg: FileAlg[F], gitAlg: GitAlg[F], @@ -42,8 +63,8 @@ final class ScalaCliAlg[F[_]](implicit override def containsBuild(buildRoot: BuildRoot): F[Boolean] = { val buildRootPath = buildRoot.relativePath.dropWhile(Set('.', '/')) val extensions = Set(".sc", ".scala") - gitAlg - .findFilesContaining(buildRoot.repo, "//> using lib ") + ScalaCliAlg.directives + .flatTraverse(gitAlg.findFilesContaining(buildRoot.repo, _)) .map(_.exists(path => path.startsWith(buildRootPath) && extensions.exists(path.endsWith))) } diff --git a/modules/core/src/test/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlgTest.scala b/modules/core/src/test/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlgTest.scala index 4841481f71..e70768ca99 100644 --- a/modules/core/src/test/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlgTest.scala +++ b/modules/core/src/test/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlgTest.scala @@ -10,6 +10,8 @@ import org.scalasteward.core.mock.MockState import org.scalasteward.core.mock.MockState.TraceEntry.{Cmd, Log} import org.scalasteward.core.util.Nel +import cats.syntax.parallel._ + class ScalaCliAlgTest extends CatsEffectSuite { test("containsBuild: directive in non-source file") { val repo = Repo("user", "repo") @@ -24,6 +26,25 @@ class ScalaCliAlgTest extends CatsEffectSuite { assertIO(obtained, false) } + test("containsBuild: directive with test.dep, dep, and lib") { + val repo = Repo("user", "repo") + val buildRoot = BuildRoot(repo, ".") + val repoDir = workspaceAlg.repoDir(repo).unsafeRunSync() + val fileWithUsingDirective = "project.scala" + + ScalaCliAlg.directives + .map { search => + val grepCmd = + Cmd.git(repoDir, "grep", "-I", "--fixed-strings", "--files-with-matches", search) + val initial = + MockState.empty.copy(commandOutputs = Map(grepCmd -> Right(List(fileWithUsingDirective)))) + val obtained = scalaCliAlg.containsBuild(buildRoot).runA(initial) + assertIO(obtained, true) + } + .parSequence + .void + } + test("getDependencies") { val repo = Repo("user", "repo") val buildRoot = BuildRoot(repo, ".") From 62715a43400fc5550ad75b965572a23b94a8c056 Mon Sep 17 00:00:00 2001 From: Jamie Thompson Date: Tue, 31 Oct 2023 16:51:07 +0100 Subject: [PATCH 02/11] fix BuildToolDispatcherTest --- .../buildtool/BuildToolDispatcherTest.scala | 75 +++++++++---------- 1 file changed, 36 insertions(+), 39 deletions(-) diff --git a/modules/core/src/test/scala/org/scalasteward/core/buildtool/BuildToolDispatcherTest.scala b/modules/core/src/test/scala/org/scalasteward/core/buildtool/BuildToolDispatcherTest.scala index 897d852dc2..2a691ecc81 100644 --- a/modules/core/src/test/scala/org/scalasteward/core/buildtool/BuildToolDispatcherTest.scala +++ b/modules/core/src/test/scala/org/scalasteward/core/buildtool/BuildToolDispatcherTest.scala @@ -10,6 +10,7 @@ import org.scalasteward.core.mock.MockState.TraceEntry.{Cmd, Log} import org.scalasteward.core.repoconfig.{BuildRootConfig, RepoConfig} import org.scalasteward.core.scalafmt import org.scalasteward.core.scalafmt.scalafmtConfName +import org.scalasteward.core.buildtool.scalacli.ScalaCliAlg class BuildToolDispatcherTest extends FunSuite { test("getDependencies") { @@ -28,37 +29,33 @@ class BuildToolDispatcherTest extends FunSuite { val (state, deps) = buildToolDispatcher.getDependencies(repo, repoConfig).runSA(initial).unsafeRunSync() + val allGreps = ScalaCliAlg.directives.map { search => + Cmd.git( + repoDir, + "grep", + "-I", + "--fixed-strings", + "--files-with-matches", + search + ) + } + val expectedState = initial.copy(trace = - Vector( - Cmd("test", "-f", s"$repoDir/pom.xml"), - Cmd("test", "-f", s"$repoDir/build.sc"), - Cmd("test", "-f", s"$repoDir/build.sbt"), - Cmd.git( - repoDir, - "grep", - "-I", - "--fixed-strings", - "--files-with-matches", - "//> using lib " - ), - Cmd("test", "-f", s"$repoDir/mvn-build/pom.xml"), - Cmd("test", "-f", s"$repoDir/mvn-build/build.sc"), - Cmd("test", "-f", s"$repoDir/mvn-build/build.sbt"), - Cmd.git( - repoDir, - "grep", - "-I", - "--fixed-strings", - "--files-with-matches", - "//> using lib " - ), - Log("Get dependencies in . from sbt"), - Cmd("read", s"$repoDir/project/build.properties"), - Cmd("test", "-d", s"$repoDir/project"), - Cmd("test", "-d", s"$repoDir/project/project"), - Cmd("read", "classpath:StewardPlugin_1_0_0.scala"), - Cmd("write", s"$repoDir/project/scala-steward-StewardPlugin_1_0_0.scala"), - Cmd("write", s"$repoDir/project/project/scala-steward-StewardPlugin_1_0_0.scala"), + Cmd("test", "-f", s"$repoDir/pom.xml") +: + Cmd("test", "-f", s"$repoDir/build.sc") +: + Cmd("test", "-f", s"$repoDir/build.sbt") +: + allGreps ++: + Cmd("test", "-f", s"$repoDir/mvn-build/pom.xml") +: + Cmd("test", "-f", s"$repoDir/mvn-build/build.sc") +: + Cmd("test", "-f", s"$repoDir/mvn-build/build.sbt") +: + allGreps ++: + Log("Get dependencies in . from sbt") +: + Cmd("read", s"$repoDir/project/build.properties") +: + Cmd("test", "-d", s"$repoDir/project") +: + Cmd("test", "-d", s"$repoDir/project/project") +: + Cmd("read", "classpath:StewardPlugin_1_0_0.scala") +: + Cmd("write", s"$repoDir/project/scala-steward-StewardPlugin_1_0_0.scala") +: + Cmd("write", s"$repoDir/project/project/scala-steward-StewardPlugin_1_0_0.scala") +: Cmd.execSandboxed( repoDir, "sbt", @@ -67,26 +64,26 @@ class BuildToolDispatcherTest extends FunSuite { "-Dsbt.supershell=false", "-Dsbt.server.forcestart=true", s";$crossStewardDependencies;$reloadPlugins;$stewardDependencies" - ), - Cmd("rm", "-rf", s"$repoDir/project/project/scala-steward-StewardPlugin_1_0_0.scala"), - Cmd("rm", "-rf", s"$repoDir/project/scala-steward-StewardPlugin_1_0_0.scala"), - Cmd("read", s"$repoDir/$scalafmtConfName"), - Log("Get dependencies in mvn-build from Maven"), + ) +: + Cmd("rm", "-rf", s"$repoDir/project/project/scala-steward-StewardPlugin_1_0_0.scala") +: + Cmd("rm", "-rf", s"$repoDir/project/scala-steward-StewardPlugin_1_0_0.scala") +: + Cmd("read", s"$repoDir/$scalafmtConfName") +: + Log("Get dependencies in mvn-build from Maven") +: Cmd.execSandboxed( repoDir / "mvn-build", "mvn", maven.args.batchMode, maven.command.listDependencies, maven.args.excludeTransitive - ), + ) +: Cmd.execSandboxed( repoDir / "mvn-build", "mvn", maven.args.batchMode, maven.command.listRepositories - ), - Cmd("read", s"$repoDir/mvn-build/$scalafmtConfName") - ) + ) +: + Cmd("read", s"$repoDir/mvn-build/$scalafmtConfName") +: + Vector.empty[MockState.TraceEntry] ) assertEquals(state, expectedState) From 22f24c0c28ce86aa47bc3807f5cf273634c69347 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sat, 18 Nov 2023 02:49:29 +0100 Subject: [PATCH 03/11] Update scalafmt-core to 3.7.17 (#3216) --- .scalafmt.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index d07bd3cf87..d34b4cea0b 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = 3.7.15 +version = 3.7.17 runner.dialect = scala213 assumeStandardLibraryStripMargin = true align.openParenCallSite = false From 43c917d65c31e6eb8087dbbe010c9898edcb2b6e Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 21 Nov 2023 21:18:40 +0100 Subject: [PATCH 04/11] Update sbt-assembly to 2.1.5 (#3217) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index d90fe33ff6..48a114033e 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,4 +1,4 @@ -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.4") +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "2.1.5") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2") From 1fe2aab7ece959478d255b75f2e074cca1c63bf3 Mon Sep 17 00:00:00 2001 From: "Frank S. Thomas" Date: Wed, 22 Nov 2023 14:31:23 +0100 Subject: [PATCH 05/11] Reset instead of merge to update branches Closes #3218 --- .../scalasteward/core/git/FileGitAlg.scala | 33 +--------- .../org/scalasteward/core/git/GenGitAlg.scala | 12 +--- .../core/nurture/NurtureAlg.scala | 13 ++-- .../core/git/FileGitAlgTest.scala | 66 ++++++++----------- 4 files changed, 38 insertions(+), 86 deletions(-) diff --git a/modules/core/src/main/scala/org/scalasteward/core/git/FileGitAlg.scala b/modules/core/src/main/scala/org/scalasteward/core/git/FileGitAlg.scala index 66ecf410d5..a82182024a 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/git/FileGitAlg.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/git/FileGitAlg.scala @@ -97,7 +97,7 @@ final class FileGitAlg[F[_]](config: GitCfg)(implicit override def hasConflicts(repo: File, branch: Branch, base: Branch): F[Boolean] = { val tryMerge = git_("merge", "--no-commit", "--no-ff", branch.name)(repo) - val abortMerge = git_("merge", "--abort")(repo).void + val abortMerge = git_("merge", "--abort")(repo).attempt.void returnToCurrentBranch(repo) { checkoutBranch(repo, base) >> F.guarantee(tryMerge, abortMerge).attempt.map(_.isLeft) @@ -114,41 +114,14 @@ final class FileGitAlg[F[_]](config: GitCfg)(implicit git("rev-parse", "--verify", branch.name)(repo) .flatMap(lines => F.fromEither(Sha1.from(lines.mkString("").trim))) - override def mergeTheirs(repo: File, branch: Branch): F[Option[Commit]] = - for { - before <- latestSha1(repo, Branch.head) - _ <- git_("merge", "--strategy-option=theirs", sign, branch.name)(repo).void - .handleErrorWith { throwable => - // Resolve CONFLICT (modify/delete) by deleting unmerged files: - for { - unmergedFiles <- git("diff", "--name-only", "--diff-filter=U")(repo) - _ <- Nel - .fromList(unmergedFiles.filter(_.nonEmpty)) - .fold(F.raiseError[Unit](throwable))(_.traverse_(file => git_("rm", file)(repo))) - _ <- git_("commit", "--all", "--no-edit", sign)(repo) - } yield () - } - after <- latestSha1(repo, Branch.head) - } yield Option.when(before =!= after)(Commit(after)) - override def push(repo: File, branch: Branch): F[Unit] = git_("push", "--force", "--set-upstream", "origin", branch.name)(repo).void override def removeClone(repo: File): F[Unit] = fileAlg.deleteForce(repo) - override def revertChanges(repo: File, base: Branch): F[Option[Commit]] = { - val range = dotdot(base, Branch.head) - git("log", "--pretty=format:%h %p", range)(repo).flatMap { commitsWithParents => - val commitsUntilMerge = commitsWithParents.map(_.split(' ')).takeWhile(_.length === 2) - val commits = commitsUntilMerge.flatMap(_.headOption) - if (commits.isEmpty) F.pure(None) - else { - val msg = CommitMsg(s"Revert commit(s) " + commits.mkString(", ")) - git_("revert" :: "--no-commit" :: commits: _*)(repo) >> commitAllIfDirty(repo, msg) - } - } - } + override def resetHard(repo: File, base: Branch): F[Unit] = + git_("reset", "--hard", base.name)(repo).void override def setAuthor(repo: File, author: Author): F[Unit] = for { diff --git a/modules/core/src/main/scala/org/scalasteward/core/git/GenGitAlg.scala b/modules/core/src/main/scala/org/scalasteward/core/git/GenGitAlg.scala index 22616c7140..deae9c404b 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/git/GenGitAlg.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/git/GenGitAlg.scala @@ -66,14 +66,11 @@ trait GenGitAlg[F[_], Repo] { def latestSha1(repo: Repo, branch: Branch): F[Sha1] - /** Merges `branch` into the current branch using `theirs` as merge strategy option. */ - def mergeTheirs(repo: Repo, branch: Branch): F[Option[Commit]] - def push(repo: Repo, branch: Branch): F[Unit] def removeClone(repo: Repo): F[Unit] - def revertChanges(repo: Repo, base: Branch): F[Option[Commit]] + def resetHard(repo: Repo, base: Branch): F[Unit] def setAuthor(repo: Repo, author: Author): F[Unit] @@ -152,17 +149,14 @@ trait GenGitAlg[F[_], Repo] { override def latestSha1(repo: A, branch: Branch): F[Sha1] = f(repo).flatMap(self.latestSha1(_, branch)) - override def mergeTheirs(repo: A, branch: Branch): F[Option[Commit]] = - f(repo).flatMap(self.mergeTheirs(_, branch)) - override def push(repo: A, branch: Branch): F[Unit] = f(repo).flatMap(self.push(_, branch)) override def removeClone(repo: A): F[Unit] = f(repo).flatMap(self.removeClone) - override def revertChanges(repo: A, base: Branch): F[Option[Commit]] = - f(repo).flatMap(self.revertChanges(_, base)) + override def resetHard(repo: A, base: Branch): F[Unit] = + f(repo).flatMap(self.resetHard(_, base)) override def setAuthor(repo: A, author: Author): F[Unit] = f(repo).flatMap(self.setAuthor(_, author)) diff --git a/modules/core/src/main/scala/org/scalasteward/core/nurture/NurtureAlg.scala b/modules/core/src/main/scala/org/scalasteward/core/nurture/NurtureAlg.scala index fb31cc51bb..856753d702 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/nurture/NurtureAlg.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/nurture/NurtureAlg.scala @@ -267,7 +267,7 @@ final class NurtureAlg[F[_]](config: ForgeCfg)(implicit gitAlg.returnToCurrentBranch(data.repo) { gitAlg.checkoutBranch(data.repo, data.updateBranch) >> shouldBeUpdated(data).ifM( - ifTrue = mergeAndApplyAgain(number, data), + ifTrue = resetAndApplyAgain(number, data), ifFalse = (Ignored: ProcessResult).pure ) } @@ -293,22 +293,19 @@ final class NurtureAlg[F[_]](config: ForgeCfg)(implicit result.flatMap { case (update, msg) => logger.info(msg).as(update) } } - private def mergeAndApplyAgain(number: PullRequestNumber, data: UpdateData): F[ProcessResult] = + private def resetAndApplyAgain(number: PullRequestNumber, data: UpdateData): F[ProcessResult] = for { _ <- logger.info( - s"Merge branch ${data.baseBranch.name} into ${data.updateBranch.name} and apply again" + s"Reset ${data.updateBranch.name} to ${data.baseBranch.name} and apply again" ) - maybeRevertCommit <- gitAlg.revertChanges(data.repo, data.baseBranch) - maybeMergeCommit <- gitAlg.mergeTheirs(data.repo, data.baseBranch) + _ <- gitAlg.resetHard(data.repo, data.baseBranch) edits <- data.update.on( update = editAlg.applyUpdate(data.repoData, _), grouped = _.updates.flatTraverse(editAlg.applyUpdate(data.repoData, _)) ) editCommits = edits.flatMap(_.commits) - commits = maybeRevertCommit.toList ++ maybeMergeCommit.toList ++ editCommits - result <- pushCommits(data, commits) + result <- pushCommits(data, editCommits) requestData <- preparePullRequest(data, edits) _ <- forgeApiAlg.updatePullRequest(number: PullRequestNumber, data.repo, requestData) } yield result - } diff --git a/modules/core/src/test/scala/org/scalasteward/core/git/FileGitAlgTest.scala b/modules/core/src/test/scala/org/scalasteward/core/git/FileGitAlgTest.scala index fb86613bbd..88206b5b7a 100644 --- a/modules/core/src/test/scala/org/scalasteward/core/git/FileGitAlgTest.scala +++ b/modules/core/src/test/scala/org/scalasteward/core/git/FileGitAlgTest.scala @@ -6,7 +6,13 @@ import cats.effect.IO import cats.syntax.all._ import munit.CatsEffectSuite import org.scalasteward.core.TestInstances.ioLogger -import org.scalasteward.core.git.FileGitAlgTest.{ioAuxGitAlg, ioGitAlg, master} +import org.scalasteward.core.git.FileGitAlgTest.{ + conflictsNo, + conflictsYes, + ioAuxGitAlg, + ioGitAlg, + master +} import org.scalasteward.core.io.FileAlgTest.ioFileAlg import org.scalasteward.core.io.ProcessAlgTest.ioProcessAlg import org.scalasteward.core.io.{FileAlg, ProcessAlg, WorkspaceAlg} @@ -47,7 +53,7 @@ class FileGitAlgTest extends CatsEffectSuite { for { _ <- ioAuxGitAlg.createRepo(repo) _ <- ioAuxGitAlg.createConflict(repo) - authors <- ioGitAlg.branchAuthors(repo, Branch("conflicts-no"), master) + authors <- ioGitAlg.branchAuthors(repo, conflictsNo, master) _ = assertEquals(authors, List("'Bot Doe'")) } yield () } @@ -157,57 +163,37 @@ class FileGitAlgTest extends CatsEffectSuite { for { _ <- ioAuxGitAlg.createRepo(repo) _ <- ioAuxGitAlg.createConflict(repo) - c1 <- ioGitAlg.hasConflicts(repo, Branch("conflicts-yes"), master) - c2 <- ioGitAlg.hasConflicts(repo, Branch("conflicts-no"), master) + c1 <- ioGitAlg.hasConflicts(repo, conflictsYes, master) + c2 <- ioGitAlg.hasConflicts(repo, conflictsNo, master) _ = assertEquals((c1, c2), (true, false)) } yield () } - test("mergeTheirs") { - val repo = rootDir / "mergeTheirs" + test("isMerged") { + val repo = rootDir / "isMerged" for { _ <- ioAuxGitAlg.createRepo(repo) _ <- ioAuxGitAlg.createConflict(repo) - branch = Branch("conflicts-yes") - c1 <- ioGitAlg.hasConflicts(repo, branch, master) - m1 <- ioGitAlg.isMerged(repo, master, branch) - _ <- ioGitAlg.checkoutBranch(repo, branch) - _ <- ioGitAlg.mergeTheirs(repo, master) - c2 <- ioGitAlg.hasConflicts(repo, branch, master) - m2 <- ioGitAlg.isMerged(repo, master, branch) - _ = assertEquals((c1, m1, c2, m2), (true, false, false, true)) - } yield () - } - - test("mergeTheirs: CONFLICT (modify/delete)") { - val repo = rootDir / "mergeTheirs-modify-delete" - for { - _ <- ioAuxGitAlg.createRepo(repo) - _ <- ioAuxGitAlg.createConflictFileRemovedOnMaster(repo) - branch = Branch("conflicts-yes") - c1 <- ioGitAlg.hasConflicts(repo, branch, master) - m1 <- ioGitAlg.isMerged(repo, master, branch) - _ <- ioGitAlg.checkoutBranch(repo, branch) - _ <- ioGitAlg.mergeTheirs(repo, master) - c2 <- ioGitAlg.hasConflicts(repo, branch, master) - m2 <- ioGitAlg.isMerged(repo, master, branch) - _ = assertEquals((c1, m1, c2, m2), (true, false, false, true)) + m1 <- ioGitAlg.isMerged(repo, conflictsNo, master) + _ <- ioAuxGitAlg.git("merge", conflictsNo.name)(repo) + m2 <- ioGitAlg.isMerged(repo, conflictsNo, master) + _ = assertEquals((m1, m2), (false, true)) } yield () } - test("revertChanges") { - val repo = rootDir / "revertChanges" + test("resetHard") { + val repo = rootDir / "resetHard" for { _ <- ioAuxGitAlg.createRepo(repo) _ <- ioAuxGitAlg.createConflict(repo) - branch = Branch("conflicts-yes") + branch = conflictsYes c1 <- ioGitAlg.hasConflicts(repo, branch, master) d1 <- ioGitAlg.branchesDiffer(repo, master, branch) _ <- ioGitAlg.checkoutBranch(repo, branch) - _ <- ioGitAlg.revertChanges(repo, master) + _ <- ioGitAlg.resetHard(repo, master) c2 <- ioGitAlg.hasConflicts(repo, branch, master) d2 <- ioGitAlg.branchesDiffer(repo, master, branch) - _ = assertEquals((c1, d1, c2, d2), (true, true, false, true)) + _ = assertEquals((c1, d1, c2, d2), (true, true, false, false)) } yield () } @@ -217,7 +203,9 @@ class FileGitAlgTest extends CatsEffectSuite { } object FileGitAlgTest { - val master: Branch = Branch("master") + private val master: Branch = Branch("master") + private val conflictsNo: Branch = Branch("conflicts-no") + private val conflictsYes: Branch = Branch("conflicts-yes") final class AuxGitAlg[F[_]](implicit fileAlg: FileAlg[F], @@ -250,13 +238,13 @@ object FileGitAlgTest { _ <- fileAlg.writeFile(repo / "file2", "file2, line1") _ <- addFiles(repo, repo / "file1", repo / "file2") // work on conflicts-no - _ <- gitAlg.createBranch(repo, Branch("conflicts-no")) + _ <- gitAlg.createBranch(repo, conflictsNo) _ <- fileAlg.writeFile(repo / "file3", "file3, line1") _ <- git("add", "file3")(repo) _ <- gitAlg.commitAll(repo, CommitMsg("Add file3 on conflicts-no")) _ <- gitAlg.checkoutBranch(repo, master) // work on conflicts-yes - _ <- gitAlg.createBranch(repo, Branch("conflicts-yes")) + _ <- gitAlg.createBranch(repo, conflictsYes) _ <- fileAlg.writeFile(repo / "file2", "file2, line1\nfile2, line2 on conflicts-yes") _ <- git("add", "file2")(repo) _ <- gitAlg.commitAll(repo, CommitMsg("Modify file2 on conflicts-yes")) @@ -274,7 +262,7 @@ object FileGitAlgTest { _ <- fileAlg.writeFile(repo / "file2", "file2, line1") _ <- addFiles(repo, repo / "file1", repo / "file2") // work on conflicts-yes - _ <- gitAlg.createBranch(repo, Branch("conflicts-yes")) + _ <- gitAlg.createBranch(repo, conflictsYes) _ <- fileAlg.writeFile(repo / "file2", "file2, line1\nfile2, line2 on conflicts-yes") _ <- git("add", "file2")(repo) _ <- gitAlg.commitAll(repo, CommitMsg("Modify file2 on conflicts-yes")) From 9245385a85d60d76e889564adbbef36f90a18788 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 23 Nov 2023 16:10:17 +0100 Subject: [PATCH 06/11] Update coursier, ... to 2.1.8 (#3220) --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 5d286f99ad..5438f1b60d 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -14,7 +14,7 @@ object Dependencies { val circeParser = "io.circe" %% "circe-parser" % circeGeneric.revision val circeRefined = "io.circe" %% "circe-refined" % circeGeneric.revision val commonsIo = "commons-io" % "commons-io" % "2.15.0" - val coursierCore = "io.get-coursier" %% "coursier" % "2.1.7" + val coursierCore = "io.get-coursier" %% "coursier" % "2.1.8" val coursierSbtMaven = "io.get-coursier" %% "coursier-sbt-maven-repository" % coursierCore.revision val cron4sCore = "com.github.alonsodomin.cron4s" %% "cron4s-core" % "0.6.1" From 02ff89d0877263a8a9b37f01f2f2f658af153434 Mon Sep 17 00:00:00 2001 From: "Frank S. Thomas" Date: Sun, 26 Nov 2023 14:39:05 +0100 Subject: [PATCH 07/11] Add label for artifact migrations This adds a `artifact-migrations` label for updates where the groupId and/or artifactId is changed. My main motivation for this label is to search for PRs that rewrite the groupId/artifactId on GitHub and to add this search to our [Artifact Migrations documentation](https://github.com/scala-steward-org/scala-steward/blob/main/docs/artifact-migrations.md). --- .../core/forge/data/NewPullRequestData.scala | 6 ++++++ .../core/forge/data/NewPullRequestDataTest.scala | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/scala/org/scalasteward/core/forge/data/NewPullRequestData.scala b/modules/core/src/main/scala/org/scalasteward/core/forge/data/NewPullRequestData.scala index b6615e5a94..b5b186a55b 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/forge/data/NewPullRequestData.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/forge/data/NewPullRequestData.scala @@ -314,12 +314,18 @@ object NewPullRequestData { val semverLabels = update.on(u => semverForUpdate(u), _.updates.flatMap(semverForUpdate(_)).distinct) + val artifactMigrationsLabel = Option.when { + update.asSingleUpdates + .flatMap(_.forArtifactIds.toList) + .exists(u => u.newerGroupId.nonEmpty || u.newerArtifactId.nonEmpty) + }("artifact-migrations") val scalafixLabel = edits.collectFirst { case _: ScalafixEdit => "scalafix-migrations" } val oldVersionLabel = Option.when(filesWithOldVersion.nonEmpty)("old-version-remains") List.concat( updateTypeLabels(update), semverLabels, + artifactMigrationsLabel, scalafixLabel, oldVersionLabel, List(commitCountLabel) diff --git a/modules/core/src/test/scala/org/scalasteward/core/forge/data/NewPullRequestDataTest.scala b/modules/core/src/test/scala/org/scalasteward/core/forge/data/NewPullRequestDataTest.scala index 3ba6f27ef4..821d0d99b3 100644 --- a/modules/core/src/test/scala/org/scalasteward/core/forge/data/NewPullRequestDataTest.scala +++ b/modules/core/src/test/scala/org/scalasteward/core/forge/data/NewPullRequestDataTest.scala @@ -131,7 +131,7 @@ class NewPullRequestDataTest extends FunSuite { assertEquals(body, expected) } - test("bodyFor() groupped update") { + test("bodyFor() grouped update") { val update1 = ("ch.qos.logback".g % "logback-classic".a % "1.2.0" %> "1.2.3").single val update2 = ("com.example".g % "foo".a % "1.0.0" %> "2.0.0").single val update = Update.Grouped("my-group", Some("The PR title"), List(update1, update2)) @@ -515,6 +515,13 @@ class NewPullRequestDataTest extends FunSuite { assertEquals(labels, expected) } + test("artifact-migrations label") { + val update = ("a".g % "b".a % "1" -> "2").single.copy(newerGroupId = Some("aa".g)) + val obtained = labelsFor(update) + val expected = List("library-update", "artifact-migrations", "commit-count:0") + assertEquals(obtained, expected) + } + test("oldVersionNote doesn't show version for grouped updates") { val files = List("Readme.md", "travis.yml") val update1 = ("a".g % "b".a % "1" -> "2").single @@ -539,7 +546,7 @@ class NewPullRequestDataTest extends FunSuite { ) } - test("adjustFutureUpdates for grouped udpates shows settings for each update") { + test("adjustFutureUpdates for grouped updates shows settings for each update") { val update1 = ("a".g % "b".a % "1" -> "2").single val update2 = ("c".g % "d".a % "1.1.0" % "test" %> "1.2.0").single val update = Update.Grouped("my-group", None, List(update1, update2)) From 18869ec3b326e7a574b8e9f4206e49c156d5c2cd Mon Sep 17 00:00:00 2001 From: Kazuma Iemura Date: Mon, 27 Nov 2023 12:15:23 +0900 Subject: [PATCH 08/11] Migration for play-swagger --- modules/core/src/main/resources/artifact-migrations.v2.conf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/core/src/main/resources/artifact-migrations.v2.conf b/modules/core/src/main/resources/artifact-migrations.v2.conf index 065a664547..ce87175214 100644 --- a/modules/core/src/main/resources/artifact-migrations.v2.conf +++ b/modules/core/src/main/resources/artifact-migrations.v2.conf @@ -994,4 +994,9 @@ changes = [ groupIdAfter = com.github.sbt artifactIdAfter = sbt-osgi }, + { + groupIdBefore = com.iheart + groupIdAfter = io.github.play-swagger + artifactIdAfter = sbt-play-swagger + }, ] From b171f7a8d2d39c1544ede3ebce9a197921f214d2 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Mon, 27 Nov 2023 21:21:55 +0100 Subject: [PATCH 09/11] Update logback-classic to 1.4.12 (#3225) --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 5438f1b60d..45610fed15 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -30,7 +30,7 @@ object Dependencies { val http4sEmberServer = "org.http4s" %% "http4s-ember-server" % http4sCore.revision val http4sJdkhttpClient = "org.http4s" %% "http4s-jdk-http-client" % "1.0.0-M9" val log4catsSlf4j = "org.typelevel" %% "log4cats-slf4j" % "2.6.0" - val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.4.11" + val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.4.12" val jjwtApi = "io.jsonwebtoken" % "jjwt-api" % "0.11.5" val jjwtImpl = "io.jsonwebtoken" % "jjwt-impl" % jjwtApi.revision val jjwtJackson = "io.jsonwebtoken" % "jjwt-jackson" % jjwtApi.revision From 1e69d10cbd8f9d4abaf521da44e4782e107e961d Mon Sep 17 00:00:00 2001 From: Jamie Thompson Date: Tue, 28 Nov 2023 09:29:12 +0100 Subject: [PATCH 10/11] correct directive format --- .../org/scalasteward/core/buildtool/scalacli/ScalaCliAlg.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlg.scala b/modules/core/src/main/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlg.scala index 0976dbf9cb..6e2e52b51f 100644 --- a/modules/core/src/main/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlg.scala +++ b/modules/core/src/main/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlg.scala @@ -46,7 +46,7 @@ object ScalaCliAlg { "compileOnly.dep", "compileOnly.deps", "compileOnly.dependencies" - ).map(alias => s"//> $alias ") + ).map(alias => s"//> using $alias ") } final class ScalaCliAlg[F[_]](implicit From 3b049d60f16ef22a8a7ac5e9ea1d2de79107e0e7 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Wed, 29 Nov 2023 19:11:35 +0100 Subject: [PATCH 11/11] Update logback-classic to 1.4.13 (#3226) --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 45610fed15..e5076c0a90 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -30,7 +30,7 @@ object Dependencies { val http4sEmberServer = "org.http4s" %% "http4s-ember-server" % http4sCore.revision val http4sJdkhttpClient = "org.http4s" %% "http4s-jdk-http-client" % "1.0.0-M9" val log4catsSlf4j = "org.typelevel" %% "log4cats-slf4j" % "2.6.0" - val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.4.12" + val logbackClassic = "ch.qos.logback" % "logback-classic" % "1.4.13" val jjwtApi = "io.jsonwebtoken" % "jjwt-api" % "0.11.5" val jjwtImpl = "io.jsonwebtoken" % "jjwt-impl" % jjwtApi.revision val jjwtJackson = "io.jsonwebtoken" % "jjwt-jackson" % jjwtApi.revision