From 29b961107f9be21c9c04b0990fba000cb1ec70d0 Mon Sep 17 00:00:00 2001 From: Jakub Zalas Date: Wed, 2 Jan 2013 01:06:26 +0100 Subject: [PATCH] [Finder] Added support for GLOB patterns in the directories passed to the in() method. Pattern has to resolve to at least one directory, otherwise exception is thrown (just like when path to an invalid directory is passed). --- src/Symfony/Component/Finder/CHANGELOG.md | 2 ++ src/Symfony/Component/Finder/Finder.php | 14 ++++++++----- .../Component/Finder/Tests/FinderTest.php | 21 +++++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/Finder/CHANGELOG.md b/src/Symfony/Component/Finder/CHANGELOG.md index a88dd941ee..7b8efdd9e1 100644 --- a/src/Symfony/Component/Finder/CHANGELOG.md +++ b/src/Symfony/Component/Finder/CHANGELOG.md @@ -6,6 +6,8 @@ CHANGELOG * added Finder::path() and Finder::notPath() methods * added finder adapters to improve performance on specific platforms + * added support for wildcard characters (glob patterns) in the paths passed + to Finder::in() 2.1.0 ----- diff --git a/src/Symfony/Component/Finder/Finder.php b/src/Symfony/Component/Finder/Finder.php index aa32cd4e33..3b075218c8 100644 --- a/src/Symfony/Component/Finder/Finder.php +++ b/src/Symfony/Component/Finder/Finder.php @@ -598,21 +598,25 @@ class Finder implements \IteratorAggregate, \Countable * * @return Finder The current Finder instance * - * @throws \InvalidArgumentException if one of the directory does not exist + * @throws \InvalidArgumentException if one of the directories does not exist * * @api */ public function in($dirs) { - $dirs = (array) $dirs; + $resolvedDirs = array(); - foreach ($dirs as $dir) { - if (!is_dir($dir)) { + foreach ((array) $dirs as $dir) { + if (is_dir($dir)) { + $resolvedDirs[] = $dir; + } elseif ($glob = glob($dir, GLOB_ONLYDIR)) { + $resolvedDirs = array_merge($resolvedDirs, $glob); + } else { throw new \InvalidArgumentException(sprintf('The "%s" directory does not exist.', $dir)); } } - $this->dirs = array_merge($this->dirs, $dirs); + $this->dirs = array_merge($this->dirs, $resolvedDirs); return $this; } diff --git a/src/Symfony/Component/Finder/Tests/FinderTest.php b/src/Symfony/Component/Finder/Tests/FinderTest.php index dcc8bb95bd..3134f4ec88 100644 --- a/src/Symfony/Component/Finder/Tests/FinderTest.php +++ b/src/Symfony/Component/Finder/Tests/FinderTest.php @@ -311,6 +311,27 @@ class FinderTest extends Iterator\RealIteratorTestCase $this->assertIterator(array(self::$tmpDir.DIRECTORY_SEPARATOR.'test.php', __DIR__.DIRECTORY_SEPARATOR.'FinderTest.php'), $iterator); } + /** + * @dataProvider getAdaptersTestData + */ + public function testInWithGlob($adapter) + { + $finder = $this->buildFinder($adapter); + $finder->in(array(__DIR__.'/Fixtures/*/B/C', __DIR__.'/Fixtures/*/*/B/C'))->getIterator(); + + $this->assertIterator($this->toAbsoluteFixtures(array('A/B/C/abc.dat', 'copy/A/B/C/abc.dat.copy')), $finder); + } + + /** + * @dataProvider getAdaptersTestData + * @expectedException \InvalidArgumentException + */ + public function testInWithNonDirectoryGlob($adapter) + { + $finder = $this->buildFinder($adapter); + $finder->in(__DIR__.'/Fixtures/A/a*'); + } + /** * @dataProvider getAdaptersTestData */