Skip to content

Commit c12d4a4

Browse files
authored
Merge pull request #3211 from scala-steward-org/topic/catch-exceptions-in-applyAll
Catch exceptions in Substring.Replacement.applyAll
2 parents 2c6717b + a0d68e4 commit c12d4a4

File tree

4 files changed

+21
-17
lines changed

4 files changed

+21
-17
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ final class EditAlg[F[_]](implicit
105105
for {
106106
repoDir <- workspaceAlg.repoDir(data.repo)
107107
replacementsByPath = updateReplacements.groupBy(_.position.path).toList
108-
_ <- replacementsByPath.traverse { case (path, replacements) =>
109-
fileAlg.editFile(repoDir / path, Substring.Replacement.applyAll(replacements))
108+
_ <- replacementsByPath.traverse_ { case (path, replacements) =>
109+
fileAlg.editFile(repoDir / path, Substring.Replacement.applyAll[F](replacements))
110110
}
111111
_ <- reformatChangedFiles(data)
112112
msgTemplate = data.config.commits.messageOrDefault

modules/core/src/main/scala/org/scalasteward/core/edit/update/data/Substring.scala

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.scalasteward.core.edit.update.data
1818

19+
import cats.ApplicativeThrow
1920
import scala.util.matching.Regex.Match
2021

2122
object Substring {
@@ -41,16 +42,19 @@ object Substring {
4142
final case class Replacement(position: Position, replacement: String)
4243

4344
object Replacement {
44-
def applyAll(replacements: List[Replacement])(source: String): String = {
45-
var start = 0
46-
val sb = new java.lang.StringBuilder(source.length)
47-
replacements.distinctBy(_.position.start).sortBy(_.position.start).foreach { r =>
48-
val before = source.substring(start, r.position.start)
49-
start = r.position.start + r.position.value.length
50-
sb.append(before).append(r.replacement)
45+
def applyAll[F[_]](replacements: List[Replacement])(source: String)(implicit
46+
F: ApplicativeThrow[F]
47+
): F[String] =
48+
F.catchNonFatal {
49+
var start = 0
50+
val sb = new java.lang.StringBuilder(source.length)
51+
replacements.distinctBy(_.position.start).sortBy(_.position.start).foreach { r =>
52+
val before = source.substring(start, r.position.start)
53+
start = r.position.start + r.position.value.length
54+
sb.append(before).append(r.replacement)
55+
}
56+
sb.append(source.substring(start))
57+
sb.toString
5158
}
52-
sb.append(source.substring(start))
53-
sb.toString
54-
}
5559
}
5660
}

modules/core/src/main/scala/org/scalasteward/core/io/FileAlg.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ trait FileAlg[F[_]] {
6363
): Resource[F, Unit] =
6464
createTemporarily(dir / data.path, data.content)
6565

66-
final def editFile(file: File, edit: String => String)(implicit F: MonadThrow[F]): F[Unit] =
66+
final def editFile(file: File, edit: String => F[String])(implicit F: MonadThrow[F]): F[Unit] =
6767
readFile(file)
68-
.flatMap(_.fold(F.unit)(content => writeFile(file, edit(content))))
68+
.flatMap(_.fold(F.unit)(edit(_).flatMap(writeFile(file, _))))
6969
.adaptError { case t => new Throwable(s"failed to edit $file", t) }
7070

7171
final def findFiles[A, B](

modules/core/src/test/scala/org/scalasteward/core/io/FileAlgTest.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import org.scalasteward.core.TestInstances.ioLogger
99
import org.scalasteward.core.io.FileAlgTest.ioFileAlg
1010
import org.scalasteward.core.mock.MockConfig.mockRoot
1111
import org.scalasteward.core.mock.MockContext.context.fileAlg
12-
import org.scalasteward.core.mock.MockState
12+
import org.scalasteward.core.mock.{MockEff, MockState}
1313
import org.scalasteward.core.mock.MockState.TraceEntry.Cmd
1414

1515
class FileAlgTest extends CatsEffectSuite {
@@ -57,7 +57,7 @@ class FileAlgTest extends CatsEffectSuite {
5757

5858
test("editFile: nonexistent file") {
5959
val obtained = fileAlg
60-
.editFile(mockRoot / "does-not-exist.txt", identity)
60+
.editFile(mockRoot / "does-not-exist.txt", MockEff.pure)
6161
.runS(MockState.empty)
6262

6363
val expected =
@@ -69,7 +69,7 @@ class FileAlgTest extends CatsEffectSuite {
6969
val file = mockRoot / "steward" / "test1.sbt"
7070
val obtained = (for {
7171
_ <- fileAlg.writeFile(file, "123")
72-
_ <- fileAlg.editFile(file, _.replace("2", "4"))
72+
_ <- fileAlg.editFile(file, content => MockEff.pure(content.replace("2", "4")))
7373
} yield ()).runS(MockState.empty)
7474

7575
val expected = MockState.empty.copy(

0 commit comments

Comments
 (0)