Chris@18: Chris@18: * @copyright 2019 Juliette Reinders Folmer. All rights reserved. Chris@18: * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence Chris@18: */ Chris@18: Chris@18: /** Chris@18: * Class to create a file list with filtering. Chris@18: */ Chris@18: class FileList Chris@18: { Chris@18: Chris@18: /** Chris@18: * The path to the project root directory. Chris@18: * Chris@18: * @var string Chris@18: */ Chris@18: protected $rootPath; Chris@18: Chris@18: /** Chris@18: * Recursive directory iterator. Chris@18: * Chris@18: * @var \DirectoryIterator Chris@18: */ Chris@18: protected $fileIterator; Chris@18: Chris@18: /** Chris@18: * Base regex to use if no filter regex is provided. Chris@18: * Chris@18: * Matches based on: Chris@18: * - File path starts with the project root (replacement done in constructor). Chris@18: * - Don't match .git/ files. Chris@18: * - Don't match dot files, i.e. "." or "..". Chris@18: * - Don't match backup files. Chris@18: * - Match everything else in a case-insensitive manner. Chris@18: * Chris@18: * @var string Chris@18: */ Chris@18: private $baseRegex = '`^%s(?!\.git/)(?!(.*/)?\.+$)(?!.*\.(bak|orig)).*$`Dix'; Chris@18: Chris@18: Chris@18: /** Chris@18: * Constructor. Chris@18: * Chris@18: * @param string $directory The directory to examine. Chris@18: * @param string $rootPath Path to the project root. Chris@18: * @param string $filter PCRE regular expression to filter the file list with. Chris@18: */ Chris@18: public function __construct($directory, $rootPath='', $filter='') Chris@18: { Chris@18: $this->rootPath = $rootPath; Chris@18: Chris@18: $directory = new \RecursiveDirectoryIterator( Chris@18: $directory, Chris@18: \RecursiveDirectoryIterator::UNIX_PATHS Chris@18: ); Chris@18: $flattened = new \RecursiveIteratorIterator( Chris@18: $directory, Chris@18: \RecursiveIteratorIterator::LEAVES_ONLY, Chris@18: \RecursiveIteratorIterator::CATCH_GET_CHILD Chris@18: ); Chris@18: Chris@18: if ($filter === '') { Chris@18: $filter = sprintf($this->baseRegex, preg_quote($this->rootPath)); Chris@18: } Chris@18: Chris@18: $this->fileIterator = new \RegexIterator($flattened, $filter); Chris@18: Chris@18: return $this; Chris@18: Chris@18: }//end __construct() Chris@18: Chris@18: Chris@18: /** Chris@18: * Retrieve the filtered file list as an array. Chris@18: * Chris@18: * @return array Chris@18: */ Chris@18: public function getList() Chris@18: { Chris@18: $fileList = []; Chris@18: Chris@18: foreach ($this->fileIterator as $file) { Chris@18: $fileList[] = str_replace($this->rootPath, '', $file); Chris@18: } Chris@18: Chris@18: return $fileList; Chris@18: Chris@18: }//end getList() Chris@18: Chris@18: Chris@18: }//end class