diff --git a/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php b/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php index 73cf386..79a2726 100644 --- a/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php +++ b/core/lib/Drupal/Core/Extension/Discovery/RecursiveExtensionFilterIterator.php @@ -97,7 +97,7 @@ class RecursiveExtensionFilterIterator extends \RecursiveFilterIterator { */ public function __construct(\RecursiveIterator $iterator, array $blacklist = []) { parent::__construct($iterator); - $this->blacklist += $blacklist; + $this->blacklist = array_merge($this->blacklist, $blacklist); } /** @@ -121,6 +121,8 @@ public function acceptTests($flag = FALSE) { */ public function getChildren() { $filter = parent::getChildren(); + // Pass on the blacklist. + $filter->blacklist = $this->blacklist; // Pass the $acceptTests flag forward to child iterators. $filter->acceptTests($this->acceptTests); return $filter; diff --git a/core/modules/system/src/Tests/Common/SystemListingTest.php b/core/modules/system/src/Tests/Common/SystemListingTest.php index a9d1549..ec3fcda 100644 --- a/core/modules/system/src/Tests/Common/SystemListingTest.php +++ b/core/modules/system/src/Tests/Common/SystemListingTest.php @@ -55,4 +55,27 @@ function testDirectoryPrecedence() { ))); } } + + /** + * Tests that directories matching file_scan_ignore_directories are ignored + */ + function testFileScanIgnoreDirectory() { + $listing = new ExtensionDiscovery(\Drupal::root(), FALSE); + $listing->setProfileDirectories(array('core/profiles/testing')); + $files = $listing->scan('module'); + $this->assertTrue(isset($files['drupal_system_listing_compatible_test'])); + + // Reset the static to force a rescan of the directories. + $reflected_class = new \ReflectionClass(ExtensionDiscovery::class); + $reflected_property = $reflected_class->getProperty('files'); + $reflected_property->setAccessible(true); + $reflected_property->setValue($reflected_class, []); + + $this->settingsSet('file_scan_ignore_directories', ['drupal_system_listing_compatible_test']); + $listing = new ExtensionDiscovery(\Drupal::root(), FALSE); + $listing->setProfileDirectories(array('core/profiles/testing')); + $files = $listing->scan('module'); + $this->assertFalse(isset($files['drupal_system_listing_compatible_test'])); + } + }