This is an automated email from the ASF dual-hosted git repository.
pkarwasz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-codec.git
The following commit(s) were added to refs/heads/master by this push:
new 3a65a4a9 fix: add support for symlinks in `DigestUtils.gitBlob()`
3a65a4a9 is described below
commit 3a65a4a974f420798f5aec507988cb61bfb1d82d
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Mon Mar 30 19:05:34 2026 +0200
fix: add support for symlinks in `DigestUtils.gitBlob()`
---
.../org/apache/commons/codec/digest/DigestUtils.java | 5 +++++
.../apache/commons/codec/digest/DigestUtilsTest.java | 20 ++++++++++++++++++++
2 files changed, 25 insertions(+)
diff --git a/src/main/java/org/apache/commons/codec/digest/DigestUtils.java
b/src/main/java/org/apache/commons/codec/digest/DigestUtils.java
index 4c197ee3..eeec88b3 100644
--- a/src/main/java/org/apache/commons/codec/digest/DigestUtils.java
+++ b/src/main/java/org/apache/commons/codec/digest/DigestUtils.java
@@ -438,6 +438,11 @@ public class DigestUtils {
*/
public static byte[] gitBlob(final MessageDigest messageDigest, final Path
data, final OpenOption... options) throws IOException {
messageDigest.reset();
+ if (Files.isSymbolicLink(data)) {
+ final byte[] linkTarget =
Files.readSymbolicLink(data).toString().getBytes(StandardCharsets.UTF_8);
+ updateDigest(messageDigest, gitBlobPrefix(linkTarget.length));
+ return digest(messageDigest, linkTarget);
+ }
updateDigest(messageDigest, gitBlobPrefix(Files.size(data)));
return updateDigest(messageDigest, data, options).digest();
}
diff --git a/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java
b/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java
index c58f4ee1..7d1e72b0 100644
--- a/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java
+++ b/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java
@@ -50,8 +50,10 @@ import org.apache.commons.lang3.JavaVersion;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
@@ -517,6 +519,24 @@ class DigestUtilsTest {
assertArrayEquals(Hex.decodeHex(expectedSha1Hex),
DigestUtils.gitBlob(DigestUtils.getSha1Digest(), resourcePath(resourceName)));
}
+ @Test
+ void testGitBlobSymlink(@TempDir final Path tempDir) throws Exception {
+ final Path subDir = Files.createDirectory(tempDir.resolve("subdir"));
+ Files.write(subDir.resolve("file.txt"),
"hello".getBytes(StandardCharsets.UTF_8));
+ final Path linkToDir;
+ final Path linkToFile;
+ try {
+ linkToDir =
Files.createSymbolicLink(tempDir.resolve("link-to-dir"), Paths.get("subdir"));
+ linkToFile =
Files.createSymbolicLink(tempDir.resolve("link-to-file"),
Paths.get("subdir/file.txt"));
+ } catch (final UnsupportedOperationException e) {
+ Assumptions.assumeTrue(false, "Symbolic links not supported on
this filesystem");
+ return;
+ }
+ final MessageDigest sha1 = DigestUtils.getSha1Digest();
+
assertArrayEquals(Hex.decodeHex("8bbe8a53790056316b23b7c270f10ab6bf6bb1b4"),
DigestUtils.gitBlob(sha1, linkToDir));
+
assertArrayEquals(Hex.decodeHex("dfe6ef8392ae13a11ff85419b4fd906d997b6cb7"),
DigestUtils.gitBlob(sha1, linkToFile));
+ }
+
@ParameterizedTest
@ValueSource(strings = {MessageDigestAlgorithms.SHA_1,
MessageDigestAlgorithms.SHA_256})
void testGitTreeCollection(final String algorithm) throws Exception {