mirror of
https://github.com/composer/composer
synced 2025-05-11 01:22:54 +00:00
Add support for list URL in composer repos, fixes #9009
This commit is contained in:
parent
45f228a375
commit
70f211923b
3 changed files with 43 additions and 13 deletions
|
@ -58,6 +58,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
protected $providersApiUrl;
|
||||
protected $hasProviders = false;
|
||||
protected $providersUrl;
|
||||
protected $listUrl;
|
||||
protected $availablePackages;
|
||||
protected $lazyProvidersUrl;
|
||||
protected $providerListing;
|
||||
|
@ -288,32 +289,52 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
return parent::getPackages();
|
||||
}
|
||||
|
||||
public function getPackageNames()
|
||||
public function getPackageNames($packageFilter = null)
|
||||
{
|
||||
// TODO add getPackageNames to the RepositoryInterface perhaps? With filtering capability embedded?
|
||||
$hasProviders = $this->hasProviders();
|
||||
|
||||
$packageFilterCb = function ($name) {
|
||||
return true;
|
||||
};
|
||||
if (null !== $packageFilter) {
|
||||
$packageFilterRegex = '{^'.str_replace('\\*', '.*?', preg_quote($packageFilter)).'$}i';
|
||||
$packageFilterCb = function ($name) use ($packageFilterRegex) {
|
||||
return (bool) preg_match($packageFilterRegex, $name);
|
||||
};
|
||||
}
|
||||
|
||||
if ($this->lazyProvidersUrl) {
|
||||
if (is_array($this->availablePackages)) {
|
||||
return array_keys($this->availablePackages);
|
||||
return array_filter(array_keys($this->availablePackages), $packageFilterCb);
|
||||
}
|
||||
|
||||
// TODO implement new list API endpoint for those repos somehow?
|
||||
if ($this->listUrl) {
|
||||
$url = $this->listUrl;
|
||||
if ($packageFilter) {
|
||||
$url .= '?filter='.urlencode($packageFilter);
|
||||
}
|
||||
|
||||
$result = $this->httpDownloader->get($url, $this->options)->decodeJson();
|
||||
|
||||
return $result['packageNames'];
|
||||
}
|
||||
|
||||
if ($this->hasPartialPackages()) {
|
||||
return array_keys($this->partialPackagesByName);
|
||||
return array_filter(array_keys($this->partialPackagesByName), $packageFilterCb);
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
if ($hasProviders) {
|
||||
return $this->getProviderNames();
|
||||
return array_filter($this->getProviderNames(), $packageFilterCb);
|
||||
}
|
||||
|
||||
$names = array();
|
||||
foreach ($this->getPackages() as $package) {
|
||||
$names[] = $package->getPrettyName();
|
||||
if ($packageFilterCb($package->getName())) {
|
||||
$names[] = $package->getPrettyName();
|
||||
}
|
||||
}
|
||||
|
||||
return $names;
|
||||
|
@ -866,6 +887,10 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
|
|||
$this->hasProviders = true;
|
||||
}
|
||||
|
||||
if (!empty($data['list'])) {
|
||||
$this->listUrl = $this->canonicalizeUrl($data['list']);
|
||||
}
|
||||
|
||||
if (!empty($data['providers']) || !empty($data['providers-includes'])) {
|
||||
$this->hasProviders = true;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue