1717package org .scalasteward .core .application
1818
1919import better .files .File
20- import cats .Monad
2120import cats .effect .ExitCode
2221import cats .syntax .all ._
2322import fs2 .Stream
@@ -29,8 +28,8 @@ import org.scalasteward.core.nurture.NurtureAlg
2928import org .scalasteward .core .repocache .RepoCacheAlg
3029import org .scalasteward .core .update .PruningAlg
3130import org .scalasteward .core .util
32- import org .scalasteward .core .util .DateTimeAlg
3331import org .scalasteward .core .util .logger .LoggerOps
32+ import org .scalasteward .core .util .{BracketThrowable , DateTimeAlg }
3433import org .scalasteward .core .vcs .data .Repo
3534
3635final class StewardAlg [F [_]](implicit
@@ -46,7 +45,7 @@ final class StewardAlg[F[_]](implicit
4645 selfCheckAlg : SelfCheckAlg [F ],
4746 streamCompiler : Stream .Compiler [F , F ],
4847 workspaceAlg : WorkspaceAlg [F ],
49- F : Monad [F ]
48+ F : BracketThrowable [F ]
5049) {
5150 private def printBanner : F [Unit ] = {
5251 val banner =
@@ -60,27 +59,31 @@ final class StewardAlg[F[_]](implicit
6059 logger.info(msg)
6160 }
6261
63- private def readRepos (reposFile : File ): F [List [Repo ]] =
64- fileAlg.readFile(reposFile).map { maybeContent =>
65- val regex = """ -\s+(.+)/([^/]+)""" .r
66- val content = maybeContent.getOrElse(" " )
67- content.linesIterator.collect { case regex(owner, repo) =>
68- Repo (owner.trim, repo.trim)
69- }.toList
62+ private def readRepos (reposFile : File ): Stream [F , Repo ] =
63+ Stream .evals {
64+ fileAlg.readFile(reposFile).map { maybeContent =>
65+ val regex = """ -\s+(.+)/([^/]+)""" .r
66+ val content = maybeContent.getOrElse(" " )
67+ content.linesIterator.collect { case regex(owner, repo) =>
68+ Repo (owner.trim, repo.trim)
69+ }.toList
70+ }
7071 }
7172
7273 private def steward (repo : Repo ): F [Either [Throwable , Unit ]] = {
7374 val label = s " Steward ${repo.show}"
7475 logger.infoTotalTime(label) {
75- for {
76- _ <- logger.info(util.string.lineLeftRight(label))
77- _ <- repoCacheAlg.checkCache(repo)
78- (attentionNeeded, updates) <- pruningAlg.needsAttention(repo)
79- result <- {
80- if (attentionNeeded) nurtureAlg.nurture(repo, updates)
81- else gitAlg.removeClone(repo).as(().asRight[Throwable ])
82- }
83- } yield result
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))
8487 }
8588 }
8689
@@ -89,12 +92,13 @@ final class StewardAlg[F[_]](implicit
8992 for {
9093 _ <- printBanner
9194 _ <- selfCheckAlg.checkAll
95+ _ <- workspaceAlg.cleanWorkspace
9296 exitCode <- sbtAlg.addGlobalPlugins {
93- for {
94- _ <- workspaceAlg.cleanWorkspace
95- repos <- readRepos(config.reposFile)
96- result <- Stream .emits(repos).evalMap(steward).compile .foldMonoid
97- } yield result. fold(_ => ExitCode .Error , _ => ExitCode .Success )
97+ readRepos(config.reposFile)
98+ .evalMap(steward)
99+ .compile
100+ .foldMonoid
101+ .map(_. fold(_ => ExitCode .Error , _ => ExitCode .Success ) )
98102 }
99103 } yield exitCode
100104 }
0 commit comments