Skip to content

Commit 0c7fa38

Browse files
committed
Parse RepoConfig only once
Instead of reading and parsing a repo's config twice in `RepoCacheAlg` and `BuildToolDispatcher` we now only parse it once in `RepoCacheAlg` and then pass that value to `BuildToolDispatcher`.
1 parent fc51ba0 commit 0c7fa38

File tree

5 files changed

+53
-49
lines changed

5 files changed

+53
-49
lines changed

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,19 @@ import better.files.File
2020
import cats.effect.{BracketThrow, ExitCode}
2121
import cats.syntax.all._
2222
import fs2.Stream
23-
import org.typelevel.log4cats.Logger
2423
import org.scalasteward.core.buildtool.sbt.SbtAlg
25-
import org.scalasteward.core.data.RepoData
2624
import org.scalasteward.core.git.GitAlg
2725
import org.scalasteward.core.io.{FileAlg, WorkspaceAlg}
2826
import org.scalasteward.core.nurture.NurtureAlg
2927
import org.scalasteward.core.repocache.RepoCacheAlg
30-
import org.scalasteward.core.repoconfig.RepoConfigAlg
3128
import org.scalasteward.core.update.PruningAlg
3229
import org.scalasteward.core.util
3330
import org.scalasteward.core.util.DateTimeAlg
3431
import org.scalasteward.core.util.logger.LoggerOps
3532
import org.scalasteward.core.vcs.data.Repo
3633
import org.scalasteward.core.vcs.github.{GitHubApp, GitHubAppApiAlg, GitHubAuthAlg}
34+
import org.typelevel.log4cats.Logger
35+
3736
import scala.concurrent.duration._
3837

