Skip to content

Commit 5bfe93a

Browse files
committed
Merge branch 'main' into topic/use-git-grep-in-scanner
2 parents 68d374b + 1a9c3c1 commit 5bfe93a

File tree

14 files changed

+144
-120
lines changed

14 files changed

+144
-120
lines changed

.scalafmt.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version = 3.7.15
1+
version = 3.7.17
22
runner.dialect = scala213
33
assumeStandardLibraryStripMargin = true
44
align.openParenCallSite = false

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ Thanks goes to these wonderful people for contributing to Scala Steward:
112112
* [Ikenna Darlington Ogbajie](https://github.com/idarlington)
113113
* [Ingar Abrahamsen](https://github.com/ingarabr)
114114
* [Jakub Kozłowski](https://github.com/kubukoz)
115+
* [Jamie Thompson](https://github.com/bishabosha)
115116
* [Javier Arrieta](https://github.com/javierarrieta)
116117
* [JCollier](https://github.com/Slakah)
117118
* [jduval87](https://github.com/jduval87)
@@ -127,7 +128,7 @@ Thanks goes to these wonderful people for contributing to Scala Steward:
127128
* [Leonhard Riedißer](https://github.com/L7R7)
128129
* [Maksym Ochenashko](https://github.com/iRevive)
129130
* [Manuel Cueto](https://github.com/manuelcueto)
130-
* [Marco Zühlke](https://github.com/mzuehlke)
131+
* [Marco Zühlke](https://github.com/mzuehlke)
131132
* [Mark Canlas](https://github.com/mcanlas)
132133
* [Mark van der Tol](https://github.com/markvandertol)
133134
* [MaT1g3R](https://github.com/MaT1g3R)

modules/core/src/main/resources/artifact-migrations.v2.conf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,4 +994,9 @@ changes = [
994994
groupIdAfter = com.github.sbt
995995
artifactIdAfter = sbt-osgi
996996
},
997+
{
998+
groupIdBefore = com.iheart
999+
groupIdAfter = io.github.play-swagger
1000+
artifactIdAfter = sbt-play-swagger
1001+
},
9971002
]

modules/core/src/main/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlg.scala

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,27 @@ import org.scalasteward.core.io.{FileAlg, ProcessAlg, WorkspaceAlg}
2828
import org.scalasteward.core.util.Nel
2929
import org.typelevel.log4cats.Logger
3030

31+
object ScalaCliAlg {
32+
val directives =
33+
// sourced from https://github.com/VirtusLab/scala-cli/blob/9e22d4a91ba8699ac2727d2ac3042d64abe951e1/modules/directives/src/main/scala/scala/build/preprocessing/directives/Dependency.scala#L33-L48
34+
List(
35+
"lib",
36+
"libs",
37+
"dep",
38+
"deps",
39+
"dependencies",
40+
"test.dependency",
41+
"test.dep",
42+
"test.deps",
43+
"test.dependencies",
44+
"compileOnly.lib",
45+
"compileOnly.libs",
46+
"compileOnly.dep",
47+
"compileOnly.deps",
48+
"compileOnly.dependencies"
49+
).map(alias => s"//> using $alias ")
50+
}
51+
3152
final class ScalaCliAlg[F[_]](implicit
3253
fileAlg: FileAlg[F],
3354
gitAlg: GitAlg[F],
@@ -42,8 +63,8 @@ final class ScalaCliAlg[F[_]](implicit
4263
override def containsBuild(buildRoot: BuildRoot): F[Boolean] = {
4364
val buildRootPath = buildRoot.relativePath.dropWhile(Set('.', '/'))
4465
val extensions = Set(".sc", ".scala")
45-
gitAlg
46-
.findFilesContaining(buildRoot.repo, "//> using lib ")
66+
ScalaCliAlg.directives
67+
.flatTraverse(gitAlg.findFilesContaining(buildRoot.repo, _))
4768
.map(_.exists(path => path.startsWith(buildRootPath) && extensions.exists(path.endsWith)))
4869
}
4970

modules/core/src/main/scala/org/scalasteward/core/forge/data/NewPullRequestData.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,12 +314,18 @@ object NewPullRequestData {
314314
val semverLabels =
315315
update.on(u => semverForUpdate(u), _.updates.flatMap(semverForUpdate(_)).distinct)
316316

317+
val artifactMigrationsLabel = Option.when {
318+
update.asSingleUpdates
319+
.flatMap(_.forArtifactIds.toList)
320+
.exists(u => u.newerGroupId.nonEmpty || u.newerArtifactId.nonEmpty)
321+
}("artifact-migrations")
317322
val scalafixLabel = edits.collectFirst { case _: ScalafixEdit => "scalafix-migrations" }
318323
val oldVersionLabel = Option.when(filesWithOldVersion.nonEmpty)("old-version-remains")
319324

320325
List.concat(
321326
updateTypeLabels(update),
322327
semverLabels,
328+
artifactMigrationsLabel,
323329
scalafixLabel,
324330
oldVersionLabel,
325331
List(commitCountLabel)

modules/core/src/main/scala/org/scalasteward/core/git/FileGitAlg.scala

Lines changed: 3 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ final class FileGitAlg[F[_]](config: GitCfg)(implicit
9797

9898
override def hasConflicts(repo: File, branch: Branch, base: Branch): F[Boolean] = {
9999
val tryMerge = git_("merge", "--no-commit", "--no-ff", branch.name)(repo)
100-
val abortMerge = git_("merge", "--abort")(repo).void
100+
val abortMerge = git_("merge", "--abort")(repo).attempt.void
101101

102102
returnToCurrentBranch(repo) {
103103
checkoutBranch(repo, base) >> F.guarantee(tryMerge, abortMerge).attempt.map(_.isLeft)
@@ -114,41 +114,14 @@ final class FileGitAlg[F[_]](config: GitCfg)(implicit
114114
git("rev-parse", "--verify", branch.name)(repo)
115115
.flatMap(lines => F.fromEither(Sha1.from(lines.mkString("").trim)))
116116

117-
override def mergeTheirs(repo: File, branch: Branch): F[Option[Commit]] =
118-
for {
119-
before <- latestSha1(repo, Branch.head)
120-
_ <- git_("merge", "--strategy-option=theirs", sign, branch.name)(repo).void
121-
.handleErrorWith { throwable =>
122-
// Resolve CONFLICT (modify/delete) by deleting unmerged files:
123-
for {
124-
unmergedFiles <- git("diff", "--name-only", "--diff-filter=U")(repo)
125-
_ <- Nel
126-
.fromList(unmergedFiles.filter(_.nonEmpty))
127-
.fold(F.raiseError[Unit](throwable))(_.traverse_(file => git_("rm", file)(repo)))
128-
_ <- git_("commit", "--all", "--no-edit", sign)(repo)
129-
} yield ()
130-
}
131-
after <- latestSha1(repo, Branch.head)
132-
} yield Option.when(before =!= after)(Commit(after))
133-
134117
override def push(repo: File, branch: Branch): F[Unit] =
135118
git_("push", "--force", "--set-upstream", "origin", branch.name)(repo).void
136119

137120
override def removeClone(repo: File): F[Unit] =
138121
fileAlg.deleteForce(repo)
139122

140-
override def revertChanges(repo: File, base: Branch): F[Option[Commit]] = {
141-
val range = dotdot(base, Branch.head)
142-
git("log", "--pretty=format:%h %p", range)(repo).flatMap { commitsWithParents =>
143-
val commitsUntilMerge = commitsWithParents.map(_.split(' ')).takeWhile(_.length === 2)
144-
val commits = commitsUntilMerge.flatMap(_.headOption)
145-
if (commits.isEmpty) F.pure(None)
146-
else {
147-
val msg = CommitMsg(s"Revert commit(s) " + commits.mkString(", "))
148-
git_("revert" :: "--no-commit" :: commits: _*)(repo) >> commitAllIfDirty(repo, msg)
149-
}
150-
}
151-
}
123+
override def resetHard(repo: File, base: Branch): F[Unit] =
124+
git_("reset", "--hard", base.name)(repo).void
152125

153126
override def setAuthor(repo: File, author: Author): F[Unit] =
154127
for {

modules/core/src/main/scala/org/scalasteward/core/git/GenGitAlg.scala

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,11 @@ trait GenGitAlg[F[_], Repo] {
6666

6767
def latestSha1(repo: Repo, branch: Branch): F[Sha1]
6868

69-
/** Merges `branch` into the current branch using `theirs` as merge strategy option. */
70-
def mergeTheirs(repo: Repo, branch: Branch): F[Option[Commit]]
71-
7269
def push(repo: Repo, branch: Branch): F[Unit]
7370

7471
def removeClone(repo: Repo): F[Unit]
7572

76-
def revertChanges(repo: Repo, base: Branch): F[Option[Commit]]
73+
def resetHard(repo: Repo, base: Branch): F[Unit]
7774

7875
def setAuthor(repo: Repo, author: Author): F[Unit]
7976

@@ -152,17 +149,14 @@ trait GenGitAlg[F[_], Repo] {
152149
override def latestSha1(repo: A, branch: Branch): F[Sha1] =
153150
f(repo).flatMap(self.latestSha1(_, branch))
154151

155-
override def mergeTheirs(repo: A, branch: Branch): F[Option[Commit]] =
156-
f(repo).flatMap(self.mergeTheirs(_, branch))
157-
158152
override def push(repo: A, branch: Branch): F[Unit] =
159153
f(repo).flatMap(self.push(_, branch))
160154

161155
override def removeClone(repo: A): F[Unit] =
162156
f(repo).flatMap(self.removeClone)
163157

164-
override def revertChanges(repo: A, base: Branch): F[Option[Commit]] =
165-
f(repo).flatMap(self.revertChanges(_, base))
158+
override def resetHard(repo: A, base: Branch): F[Unit] =
159+
f(repo).flatMap(self.resetHard(_, base))
166160

167161
override def setAuthor(repo: A, author: Author): F[Unit] =
168162
f(repo).flatMap(self.setAuthor(_, author))

modules/core/src/main/scala/org/scalasteward/core/nurture/NurtureAlg.scala

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ final class NurtureAlg[F[_]](config: ForgeCfg)(implicit
267267
gitAlg.returnToCurrentBranch(data.repo) {
268268
gitAlg.checkoutBranch(data.repo, data.updateBranch) >>
269269
shouldBeUpdated(data).ifM(
270-
ifTrue = mergeAndApplyAgain(number, data),
270+
ifTrue = resetAndApplyAgain(number, data),
271271
ifFalse = (Ignored: ProcessResult).pure
272272
)
273273
}
@@ -293,22 +293,19 @@ final class NurtureAlg[F[_]](config: ForgeCfg)(implicit
293293
result.flatMap { case (update, msg) => logger.info(msg).as(update) }
294294
}
295295

296-
private def mergeAndApplyAgain(number: PullRequestNumber, data: UpdateData): F[ProcessResult] =
296+
private def resetAndApplyAgain(number: PullRequestNumber, data: UpdateData): F[ProcessResult] =
297297
for {
298298
_ <- logger.info(
299-
s"Merge branch ${data.baseBranch.name} into ${data.updateBranch.name} and apply again"
299+
s"Reset ${data.updateBranch.name} to ${data.baseBranch.name} and apply again"
300300
)
301-
maybeRevertCommit <- gitAlg.revertChanges(data.repo, data.baseBranch)
302-
maybeMergeCommit <- gitAlg.mergeTheirs(data.repo, data.baseBranch)
301+
_ <- gitAlg.resetHard(data.repo, data.baseBranch)
303302
edits <- data.update.on(
304303
update = editAlg.applyUpdate(data.repoData, _),
305304
grouped = _.updates.flatTraverse(editAlg.applyUpdate(data.repoData, _))
306305
)
307306
editCommits = edits.flatMap(_.commits)
308-
commits = maybeRevertCommit.toList ++ maybeMergeCommit.toList ++ editCommits
309-
result <- pushCommits(data, commits)
307+
result <- pushCommits(data, editCommits)
310308
requestData <- preparePullRequest(data, edits)
311309
_ <- forgeApiAlg.updatePullRequest(number: PullRequestNumber, data.repo, requestData)
312310
} yield result
313-
314311
}

modules/core/src/test/scala/org/scalasteward/core/buildtool/BuildToolDispatcherTest.scala

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.scalasteward.core.mock.MockState.TraceEntry.{Cmd, Log}
1010
import org.scalasteward.core.repoconfig.{BuildRootConfig, RepoConfig}
1111
import org.scalasteward.core.scalafmt
1212
import org.scalasteward.core.scalafmt.scalafmtConfName
13+
import org.scalasteward.core.buildtool.scalacli.ScalaCliAlg
1314

1415
class BuildToolDispatcherTest extends FunSuite {
1516
test("getDependencies") {
@@ -28,23 +29,33 @@ class BuildToolDispatcherTest extends FunSuite {
2829
val (state, deps) =
2930
buildToolDispatcher.getDependencies(repo, repoConfig).runSA(initial).unsafeRunSync()
3031

32+
val allGreps = ScalaCliAlg.directives.map { search =>
33+
Cmd.git(
34+
repoDir,
35+
"grep",
36+
"-I",
37+
"--fixed-strings",
38+
"--files-with-matches",
39+
search
40+
)
41+
}
42+
3143
val expectedState = initial.copy(trace =
32-
Vector(
33-
Cmd("test", "-f", s"$repoDir/pom.xml"),
34-
Cmd("test", "-f", s"$repoDir/build.sc"),
35-
Cmd("test", "-f", s"$repoDir/build.sbt"),
36-
Cmd.gitGrep(repoDir, "//> using lib "),
37-
Cmd("test", "-f", s"$repoDir/mvn-build/pom.xml"),
38-
Cmd("test", "-f", s"$repoDir/mvn-build/build.sc"),
39-
Cmd("test", "-f", s"$repoDir/mvn-build/build.sbt"),
40-
Cmd.gitGrep(repoDir, "//> using lib "),
41-
Log("Get dependencies in . from sbt"),
42-
Cmd("read", s"$repoDir/project/build.properties"),
43-
Cmd("test", "-d", s"$repoDir/project"),
44-
Cmd("test", "-d", s"$repoDir/project/project"),
45-
Cmd("read", "classpath:StewardPlugin_1_0_0.scala"),
46-
Cmd("write", s"$repoDir/project/scala-steward-StewardPlugin_1_0_0.scala"),
47-
Cmd("write", s"$repoDir/project/project/scala-steward-StewardPlugin_1_0_0.scala"),
44+
Cmd("test", "-f", s"$repoDir/pom.xml") +:
45+
Cmd("test", "-f", s"$repoDir/build.sc") +:
46+
Cmd("test", "-f", s"$repoDir/build.sbt") +:
47+
allGreps ++:
48+
Cmd("test", "-f", s"$repoDir/mvn-build/pom.xml") +:
49+
Cmd("test", "-f", s"$repoDir/mvn-build/build.sc") +:
50+
Cmd("test", "-f", s"$repoDir/mvn-build/build.sbt") +:
51+
allGreps ++:
52+
Log("Get dependencies in . from sbt") +:
53+
Cmd("read", s"$repoDir/project/build.properties") +:
54+
Cmd("test", "-d", s"$repoDir/project") +:
55+
Cmd("test", "-d", s"$repoDir/project/project") +:
56+
Cmd("read", "classpath:StewardPlugin_1_0_0.scala") +:
57+
Cmd("write", s"$repoDir/project/scala-steward-StewardPlugin_1_0_0.scala") +:
58+
Cmd("write", s"$repoDir/project/project/scala-steward-StewardPlugin_1_0_0.scala") +:
4859
Cmd.execSandboxed(
4960
repoDir,
5061
"sbt",
@@ -53,26 +64,26 @@ class BuildToolDispatcherTest extends FunSuite {
5364
"-Dsbt.supershell=false",
5465
"-Dsbt.server.forcestart=true",
5566
s";$crossStewardDependencies;$reloadPlugins;$stewardDependencies"
56-
),
57-
Cmd("rm", "-rf", s"$repoDir/project/project/scala-steward-StewardPlugin_1_0_0.scala"),
58-
Cmd("rm", "-rf", s"$repoDir/project/scala-steward-StewardPlugin_1_0_0.scala"),
59-
Cmd("read", s"$repoDir/$scalafmtConfName"),
60-
Log("Get dependencies in mvn-build from Maven"),
67+
) +:
68+
Cmd("rm", "-rf", s"$repoDir/project/project/scala-steward-StewardPlugin_1_0_0.scala") +:
69+
Cmd("rm", "-rf", s"$repoDir/project/scala-steward-StewardPlugin_1_0_0.scala") +:
70+
Cmd("read", s"$repoDir/$scalafmtConfName") +:
71+
Log("Get dependencies in mvn-build from Maven") +:
6172
Cmd.execSandboxed(
6273
repoDir / "mvn-build",
6374
"mvn",
6475
maven.args.batchMode,
6576
maven.command.listDependencies,
6677
maven.args.excludeTransitive
67-
),
78+
) +:
6879
Cmd.execSandboxed(
6980
repoDir / "mvn-build",
7081
"mvn",
7182
maven.args.batchMode,
7283
maven.command.listRepositories
73-
),
74-
Cmd("read", s"$repoDir/mvn-build/$scalafmtConfName")
75-
)
84+
) +:
85+
Cmd("read", s"$repoDir/mvn-build/$scalafmtConfName") +:
86+
Vector.empty[MockState.TraceEntry]
7687
)
7788

7889
assertEquals(state, expectedState)

modules/core/src/test/scala/org/scalasteward/core/buildtool/scalacli/ScalaCliAlgTest.scala

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import org.scalasteward.core.mock.MockState
1010
import org.scalasteward.core.mock.MockState.TraceEntry.{Cmd, Log}
1111
import org.scalasteward.core.util.Nel
1212

13+
import cats.syntax.parallel._
14+
1315
class ScalaCliAlgTest extends CatsEffectSuite {
1416
test("containsBuild: directive in non-source file") {
1517
val repo = Repo("user", "repo")
@@ -23,6 +25,25 @@ class ScalaCliAlgTest extends CatsEffectSuite {
2325
assertIO(obtained, false)
2426
}
2527

28+
test("containsBuild: directive with test.dep, dep, and lib") {
29+
val repo = Repo("user", "repo")
30+
val buildRoot = BuildRoot(repo, ".")
31+
val repoDir = workspaceAlg.repoDir(repo).unsafeRunSync()
32+
val fileWithUsingDirective = "project.scala"
33+
34+
ScalaCliAlg.directives
35+
.map { search =>
36+
val grepCmd =
37+
Cmd.git(repoDir, "grep", "-I", "--fixed-strings", "--files-with-matches", search)
38+
val initial =
39+
MockState.empty.copy(commandOutputs = Map(grepCmd -> Right(List(fileWithUsingDirective))))
40+
val obtained = scalaCliAlg.containsBuild(buildRoot).runA(initial)
41+
assertIO(obtained, true)
42+
}
43+
.parSequence
44+
.void
45+
}
46+
2647
test("getDependencies") {
2748
val repo = Repo("user", "repo")
2849
val buildRoot = BuildRoot(repo, ".")

0 commit comments

Comments
 (0)