From ea1defff53633dbfa1a2f859d74e1a9babf7f011 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Thu, 2 Mar 2017 11:34:07 +0100 Subject: [PATCH] [Config] Sort "globbed" paths to make them predictable --- .../Component/Config/Loader/FileLoader.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Config/Loader/FileLoader.php b/src/Symfony/Component/Config/Loader/FileLoader.php index f54b6f8cda..6b1706e15b 100644 --- a/src/Symfony/Component/Config/Loader/FileLoader.php +++ b/src/Symfony/Component/Config/Loader/FileLoader.php @@ -129,8 +129,18 @@ abstract class FileLoader extends Loader if (false === strpos($resource, '/**/') && (defined('GLOB_BRACE') || false === strpos($resource, '{'))) { foreach (glob($prefix.$resource, defined('GLOB_BRACE') ? GLOB_BRACE : 0) as $path) { if ($recursive && is_dir($path)) { - $flags = \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS; - foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path, $flags)) as $path => $info) { + $files = iterator_to_array(new \RecursiveIteratorIterator( + new \RecursiveCallbackFilterIterator( + new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), + function (\SplFileInfo $file) { return '.' !== $file->getBasename()[0]; } + ), + \RecursiveIteratorIterator::LEAVES_ONLY + )); + usort($files, function (\SplFileInfo $a, \SplFileInfo $b) { + return (string) $a > (string) $b ? 1 : -1; + }); + + foreach ($files as $path => $info) { if ($info->isFile()) { yield $path => $info; } @@ -154,7 +164,7 @@ abstract class FileLoader extends Loader } $prefixLen = strlen($prefix); - foreach ($finder->followLinks()->in($prefix) as $path => $info) { + foreach ($finder->followLinks()->sortByName()->in($prefix) as $path => $info) { if (preg_match($regex, substr($path, $prefixLen)) && $info->isFile()) { yield $path => $info; }