3938
final class StewardAlg[F[_]](config: Config)(implicit
@@ -46,7 +45,6 @@ final class StewardAlg[F[_]](config: Config)(implicit
4645
nurtureAlg: NurtureAlg[F],
4746
pruningAlg: PruningAlg[F],
4847
repoCacheAlg: RepoCacheAlg[F],
49-
repoConfigAlg: RepoConfigAlg[F],
5048
sbtAlg: SbtAlg[F],
5149
selfCheckAlg: SelfCheckAlg[F],
5250
streamCompiler: Stream.Compiler[F, F],
@@ -90,9 +88,7 @@ final class StewardAlg[F[_]](config: Config)(implicit
9088
logger.attemptLogLabel(util.string.lineLeftRight(label), Some(label)) {
9189
F.guarantee {
9290
for {
93-
(cache, fork) <- repoCacheAlg.checkCache(repo)
94-
config <- repoConfigAlg.mergeWithDefault(cache.maybeRepoConfig)
95-
data = RepoData(repo, cache, config)
91+
(data, fork) <- repoCacheAlg.checkCache(repo)
9692
(attentionNeeded, updates) <- pruningAlg.needsAttention(data)
9793
_ <- if (attentionNeeded) nurtureAlg.nurture(data, fork, updates) else F.unit
9894
} yield ()

modules/core/src/main/scala/org/scalasteward/core/buildtool/BuildToolDispatcher.scala

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import org.scalasteward.core.buildtool.mill.MillAlg
2424
import org.scalasteward.core.buildtool.sbt.SbtAlg
2525
import org.scalasteward.core.data.Scope
2626
import org.scalasteward.core.edit.scalafix.ScalafixMigration
27-
import org.scalasteward.core.repoconfig.RepoConfigAlg
27+
import org.scalasteward.core.repoconfig.RepoConfig
2828
import org.scalasteward.core.scalafmt.ScalafmtAlg
2929
import org.scalasteward.core.vcs.data.{BuildRoot, Repo}
3030

@@ -33,29 +33,23 @@ final class BuildToolDispatcher[F[_]](config: Config)(implicit
3333
millAlg: MillAlg[F],
3434
sbtAlg: SbtAlg[F],
3535
scalafmtAlg: ScalafmtAlg[F],
36-
repoConfigAlg: RepoConfigAlg[F],
3736
F: Monad[F]
3837
) {
39-
def getDependencies(repo: Repo): F[List[Scope.Dependencies]] =
40-
getBuildRootsAndTools(repo).flatMap(_.flatTraverse { case (buildRoot, buildTools) =>
38+
def getDependencies(repo: Repo, repoConfig: RepoConfig): F[List[Scope.Dependencies]] =
39+
getBuildRootsAndTools(repo, repoConfig).flatMap(_.flatTraverse { case (buildRoot, buildTools) =>
4140
for {
4241
dependencies <- buildTools.flatTraverse(_.getDependencies(buildRoot))
4342
additionalDependencies <- getAdditionalDependencies(buildRoot)
4443
} yield Scope.combineByResolvers(additionalDependencies ::: dependencies)
4544
})
4645

47-
def runMigration(repo: Repo, migration: ScalafixMigration): F[Unit] =
48-
getBuildRootsAndTools(repo).flatMap(_.traverse_ { case (buildRoot, buildTools) =>
46+
def runMigration(repo: Repo, repoConfig: RepoConfig, migration: ScalafixMigration): F[Unit] =
47+
getBuildRootsAndTools(repo, repoConfig).flatMap(_.traverse_ { case (buildRoot, buildTools) =>
4948
buildTools.traverse_(_.runMigration(buildRoot, migration))
5049
})
5150

52-
private def getBuildRoots(repo: Repo): F[List[BuildRoot]] =
53-
for {
54-
repoConfigOpt <- repoConfigAlg.readRepoConfig(repo)
55-
repoConfig <- repoConfigAlg.mergeWithDefault(repoConfigOpt)
56-
buildRoots = repoConfig.buildRootsOrDefault
57-
.map(config => BuildRoot(repo, config.relativePath))
58-
} yield buildRoots
51+
private def getBuildRoots(repo: Repo, repoConfig: RepoConfig): List[BuildRoot] =
52+
repoConfig.buildRootsOrDefault.map(buildRootCfg => BuildRoot(repo, buildRootCfg.relativePath))
5953

6054
private val allBuildTools = List(mavenAlg, millAlg, sbtAlg)
6155
private val fallbackBuildTool = List(sbtAlg)
@@ -66,8 +60,11 @@ final class BuildToolDispatcher[F[_]](config: Config)(implicit
6660
case list => buildRoot -> list
6761
}
6862

69-
private def getBuildRootsAndTools(repo: Repo): F[List[(BuildRoot, List[BuildToolAlg[F]])]] =
70-
getBuildRoots(repo).flatMap(_.traverse(findBuildTools))
63+
private def getBuildRootsAndTools(
64+
repo: Repo,
65+
repoConfig: RepoConfig
66+
): F[List[(BuildRoot, List[BuildToolAlg[F]])]] =
67+
getBuildRoots(repo, repoConfig).traverse(findBuildTools)
7168

7269
private def getAdditionalDependencies(buildRoot: BuildRoot): F[List[Scope.Dependencies]] =
7370
scalafmtAlg

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ final class EditAlg[F[_]](implicit
6565
if (migrations.isEmpty) F.pure(Nil)
6666
else
6767
gitAlg.discardChanges(repo) *>
68-
runScalafixMigrations(repo, migrations) <*
68+
runScalafixMigrations(repo, data.config, migrations) <*
6969
bumpVersion(update, files)
7070
cs2 <- gitAlg.commitAllIfDirty(repo, git.commitMsgFor(update, data.config.commits))
7171
cs3 <- hookExecutor.execPostUpdateHooks(data, update)
@@ -75,25 +75,30 @@ final class EditAlg[F[_]](implicit
7575

7676
private def findFilesContainingCurrentVersion(
7777
repo: Repo,
78-
repoConfig: RepoConfig,
78+
config: RepoConfig,
7979
update: Update
8080
): F[Option[Nel[File]]] =
8181
workspaceAlg.repoDir(repo).flatMap { repoDir =>
82-
val fileFilter = isSourceFile(update, repoConfig.updates.fileExtensionsOrDefault) _
82+
val fileFilter = isSourceFile(update, config.updates.fileExtensionsOrDefault) _
8383
fileAlg.findFiles(repoDir, fileFilter, _.contains(update.currentVersion)).map(Nel.fromList)
8484
}
8585

8686
private def runScalafixMigrations(
8787
repo: Repo,
88+
config: RepoConfig,
8889
migrations: List[ScalafixMigration]
8990
): F[List[Commit]] =
90-
migrations.traverseFilter(runScalafixMigration(repo, _))
91+
migrations.traverseFilter(runScalafixMigration(repo, config, _))
9192

92-
private def runScalafixMigration(repo: Repo, migration: ScalafixMigration): F[Option[Commit]] =
93+
private def runScalafixMigration(
94+
repo: Repo,
95+
config: RepoConfig,
96+
migration: ScalafixMigration
97+
): F[Option[Commit]] =
9398
for {
9499
_ <- logger.info(s"Running migration $migration")
95100
result <- logger.attemptLogWarn("Scalafix migration failed")(
96-
buildToolDispatcher.runMigration(repo, migration)
101+
buildToolDispatcher.runMigration(repo, config, migration)
97102
)
98103
verb = if (result.isRight) "Applied" else "Failed"
99104
msg1 = s"$verb Scalafix rule(s) ${migration.rewriteRules.mkString_(", ")}"

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

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ package org.scalasteward.core.repocache
1818

1919
import cats.syntax.all._
2020
import cats.{MonadThrow, Parallel}
21-
import org.typelevel.log4cats.Logger
2221
import org.scalasteward.core.application.Config
2322
import org.scalasteward.core.buildtool.BuildToolDispatcher
24-
import org.scalasteward.core.data.{Dependency, DependencyInfo}
23+
import org.scalasteward.core.data.{Dependency, DependencyInfo, RepoData}
2524
import org.scalasteward.core.git.GitAlg
2625
import org.scalasteward.core.repoconfig.RepoConfigAlg
2726
import org.scalasteward.core.vcs.data.{Repo, RepoOut}
2827
import org.scalasteward.core.vcs.{VCSApiAlg, VCSRepoAlg}
28+
import org.typelevel.log4cats.Logger
2929

3030
final class RepoCacheAlg[F[_]](config: Config)(implicit
3131
buildToolDispatcher: BuildToolDispatcher[F],
@@ -39,7 +39,7 @@ final class RepoCacheAlg[F[_]](config: Config)(implicit
3939
vcsRepoAlg: VCSRepoAlg[F],
4040
F: MonadThrow[F]
4141
) {
42-
def checkCache(repo: Repo): F[(RepoCache, RepoOut)] =
42+
def checkCache(repo: Repo): F[(RepoData, RepoOut)] =
4343
logger.info(s"Check cache of ${repo.show}") >>
4444
refreshErrorAlg.skipIfFailedRecently(repo) {
4545
for {
@@ -48,32 +48,38 @@ final class RepoCacheAlg[F[_]](config: Config)(implicit
4848
repoCacheRepository.findCache(repo)
4949
).parTupled
5050
latestSha1 = branchOut.commit.sha
51-
cache <- maybeCache
51+
data <- maybeCache
5252
.filter(_.sha1 === latestSha1)
53-
.fold(cloneAndRefreshCache(repo, repoOut))(F.pure)
54-
} yield (cache, repoOut)
53+
.fold(cloneAndRefreshCache(repo, repoOut))(supplementCache(repo, _))
54+
} yield (data, repoOut)
5555
}
5656

57-
private def cloneAndRefreshCache(repo: Repo, repoOut: RepoOut): F[RepoCache] =
57+
private def supplementCache(repo: Repo, cache: RepoCache): F[RepoData] =
58+
repoConfigAlg.mergeWithDefault(cache.maybeRepoConfig).map { config =>
59+
RepoData(repo, cache, config)
60+
}
61+
62+
private def cloneAndRefreshCache(repo: Repo, repoOut: RepoOut): F[RepoData] =
5863
vcsRepoAlg.cloneAndSync(repo, repoOut) >> refreshCache(repo)
5964

60-
private def refreshCache(repo: Repo): F[RepoCache] =
65+
private def refreshCache(repo: Repo): F[RepoData] =
6166
for {
6267
_ <- logger.info(s"Refresh cache of ${repo.show}")
63-
cache <- refreshErrorAlg.persistError(repo)(computeCache(repo))
64-
_ <- repoCacheRepository.updateCache(repo, cache)
65-
} yield cache
68+
data <- refreshErrorAlg.persistError(repo)(computeCache(repo))
69+
_ <- repoCacheRepository.updateCache(repo, data.cache)
70+
} yield data
6671

67-
private def computeCache(repo: Repo): F[RepoCache] =
72+
private def computeCache(repo: Repo): F[RepoData] =
6873
for {
6974
branch <- gitAlg.currentBranch(repo)
7075
latestSha1 <- gitAlg.latestSha1(repo, branch)
71-
dependencies <- buildToolDispatcher.getDependencies(repo)
76+
maybeConfig <- repoConfigAlg.readRepoConfig(repo)
77+
config <- repoConfigAlg.mergeWithDefault(maybeConfig)
78+
dependencies <- buildToolDispatcher.getDependencies(repo, config)
7279
dependencyInfos <-
73-
dependencies
74-
.traverse(_.traverse(_.traverse(gatherDependencyInfo(repo, _))))
75-
maybeRepoConfig <- repoConfigAlg.readRepoConfig(repo)
76-
} yield RepoCache(latestSha1, dependencyInfos, maybeRepoConfig)
80+
dependencies.traverse(_.traverse(_.traverse(gatherDependencyInfo(repo, _))))
81+
cache = RepoCache(latestSha1, dependencyInfos, maybeConfig)
82+
} yield RepoData(repo, cache, config)
7783

7884
private def gatherDependencyInfo(repo: Repo, dependency: Dependency): F[DependencyInfo] =
7985
gitAlg.findFilesContaining(repo, dependency.version).map(DependencyInfo(dependency, _))

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,18 @@ import munit.FunSuite
44
import org.scalasteward.core.buildtool.sbt.command._
55
import org.scalasteward.core.buildtool.sbt.data.SbtVersion
66
import org.scalasteward.core.data.{Resolver, Scope, Version}
7+
import org.scalasteward.core.mock.MockContext.config
78
import org.scalasteward.core.mock.MockContext.context.buildToolDispatcher
8-
import org.scalasteward.core.mock.MockContext.{config, mockRoot}
99
import org.scalasteward.core.mock.MockState
1010
import org.scalasteward.core.mock.MockState.TraceEntry.Cmd
11+
import org.scalasteward.core.repoconfig.RepoConfig
1112
import org.scalasteward.core.scalafmt
1213
import org.scalasteward.core.vcs.data.Repo
1314

1415
class BuildToolDispatcherTest extends FunSuite {
1516
test("getDependencies") {
1617
val repo = Repo("build-tool-dispatcher", "test-1")
18+
val repoConfig = RepoConfig.empty
1719
val repoDir = config.workspace / repo.show
1820
val initial = MockState.empty
1921
.addFiles(
@@ -22,12 +24,10 @@ class BuildToolDispatcherTest extends FunSuite {
2224
)
2325
.unsafeRunSync()
2426
val (state, deps) =
25-
buildToolDispatcher.getDependencies(repo).run(initial).unsafeRunSync()
27+
buildToolDispatcher.getDependencies(repo, repoConfig).run(initial).unsafeRunSync()
2628

2729
val expectedState = initial.copy(trace =
2830
Vector(
29-
Cmd("read", s"$repoDir/.scala-steward.conf"),
30-
Cmd("read", s"$mockRoot/default.scala-steward.conf"),
3131
Cmd("test", "-f", s"$repoDir/pom.xml"),
3232
Cmd("test", "-f", s"$repoDir/build.sc"),
3333
Cmd("test", "-f", s"$repoDir/build.sbt"),

0 commit comments

Comments
 (0)