Skip to content

Commit

Permalink
DirectoryScanner traverses directories despite limited inclusions (#63)
Browse files Browse the repository at this point in the history
This closes #64 and fixes #63
  • Loading branch information
belingueres authored and michael-o committed Jul 3, 2019
1 parent 59cf121 commit d0b12c6
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/main/java/org/codehaus/plexus/util/MatchPattern.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Expand Down
85 changes: 85 additions & 0 deletions src/test/java/org/codehaus/plexus/util/DirectoryScannerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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 <a href="https://github.com/codehaus-plexus/plexus-utils/issues/63">Issue #63</a>
* @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<String> scannedDirSet = new HashSet<String>();

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<String> expectedScannedDirSet =
new HashSet<String>( Arrays.asList( "io", "directoryTest", "testDir123", "test_dir_123", "test-dir-123" ) );

assertEquals( expectedScannedDirSet, scannedDirSet );
}

@Test
public void testIsSymbolicLink()
throws IOException
Expand Down
20 changes: 20 additions & 0 deletions src/test/java/org/codehaus/plexus/util/MatchPatternTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* limitations under the License.
*/

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.Test;
Expand All @@ -32,4 +33,23 @@ public void testMatchPath()
MatchPattern mp = MatchPattern.fromString( "ABC*" );
assertTrue( mp.matchPath( "ABCD", true ) );
}

/**
* @see <a href="https://github.com/codehaus-plexus/plexus-utils/issues/63">Issue #63</a>
*/
@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 ) );
}

}

0 comments on commit d0b12c6

Please sign in to comment.