Skip to content

Commit 32b3a7a

Browse files
author
Devon Stewart
committed
Bubbling Ref out of instances of seenBranches
1 parent 6595ca7 commit 32b3a7a

File tree

1 file changed

+35
-40
lines changed

1 file changed

+35
-40
lines changed

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

Lines changed: 35 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ final class NurtureAlg[F[_]](config: Config)(implicit
5757
for {
5858
_ <- logger.info(s"Nurture ${data.repo.show}")
5959
baseBranch <- cloneAndSync(data.repo, fork)
60-
seenBranches <- Ref[F].of(List.empty[Branch])
61-
_ <- updateDependencies(data, fork.repo, baseBranch, updates, seenBranches)
60+
_ <- updateDependencies(data, fork.repo, baseBranch, updates)
6261
} yield ()
6362

6463
def cloneAndSync(repo: Repo, fork: RepoOut): F[Branch] =
@@ -71,35 +70,40 @@ final class NurtureAlg[F[_]](config: Config)(implicit
7170
data: RepoData,
7271
fork: Repo,
7372
baseBranch: Branch,
74-
updates: List[Update.Single],
75-
seenBranches: Ref[F, List[Branch]]
73+
updates: List[Update.Single]
7674
): F[Unit] =
7775
for {
7876
_ <- F.unit
7977
grouped = Update.groupByGroupId(updates)
8078
_ <- logger.info(util.logger.showUpdates(grouped))
8179
baseSha1 <- gitAlg.latestSha1(data.repo, baseBranch)
80+
seenBranches <- Ref[F].of(List.empty[Branch])
8281
_ <- NurtureAlg.processUpdates(
8382
grouped,
8483
update => {
8584
val updateData =
8685
UpdateData(data, fork, update, baseBranch, baseSha1, git.branchFor(update))
87-
processUpdate(updateData, seenBranches).flatMap {
88-
case result @ Created(newPrNumber) =>
89-
(for {
90-
_ <- closeObsoletePullRequests(updateData, newPrNumber)
91-
_ <- seenBranches.update(updateData.updateBranch :: _)
92-
} yield ()).as[ProcessResult](result)
93-
case result @ Updated =>
94-
seenBranches.update(updateData.updateBranch :: _).as[ProcessResult](result)
95-
case result @ Ignored => F.pure(result)
96-
}
86+
seenBranches
87+
.getAndUpdate(
88+
identity
89+
) // Suppress Codacity's faulty `.get` detection, https://twitter.com/blast_hardchese/status/1373376444827508737
90+
.flatMap(processUpdate(updateData, _))
91+
.flatMap {
92+
case result @ Created(newPrNumber) =>
93+
(for {
94+
_ <- closeObsoletePullRequests(updateData, newPrNumber)
95+
_ <- seenBranches.update(updateData.updateBranch :: _)
96+
} yield ()).as[ProcessResult](result)
97+
case result @ Updated =>
98+
seenBranches.update(updateData.updateBranch :: _).as[ProcessResult](result)
99+
case result @ Ignored => F.pure(result)
100+
}
97101
},
98102
data.config.updates.limit
99103
)
100104
} yield ()
101105

102-
def processUpdate(data: UpdateData, seenBranches: Ref[F, List[Branch]]): F[ProcessResult] =
106+
def processUpdate(data: UpdateData, seenBranches: List[Branch]): F[ProcessResult] =
103107
for {
104108
_ <- logger.info(s"Process update ${data.update.show}")
105109
head = vcs.listingBranch(config.vcsType, data.fork, data.update)
@@ -155,30 +159,19 @@ final class NurtureAlg[F[_]](config: Config)(implicit
155159
gitAlg.removeBranch(repo, branch)
156160
}
157161

158-
def ensureDistinctBranch(
159-
data: UpdateData,
160-
seenBranches: Ref[F, List[Branch]],
161-
whenDistinct: F[ProcessResult]
162-
): F[ProcessResult] =
163-
seenBranches.get
164-
.flatMap(_.forallM(gitAlg.diff(data.repo, _).map(_.nonEmpty)))
165-
.ifM(
166-
whenDistinct,
167-
logger.warn("Discovered a duplicate branch, not pushing").as(Ignored)
168-
)
169-
170-
def applyNewUpdate(data: UpdateData, seenBranches: Ref[F, List[Branch]]): F[ProcessResult] =
162+
def applyNewUpdate(data: UpdateData, seenBranches: List[Branch]): F[ProcessResult] =
171163
gitAlg.returnToCurrentBranch(data.repo) {
172164
val createBranch = logger.info(s"Create branch ${data.updateBranch.name}") >>
173165
gitAlg.createBranch(data.repo, data.updateBranch)
174166
editAlg.applyUpdate(data.repoData, data.update, createBranch).flatMap { editCommits =>
175167
if (editCommits.isEmpty) logger.warn("No commits created").as(Ignored)
176168
else
177-
ensureDistinctBranch(
178-
data,
179-
seenBranches,
180-
pushCommits(data, editCommits) >> createPullRequest(data)
181-
)
169+
seenBranches
170+
.forallM(gitAlg.diff(data.repo, _).map(_.nonEmpty))
171+
.ifM(
172+
pushCommits(data, editCommits) >> createPullRequest(data),
173+
logger.warn("Discovered a duplicate branch, not pushing").as[ProcessResult](Ignored)
174+
)
182175
}
183176
}
184177

@@ -227,7 +220,7 @@ final class NurtureAlg[F[_]](config: Config)(implicit
227220
_ <- logger.info(s"Created PR ${pr.html_url}")
228221
} yield Created(pr.number)
229222

230-
def updatePullRequest(data: UpdateData, seenBranches: Ref[F, List[Branch]]): F[ProcessResult] =
223+
def updatePullRequest(data: UpdateData, seenBranches: List[Branch]): F[ProcessResult] =
231224
if (data.repoConfig.updatePullRequestsOrDefault =!= PullRequestUpdateStrategy.Never)
232225
gitAlg.returnToCurrentBranch(data.repo) {
233226
for {
@@ -260,18 +253,20 @@ final class NurtureAlg[F[_]](config: Config)(implicit
260253
result.flatMap { case (update, msg) => logger.info(msg).as(update) }
261254
}
262255

263-
def mergeAndApplyAgain(data: UpdateData, seenBranches: Ref[F, List[Branch]]): F[ProcessResult] =
256+
def mergeAndApplyAgain(data: UpdateData, seenBranches: List[Branch]): F[ProcessResult] =
264257
for {
265258
_ <- logger.info(
266259
s"Merge branch ${data.baseBranch.name} into ${data.updateBranch.name} and apply again"
267260
)
268261
maybeMergeCommit <- gitAlg.mergeTheirs(data.repo, data.baseBranch)
269262
editCommits <- editAlg.applyUpdate(data.repoData, data.update)
270-
result <- ensureDistinctBranch(
271-
data,
272-
seenBranches,
273-
pushCommits(data, maybeMergeCommit.toList ++ editCommits)
274-
)
263+
result <-
264+
seenBranches
265+
.forallM(gitAlg.diff(data.repo, _).map(_.nonEmpty))
266+
.ifM(
267+
pushCommits(data, maybeMergeCommit.toList ++ editCommits),
268+
logger.warn("Discovered a duplicate branch, not pushing").as[ProcessResult](Ignored)
269+
)
275270
} yield result
276271
}
277272

0 commit comments

Comments
 (0)