diff options
| author | Joas Schilling <nickvergessen@gmx.de> | 2014-04-26 18:04:47 +0200 | 
|---|---|---|
| committer | Joas Schilling <nickvergessen@gmx.de> | 2014-04-26 18:04:47 +0200 | 
| commit | 927c219b1fc1cc69f724827771d567384b2cda8c (patch) | |
| tree | 7c3cb3c2f37d0f144acc0a4d21e41d9cc124e4f1 /phpBB/phpbb | |
| parent | 7a44f66448fcdc53ed3c371c25317e553217eec8 (diff) | |
| download | forums-927c219b1fc1cc69f724827771d567384b2cda8c.tar forums-927c219b1fc1cc69f724827771d567384b2cda8c.tar.gz forums-927c219b1fc1cc69f724827771d567384b2cda8c.tar.bz2 forums-927c219b1fc1cc69f724827771d567384b2cda8c.tar.xz forums-927c219b1fc1cc69f724827771d567384b2cda8c.zip | |
[ticket/12273] Use RecursiveDirectoryIterator with filter in php_exporter
PHPBB3-12273
Diffstat (limited to 'phpBB/phpbb')
| -rw-r--r-- | phpBB/phpbb/event/php_exporter.php | 56 | ||||
| -rw-r--r-- | phpBB/phpbb/event/recursive_event_filter_iterator.php | 45 | 
2 files changed, 59 insertions, 42 deletions
| diff --git a/phpBB/phpbb/event/php_exporter.php b/phpBB/phpbb/event/php_exporter.php index 41058216e8..8e4a9d399d 100644 --- a/phpBB/phpbb/event/php_exporter.php +++ b/phpBB/phpbb/event/php_exporter.php @@ -100,17 +100,22 @@ class php_exporter  	/**  	* Returns a list of files in $dir  	* -	* Works recursive with any depth -	*  	* @param	string	$dir	Directory to go through -	* @param	string	$path	Path from root to $dir -	* @return	array	List of files (including directories) +	* @return	array	List of files (including the path)  	*/ -	public function get_recursive_file_list($dir, $path = '') +	public function get_recursive_file_list($dir)  	{  		try  		{ -			$iterator = new \DirectoryIterator($dir); +			$iterator = new \RecursiveIteratorIterator( +				new \phpbb\event\recursive_event_filter_iterator( +					new \RecursiveDirectoryIterator( +						$dir, +						\FilesystemIterator::SKIP_DOTS +					) +				), +				\RecursiveIteratorIterator::LEAVES_ONLY +			);  		}  		catch (\Exception $e)  		{ @@ -120,42 +125,9 @@ class php_exporter  		$files = array();  		foreach ($iterator as $file_info)  		{ -			/** @var \DirectoryIterator $file_info */ -			if ($file_info->isDot()) -			{ -				continue; -			} - -			// Do not scan some directories -			if ($file_info->isDir() && ( -					($path == '' && in_array($file_info->getFilename(), array( -						'cache', -						'develop', -						'ext', -						'files', -						'language', -						'store', -						'vendor', -					))) -					|| ($path == '/includes' && in_array($file_info->getFilename(), array('utf'))) -					|| ($path == '/phpbb/db/migration' && in_array($file_info->getFilename(), array('data'))) -					|| ($path == '/phpbb' && in_array($file_info->getFilename(), array('event'))) -				)) -			{ -				continue; -			} -			else if ($file_info->isDir()) -			{ -				$sub_dir = $this->get_recursive_file_list($file_info->getPath() . '/' . $file_info->getFilename(), $path . '/' . $file_info->getFilename()); -				foreach ($sub_dir as $file) -				{ -					$files[] = $file_info->getFilename() . '/' . $file; -				} -			} -			else if (substr($file_info->getFilename(), -4) == '.php') -			{ -				$files[] = $file_info->getFilename(); -			} +			/** @var \RecursiveDirectoryIterator $file_info */ +			$relative_path = $iterator->getInnerIterator()->getSubPathname(); +			$files[] = str_replace(DIRECTORY_SEPARATOR, '/', $relative_path);  		}  		return $files; diff --git a/phpBB/phpbb/event/recursive_event_filter_iterator.php b/phpBB/phpbb/event/recursive_event_filter_iterator.php new file mode 100644 index 0000000000..c520bdae4a --- /dev/null +++ b/phpBB/phpbb/event/recursive_event_filter_iterator.php @@ -0,0 +1,45 @@ +<?php +/** +* +* @package event +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\event; + +/** +* Class recursive_event_filter_iterator +* +* This filter ignores directories and files starting with a dot. +* It also skips some directories that do not contain events anyway, +* such as e.g. files/, store/ and vendor/ +* +* @package phpbb\event +*/ +class recursive_event_filter_iterator extends \RecursiveFilterIterator +{ +	/** +	* {@inheritDoc} +	*/ +	public function accept() +	{ +		$relative_path = str_replace(DIRECTORY_SEPARATOR, '/', $this->current()); +		$filename = $this->current()->getFilename(); + +		return (substr($relative_path, -4) === '.php' || $this->current()->isDir()) +			&& $filename[0] !== '.' +			&& strpos($relative_path, 'phpBB/cache/') !== 0 +			&& strpos($relative_path, 'phpBB/develop/') !== 0 +			&& strpos($relative_path, 'phpBB/ext/') !== 0 +			&& strpos($relative_path, 'phpBB/files/') !== 0 +			&& strpos($relative_path, 'phpBB/includes/utf/') !== 0 +			&& strpos($relative_path, 'phpBB/language/') !== 0 +			&& strpos($relative_path, 'phpBB/phpbb/db/migration/data/') !== 0 +			&& strpos($relative_path, 'phpBB/phpbb/event/') !== 0 +			&& strpos($relative_path, 'phpBB/store/') !== 0 +			&& strpos($relative_path, 'phpBB/vendor/') !== 0 +		; +	} +} | 
