Skip to content

Commit cedd061

Browse files
committed
basically redo the cache
hours of my life lost to Apache Ivy
1 parent 406e8b0 commit cedd061

36 files changed

+1265
-643
lines changed

build.gradle.kts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ repositories {
1111
mavenCentral()
1212
cichlid.snapshots()
1313
minecraft.libraries()
14-
minecraft.pistonMeta()
14+
minecraft.versions()
1515
}
1616

17+
val mcVer = "1.17.1"
18+
1719
dependencies {
18-
implementation(minecraft.client("1.17.1"))
20+
implementation(minecraft.client(mcVer))
1921
// compile against Cichlid API
2022
// compileOnly(cichlid.loaderApi("0.1.0"))
2123
// run with full Cichlid
@@ -25,7 +27,7 @@ dependencies {
2527
cichlid {
2628
runs {
2729
register("client") {
28-
version = "1.17.1"
30+
version = mcVer
2931
}
3032
// register("client 1.21.4") {
3133
// version = "1.21.4"

gradlew

100644100755
File mode changed.

plugin/src/main/java/io/github/cichlidmc/cichlid_gradle/CichlidGradlePlugin.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
package io.github.cichlidmc.cichlid_gradle;
22

3-
import java.util.Objects;
4-
53
import io.github.cichlidmc.cichlid_gradle.cache.CichlidCache;
6-
import io.github.cichlidmc.cichlid_gradle.cache.MinecraftMaven;
74
import io.github.cichlidmc.cichlid_gradle.extension.CichlidExtension;
85
import io.github.cichlidmc.cichlid_gradle.extension.dep.CichlidDepsExtension;
9-
import io.github.cichlidmc.cichlid_gradle.extension.repo.CichlidReposExtension;
106
import io.github.cichlidmc.cichlid_gradle.extension.dep.MinecraftDepsExtension;
7+
import io.github.cichlidmc.cichlid_gradle.extension.repo.CichlidReposExtension;
118
import io.github.cichlidmc.cichlid_gradle.extension.repo.MinecraftReposExtension;
129
import io.github.cichlidmc.cichlid_gradle.run.RunTaskGeneration;
1310
import org.gradle.api.Plugin;
1411
import org.gradle.api.Project;
1512
import org.gradle.api.artifacts.Dependency;
1613

14+
import java.util.Objects;
15+
1716
public abstract class CichlidGradlePlugin implements Plugin<Project> {
1817
public static final String NAME = "CichlidGradle";
1918
public static final String VERSION = "1.0-SNAPSHOT";
@@ -33,15 +32,15 @@ public void apply(Project project) {
3332
if (isMinecraftDependency(dep)) {
3433
String version = Objects.requireNonNull(dep.getVersion());
3534
CichlidCache cache = CichlidCache.get(project);
36-
cache.maven.ensureVersionDownloaded(version);
35+
cache.ensureVersionIsCached(version);
3736
}
3837
})
3938
);
4039
}
4140

4241
private static boolean isMinecraftDependency(Dependency dep) {
4342
return "net.minecraft".equals(dep.getGroup())
44-
&& MinecraftMaven.MC_MODULES.contains(dep.getName())
43+
&& CichlidCache.MINECRAFT_MODULES.contains(dep.getName())
4544
&& dep.getVersion() != null;
4645
}
4746
}

plugin/src/main/java/io/github/cichlidmc/cichlid_gradle/cache/AssetStorage.java

Lines changed: 0 additions & 78 deletions
This file was deleted.

plugin/src/main/java/io/github/cichlidmc/cichlid_gradle/cache/CichlidCache.java

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,74 @@
11
package io.github.cichlidmc.cichlid_gradle.cache;
22

3+
import io.github.cichlidmc.cichlid_gradle.cache.storage.AssetStorage;
4+
import io.github.cichlidmc.cichlid_gradle.cache.storage.VersionStorage;
5+
import io.github.cichlidmc.cichlid_gradle.cache.task.TaskContext;
6+
import io.github.cichlidmc.pistonmetaparser.FullVersion;
7+
import io.github.cichlidmc.pistonmetaparser.manifest.Version;
8+
import org.gradle.api.Project;
9+
310
import java.nio.file.Path;
411
import java.util.Objects;
12+
import java.util.Set;
513

6-
import org.gradle.api.Project;
7-
14+
/**
15+
* Interface for Cichlid's global Minecraft cache. Holds no state, just interfaces with the filesystem.
16+
* Layout:
17+
* - root
18+
* - v1
19+
* - assets
20+
* - indices
21+
* - objects
22+
* - .lock
23+
* - <version>
24+
* - natives
25+
* - mappings
26+
* - jars
27+
* - runs
28+
*/
829
public class CichlidCache {
30+
// pattern is relative to root
31+
public static final String IVY_PATTERN = "[revision]/jars/[module]-[revision].[ext]";
32+
public static final String MINECRAFT_GROUP = "net.minecraft";
33+
public static final Set<String> MINECRAFT_MODULES = Set.of(
34+
"minecraft-client", "minecraft-server", "minecraft-merged", "minecraft-bundler"
35+
);
36+
937
public static final String PROJECT_CACHE_PROPERTY = "cichlid.use_project_cache";
10-
public static final String PATH = "cichlid-gradle";
38+
public static final int FORMAT = 1;
39+
public static final String PATH = "cichlid-gradle-cache/v" + FORMAT;
1140

41+
public final Path root;
42+
// assets are shared by many versions, they're stored separately
1243
public final AssetStorage assets;
13-
public final NativesStorage natives;
14-
public final RunsStorage runs;
15-
public final MinecraftMaven maven;
1644

1745
private CichlidCache(Path root) {
18-
Path mc = root.resolve("minecraft");
19-
this.assets = new AssetStorage(mc.resolve("assets"));
20-
this.natives = new NativesStorage(mc.resolve("natives"));
21-
this.runs = new RunsStorage(mc.resolve("runs"));
22-
this.maven = new MinecraftMaven(mc.resolve(MinecraftMaven.PATH), this);
46+
this.root = root;
47+
this.assets = new AssetStorage(this.root.resolve("assets"));
48+
}
49+
50+
public VersionStorage getVersion(String version) {
51+
return new VersionStorage(this.root.resolve(version), version);
52+
}
53+
54+
public void ensureVersionIsCached(String versionId) {
55+
// see if this version actually exists
56+
Version version = ManifestCache.getVersion(versionId);
57+
if (version == null)
58+
return;
59+
60+
FullVersion fullVersion = ManifestCache.expand(version);
61+
62+
TaskContext ctx = new TaskContext();
63+
this.assets.submitInitialTasks(fullVersion.assetIndex, ctx);
64+
65+
VersionStorage storage = this.getVersion(versionId);
66+
storage.submitInitialTasks(fullVersion, ctx);
67+
68+
ctx.report();
69+
70+
// all tasks are done. If an exception wasn't thrown by report, everything was successful.
71+
storage.markComplete();
2372
}
2473

2574
public static CichlidCache get(Project project) {
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.github.cichlidmc.cichlid_gradle.cache;
2+
3+
import io.github.cichlidmc.pistonmetaparser.FullVersion;
4+
import io.github.cichlidmc.pistonmetaparser.PistonMeta;
5+
import io.github.cichlidmc.pistonmetaparser.VersionManifest;
6+
import io.github.cichlidmc.pistonmetaparser.manifest.Version;
7+
8+
/**
9+
* Wraps access to a cached manifest singleton in synchronization so it's safe to share
10+
*/
11+
public class ManifestCache {
12+
private static VersionManifest manifest;
13+
14+
public static synchronized VersionManifest get() {
15+
if (manifest == null) {
16+
manifest = PistonMeta.fetch();
17+
}
18+
return manifest;
19+
}
20+
21+
public static Version getVersion(String id) {
22+
VersionManifest manifest = get();
23+
synchronized (manifest) {
24+
return manifest.getVersion(id);
25+
}
26+
}
27+
28+
public static FullVersion expand(Version version) {
29+
//noinspection SynchronizationOnLocalVariableOrMethodParameter - I'm pretty sure this is fine here
30+
synchronized (version) {
31+
return version.expand();
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)