Skip to content

Commit 9905bfb

Browse files
authored
Report file checksum when encountering artifact transform failures (#87522) (#87531)
1 parent 1f2a906 commit 9905bfb

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

build-tools/src/main/java/org/elasticsearch/gradle/transform/UnpackTransform.java

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.gradle.api.artifacts.transform.TransformOutputs;
1414
import org.gradle.api.artifacts.transform.TransformParameters;
1515
import org.gradle.api.file.FileSystemLocation;
16+
import org.gradle.api.logging.Logger;
1617
import org.gradle.api.logging.Logging;
1718
import org.gradle.api.provider.Property;
1819
import org.gradle.api.provider.Provider;
@@ -21,17 +22,25 @@
2122
import org.gradle.api.tasks.Optional;
2223
import org.gradle.api.tasks.PathSensitive;
2324
import org.gradle.api.tasks.PathSensitivity;
24-
import org.gradle.internal.UncheckedException;
2525

2626
import java.io.File;
27+
import java.io.FileInputStream;
2728
import java.io.IOException;
29+
import java.io.InputStream;
30+
import java.io.UncheckedIOException;
2831
import java.nio.file.Path;
2932
import java.nio.file.Paths;
33+
import java.security.DigestInputStream;
34+
import java.security.MessageDigest;
35+
import java.security.NoSuchAlgorithmException;
36+
import java.util.HexFormat;
3037
import java.util.List;
3138
import java.util.function.Function;
3239

3340
public interface UnpackTransform extends TransformAction<UnpackTransform.Parameters> {
3441

42+
Logger LOGGER = Logging.getLogger(UnpackTransform.class);
43+
3544
interface Parameters extends TransformParameters {
3645
@Input
3746
@Optional
@@ -78,11 +87,16 @@ default void transform(TransformOutputs outputs) {
7887
}
7988

8089
try {
81-
Logging.getLogger(UnpackTransform.class)
82-
.info("Unpacking " + archiveFile.getName() + " using " + getClass().getSimpleName() + ".");
90+
LOGGER.info("Unpacking {} using {}.", archiveFile.getName(), getClass().getSimpleName());
8391
unpack(archiveFile, extractedDir, outputs, getParameters().getAsFiletreeOutput());
84-
} catch (IOException e) {
85-
throw UncheckedException.throwAsUncheckedException(e);
92+
} catch (IOException e1) {
93+
String hash = "[unknown]";
94+
try {
95+
hash = getSha1(archiveFile);
96+
} catch (Exception e2) {
97+
LOGGER.warn("Unable to calculate hash for file " + archiveFile.getPath(), e2);
98+
}
99+
throw new UncheckedIOException("Failed to unpack " + archiveFile.getName() + " with checksum " + hash, e1);
86100
}
87101
}
88102

@@ -137,4 +151,15 @@ static Path trimArchiveExtractPath(List<String> keepPatterns, String ignoredPatt
137151
// finally remove the top-level directories from the output path
138152
return entryName.subpath(index + 1, entryName.getNameCount());
139153
}
154+
155+
static String getSha1(File file) throws IOException, NoSuchAlgorithmException {
156+
MessageDigest digest = MessageDigest.getInstance("SHA-1");
157+
try (InputStream is = new DigestInputStream(new FileInputStream(file), digest)) {
158+
byte[] buffer = new byte[4096];
159+
while (is.read(buffer) > 0) {
160+
// loop
161+
}
162+
}
163+
return HexFormat.of().formatHex(digest.digest());
164+
}
140165
}

0 commit comments

Comments
 (0)