Skip to content

Commit bd982e7

Browse files
committed
[MSHADE-420] fix time when read from extra field
1 parent 3692f81 commit bd982e7

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,11 @@
255255
<version>3.3.0</version>
256256
<scope>test</scope>
257257
</dependency>
258+
<dependency>
259+
<groupId>org.apache.commons</groupId>
260+
<artifactId>commons-compress</artifactId>
261+
<version>1.23.0</version>
262+
</dependency>
258263
</dependencies>
259264

260265
<build>

src/main/java/org/apache/maven/plugins/shade/DefaultShader.java

+25-2
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import java.util.List;
4444
import java.util.Objects;
4545
import java.util.Set;
46+
import java.util.TimeZone;
4647
import java.util.concurrent.Callable;
4748
import java.util.jar.JarEntry;
4849
import java.util.jar.JarFile;
@@ -55,6 +56,9 @@
5556

5657
import org.apache.commons.collections4.MultiValuedMap;
5758
import org.apache.commons.collections4.multimap.HashSetValuedHashMap;
59+
import org.apache.commons.compress.archivers.zip.ExtraFieldUtils;
60+
import org.apache.commons.compress.archivers.zip.X5455_ExtendedTimestamp;
61+
import org.apache.commons.compress.archivers.zip.ZipExtraField;
5862
import org.apache.maven.plugin.MojoExecutionException;
5963
import org.apache.maven.plugins.shade.filter.Filter;
6064
import org.apache.maven.plugins.shade.relocation.Relocator;
@@ -89,6 +93,25 @@ public DefaultShader(final Logger logger) {
8993
this.logger = Objects.requireNonNull(logger);
9094
}
9195

96+
// workaround for MSHADE-420
97+
private long getTime(ZipEntry entry) {
98+
if (entry.getExtra() != null) {
99+
try {
100+
ZipExtraField[] fields =
101+
ExtraFieldUtils.parse(entry.getExtra(), true, ExtraFieldUtils.UnparseableExtraField.SKIP);
102+
for (ZipExtraField field : fields) {
103+
if (X5455_ExtendedTimestamp.HEADER_ID.equals(field.getHeaderId())) {
104+
// extended timestamp extra field: need to translate UTC to local time for Reproducible Builds
105+
return entry.getTime() - TimeZone.getDefault().getRawOffset();
106+
}
107+
}
108+
} catch (ZipException ze) {
109+
// ignore
110+
}
111+
}
112+
return entry.getTime();
113+
}
114+
92115
public void shade(ShadeRequest shadeRequest) throws IOException, MojoExecutionException {
93116
Set<String> resources = new HashSet<>();
94117

@@ -332,7 +355,7 @@ public InputStream call() throws Exception {
332355
}
333356
},
334357
name,
335-
entry.getTime(),
358+
getTime(entry),
336359
entry.getMethod());
337360
} catch (Exception e) {
338361
throw new IOException(String.format("Problem shading JAR %s entry %s: %s", jar, name, e), e);
@@ -423,7 +446,7 @@ private void goThroughAllJarEntriesForManifestTransformer(
423446
resources.add(resource);
424447
try (InputStream inputStream = jarFile.getInputStream(entry)) {
425448
manifestTransformer.processResource(
426-
resource, inputStream, shadeRequest.getRelocators(), entry.getTime());
449+
resource, inputStream, shadeRequest.getRelocators(), getTime(entry));
427450
}
428451
break;
429452
}

0 commit comments

Comments
 (0)