From 13b8ce0a18244e0ac85cc8b712e22dfb3a53c537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Simon?= Date: Tue, 26 Feb 2013 11:03:08 +0100 Subject: [PATCH] Adds expandable globs support to shell adapters --- .../Finder/Adapter/AbstractFindAdapter.php | 10 ++++++++++ .../Component/Finder/Expression/Expression.php | 14 ++++++++++++++ src/Symfony/Component/Finder/Expression/Glob.php | 11 +++++++++++ src/Symfony/Component/Finder/Tests/FinderTest.php | 10 ++++++++++ 4 files changed, 45 insertions(+) diff --git a/src/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php b/src/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php index d9ad2b10543b..1e3117fd518f 100644 --- a/src/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php +++ b/src/Symfony/Component/Finder/Adapter/AbstractFindAdapter.php @@ -154,6 +154,11 @@ private function buildNamesFiltering(Command $command, array $names, $not = fals foreach ($names as $i => $name) { $expr = Expression::create($name); + // Find does not support expandable globs ("*.{a,b}" syntax). + if ($expr->isGlob() && $expr->getGlob()->isExpandable()) { + $expr = Expression::create($expr->getGlob()->toRegex(false)); + } + // Fixes 'not search' and 'full path matching' regex problems. // - Jokers '.' are replaced by [^/]. // - We add '[^/]*' before and after regex (if no ^|$ flags are present). @@ -197,6 +202,11 @@ private function buildPathsFiltering(Command $command, $dir, array $paths, $not foreach ($paths as $i => $path) { $expr = Expression::create($path); + // Find does not support expandable globs ("*.{a,b}" syntax). + if ($expr->isGlob() && $expr->getGlob()->isExpandable()) { + $expr = Expression::create($expr->getGlob()->toRegex(false)); + } + // Fixes 'not search' regex problems. if ($expr->isRegex()) { $regex = $expr->getRegex(); diff --git a/src/Symfony/Component/Finder/Expression/Expression.php b/src/Symfony/Component/Finder/Expression/Expression.php index 9c87ddf3da2b..ceedbc18a9ee 100644 --- a/src/Symfony/Component/Finder/Expression/Expression.php +++ b/src/Symfony/Component/Finder/Expression/Expression.php @@ -122,6 +122,20 @@ public function isGlob() return self::TYPE_GLOB === $this->value->getType(); } + /** + * @throws \LogicException + * + * @return Glob + */ + public function getGlob() + { + if (self::TYPE_GLOB !== $this->value->getType()) { + throw new \LogicException('Regex cant be transformed to glob.'); + } + + return $this->value; + } + /** * @return Regex */ diff --git a/src/Symfony/Component/Finder/Expression/Glob.php b/src/Symfony/Component/Finder/Expression/Glob.php index f6af7d01294b..3023ceea69a3 100644 --- a/src/Symfony/Component/Finder/Expression/Glob.php +++ b/src/Symfony/Component/Finder/Expression/Glob.php @@ -81,6 +81,17 @@ public function append($expr) return $this; } + /** + * Tests if glob is expandable ("*.{a,b}" syntax). + * + * @return bool + */ + public function isExpandable() + { + return false !== strpos($this->pattern, '{') + && false !== strpos($this->pattern, '}'); + } + /** * @param bool $strictLeadingDot * @param bool $strictWildcardSlash diff --git a/src/Symfony/Component/Finder/Tests/FinderTest.php b/src/Symfony/Component/Finder/Tests/FinderTest.php index c919264f2ebe..854fe4ee3c64 100644 --- a/src/Symfony/Component/Finder/Tests/FinderTest.php +++ b/src/Symfony/Component/Finder/Tests/FinderTest.php @@ -106,6 +106,10 @@ public function testName($adapter) $finder = $this->buildFinder($adapter); $finder->name('~\\.php$~i'); $this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator()); + + $finder = $this->buildFinder($adapter); + $finder->name('test.p{hp,y}'); + $this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator()); } /** @@ -128,6 +132,12 @@ public function testNotName($adapter) $finder->notName('*.php'); $finder->notName('*.py'); $this->assertIterator(array(), $finder->in(self::$tmpDir)->getIterator()); + + $finder = $this->buildFinder($adapter); + $finder->name('test.ph*'); + $finder->name('test.py'); + $finder->notName('*.p{hp,y}'); + $this->assertIterator(array(), $finder->in(self::$tmpDir)->getIterator()); } /**