diff options
author | modmuss50 <modmuss50@gmail.com> | 2021-03-15 23:31:18 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-15 23:31:18 +0000 |
commit | e6ac2afc7b5eab82be0266774dc95e834d10d013 (patch) | |
tree | 09b2a7c359fc46a8ee525b6391392af2278955c9 /src/main/java/net/fabricmc/loom/util/ZipReprocessorUtil.java | |
parent | 7231b9e053a91e584d5a41591347fe8e2082913f (diff) | |
download | architectury-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.java | 20 |
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; |