diff --git a/manifest/ManifestFileFinder.php b/manifest/ManifestFileFinder.php new file mode 100644 index 000000000..63e8e2969 --- /dev/null +++ b/manifest/ManifestFileFinder.php @@ -0,0 +1,65 @@ + false, + 'ignore_tests' => true, + 'min_depth' => 1 + ); + + public function acceptDir($basename, $pathname, $depth) { + // Skip over the assets directory in the site root. + if ($depth == 1 && $basename == ASSETS_DIR) { + return false; + } + + // Skip over any lang directories in the top level of the module. + if ($depth == 2 && $basename == self::LANG_DIR) { + return false; + } + + // If we're not in testing mode, then skip over the tests directory in + // the module root. + if ($this->getOption('ignore_tests') && $depth == 2 && $basename == self::TESTS_DIR) { + return false; + } + + // Ignore any directories which contain a _manifest_exclude file. + if (file_exists($pathname . '/' . self::EXCLUDE_FILE)) { + return false; + } + + // Only include top level module directories which have a configuration + // _config.php file. However, if we're in themes mode then include + // the themes dir without a config file. + $lackingConfig = ( + $depth == 1 + && !($this->getOption('include_themes') && $basename == THEMES_DIR) + && !file_exists($pathname . '/' . self::CONFIG_FILE) + ); + + if ($lackingConfig) { + return false; + } + + return parent::acceptDir($basename, $pathname, $depth); + } + +} \ No newline at end of file diff --git a/tests/manifest/ManifestFileFinderTest.php b/tests/manifest/ManifestFileFinderTest.php new file mode 100644 index 000000000..a5045e52f --- /dev/null +++ b/tests/manifest/ManifestFileFinderTest.php @@ -0,0 +1,61 @@ +base = dirname(__FILE__) . '/fixtures/manifestfilefinder'; + parent::__construct(); + } + + public function assertFinderFinds($finder, $expect, $message = null) { + $found = $finder->find($this->base); + + foreach ($expect as $k => $file) { + $expect[$k] = "{$this->base}/$file"; + } + + sort($expect); + sort($found); + + $this->assertEquals($expect, $found, $message); + } + + public function testBasicOperation() { + $finder = new ManifestFileFinder(); + $finder->setOption('name_regex', '/\.txt$/'); + + $this->assertFinderFinds($finder, array( + 'module/module.txt' + )); + } + + public function testIgnoreTests() { + $finder = new ManifestFileFinder(); + $finder->setOption('name_regex', '/\.txt$/'); + $finder->setOption('ignore_tests', false); + + $this->assertFinderFinds($finder, array( + 'module/module.txt', + 'module/tests/tests.txt' + )); + } + + public function testIncludeThemes() { + $finder = new ManifestFileFinder(); + $finder->setOption('name_regex', '/\.txt$/'); + $finder->setOption('include_themes', true); + + $this->assertFinderFinds($finder, array( + 'module/module.txt', + 'themes/themes.txt' + )); + } + +} \ No newline at end of file diff --git a/tests/manifest/fixtures/manifestfilefinder/assets/_config.php b/tests/manifest/fixtures/manifestfilefinder/assets/_config.php new file mode 100644 index 000000000..b3d9bbc7f --- /dev/null +++ b/tests/manifest/fixtures/manifestfilefinder/assets/_config.php @@ -0,0 +1 @@ +