diff options
author | shedaniel <daniel@shedaniel.me> | 2021-02-03 10:58:56 +0800 |
---|---|---|
committer | shedaniel <daniel@shedaniel.me> | 2021-02-03 10:58:56 +0800 |
commit | cbb00df99a2f178b42fbcdf22a9e51ea22d0e3a4 (patch) | |
tree | 1f842279fdce2f8dc1505daf77e8a18b9d6c668c /src/main/java/net | |
parent | 6b8188e688a556e0950458a59ab16d7b4e58236f (diff) | |
download | architectury-loom-cbb00df99a2f178b42fbcdf22a9e51ea22d0e3a4.tar.gz architectury-loom-cbb00df99a2f178b42fbcdf22a9e51ea22d0e3a4.tar.bz2 architectury-loom-cbb00df99a2f178b42fbcdf22a9e51ea22d0e3a4.zip |
Still takes about a minute to download all the assets, should be much better than 5 minutes.
Diffstat (limited to 'src/main/java/net')
-rw-r--r-- | src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java | 2 | ||||
-rw-r--r-- | src/main/java/net/fabricmc/loom/configuration/providers/minecraft/assets/MinecraftAssetsProvider.java | 153 |
2 files changed, 82 insertions, 73 deletions
diff --git a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java index 10797e00..41cda1b1 100644 --- a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java @@ -271,7 +271,7 @@ public final class RunConfigSettings implements Named { * Configure run config with the default server options. */ public void data() { - mode("data"); + environment("data"); defaultMainClass(getExtension().isForge() ? Constants.ForgeUserDev.LAUNCH_TESTING : Constants.Knot.KNOT_SERVER); } 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 b1913436..5709e38c 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 @@ -29,10 +29,8 @@ 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; @@ -42,6 +40,10 @@ import com.google.common.hash.Hashing; import com.google.common.io.Files; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; +import me.tongfei.progressbar.DelegatingProgressBarConsumer; +import me.tongfei.progressbar.ProgressBar; +import me.tongfei.progressbar.ProgressBarBuilder; +import me.tongfei.progressbar.ProgressBarStyle; import org.gradle.api.GradleException; import org.gradle.api.Project; @@ -52,7 +54,6 @@ import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionInfo; import net.fabricmc.loom.util.Checksum; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DownloadUtil; -import net.fabricmc.loom.util.gradle.ProgressLogger; public class MinecraftAssetsProvider { public static void provide(MinecraftProvider minecraftProvider, Project project) throws IOException { @@ -98,8 +99,7 @@ public class MinecraftAssetsProvider { } } - Deque<ProgressLogger> loggers = new ConcurrentLinkedDeque<>(); - ExecutorService executor = Executors.newFixedThreadPool(Math.min(10, Math.max(Runtime.getRuntime().availableProcessors() / 2, 1))); + ExecutorService executor = Executors.newFixedThreadPool(Math.min(16, Math.max(Runtime.getRuntime().availableProcessors() * 2, 1))); int toDownload = 0; AssetIndex index; @@ -112,92 +112,101 @@ public class MinecraftAssetsProvider { Map<String, AssetObject> parent = index.getFileMap(); - for (Map.Entry<String, AssetObject> entry : parent.entrySet()) { - AssetObject object = entry.getValue(); - String sha1 = object.getHash(); - String filename = "objects" + File.separator + sha1.substring(0, 2) + File.separator + sha1; - File file = new File(assets, filename); - - 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; - } - }); + ProgressBar[] progressBar = {null}; - if (LoomGradlePlugin.refreshDeps || localFileChecksum == null || !localFileChecksum.equals(sha1)) { - if (offline) { - if (file.exists()) { - project.getLogger().warn("Outdated asset " + entry.getKey()); - } else { - throw new GradleException("Asset " + entry.getKey() + " not found at " + file.getAbsolutePath()); + try { + for (Map.Entry<String, AssetObject> entry : parent.entrySet()) { + AssetObject object = entry.getValue(); + String sha1 = object.getHash(); + String filename = "objects" + File.separator + sha1.substring(0, 2) + File.separator + sha1; + File file = new File(assets, filename); + + 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; } - } else { - toDownload++; - executor.execute(() -> { - ProgressLogger progressLogger; - - if (loggers.isEmpty()) { - //Create a new logger if we need one - progressLogger = ProgressLogger.getProgressFactory(project, MinecraftAssetsProvider.class.getName()); - progressLogger.start("Downloading assets...", "assets"); + }); + + if (LoomGradlePlugin.refreshDeps || localFileChecksum == null || !localFileChecksum.equals(sha1)) { + if (offline) { + if (file.exists()) { + project.getLogger().warn("Outdated asset " + entry.getKey()); } else { - // use a free logger if we can - progressLogger = loggers.pop(); + throw new GradleException("Asset " + entry.getKey() + " not found at " + file.getAbsolutePath()); + } + } else { + toDownload++; + + if (progressBar[0] == null) { + progressBar[0] = new ProgressBarBuilder() + .setConsumer(new DelegatingProgressBarConsumer(project.getLogger()::lifecycle)) + .setInitialMax(toDownload) + .setUpdateIntervalMillis(2000) + .setTaskName(":downloading assets") + .setStyle(ProgressBarStyle.ASCII) + .showSpeed() + .build(); } - String assetName = entry.getKey(); - int end = assetName.lastIndexOf("/") + 1; + progressBar[0].maxHint(toDownload); - if (end > 0) { - assetName = assetName.substring(end); - } + executor.execute(() -> { + String assetName = entry.getKey(); + int end = assetName.lastIndexOf("/") + 1; - project.getLogger().debug(":downloading asset " + assetName); - progressLogger.progress(String.format("%-30.30s", assetName) + " - " + sha1); + if (end > 0) { + assetName = assetName.substring(end); + } - try { - DownloadUtil.downloadIfChanged(new URL(Constants.RESOURCES_BASE + sha1.substring(0, 2) + "/" + sha1), file, project.getLogger(), true); - } catch (IOException e) { - throw new RuntimeException("Failed to download: " + assetName, e); - } + project.getLogger().debug(":downloading asset " + assetName); - if (localFileChecksum == null) { - checksumInfos.put(entry.getKey(), sha1); - } + try { + DownloadUtil.downloadIfChanged(new URL(Constants.RESOURCES_BASE + sha1.substring(0, 2) + "/" + sha1), file, project.getLogger(), true); + } catch (IOException e) { + throw new RuntimeException("Failed to download: " + assetName, e); + } + + if (localFileChecksum == null) { + checksumInfos.put(entry.getKey(), sha1); + } - //Give this logger back - loggers.add(progressLogger); - }); + synchronized (progressBar[0]) { + progressBar[0].step(); + } + }); + } } } - } - project.getLogger().info("Took " + stopwatch.stop() + " to iterate " + parent.size() + " asset index."); + project.getLogger().info("Took " + stopwatch.stop() + " to iterate " + parent.size() + " asset index."); - if (toDownload > 0) { - project.getLogger().lifecycle(":downloading " + toDownload + " asset" + (toDownload == 1 ? "" : "s") + "..."); - } + if (toDownload > 0) { + project.getLogger().lifecycle(":downloading " + toDownload + " asset" + (toDownload == 1 ? "" : "s") + "..."); + } - checksumInfo.getParentFile().mkdirs(); + checksumInfo.getParentFile().mkdirs(); - try (FileWriter writer = new FileWriter(checksumInfo)) { - gson.toJson(checksumInfos, writer); - } + try (FileWriter writer = new FileWriter(checksumInfo)) { + gson.toJson(checksumInfos, writer); + } - //Wait for the assets to all download - executor.shutdown(); + //Wait for the assets to all download + executor.shutdown(); - try { - if (executor.awaitTermination(2, TimeUnit.HOURS)) { - executor.shutdownNow(); + try { + if (executor.awaitTermination(2, TimeUnit.HOURS)) { + executor.shutdownNow(); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } finally { + if (progressBar[0] != null) { + progressBar[0].close(); } - } catch (InterruptedException e) { - throw new RuntimeException(e); } - - loggers.forEach(ProgressLogger::completed); } } |