Skip to content

Commit a890c3d

Browse files
authored
Introduce EditAttempt enum (#2242)
1 parent e31b5f7 commit a890c3d

File tree

5 files changed

+83
-38
lines changed

5 files changed

+83
-38
lines changed

modules/core/src/main/scala/org/scalasteward/core/edit/EditAlg.scala

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ import cats.effect.Concurrent
2121
import cats.syntax.all._
2222
import org.scalasteward.core.buildtool.BuildToolDispatcher
2323
import org.scalasteward.core.data.{RepoData, Update}
24+
import org.scalasteward.core.edit.EditAttempt.{ScalafixEdit, UpdateEdit}
2425
import org.scalasteward.core.edit.hooks.HookExecutor
2526
import org.scalasteward.core.edit.scalafix.{ScalafixMigration, ScalafixMigrationsFinder}
2627
import org.scalasteward.core.git
27-
import org.scalasteward.core.git.{Commit, GitAlg}
28+
import org.scalasteward.core.git.GitAlg
2829
import org.scalasteward.core.io.{isSourceFile, FileAlg, WorkspaceAlg}
2930
import org.scalasteward.core.repoconfig.RepoConfig
3031
import org.scalasteward.core.util._
@@ -42,7 +43,11 @@ final class EditAlg[F[_]](implicit
4243
workspaceAlg: WorkspaceAlg[F],
4344
F: Concurrent[F]
4445
) {
45-
def applyUpdate(data: RepoData, update: Update, preCommit: F[Unit] = F.unit): F[List[Commit]] =
46+
def applyUpdate(
47+
data: RepoData,
48+
update: Update,
49+
preCommit: F[Unit] = F.unit
50+
): F[List[EditAttempt]] =
4651
findFilesContainingCurrentVersion(data.repo, data.config, update).flatMap {
4752
case None =>
4853
logger.warn("No files found that contain the current version").as(Nil)
@@ -54,15 +59,17 @@ final class EditAlg[F[_]](implicit
5459
_ <- preCommit
5560
repo = data.repo
5661
migrations = scalafixMigrationsFinder.findMigrations(update)
57-
cs1 <-
62+
scalafixEdits <-
5863
if (migrations.isEmpty) F.pure(Nil)
5964
else
6065
gitAlg.discardChanges(repo) *>
6166
runScalafixMigrations(repo, data.config, migrations) <*
6267
bumpVersion(update, files)
63-
cs2 <- gitAlg.commitAllIfDirty(repo, git.commitMsgFor(update, data.config.commits))
64-
cs3 <- hookExecutor.execPostUpdateHooks(data, update)
65-
} yield cs1 ++ cs2 ++ cs3
68+
updateEdit <- gitAlg
69+
.commitAllIfDirty(repo, git.commitMsgFor(update, data.config.commits))
70+
.map(_.map(commit => UpdateEdit(update, commit)))
71+
hooksEdits <- hookExecutor.execPostUpdateHooks(data, update)
72+
} yield scalafixEdits ++ updateEdit ++ hooksEdits
6673
}
6774
}
6875

@@ -80,14 +87,14 @@ final class EditAlg[F[_]](implicit
8087
repo: Repo,
8188
config: RepoConfig,
8289
migrations: List[ScalafixMigration]
83-
): F[List[Commit]] =
84-
migrations.traverseFilter(runScalafixMigration(repo, config, _))
90+
): F[List[EditAttempt]] =
91+
migrations.traverse(runScalafixMigration(repo, config, _))
8592

