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 ) );
+ }
+
}