<?php
-namespace Drush\SiteAlias;
+namespace Consolidation\SiteAlias;
use Symfony\Component\Finder\Finder;
*/
class SiteAliasFileDiscovery
{
- protected $searchLocations = [];
- protected $depth = '<= 1';
+ protected $searchLocations;
+ protected $locationFilter;
+ protected $depth;
+
+ public function __construct($searchLocations = [], $depth = '<= 1', $locationFilter = null)
+ {
+ $this->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($path)
+ public function addSearchLocation($paths)
{
- if (is_dir($path)) {
- $this->searchLocations[] = $path;
+ foreach ((array)$paths as $path) {
+ if (is_dir($path)) {
+ $this->searchLocations[] = $path;
+ }
}
return $this;
}
return $this->searchLocations;
}
+ public function locationFilter()
+ {
+ return $this->locationFilter;
+ }
/**
* Set the search depth for finding alias files
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.
*/
public function findSingleSiteAliasFile($siteName)
{
- $matches = $this->searchForAliasFiles("$siteName.site.yml");
+ $matches = $this->find($siteName);
if (empty($matches)) {
return false;
}
{
return array_merge(
$this->searchForAliasFiles('*.alias.drushrc.php'),
- $this->searchForAliasFiles('*.aliases.drushrc.php')
+ $this->searchForAliasFiles('*.aliases.drushrc.php'),
+ $this->searchForAliasFiles('aliases.drushrc.php')
);
}
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;
}
/**
- * Return a list of all alias files with the specified extension.
- *
- * @param string $filenameExensions
- * @return string[]
+ * 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 searchForAliasFilesKeyedByBasenamePrefix($filenameExensions)
+ protected function splitLocationFromSite($site)
{
- if (empty($this->searchLocations)) {
- return [];
- }
- $searchPattern = '*' . $filenameExensions;
- $finder = $this->createFinder($searchPattern);
- $result = [];
- foreach ($finder as $file) {
- $path = $file->getRealPath();
- $key = $this->extractKey($file->getBasename(), $filenameExensions);
- $result[$key] = $path;
- }
- return $result;
+ $parts = explode('.', $site, 3) + ['', '', ''];
+
+ return array_slice($parts, 0, 2);
}
+
// TODO: Seems like this could just be basename()
protected function extractKey($basename, $filenameExensions)
{