Skip to content

Commit 3a65a4a

Browse files
committed
fix: add support for symlinks in DigestUtils.gitBlob()
1 parent 0b07ee3 commit 3a65a4a

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

src/main/java/org/apache/commons/codec/digest/DigestUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,11 @@ public static byte[] gitBlob(final MessageDigest messageDigest, final byte[] dat
438438
*/
439439
public static byte[] gitBlob(final MessageDigest messageDigest, final Path data, final OpenOption... options) throws IOException {
440440
messageDigest.reset();
441+
if (Files.isSymbolicLink(data)) {
442+
final byte[] linkTarget = Files.readSymbolicLink(data).toString().getBytes(StandardCharsets.UTF_8);
443+
updateDigest(messageDigest, gitBlobPrefix(linkTarget.length));
444+
return digest(messageDigest, linkTarget);
445+
}
441446
updateDigest(messageDigest, gitBlobPrefix(Files.size(data)));
442447
return updateDigest(messageDigest, data, options).digest();
443448
}

src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@
5050
import org.apache.commons.lang3.StringUtils;
5151
import org.apache.commons.lang3.SystemUtils;
5252
import org.junit.jupiter.api.AfterEach;
53+
import org.junit.jupiter.api.Assumptions;
5354
import org.junit.jupiter.api.BeforeEach;
5455
import org.junit.jupiter.api.Test;
56+
import org.junit.jupiter.api.io.TempDir;
5557
import org.junit.jupiter.params.ParameterizedTest;
5658
import org.junit.jupiter.params.provider.Arguments;
5759
import org.junit.jupiter.params.provider.MethodSource;
@@ -517,6 +519,24 @@ void testGitBlobPath(final String resourceName, final String expectedSha1Hex) th
517519
assertArrayEquals(Hex.decodeHex(expectedSha1Hex), DigestUtils.gitBlob(DigestUtils.getSha1Digest(), resourcePath(resourceName)));
518520
}
519521

522+
@Test
523+
void testGitBlobSymlink(@TempDir final Path tempDir) throws Exception {
524+
final Path subDir = Files.createDirectory(tempDir.resolve("subdir"));
525+
Files.write(subDir.resolve("file.txt"), "hello".getBytes(StandardCharsets.UTF_8));
526+
final Path linkToDir;
527+
final Path linkToFile;
528+
try {
529+
linkToDir = Files.createSymbolicLink(tempDir.resolve("link-to-dir"), Paths.get("subdir"));
530+
linkToFile = Files.createSymbolicLink(tempDir.resolve("link-to-file"), Paths.get("subdir/file.txt"));
531+
} catch (final UnsupportedOperationException e) {
532+
Assumptions.assumeTrue(false, "Symbolic links not supported on this filesystem");
533+
return;
534+
}
535+
final MessageDigest sha1 = DigestUtils.getSha1Digest();
536+
assertArrayEquals(Hex.decodeHex("8bbe8a53790056316b23b7c270f10ab6bf6bb1b4"), DigestUtils.gitBlob(sha1, linkToDir));
537+
assertArrayEquals(Hex.decodeHex("dfe6ef8392ae13a11ff85419b4fd906d997b6cb7"), DigestUtils.gitBlob(sha1, linkToFile));
538+
}
539+
520540
@ParameterizedTest
521541
@ValueSource(strings = {MessageDigestAlgorithms.SHA_1, MessageDigestAlgorithms.SHA_256})
522542
void testGitTreeCollection(final String algorithm) throws Exception {

0 commit comments

Comments
 (0)