Skip to content

Commit 07c7896

Browse files
mikkozielMarconZet
authored and
MarconZet
committed
Replacement Heuristic (#132)
* Change replacement heuristic * Expanded heuristic testes * Fixes after lint * Fixes after buildifier github action failed * Fixes after buildifier github action failed * Fixes after review * Changes after lint * Added test cases for same version of two libraries
1 parent d4bbb77 commit 07c7896

File tree

9 files changed

+542
-12
lines changed

9 files changed

+542
-12
lines changed

bazel/src/main/kotlin/org/virtuslab/bazelsteward/bazel/BazelVersionFileSearch.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ class BazelVersionFileSearch(config: Config) {
1010
private val fileNames = setOf(".bazelversion", ".bazeliskrc")
1111

1212
val bazelVersionFiles: List<BazelFileSearch.BazelFile> by lazy {
13-
config.path.listDirectoryEntries().filter { fileNames.contains(it.name) }.map { BazelFileSearch.BazelFile(it) }
13+
config.path.listDirectoryEntries().filter { fileNames.contains(it.name) }.map { BazelFileSearch.createBazelFile(it) }
1414
}
1515
}

core/src/main/kotlin/org/virtuslab/bazelsteward/core/common/BazelFileSearch.kt

+11-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ import java.nio.file.Path
55
import kotlin.io.path.readText
66

77
class BazelFileSearch(config: Config) {
8-
data class BazelFile(val path: Path) {
8+
interface BazelFile {
9+
val path: Path
910
val content: String
11+
}
12+
13+
private data class LazyBazelFile(override val path: Path) : BazelFile {
14+
override val content: String
1015
get() = path.readText()
1116
}
1217

@@ -22,5 +27,9 @@ class BazelFileSearch(config: Config) {
2227
.toList()
2328
}
2429

25-
val buildDefinitions: List<BazelFile> by lazy { buildPaths.map { BazelFile(it) } }
30+
val buildDefinitions: List<BazelFile> by lazy { buildPaths.map { createBazelFile(it) } }
31+
32+
companion object {
33+
fun createBazelFile(path: Path): BazelFile = LazyBazelFile(path)
34+
}
2635
}

core/src/main/kotlin/org/virtuslab/bazelsteward/core/common/FileUpdateSearch.kt

+9-8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import org.virtuslab.bazelsteward.core.GitBranch
44
import org.virtuslab.bazelsteward.core.library.Library
55
import org.virtuslab.bazelsteward.core.library.LibraryId
66
import org.virtuslab.bazelsteward.core.library.Version
7+
import org.virtuslab.bazelsteward.core.replacement.VersionOnlyHeuristic
8+
import org.virtuslab.bazelsteward.core.replacement.WholeLibraryHeuristic
79
import java.nio.file.Path
810

911
class FileUpdateSearch {
@@ -26,15 +28,14 @@ class FileUpdateSearch {
2628
files: List<BazelFileSearch.BazelFile>,
2729
updateSuggestion: UpdateLogic.UpdateSuggestion<Lib>
2830
): FileChangeSuggestion? {
29-
val markers = updateSuggestion.currentLibrary.id.associatedStrings()
30-
val currentVersion = updateSuggestion.currentLibrary.version.value
31-
val regex =
32-
(markers + currentVersion).map { """(${Regex.escape(it)})""" }.reduce { acc, s -> "$acc.*$s" }.let { Regex(it) }
33-
val matchResult = files.firstNotNullOfOrNull { regex.find(it.content)?.to(it.path) } ?: return null
34-
val versionGroup = matchResult.first.groups[3] ?: return null
35-
return FileChangeSuggestion(
36-
updateSuggestion.currentLibrary, updateSuggestion.suggestedVersion, matchResult.second, versionGroup.range.first
31+
val allHeuristics = listOf(
32+
WholeLibraryHeuristic(),
33+
VersionOnlyHeuristic(),
3734
)
35+
for (heuristic in allHeuristics) {
36+
heuristic.apply(files, updateSuggestion)?.let { return it }
37+
}
38+
return null
3839
}
3940

4041
fun <Lib : LibraryId> searchBazelVersionFiles(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.virtuslab.bazelsteward.core.replacement
2+
3+
import org.virtuslab.bazelsteward.core.common.BazelFileSearch
4+
import org.virtuslab.bazelsteward.core.common.FileUpdateSearch
5+
import org.virtuslab.bazelsteward.core.common.UpdateLogic
6+
import org.virtuslab.bazelsteward.core.library.LibraryId
7+
8+
interface Heuristic {
9+
val name: String
10+
fun <Lib : LibraryId> apply(
11+
files: List<BazelFileSearch.BazelFile>,
12+
updateSuggestion: UpdateLogic.UpdateSuggestion<Lib>
13+
): FileUpdateSearch.FileChangeSuggestion?
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.virtuslab.bazelsteward.core.replacement
2+
3+
import org.virtuslab.bazelsteward.core.common.BazelFileSearch
4+
import org.virtuslab.bazelsteward.core.common.FileUpdateSearch
5+
import org.virtuslab.bazelsteward.core.common.UpdateLogic
6+
import org.virtuslab.bazelsteward.core.library.LibraryId
7+
8+
class VersionOnlyHeuristic : Heuristic {
9+
override val name: String = "version-only"
10+
11+
override fun <Lib : LibraryId> apply(
12+
files: List<BazelFileSearch.BazelFile>,
13+
updateSuggestion: UpdateLogic.UpdateSuggestion<Lib>
14+
): FileUpdateSearch.FileChangeSuggestion? {
15+
val currentVersion = updateSuggestion.currentLibrary.version.value
16+
val regex = Regex(Regex.escape(currentVersion))
17+
val matchResult = files.firstNotNullOfOrNull { regex.find(it.content)?.to(it.path) } ?: return null
18+
matchResult.first.next()?.let { return null }
19+
val versionGroup = matchResult.first.groups[0] ?: return null
20+
return FileUpdateSearch.FileChangeSuggestion(
21+
updateSuggestion.currentLibrary, updateSuggestion.suggestedVersion, matchResult.second, versionGroup.range.first
22+
)
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.virtuslab.bazelsteward.core.replacement
2+
3+
import org.virtuslab.bazelsteward.core.common.BazelFileSearch
4+
import org.virtuslab.bazelsteward.core.common.FileUpdateSearch
5+
import org.virtuslab.bazelsteward.core.common.UpdateLogic
6+
import org.virtuslab.bazelsteward.core.library.LibraryId
7+
8+
class WholeLibraryHeuristic : Heuristic {
9+
override val name: String = "whole-library"
10+
11+
override fun <Lib : LibraryId> apply(
12+
files: List<BazelFileSearch.BazelFile>,
13+
updateSuggestion: UpdateLogic.UpdateSuggestion<Lib>
14+
): FileUpdateSearch.FileChangeSuggestion? {
15+
val markers = updateSuggestion.currentLibrary.id.associatedStrings()
16+
val currentVersion = updateSuggestion.currentLibrary.version.value
17+
val regex =
18+
(markers + currentVersion).map { """(${Regex.escape(it)})""" }.reduce { acc, s -> "$acc.*$s" }.let { Regex(it) }
19+
val matchResult = files.firstNotNullOfOrNull { regex.find(it.content)?.to(it.path) } ?: return null
20+
val versionGroup = matchResult.first.groups[3] ?: return null
21+
return FileUpdateSearch.FileChangeSuggestion(
22+
updateSuggestion.currentLibrary, updateSuggestion.suggestedVersion, matchResult.second, versionGroup.range.first
23+
)
24+
}
25+
}

0 commit comments

Comments
 (0)