Skip to content

Commit 8170cf2

Browse files
committed
Avoid duplicated VCSApiAlg.createForkOrGetRepo call
This removes the `VCSApiAlg.createForkOrGetRepo` call in `NurtureAlg` by reusing the result of `createForkOrGetRepoWithDefaultBranch` in `RepoCacheAlg`.
1 parent a8ccd68 commit 8170cf2

File tree

5 files changed

+33
-49
lines changed

5 files changed

+33
-49
lines changed

modules/core/src/main/scala/org/scalasteward/core/application/StewardAlg.scala

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,17 +73,15 @@ final class StewardAlg[F[_]](implicit
7373
private def steward(repo: Repo): F[Either[Throwable, Unit]] = {
7474
val label = s"Steward ${repo.show}"
7575
logger.infoTotalTime(label) {
76-
F.guarantee {
77-
for {
78-
_ <- logger.info(util.string.lineLeftRight(label))
79-
_ <- repoCacheAlg.checkCache(repo)
80-
(attentionNeeded, updates) <- pruningAlg.needsAttention(repo)
81-
result <- {
82-
if (attentionNeeded) nurtureAlg.nurture(repo, updates)
83-
else F.pure(().asRight[Throwable])
84-
}
85-
} yield result
86-
}(gitAlg.removeClone(repo))
76+
logger.attemptLog(util.string.lineLeftRight(label), Some(label)) {
77+
F.guarantee {
78+
for {
79+
fork <- repoCacheAlg.checkCache(repo)
80+
(attentionNeeded, updates) <- pruningAlg.needsAttention(repo)
81+
_ <- if (attentionNeeded) nurtureAlg.nurture(repo, fork, updates) else F.unit
82+
} yield ()
83+
}(gitAlg.removeClone(repo))
84+
}
8785
}
8886
}
8987

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

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,13 @@ import org.scalasteward.core.git.{Branch, Commit, GitAlg}
3030
import org.scalasteward.core.repocache.RepoCacheRepository
3131
import org.scalasteward.core.repoconfig.{PullRequestUpdateStrategy, RepoConfigAlg}
3232
import org.scalasteward.core.scalafix.MigrationAlg
33-
import org.scalasteward.core.util.logger.LoggerOps
34-
import org.scalasteward.core.util.{BracketThrowable, DateTimeAlg, HttpExistenceClient}
35-
import org.scalasteward.core.vcs.data.{NewPullRequestData, Repo}
33+
import org.scalasteward.core.util.{BracketThrowable, HttpExistenceClient}
34+
import org.scalasteward.core.vcs.data.{NewPullRequestData, Repo, RepoOut}
3635
import org.scalasteward.core.vcs.{VCSApiAlg, VCSExtraAlg, VCSRepoAlg}
3736
import org.scalasteward.core.{git, util, vcs}
3837

3938
final class NurtureAlg[F[_]](implicit
4039
config: Config,
41-
dateTimeAlg: DateTimeAlg[F],
4240
editAlg: EditAlg[F],
4341
repoConfigAlg: RepoConfigAlg[F],
4442
gitAlg: GitAlg[F],
@@ -54,27 +52,20 @@ final class NurtureAlg[F[_]](implicit
5452
streamCompiler: Stream.Compiler[F, F],
5553
F: BracketThrowable[F]
5654
) {
57-
def nurture(repo: Repo, updates: List[Update.Single]): F[Either[Throwable, Unit]] = {
58-
val label = s"Nurture ${repo.show}"
59-
logger.infoTotalTime(label) {
60-
logger.attemptLog(util.string.lineLeftRight(label)) {
61-
cloneAndSync(repo).flatMap { case (fork, baseBranch) =>
62-
updateDependencies(repo, fork, baseBranch, updates)
63-
}
64-
}
65-
}
66-
}
55+
def nurture(repo: Repo, fork: RepoOut, updates: List[Update.Single]): F[Unit] =
56+
for {
57+
_ <- logger.info(s"Nurture ${repo.show}")
58+
baseBranch <- cloneAndSync(repo, fork)
59+
_ <- updateDependencies(repo, fork.repo, baseBranch, updates)
60+
} yield ()
6761

68-
def cloneAndSync(repo: Repo): F[(Repo, Branch)] =
62+
def cloneAndSync(repo: Repo, fork: RepoOut): F[Branch] =
6963
for {
7064
_ <- logger.info(s"Clone and synchronize ${repo.show}")
71-
repoOut <- vcsApiAlg.createForkOrGetRepo(repo, config.doNotFork)
72-
_ <-
73-
gitAlg
74-
.cloneExists(repo)
75-
.ifM(F.unit, vcsRepoAlg.clone(repo, repoOut) >> vcsRepoAlg.syncFork(repo, repoOut))
76-
defaultBranch <- vcsApiAlg.parentOrRepo(repoOut, config.doNotFork).map(_.default_branch)
77-
} yield (repoOut.repo, defaultBranch)
65+
cloneAndSync = vcsRepoAlg.clone(repo, fork) >> vcsRepoAlg.syncFork(repo, fork)
66+
_ <- gitAlg.cloneExists(repo).ifM(F.unit, cloneAndSync)
67+
baseBranch <- vcsApiAlg.parentOrRepo(fork, config.doNotFork).map(_.default_branch)
68+
} yield baseBranch
7869

7970
def updateDependencies(
8071
repo: Repo,

modules/core/src/main/scala/org/scalasteward/core/repocache/RepoCacheAlg.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ import org.scalasteward.core.data.{Dependency, DependencyInfo}
2525
import org.scalasteward.core.git.GitAlg
2626
import org.scalasteward.core.repoconfig.RepoConfigAlg
2727
import org.scalasteward.core.util.MonadThrowable
28-
import org.scalasteward.core.util.logger.LoggerOps
2928
import org.scalasteward.core.vcs.data.{Repo, RepoOut}
3029
import org.scalasteward.core.vcs.{VCSApiAlg, VCSRepoAlg}
30+
import scala.util.control.NoStackTrace
3131

3232
final class RepoCacheAlg[F[_]](implicit
3333
buildToolDispatcher: BuildToolDispatcher[F],
@@ -42,10 +42,10 @@ final class RepoCacheAlg[F[_]](implicit
4242
vcsRepoAlg: VCSRepoAlg[F],
4343
F: MonadThrowable[F]
4444
) {
45-
def checkCache(repo: Repo): F[Unit] =
46-
logger.attemptLog_(s"Check cache of ${repo.show}") {
45+
def checkCache(repo: Repo): F[RepoOut] =
46+
logger.info(s"Check cache of ${repo.show}") >> {
4747
F.ifM(refreshErrorAlg.failedRecently(repo))(
48-
logger.info(s"Skipping due to previous error"),
48+
F.raiseError(new Throwable("Skipping due to previous error") with NoStackTrace),
4949
for {
5050
((repoOut, branchOut), cachedSha1) <- (
5151
vcsApiAlg.createForkOrGetRepoWithDefaultBranch(repo, config.doNotFork),
@@ -54,7 +54,7 @@ final class RepoCacheAlg[F[_]](implicit
5454
latestSha1 = branchOut.commit.sha
5555
refreshRequired = cachedSha1.forall(_ =!= latestSha1)
5656
_ <- if (refreshRequired) cloneAndRefreshCache(repo, repoOut) else F.unit
57-
} yield ()
57+
} yield repoOut
5858
)
5959
}
6060

modules/core/src/main/scala/org/scalasteward/core/util/logger.scala

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,19 @@ import scala.concurrent.duration.FiniteDuration
2424

2525
object logger {
2626
implicit final class LoggerOps[F[_]](private val logger: Logger[F]) extends AnyVal {
27-
def attemptLog[A](message: String)(fa: F[A])(implicit
27+
def attemptLog[A](label: String, errorLabel: Option[String] = None)(fa: F[A])(implicit
2828
F: MonadThrowable[F]
2929
): F[Either[Throwable, A]] =
30-
logger.info(message) >> fa.attempt.flatTap {
31-
case Left(t) => logger.error(t)(s"$message failed")
30+
logger.info(label) >> fa.attempt.flatTap {
31+
case Left(t) => logger.error(t)(s"${errorLabel.getOrElse(label)} failed")
3232
case Right(_) => F.unit
3333
}
3434

35-
def attemptLog_[A](message: String)(fa: F[A])(implicit F: MonadThrowable[F]): F[Unit] =
36-
attemptLog(message)(fa).void
37-
3835
def infoTimed[A](msg: FiniteDuration => String)(fa: F[A])(implicit
3936
dateTimeAlg: DateTimeAlg[F],
4037
F: Monad[F]
4138
): F[A] =
42-
dateTimeAlg.timed(fa).flatMap { case (a, duration) =>
43-
logger.info(msg(duration)) >> F.pure(a)
44-
}
39+
dateTimeAlg.timed(fa).flatMap { case (a, duration) => logger.info(msg(duration)).as(a) }
4540

4641
def infoTotalTime[A](label: String)(fa: F[A])(implicit
4742
dateTimeAlg: DateTimeAlg[F],

modules/core/src/test/scala/org/scalasteward/core/util/loggerTest.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import org.scalatest.funsuite.AnyFunSuite
88
import org.scalatest.matchers.should.Matchers
99

1010
class loggerTest extends AnyFunSuite with Matchers {
11-
test("attemptLog_") {
11+
test("attemptLog") {
1212
final case class Err(msg: String) extends Throwable(msg)
1313
val err = Err("hmm?")
1414
val state = mockLogger
15-
.attemptLog_("run")(Sync[MockEff].raiseError(err))
15+
.attemptLog("run")(Sync[MockEff].raiseError(err))
1616
.runS(MockState.empty)
1717
.unsafeRunSync()
1818

0 commit comments

Comments
 (0)