diff --git a/src/main/java/org/codehaus/plexus/util/MatchPattern.java b/src/main/java/org/codehaus/plexus/util/MatchPattern.java index 4bcc6522..dade194a 100644 --- a/src/main/java/org/codehaus/plexus/util/MatchPattern.java +++ b/src/main/java/org/codehaus/plexus/util/MatchPattern.java @@ -94,7 +94,7 @@ public boolean matchPatternStart( String str, boolean isCaseSensitive ) } else { - String altStr = source.replace( '\\', '/' ); + String altStr = str.replace( '\\', '/' ); return SelectorUtils.matchAntPathPatternStart( this, str, File.separator, isCaseSensitive ) || SelectorUtils.matchAntPathPatternStart( this, altStr, "/", isCaseSensitive ); diff --git a/src/test/java/org/codehaus/plexus/util/DirectoryScannerTest.java b/src/test/java/org/codehaus/plexus/util/DirectoryScannerTest.java index 9d3500ee..90fe70e6 100644 --- a/src/test/java/org/codehaus/plexus/util/DirectoryScannerTest.java +++ b/src/test/java/org/codehaus/plexus/util/DirectoryScannerTest.java @@ -31,8 +31,11 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; @@ -50,6 +53,19 @@ public class DirectoryScannerTest private static String testDir = getTestDirectory().getPath(); + @Before + public void setUp() + { + try + { + FileUtils.deleteDirectory( testDir ); + } + catch ( IOException e ) + { + fail( "Could not delete directory " + testDir ); + } + } + @Test public void testCrossPlatformIncludesString() throws IOException, URISyntaxException @@ -477,6 +493,75 @@ public void testRegexWithSlashInsideCharacterClass() assertInclusionsAndExclusions( ds.getIncludedFiles(), excludedPaths, includedPaths ); } + /** + * Test that the directory scanning does not enter into not matching directories. + * + * @see Issue #63 + * @throws IOException if occurs an I/O error. + */ + @Test + public void testDoNotScanUnnecesaryDirectories() + throws IOException + { + createTestDirectories(); + + // create additional directories 'anotherDir1', 'anotherDir2' and 'anotherDir3' with a 'file1.dat' file + FileUtils.mkdir( testDir + File.separator + "directoryTest" + File.separator + "testDir123" + File.separator + + "anotherDir1" ); + FileUtils.mkdir( testDir + File.separator + "directoryTest" + File.separator + "test_dir_123" + File.separator + + "anotherDir2" ); + FileUtils.mkdir( testDir + File.separator + "directoryTest" + File.separator + "test-dir-123" + File.separator + + "anotherDir3" ); + + this.createFile( new File( testDir + File.separator + "directoryTest" + File.separator + "testDir123" + + File.separator + "anotherDir1" + File.separator + "file1.dat" ), 0 ); + this.createFile( new File( testDir + File.separator + "directoryTest" + File.separator + "test_dir_123" + + File.separator + "anotherDir2" + File.separator + "file1.dat" ), 0 ); + this.createFile( new File( testDir + File.separator + "directoryTest" + File.separator + "test-dir-123" + + File.separator + "anotherDir3" + File.separator + "file1.dat" ), 0 ); + + String[] excludedPaths = { + "directoryTest" + File.separator + "testDir123" + File.separator + "anotherDir1" + File.separator + + "file1.dat", + "directoryTest" + File.separator + "test_dir_123" + File.separator + "anotherDir2" + File.separator + + "file1.dat", + "directoryTest" + File.separator + "test-dir-123" + File.separator + "anotherDir3" + File.separator + + "file1.dat" + }; + + String[] includedPaths = { + "directoryTest" + File.separator + "testDir123" + File.separator + "file1.dat", + "directoryTest" + File.separator + "test_dir_123" + File.separator + "file1.dat", + "directoryTest" + File.separator + "test-dir-123" + File.separator + "file1.dat" + }; + + final Set scannedDirSet = new HashSet(); + + DirectoryScanner ds = new DirectoryScanner() + { + @Override + protected void scandir( File dir, String vpath, boolean fast ) + { + scannedDirSet.add( dir.getName() ); + super.scandir( dir, vpath, fast ); + } + + }; + + // one '*' matches only ONE directory level + String[] includes = { "directoryTest" + File.separator + "*" + File.separator + "file1.dat" }; + ds.setIncludes( includes ); + ds.setBasedir( new File( testDir ) ); + ds.scan(); + + assertInclusionsAndExclusions( ds.getIncludedFiles(), excludedPaths, includedPaths ); + + Set expectedScannedDirSet = + new HashSet( Arrays.asList( "io", "directoryTest", "testDir123", "test_dir_123", "test-dir-123" ) ); + + assertEquals( expectedScannedDirSet, scannedDirSet ); + } + @Test public void testIsSymbolicLink() throws IOException diff --git a/src/test/java/org/codehaus/plexus/util/MatchPatternTest.java b/src/test/java/org/codehaus/plexus/util/MatchPatternTest.java index 38deb81e..b777a2a3 100644 --- a/src/test/java/org/codehaus/plexus/util/MatchPatternTest.java +++ b/src/test/java/org/codehaus/plexus/util/MatchPatternTest.java @@ -16,6 +16,7 @@ * limitations under the License. */ +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; @@ -32,4 +33,23 @@ public void testMatchPath() MatchPattern mp = MatchPattern.fromString( "ABC*" ); assertTrue( mp.matchPath( "ABCD", true ) ); } + + /** + * @see Issue #63 + */ + @Test + public void testMatchPatternStart() + { + MatchPattern mp = MatchPattern.fromString( "ABC*" ); + + assertTrue( mp.matchPatternStart( "ABCD", true ) ); + assertFalse( mp.matchPatternStart( "AbCD", true ) ); + + assertTrue( mp.matchPatternStart( "ABCD", false ) ); + assertTrue( mp.matchPatternStart( "AbCD", false ) ); + + assertFalse( mp.matchPatternStart( "XXXX", true ) ); + assertFalse( mp.matchPatternStart( "XXXX", false ) ); + } + }