Skip to content

Commit 8fabbea

Browse files
committed
Don't download file with version info
1 parent d6f246f commit 8fabbea

4 files changed

Lines changed: 50 additions & 18 deletions

File tree

core/src/main/kotlin/org/sinytra/probe/core/platform/ModrinthPlatform.kt

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,22 @@ import kotlin.io.path.*
1717

1818
private const val REQUIRED_DEP: String = "required"
1919

20+
@Serializable
21+
data class ModrinthProjectVersion(
22+
override val projectId: String,
23+
override val versionId: String,
24+
override val versionNumber: String,
25+
override val dependencies: List<String>
26+
) : ProjectVersion
27+
2028
@Serializable
2129
data class ModrinthResolvedVersion(
2230
override val projectId: String,
2331
override val versionId: String,
2432
override val versionNumber: String,
2533
override val path: String,
2634
override val dependencies: List<String>
27-
) : ProjectVersion
35+
) : ProjectResolvedVersion
2836

2937
class ModrinthPlatform(
3038
private val storagePath: Path,
@@ -64,21 +72,33 @@ class ModrinthPlatform(
6472
}
6573

6674
override suspend fun getVersion(slug: String, versionId: String): ProjectVersion? {
67-
val key = versionKey(versionId)
68-
69-
cache.getObject<ModrinthResolvedVersion>(key)
70-
?.let { return it }
75+
val version = getCachedMRVersion(slug, versionId) ?: return null
76+
val dependencies = version.dependencies
77+
.filter { it.dependencyType == REQUIRED_DEP && it.projectId != FAPI_ID }
78+
.map(ModrinthVersionDependency::projectId)
79+
val projectVersion = ModrinthProjectVersion(version.projectId, version.id, version.versionNumber, dependencies)
7180

72-
LOGGER.info("Fetching '{}' version {}", slug, versionId)
81+
return projectVersion
82+
}
7383

74-
val version = ModrinthAPI.getVersion(versionId) ?: return null
84+
override suspend fun getResolvedVersion(slug: String, versionId: String): ProjectResolvedVersion? {
85+
val version = getCachedMRVersion(slug, versionId) ?: return null
7586
val resolved = downloadVersionFile(version)
76-
77-
cache.setObject(key, resolved)
78-
7987
return resolved
8088
}
8189

90+
suspend fun getCachedMRVersion(slug: String, versionId: String): ModrinthVersion? {
91+
val key = versionKey(versionId)
92+
val version = cache.getObject<ModrinthVersion>(key)
93+
?: coroutineScope {
94+
LOGGER.info("Fetching '{}' version {}", slug, versionId)
95+
ModrinthAPI.getVersion(versionId)
96+
}
97+
?: return null
98+
cache.setObject(key, version)
99+
return version
100+
}
101+
82102
suspend fun hasVersion(versionId: String): Boolean {
83103
val key = versionKey(versionId)
84104
return cache.exists(key)
@@ -114,7 +134,7 @@ class ModrinthPlatform(
114134
return resolveProjectInternal(project.id, gameVersions.first(), gameVersions, fallbackLoader)
115135
}
116136

117-
override suspend fun resolveProjectVersion(slug: String, gameVersion: String, loader: String): ProjectVersion? =
137+
override suspend fun resolveProjectVersion(slug: String, gameVersion: String, loader: String): ProjectResolvedVersion? =
118138
getOrComputeVersion(slug, gameVersion, listOf(gameVersion), loader, false)
119139

120140
suspend fun searchProjects(limit: Int, offset: Int, gameVersion: String, loader: String, excludeLoader: String?): List<ProjectSearchResult>? =

core/src/main/kotlin/org/sinytra/probe/core/platform/PlatformService.kt

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ interface PlatformProject {
1515
}
1616

1717
interface ProjectVersion {
18+
val projectId: String // Uniquely distinguishable ID
19+
val versionId: String
20+
val versionNumber: String
21+
val dependencies: List<String>
22+
}
23+
24+
interface ProjectResolvedVersion {
1825
val projectId: String // Uniquely distinguishable ID
1926
val versionId: String
2027
val versionNumber: String
@@ -23,17 +30,19 @@ interface ProjectVersion {
2330
}
2431

2532
data class ResolvedProject(
26-
val version: ProjectVersion,
33+
val version: ProjectResolvedVersion,
2734
val dependencies: List<ResolvedProject>
2835
)
2936

3037
interface PlatformService {
3138
suspend fun getProject(slug: String): PlatformProject?
39+
3240
// Does not guarantee that the version file exists
3341
suspend fun getVersion(slug: String, versionId: String): ProjectVersion?
42+
suspend fun getResolvedVersion(slug: String, versionId: String): ProjectResolvedVersion?
3443
suspend fun isNeoForgeAvailable(project: PlatformProject, gameVersion: String): Boolean
3544
suspend fun resolveProject(project: PlatformProject, gameVersion: String): ResolvedProject?
36-
suspend fun resolveProjectVersion(slug: String, gameVersion: String, loader: String): ProjectVersion?
45+
suspend fun resolveProjectVersion(slug: String, gameVersion: String, loader: String): ProjectResolvedVersion?
3746
}
3847

3948
class GlobalPlatformService(private val platforms: Map<ProjectPlatform, PlatformService>) {
@@ -50,13 +59,16 @@ class GlobalPlatformService(private val platforms: Map<ProjectPlatform, Platform
5059
suspend fun getVersion(project: PlatformProject, versionId: String): ProjectVersion? =
5160
getPlatform(project.platform).getVersion(project.id, versionId)
5261

62+
suspend fun getResolvedVersion(project: PlatformProject, versionId: String): ProjectResolvedVersion? =
63+
getPlatform(project.platform).getResolvedVersion(project.id, versionId)
64+
5365
suspend fun resolveProject(project: PlatformProject, gameVersion: String): ResolvedProject? =
5466
getPlatform(project.platform).resolveProject(project, gameVersion)
5567

56-
suspend fun resolveProjectVersion(platform: ProjectPlatform, id: String, gameVersion: String, loader: String): ProjectVersion? =
68+
suspend fun resolveProjectVersion(platform: ProjectPlatform, id: String, gameVersion: String, loader: String): ProjectResolvedVersion? =
5769
getPlatform(platform).resolveProjectVersion(id, gameVersion, loader)
5870
}
5971

60-
fun ProjectVersion.getFilePath(basePath: Path): Path {
72+
fun ProjectResolvedVersion.getFilePath(basePath: Path): Path {
6173
return basePath / path
6274
}

core/src/main/kotlin/org/sinytra/probe/core/service/TransformationService.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class TransformationService(
6060
return TransformationResult(
6161
project.version.projectId,
6262
project.version.versionId,
63-
otherFiles.map(ProjectVersion::projectId),
63+
otherFiles.map(ProjectResolvedVersion::projectId),
6464
result?.success ?: false,
6565
result?.primaryModid
6666
)
@@ -73,7 +73,7 @@ class TransformationService(
7373
return listOf(ffapi.getFilePath(storagePath))
7474
}
7575

76-
private fun ResolvedProject.flattenDependencies(): List<ProjectVersion> =
76+
private fun ResolvedProject.flattenDependencies(): List<ProjectResolvedVersion> =
7777
generateSequence(dependencies) { projects ->
7878
projects.flatMap { it.dependencies }.takeIf { it.isNotEmpty() }
7979
}

gatherer/src/main/kotlin/org/sinytra/probe/gatherer/internal/ModTestRunner.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class ModTestRunner(
123123
val results = candidates.map { proj ->
124124
async(dispatcher) {
125125
semaphore.withPermit {
126-
val version = modrinth.getVersion(proj.slug, proj.versionId)
126+
val version = modrinth.getResolvedVersion(proj.slug, proj.versionId)
127127
?: throw IllegalStateException("Missing version for ${proj.slug}")
128128
val versionFile = modsDir / version.path
129129

0 commit comments

Comments
 (0)