aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java
diff options
context:
space:
mode:
authormodmuss50 <modmuss50@gmail.com>2021-03-15 23:31:18 +0000
committerGitHub <noreply@github.com>2021-03-15 23:31:18 +0000
commite6ac2afc7b5eab82be0266774dc95e834d10d013 (patch)
tree09b2a7c359fc46a8ee525b6391392af2278955c9 /src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java
parent7231b9e053a91e584d5a41591347fe8e2082913f (diff)
downloadarchitectury-loom-e6ac2afc7b5eab82be0266774dc95e834d10d013.tar.gz
architectury-loom-e6ac2afc7b5eab82be0266774dc95e834d10d013.tar.bz2
architectury-loom-e6ac2afc7b5eab82be0266774dc95e834d10d013.zip
Ensure outputs are reproducable across all OS's. (#363)
Diffstat (limited to 'src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java')
-rw-r--r--src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java b/src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java
index 662acf82..735b3346 100644
--- a/src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java
+++ b/src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java
@@ -29,11 +29,20 @@ import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.nio.file.attribute.FileTime;
+import java.util.Calendar;
+import java.util.Comparator;
+import java.util.GregorianCalendar;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class ZipReprocessorUtil {
+ /**
+ * See {@link org.gradle.api.internal.file.archive.ZipCopyAction} about this.
+ */
+ private static final long CONSTANT_TIME_FOR_ZIP_ENTRIES = new GregorianCalendar(1980, Calendar.FEBRUARY, 1, 0, 0, 0).getTimeInMillis();
+
private ZipReprocessorUtil() { }
public static void reprocessZip(File file, boolean reproducibleFileOrder, boolean preserveFileTimestamps) throws IOException {
@@ -45,7 +54,7 @@ public class ZipReprocessorUtil {
ZipEntry[] entries;
if (reproducibleFileOrder) {
- entries = zipFile.stream().sorted((a, b) -> a.getName().compareTo(b.getName())).toArray(ZipEntry[]::new);
+ entries = zipFile.stream().sorted(Comparator.comparing(ZipEntry::getName)).toArray(ZipEntry[]::new);
} else {
entries = zipFile.stream().toArray(ZipEntry[]::new);
}
@@ -54,11 +63,16 @@ public class ZipReprocessorUtil {
try (ZipOutputStream zipOutputStream = new ZipOutputStream(outZip)) {
for (ZipEntry entry : entries) {
+ ZipEntry newEntry = entry;
+
if (!preserveFileTimestamps) {
- entry.setTime(0);
+ newEntry = new ZipEntry(entry.getName());
+ newEntry.setTime(CONSTANT_TIME_FOR_ZIP_ENTRIES);
+ newEntry.setLastModifiedTime(FileTime.fromMillis(CONSTANT_TIME_FOR_ZIP_ENTRIES));
+ newEntry.setLastAccessTime(FileTime.fromMillis(CONSTANT_TIME_FOR_ZIP_ENTRIES));
}
- zipOutputStream.putNextEntry(entry);
+ zipOutputStream.putNextEntry(newEntry);
InputStream inputStream = zipFile.getInputStream(entry);
byte[] buf = new byte[1024];
int length;