8693
private def runScalafixMigration(
8794
repo: Repo,
8895
config: RepoConfig,
8996
migration: ScalafixMigration
90-
): F[Option[Commit]] =
97+
): F[EditAttempt] =
9198
for {
9299
_ <- logger.info(s"Running migration $migration")
93100
result <- logger.attemptLogWarn("Scalafix migration failed")(
@@ -97,7 +104,7 @@ final class EditAlg[F[_]](implicit
97104
msg1 = s"$verb Scalafix rule(s) ${migration.rewriteRules.mkString_(", ")}"
98105
msg2 = migration.doc.map(url => s"See $url for details").toList
99106
maybeCommit <- gitAlg.commitAllIfDirty(repo, msg1, msg2: _*)
100-
} yield maybeCommit
107+
} yield ScalafixEdit(migration, result, maybeCommit)
101108

102109
private def bumpVersion(update: Update, files: Nel[File]): F[Boolean] = {
103110
val actions = UpdateHeuristic.all.map { heuristic =>
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright 2018-2021 Scala Steward contributors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.scalasteward.core.edit
18+
19+
import org.scalasteward.core.data.Update
20+
import org.scalasteward.core.edit.hooks.PostUpdateHook
21+
import org.scalasteward.core.edit.scalafix.ScalafixMigration
22+
import org.scalasteward.core.git.Commit
23+
24+
sealed trait EditAttempt extends Product with Serializable {
25+
def maybeCommit: Option[Commit]
26+
}
27+
28+
object EditAttempt {
29+
final case class UpdateEdit(update: Update, commit: Commit) extends EditAttempt {
30+
override def maybeCommit: Some[Commit] = Some(commit)
31+
}
32+
33+
final case class ScalafixEdit(
34+
migration: ScalafixMigration,
35+
result: Either[Throwable, Unit],
36+
maybeCommit: Option[Commit]
37+
) extends EditAttempt
38+
39+
final case class HookEdit(
40+
hook: PostUpdateHook,
41+
result: Either[Throwable, Unit],
42+
maybeCommit: Option[Commit]
43+
) extends EditAttempt
44+
}

modules/core/src/main/scala/org/scalasteward/core/edit/hooks/HookExecutor.scala

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import cats.MonadThrow
2020
import cats.syntax.all._
2121
import org.scalasteward.core.buildtool.sbt.{sbtArtifactId, sbtGroupId}
2222
import org.scalasteward.core.data._
23-
import org.scalasteward.core.git.{Commit, GitAlg}
23+
import org.scalasteward.core.edit.EditAttempt
24+
import org.scalasteward.core.edit.EditAttempt.HookEdit
25+
import org.scalasteward.core.git.GitAlg
2426
import org.scalasteward.core.io.{ProcessAlg, WorkspaceAlg}
2527
import org.scalasteward.core.repocache.RepoCache
2628
import org.scalasteward.core.scalafmt.{scalafmtArtifactId, scalafmtBinary, scalafmtGroupId}
@@ -36,7 +38,7 @@ final class HookExecutor[F[_]](implicit
3638
workspaceAlg: WorkspaceAlg[F],
3739
F: MonadThrow[F]
3840
) {
39-
def execPostUpdateHooks(data: RepoData, update: Update): F[List[Commit]] =
41+
def execPostUpdateHooks(data: RepoData, update: Update): F[List[EditAttempt]] =
4042
HookExecutor.postUpdateHooks
4143
.filter { hook =>
4244
update.groupId === hook.groupId &&
@@ -45,21 +47,17 @@ final class HookExecutor[F[_]](implicit
4547
hook.enabledByConfig(data.config)
4648
}
4749
.distinctBy(_.command)
48-
.flatTraverse(execPostUpdateHook(data.repo, update, _))
50+
.traverse(execPostUpdateHook(data.repo, update, _))
4951

50-
private def execPostUpdateHook(
51-
repo: Repo,
52-
update: Update,
53-
hook: PostUpdateHook
54-
): F[List[Commit]] =
52+
private def execPostUpdateHook(repo: Repo, update: Update, hook: PostUpdateHook): F[EditAttempt] =
5553
for {
5654
_ <- logger.info(s"Executing post-update hook for ${hook.groupId}:${hook.artifactId.name}")
5755
repoDir <- workspaceAlg.repoDir(repo)
58-
_ <- logger.attemptLogWarn_("Post-update hook failed") {
56+
result <- logger.attemptLogWarn("Post-update hook failed") {
5957
processAlg.execMaybeSandboxed(hook.useSandbox)(hook.command, repoDir)
6058
}
6159
maybeCommit <- gitAlg.commitAllIfDirty(repo, hook.commitMessage(update))
62-
} yield maybeCommit.toList
60+
} yield HookEdit(hook, result.void, maybeCommit)
6361
}
6462

6563
object HookExecutor {

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ import org.scalasteward.core.application.Config
2525
import org.scalasteward.core.coursier.CoursierAlg
2626
import org.scalasteward.core.data.ProcessResult.{Created, Ignored, Updated}
2727
import org.scalasteward.core.data._
28-
import org.scalasteward.core.edit.EditAlg
29-
import org.scalasteward.core.edit.scalafix.ScalafixMigrationsFinder
28+
import org.scalasteward.core.edit.{EditAlg, EditAttempt}
3029
import org.scalasteward.core.git.{Branch, Commit, GitAlg}
3130
import org.scalasteward.core.repoconfig.PullRequestUpdateStrategy
3231
import org.scalasteward.core.util.UrlChecker
@@ -42,7 +41,6 @@ final class NurtureAlg[F[_]](config: Config)(implicit
4241
gitAlg: GitAlg[F],
4342
logger: Logger[F],
4443
pullRequestRepository: PullRequestRepository[F],
45-
scalafixMigrationsFinder: ScalafixMigrationsFinder,
4644
vcsApiAlg: VCSApiAlg[F],
4745
vcsExtraAlg: VCSExtraAlg[F],
4846
vcsRepoAlg: VCSRepoAlg[F],
@@ -148,9 +146,10 @@ final class NurtureAlg[F[_]](config: Config)(implicit
148146
gitAlg.returnToCurrentBranch(data.repo) {
149147
val createBranch = logger.info(s"Create branch ${data.updateBranch.name}") >>
150148
gitAlg.createBranch(data.repo, data.updateBranch)
151-
editAlg.applyUpdate(data.repoData, data.update, createBranch).flatMap { editCommits =>
149+
editAlg.applyUpdate(data.repoData, data.update, createBranch).flatMap { edits =>
150+
val editCommits = edits.flatMap(_.maybeCommit)
152151
if (editCommits.isEmpty) logger.warn("No commits created").as(Ignored)
153-
else pushCommits(data, editCommits) >> createPullRequest(data)
152+
else pushCommits(data, editCommits) >> createPullRequest(data, edits)
154153
}
155154
}
156155

@@ -162,7 +161,7 @@ final class NurtureAlg[F[_]](config: Config)(implicit
162161
_ <- gitAlg.push(data.repo, data.updateBranch)
163162
} yield Updated
164163

165-
def createPullRequest(data: UpdateData): F[ProcessResult] =
164+
def createPullRequest(data: UpdateData, edits: List[EditAttempt]): F[ProcessResult] =
166165
for {
167166
_ <- logger.info(s"Create PR ${data.updateBranch.name}")
168167
dependenciesWithNextVersion =
@@ -178,13 +177,12 @@ final class NurtureAlg[F[_]](config: Config)(implicit
178177
.traverse(vcsExtraAlg.getReleaseRelatedUrls(_, data.update))
179178
filesWithOldVersion <- gitAlg.findFilesContaining(data.repo, data.update.currentVersion)
180179
branchName = vcs.createBranch(config.vcsType, data.fork, data.update)
181-
migrations = scalafixMigrationsFinder.findMigrations(data.update)
182180
requestData = NewPullRequestData.from(
183181
data,
184182
branchName,
183+
edits,
185184
existingArtifactUrlsMap,
186185
releaseRelatedUrls.getOrElse(List.empty),
187-
migrations,
188186
filesWithOldVersion
189187
)
190188
pr <- vcsApiAlg.createPullRequest(data.repo, requestData)
@@ -237,7 +235,8 @@ final class NurtureAlg[F[_]](config: Config)(implicit
237235
s"Merge branch ${data.baseBranch.name} into ${data.updateBranch.name} and apply again"
238236
)
239237
maybeMergeCommit <- gitAlg.mergeTheirs(data.repo, data.baseBranch)
240-
editCommits <- editAlg.applyUpdate(data.repoData, data.update)
238+
edits <- editAlg.applyUpdate(data.repoData, data.update)
239+
editCommits = edits.flatMap(_.maybeCommit)
241240
result <- pushCommits(data, maybeMergeCommit.toList ++ editCommits)
242241
} yield result
243242
}

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import io.circe.Encoder
2121
import io.circe.generic.semiauto._
2222
import org.http4s.Uri
2323
import org.scalasteward.core.data._
24+
import org.scalasteward.core.edit.EditAttempt
25+
import org.scalasteward.core.edit.EditAttempt.ScalafixEdit
2426
import org.scalasteward.core.edit.scalafix.ScalafixMigration
2527
import org.scalasteward.core.git
2628
import org.scalasteward.core.git.Branch
@@ -48,12 +50,13 @@ object NewPullRequestData {
4850

4951
def bodyFor(
5052
update: Update,
53+
edits: List[EditAttempt],
5154
artifactIdToUrl: Map[String, Uri],
5255
releaseRelatedUrls: List[ReleaseRelatedUrl],
53-
migrations: List[ScalafixMigration],
5456
filesWithOldVersion: List[String]
5557
): String = {
5658
val artifacts = artifactsWithOptionalUrl(update, artifactIdToUrl)
59+
val migrations = edits.collect { case ScalafixEdit(migration, _, _) => migration }
5760
val (migrationLabel, appliedMigrations) = migrationNote(migrations)
5861
val (oldVersionLabel, oldVersionDetails) = oldVersionNote(filesWithOldVersion, update)
5962
val details = appliedMigrations.toList ++
@@ -195,20 +198,14 @@ object NewPullRequestData {
195198
def from(
196199
data: UpdateData,
197200
branchName: String,
201+
edits: List[EditAttempt] = List.empty,
198202
artifactIdToUrl: Map[String, Uri] = Map.empty,
199203
releaseRelatedUrls: List[ReleaseRelatedUrl] = List.empty,
200-
migrations: List[ScalafixMigration] = List.empty,
201204
filesWithOldVersion: List[String] = List.empty
202205
): NewPullRequestData =
203206
NewPullRequestData(
204207
title = git.commitMsgFor(data.update, data.repoConfig.commits),
205-
body = bodyFor(
206-
data.update,
207-
artifactIdToUrl,
208-
releaseRelatedUrls,
209-
migrations,
210-
filesWithOldVersion
211-
),
208+
body = bodyFor(data.update, edits, artifactIdToUrl, releaseRelatedUrls, filesWithOldVersion),
212209
head = branchName,
213210
base = data.baseBranch
214211
)

0 commit comments

Comments
 (0)