X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fconsolidation%2Fsite-alias%2Fsrc%2FSiteAliasFileDiscovery.php;fp=vendor%2Fconsolidation%2Fsite-alias%2Fsrc%2FSiteAliasFileDiscovery.php;h=3902c6c357c03e70e9a28b7062b3806ac946cb38;hp=0000000000000000000000000000000000000000;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hpb=74df008bdbb3a11eeea356744f39b802369bda3c diff --git a/vendor/consolidation/site-alias/src/SiteAliasFileDiscovery.php b/vendor/consolidation/site-alias/src/SiteAliasFileDiscovery.php new file mode 100644 index 000000000..3902c6c35 --- /dev/null +++ b/vendor/consolidation/site-alias/src/SiteAliasFileDiscovery.php @@ -0,0 +1,213 @@ +locationFilter = $locationFilter; + $this->searchLocations = $searchLocations; + $this->depth = $depth; + } + + /** + * Add a location that alias files may be found. + * + * @param string $path + * @return $this + */ + public function addSearchLocation($paths) + { + foreach ((array)$paths as $path) { + if (is_dir($path)) { + $this->searchLocations[] = $path; + } + } + return $this; + } + + /** + * Return all of the paths where alias files may be found. + * @return string[] + */ + public function searchLocations() + { + return $this->searchLocations; + } + + public function locationFilter() + { + return $this->locationFilter; + } + + /** + * Set the search depth for finding alias files + * + * @param string|int $depth (@see \Symfony\Component\Finder\Finder::depth) + * @return $this + */ + public function depth($depth) + { + $this->depth = $depth; + return $this; + } + + /** + * Only search for aliases that are in alias files stored in directories + * whose basename or key matches the specified location. + */ + public function filterByLocation($location) + { + if (empty($location)) { + return $this; + } + + return new SiteAliasFileDiscovery($this->searchLocations(), $this->depth, $location); + } + + /** + * Find an alias file SITENAME.site.yml in one + * of the specified search locations. + * + * @param string $siteName + * @return string[] + */ + public function find($siteName) + { + return $this->searchForAliasFiles("$siteName.site.yml"); + } + + /** + * Find an alias file SITENAME.site.yml in one + * of the specified search locations. + * + * @param string $siteName + * @return string|bool + */ + public function findSingleSiteAliasFile($siteName) + { + $matches = $this->find($siteName); + if (empty($matches)) { + return false; + } + return reset($matches); + } + + /** + * Return a list of all SITENAME.site.yml files in any of + * the search locations. + * + * @return string[] + */ + public function findAllSingleAliasFiles() + { + return $this->searchForAliasFiles('*.site.yml'); + } + + /** + * Return all of the legacy alias files used in previous Drush versions. + * + * @return string[] + */ + public function findAllLegacyAliasFiles() + { + return array_merge( + $this->searchForAliasFiles('*.alias.drushrc.php'), + $this->searchForAliasFiles('*.aliases.drushrc.php'), + $this->searchForAliasFiles('aliases.drushrc.php') + ); + } + + /** + * Create a Symfony Finder object to search all available search locations + * for the specified search pattern. + * + * @param string $searchPattern + * @return Finder + */ + protected function createFinder($searchPattern) + { + $finder = new Finder(); + $finder->files() + ->name($searchPattern) + ->in($this->searchLocations) + ->depth($this->depth); + return $finder; + } + + /** + * Return a list of all alias files matching the provided pattern. + * + * @param string $searchPattern + * @return string[] + */ + protected function searchForAliasFiles($searchPattern) + { + if (empty($this->searchLocations)) { + return []; + } + list($match, $site) = $this->splitLocationFromSite($this->locationFilter); + if (!empty($site)) { + $searchPattern = str_replace('*', $site, $searchPattern); + } + $finder = $this->createFinder($searchPattern); + $result = []; + foreach ($finder as $file) { + $path = $file->getRealPath(); + $result[] = $path; + } + // Find every location where the parent directory name matches + // with the first part of the search pattern. + // In theory we can use $finder->path() instead. That didn't work well, + // in practice, though; had trouble correctly escaping the path separators. + if (!empty($this->locationFilter)) { + $result = array_filter($result, function ($path) use ($match) { + return SiteAliasName::locationFromPath($path) === $match; + }); + } + + return $result; + } + + /** + * splitLocationFromSite returns the part of 'site' before the first + * '.' as the "path match" component, and the part after the first + * '.' as the "site" component. + */ + protected function splitLocationFromSite($site) + { + $parts = explode('.', $site, 3) + ['', '', '']; + + return array_slice($parts, 0, 2); + } + + + // TODO: Seems like this could just be basename() + protected function extractKey($basename, $filenameExensions) + { + return str_replace($filenameExensions, '', $basename); + } +}