diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-01-29 23:38:46 +0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-29 15:38:46 +0000 | 
| commit | 17fb2b4656f8f78bc578b35f8285edb03789f4d1 (patch) | |
| tree | d5ade13ce6d7c6b01626d8289d1b89fb2f96bdc6 /src/main/java/net/fabricmc/loom/configuration/providers | |
| parent | 48d4243be6d565253662d3cf1fbb622a196c27ec (diff) | |
| download | architectury-loom-17fb2b4656f8f78bc578b35f8285edb03789f4d1.tar.gz architectury-loom-17fb2b4656f8f78bc578b35f8285edb03789f4d1.tar.bz2 architectury-loom-17fb2b4656f8f78bc578b35f8285edb03789f4d1.zip | |
Cache the checksum of asset index files. (#335)
* Cache the checksum of asset index files.
* Resolve reviews
Diffstat (limited to 'src/main/java/net/fabricmc/loom/configuration/providers')
| -rw-r--r-- | src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/MinecraftAssetsProvider.java | 51 | 
1 files changed, 48 insertions, 3 deletions
| diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/MinecraftAssetsProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/MinecraftAssetsProvider.java index 7b1ff144..b1913436 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/MinecraftAssetsProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/MinecraftAssetsProvider.java @@ -26,20 +26,27 @@ package net.fabricmc.loom.configuration.providers.minecraft.assets;  import java.io.File;  import java.io.FileReader; +import java.io.FileWriter;  import java.io.IOException;  import java.net.URL;  import java.util.Deque; +import java.util.HashMap;  import java.util.Map;  import java.util.concurrent.ConcurrentLinkedDeque;  import java.util.concurrent.ExecutorService;  import java.util.concurrent.Executors;  import java.util.concurrent.TimeUnit; +import com.google.common.base.Stopwatch; +import com.google.common.hash.Hashing; +import com.google.common.io.Files;  import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken;  import org.gradle.api.GradleException;  import org.gradle.api.Project;  import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.LoomGradlePlugin;  import net.fabricmc.loom.configuration.providers.MinecraftProvider;  import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionInfo;  import net.fabricmc.loom.util.Checksum; @@ -63,6 +70,7 @@ public class MinecraftAssetsProvider {  		}  		File assetsInfo = new File(assets, "indexes" + File.separator + assetIndex.getFabricId(minecraftProvider.getMinecraftVersion()) + ".json"); +		File checksumInfo = new File(assets, "checksum" + File.separator + minecraftProvider.getMinecraftVersion() + ".json");  		if (!assetsInfo.exists() || !Checksum.equals(assetsInfo, assetIndex.sha1)) {  			project.getLogger().lifecycle(":downloading asset index"); @@ -80,17 +88,28 @@ public class MinecraftAssetsProvider {  			}  		} -		project.getLogger().lifecycle(":downloading assets..."); +		Gson gson = new Gson(); +		Map<String, String> checksumInfos = new HashMap<>(); + +		if (checksumInfo.exists()) { +			try (FileReader reader = new FileReader(checksumInfo)) { +				checksumInfos.putAll(gson.fromJson(reader, new TypeToken<Map<String, String>>() { +				}.getType())); +			} +		}  		Deque<ProgressLogger> loggers = new ConcurrentLinkedDeque<>();  		ExecutorService executor = Executors.newFixedThreadPool(Math.min(10, Math.max(Runtime.getRuntime().availableProcessors() / 2, 1))); +		int toDownload = 0;  		AssetIndex index;  		try (FileReader fileReader = new FileReader(assetsInfo)) { -			index = new Gson().fromJson(fileReader, AssetIndex.class); +			index = gson.fromJson(fileReader, AssetIndex.class);  		} +		Stopwatch stopwatch = Stopwatch.createStarted(); +  		Map<String, AssetObject> parent = index.getFileMap();  		for (Map.Entry<String, AssetObject> entry : parent.entrySet()) { @@ -99,7 +118,16 @@ public class MinecraftAssetsProvider {  			String filename = "objects" + File.separator + sha1.substring(0, 2) + File.separator + sha1;  			File file = new File(assets, filename); -			if (!file.exists() || !Checksum.equals(file, sha1)) { +			String localFileChecksum = !file.exists() ? null : checksumInfos.computeIfAbsent(entry.getKey(), path -> { +				try { +					return Files.asByteSource(file).hash(Hashing.sha1()).toString(); +				} catch (IOException e) { +					e.printStackTrace(); +					return null; +				} +			}); + +			if (LoomGradlePlugin.refreshDeps || localFileChecksum == null || !localFileChecksum.equals(sha1)) {  				if (offline) {  					if (file.exists()) {  						project.getLogger().warn("Outdated asset " + entry.getKey()); @@ -107,6 +135,7 @@ public class MinecraftAssetsProvider {  						throw new GradleException("Asset " + entry.getKey() + " not found at " + file.getAbsolutePath());  					}  				} else { +					toDownload++;  					executor.execute(() -> {  						ProgressLogger progressLogger; @@ -135,6 +164,10 @@ public class MinecraftAssetsProvider {  							throw new RuntimeException("Failed to download: " + assetName, e);  						} +						if (localFileChecksum == null) { +							checksumInfos.put(entry.getKey(), sha1); +						} +  						//Give this logger back  						loggers.add(progressLogger);  					}); @@ -142,6 +175,18 @@ public class MinecraftAssetsProvider {  			}  		} +		project.getLogger().info("Took " + stopwatch.stop() + " to iterate " + parent.size() + " asset index."); + +		if (toDownload > 0) { +			project.getLogger().lifecycle(":downloading " + toDownload + " asset" + (toDownload == 1 ? "" : "s") + "..."); +		} + +		checksumInfo.getParentFile().mkdirs(); + +		try (FileWriter writer = new FileWriter(checksumInfo)) { +			gson.toJson(checksumInfos, writer); +		} +  		//Wait for the assets to all download  		executor.shutdown(); | 
