From a503307807ca01d55f74d665b3363b544639c8eb Mon Sep 17 00:00:00 2001 From: Maarten Mulders Date: Sat, 24 Oct 2020 10:47:33 +0200 Subject: [PATCH] Fix unjustified warning about casing for directory entries --- .../plexus/archiver/AbstractUnArchiver.java | 7 ++++++- .../archiver/AbstractUnArchiverTest.java | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java b/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java index bfb4b8fa4..cc493c740 100644 --- a/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java @@ -405,8 +405,13 @@ protected boolean shouldExtractEntry( File targetDirectory, File targetFileName, return true; } + boolean entryIsDirectory = entryName.endsWith( "/" ); // directory entries always end with '/', regardless of the OS. String canonicalDestPath = targetFileName.getCanonicalPath(); - String relativeCanonicalDestPath = canonicalDestPath.replace( targetDirectory.getCanonicalPath() + File.separatorChar, "" ); + String suffix = (entryIsDirectory ? "/" : ""); + String relativeCanonicalDestPath = canonicalDestPath.replace( + targetDirectory.getCanonicalPath() + File.separatorChar, + "" ) + + suffix; boolean fileOnDiskIsNewerThanEntry = targetFileName.lastModified() >= entryDate.getTime(); boolean differentCasing = !entryName.equals( relativeCanonicalDestPath ); diff --git a/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java b/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java index b7870adb5..8435fdf33 100644 --- a/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java @@ -33,7 +33,8 @@ import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; /** * Unit test for {@link AbstractUnArchiver} @@ -184,6 +185,21 @@ public void shouldExtractWhenEntryInArchiveIsNewerThanFileOnDiskAndWarnAboutDiff assertThat( this.log.getWarns(), hasItem( new LogMessageMatcher( "names differ only by case" ) ) ); } + @Test + public void shouldNotWarnAboutDifferentCasingForDirectoryEntries() throws IOException + { + // given + File file = temporaryFolder.newFolder(); + file.setLastModified( 0 ); + String entryname = file.getName() + '/'; // archive entries for directories end with a '/' + Date entryDate = new Date(); + + // when & then + this.abstractUnArchiver.setOverwrite( true ); + assertThat( this.abstractUnArchiver.shouldExtractEntry( temporaryFolder.getRoot(), file, entryname, entryDate ), is( true ) ); + assertThat( this.log.getWarns(), not( hasItem( new LogMessageMatcher( "names differ only by case" ) ) ) ); + } + static class LogMessageMatcher extends BaseMatcher { private final StringContains delegateMatcher;