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 {

Reply via email to