From ff5ff98cb00bd7d4c6fa4889a4da9056b92fbc0f Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Fri, 5 Aug 2022 19:53:41 +0100 Subject: [PATCH] Misc performance improvements. --- .../providers/BundleMetadata.java | 42 ++++++++++++++++--- .../minecraft/MinecraftLibraryProvider.java | 2 +- .../minecraft/MinecraftProvider.java | 2 +- .../fabricmc/loom/util/download/Download.java | 7 ++-- .../loom/util/gradle/ProgressGroup.java | 17 +++++++- 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/BundleMetadata.java b/src/main/java/net/fabricmc/loom/configuration/providers/BundleMetadata.java index aa6b9379..4705fca4 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/BundleMetadata.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/BundleMetadata.java @@ -25,16 +25,20 @@ package net.fabricmc.loom.configuration.providers; import java.io.IOException; -import java.io.InputStream; +import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Optional; +import org.gradle.api.Project; import org.jetbrains.annotations.Nullable; +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.AttributeHelper; import net.fabricmc.loom.util.FileSystemUtil; public record BundleMetadata(List libraries, List versions, String mainClass) { @@ -83,10 +87,38 @@ public record BundleMetadata(List libraries, List versions, String } public record Entry(String sha1, String name, String path) { - public void unpackEntry(Path jar, Path dest) throws IOException { - try (FileSystemUtil.Delegate fs = FileSystemUtil.getJarFileSystem(jar); - InputStream is = Files.newInputStream(fs.get().getPath(path()))) { - Files.copy(is, dest, StandardCopyOption.REPLACE_EXISTING); + public void unpackEntry(Path jar, Path dest, Project project) throws IOException { + final LoomGradleExtension extension = LoomGradleExtension.get(project); + + if (!extension.refreshDeps() && Files.exists(dest)) { + final String hash = readHash(dest).orElse(""); + + if (hash.equals(sha1)) { + // File exists with expected hash + return; + } + } + + try (FileSystemUtil.Delegate fs = FileSystemUtil.getJarFileSystem(jar)) { + Files.copy(fs.get().getPath(path()), dest, StandardCopyOption.REPLACE_EXISTING); + } + + writeHash(dest, sha1); + } + + private Optional readHash(Path output) { + try { + return AttributeHelper.readAttribute(output, "LoomHash"); + } catch (IOException e) { + return Optional.empty(); + } + } + + private void writeHash(Path output, String eTag) { + try { + AttributeHelper.writeAttribute(output, "LoomHash", eTag); + } catch (IOException e) { + throw new UncheckedIOException("Failed to write hash to (%s)".formatted(output), e); } } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java index f79674da..588b20f7 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java @@ -89,7 +89,7 @@ public class MinecraftLibraryProvider { private void provideClientLibraries(boolean overrideLWJGL, boolean hasNativesToExtract) { final boolean isArm = Architecture.CURRENT.isArm(); - final boolean classpathArmNatives = !hasNativesToExtract && isArm; + final boolean classpathArmNatives = !hasNativesToExtract && isArm && !IS_MACOS; if (classpathArmNatives) { LoomRepositoryPlugin.forceLWJGLFromMavenCentral(project); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftProvider.java index b8173454..13189391 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftProvider.java @@ -211,7 +211,7 @@ public abstract class MinecraftProvider { throw new UnsupportedOperationException("Expected only 1 version in META-INF/versions.list, but got %d".formatted(getServerBundleMetadata().versions().size())); } - getServerBundleMetadata().versions().get(0).unpackEntry(minecraftServerJar.toPath(), getMinecraftExtractedServerJar().toPath()); + getServerBundleMetadata().versions().get(0).unpackEntry(minecraftServerJar.toPath(), getMinecraftExtractedServerJar().toPath(), project); } public File workingDir() { diff --git a/src/main/java/net/fabricmc/loom/util/download/Download.java b/src/main/java/net/fabricmc/loom/util/download/Download.java index cd756118..12742ce6 100644 --- a/src/main/java/net/fabricmc/loom/util/download/Download.java +++ b/src/main/java/net/fabricmc/loom/util/download/Download.java @@ -250,6 +250,7 @@ public class Download { if (isHashValid(output)) { // Valid hash, no need to re-download + writeHash(output, expectedHash); return false; } @@ -322,9 +323,9 @@ public class Download { } } - private void writeHash(Path output, String eTag) throws DownloadException { + private void writeHash(Path output, String value) throws DownloadException { try { - AttributeHelper.writeAttribute(output, "LoomHash", eTag); + AttributeHelper.writeAttribute(output, "LoomHash", value); } catch (IOException e) { throw error(e, "Failed to write hash to (%s)", output); } @@ -354,7 +355,7 @@ public class Download { private boolean getAndResetLock(Path output) throws DownloadException { final Path lock = getLockFile(output); - final boolean exists = Files.exists(lock); + final boolean exists = exists(lock); if (exists) { try { diff --git a/src/main/java/net/fabricmc/loom/util/gradle/ProgressGroup.java b/src/main/java/net/fabricmc/loom/util/gradle/ProgressGroup.java index 8248f9bd..02126565 100644 --- a/src/main/java/net/fabricmc/loom/util/gradle/ProgressGroup.java +++ b/src/main/java/net/fabricmc/loom/util/gradle/ProgressGroup.java @@ -33,16 +33,26 @@ import org.gradle.internal.logging.progress.ProgressLogger; import org.gradle.internal.logging.progress.ProgressLoggerFactory; public class ProgressGroup implements Closeable { + private final String name; private final ProgressLoggerFactory progressLoggerFactory; - private final ProgressLogger progressGroup; + + private ProgressLogger progressGroup; public ProgressGroup(Project project, String name) { + this.name = name; this.progressLoggerFactory = ((ProjectInternal) project).getServices().get(ProgressLoggerFactory.class); + } + + private void start() { this.progressGroup = this.progressLoggerFactory.newOperation(name).setDescription(name); this.progressGroup.started(); } public ProgressLogger createProgressLogger(String name) { + if (progressGroup == null) { + start(); + } + ProgressLogger progressLogger = this.progressLoggerFactory.newOperation(getClass(), progressGroup); progressLogger.setDescription(name); progressLogger.start(name, null); @@ -51,6 +61,9 @@ public class ProgressGroup implements Closeable { @Override public void close() throws IOException { - this.progressGroup.completed(); + if (this.progressGroup != null) { + this.progressGroup.completed(); + this.progressGroup = null; + } } }