diff --git a/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java b/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java index 0f2861b69..e448d6868 100644 --- a/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/AbstractUnArchiver.java @@ -409,7 +409,7 @@ protected boolean shouldExtractEntry( File targetDirectory, File targetFileName, "" ) + suffix; boolean fileOnDiskIsNewerThanEntry = targetFileName.lastModified() >= entryDate.getTime(); - boolean differentCasing = !entryName.equals( relativeCanonicalDestPath ); + boolean differentCasing = !entryName.replace("/", File.separator).equals( relativeCanonicalDestPath ); String casingMessage = String.format( "Archive entry '%s' and existing file '%s' names differ only by case." + " This may lead to an unexpected outcome on case-insensitive filesystems.", entryName, canonicalDestPath ); diff --git a/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java b/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java index 8435fdf33..b479affe7 100644 --- a/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/AbstractUnArchiverTest.java @@ -200,6 +200,22 @@ public void shouldNotWarnAboutDifferentCasingForDirectoryEntries() throws IOExce assertThat( this.log.getWarns(), not( hasItem( new LogMessageMatcher( "names differ only by case" ) ) ) ); } + + @Test + public void shouldExtractWhenCasingDifferOnlyInEntryNamePath() throws IOException + { + // given + File file = new File( temporaryFolder.getRoot() + File.separator + "directory", "whatever.txt" ); // does not create the file! + file.mkdirs(); + file.createNewFile(); + String entryname = "directory/whatever.txt"; + Date entryDate = new Date(System.currentTimeMillis()+5000); + + // when & then + this.abstractUnArchiver.setOverwrite( true ); + assertThat( this.abstractUnArchiver.shouldExtractEntry( temporaryFolder.getRoot(), file, entryname, entryDate ), is ( true ) ); + } + static class LogMessageMatcher extends BaseMatcher { private final StringContains delegateMatcher;