Resolve dependencies through the repositories the packages filter dropped
A partial build (`satis build satis.json web/ vendor/package`) narrows the repository list down to the ones providing the requested packages. The dependency pass then reused that narrowed list, so with `require-dependencies` nothing the filtered package required could be found -- packagist.org and every other repository had already been dropped. Feed the dependency repository set the repositories the filter removed, the same way the repository-URL filter already does. Fixes #706
This commit is contained in:
1 parent
1a8cdb80c2
commit
8e2a075614
2 files changed
+56
-11
No files matched your search
@@ -221,12 +221,17 @@ class PackageSelection
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->hasFilterForPackages()) {
|
$reposDroppedByPackagesFilter = [];
|
||||||
$repos = $this->filterPackages($repos);
|
|
||||||
|
|
||||||
if (0 === count($repos)) {
|
if ($this->hasFilterForPackages()) {
|
||||||
|
$filteredRepos = $this->filterPackages($repos);
|
||||||
|
|
||||||
|
if (0 === count($filteredRepos)) {
|
||||||
throw new \InvalidArgumentException(sprintf('Could not find any repositories config with "name" matching your package(s) filter: %s', implode(', ', $this->packagesFilter)));
|
throw new \InvalidArgumentException(sprintf('Could not find any repositories config with "name" matching your package(s) filter: %s', implode(', ', $this->packagesFilter)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$reposDroppedByPackagesFilter = array_filter($repos, static fn ($repo) => !in_array($repo, $filteredRepos, true));
|
||||||
|
$repos = $filteredRepos;
|
||||||
}
|
}
|
||||||
|
|
||||||
$repositorySet = new RepositorySet($this->minimumStability, $stabilityFlags);
|
$repositorySet = new RepositorySet($this->minimumStability, $stabilityFlags);
|
||||||
@@ -253,6 +258,9 @@ class PackageSelection
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the packages filter picks what to request, not who may answer a dependency
|
||||||
|
$this->addRepositories($repositorySet, $reposDroppedByPackagesFilter);
|
||||||
|
|
||||||
// additional repositories for dependencies
|
// additional repositories for dependencies
|
||||||
if (!$this->hasRepositoriesFilter() || true !== $this->repositoryFilterDep) {
|
if (!$this->hasRepositoriesFilter() || true !== $this->repositoryFilterDep) {
|
||||||
$this->addRepositories($repositorySet, $this->getDepRepos($composer));
|
$this->addRepositories($repositorySet, $this->getDepRepos($composer));
|
||||||
|
|||||||
@@ -1401,6 +1401,32 @@ class PackageSelectionTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* `require-dependencies` resolves through the repositories the filter dropped.
|
||||||
|
*
|
||||||
|
* @see https://github.com/composer/satis/issues/706
|
||||||
|
*/
|
||||||
|
public function testSelectWithPackagesFilterStillResolvesDependencies(): void
|
||||||
|
{
|
||||||
|
$filteredPackage = 'vendor/filtered-package';
|
||||||
|
$dependency = 'vendor/dependency-package';
|
||||||
|
|
||||||
|
$this->runPackagesFilterSelection(
|
||||||
|
fn (string $workDir): array => [
|
||||||
|
$this->createLocalRepositoryConfig(
|
||||||
|
self::REPOSITORY_TYPE_PACKAGE,
|
||||||
|
$filteredPackage,
|
||||||
|
$workDir,
|
||||||
|
[$dependency => self::FIXTURE_VERSION]
|
||||||
|
),
|
||||||
|
$this->createLocalRepositoryConfig(self::REPOSITORY_TYPE_PACKAGE, $dependency, $workDir),
|
||||||
|
],
|
||||||
|
[$filteredPackage],
|
||||||
|
[$dependency, $filteredPackage],
|
||||||
|
['require-dependencies' => true]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs `select()` with a packages filter over a throwaway working directory
|
* Runs `select()` with a packages filter over a throwaway working directory
|
||||||
* and asserts which packages came out.
|
* and asserts which packages came out.
|
||||||
@@ -1408,18 +1434,20 @@ class PackageSelectionTest extends TestCase
|
|||||||
* @param callable(string): list<array<string, mixed>> $buildRepositories
|
* @param callable(string): list<array<string, mixed>> $buildRepositories
|
||||||
* @param list<string> $packagesFilter
|
* @param list<string> $packagesFilter
|
||||||
* @param list<string> $expectedPackageNames
|
* @param list<string> $expectedPackageNames
|
||||||
|
* @param array<string, mixed> $extraConfig
|
||||||
*/
|
*/
|
||||||
private function runPackagesFilterSelection(
|
private function runPackagesFilterSelection(
|
||||||
callable $buildRepositories,
|
callable $buildRepositories,
|
||||||
array $packagesFilter,
|
array $packagesFilter,
|
||||||
array $expectedPackageNames,
|
array $expectedPackageNames,
|
||||||
|
array $extraConfig = [],
|
||||||
): void {
|
): void {
|
||||||
$filesystem = new Filesystem();
|
$filesystem = new Filesystem();
|
||||||
$workDir = sys_get_temp_dir() . '/satis-package-filter-' . uniqid('', true);
|
$workDir = sys_get_temp_dir() . '/satis-package-filter-' . uniqid('', true);
|
||||||
$filesystem->ensureDirectoryExists($workDir);
|
$filesystem->ensureDirectoryExists($workDir);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$config = [
|
$config = $extraConfig + [
|
||||||
'name' => 'test/satis',
|
'name' => 'test/satis',
|
||||||
'homepage' => 'http://localhost',
|
'homepage' => 'http://localhost',
|
||||||
'repositories' => $buildRepositories($workDir),
|
'repositories' => $buildRepositories($workDir),
|
||||||
@@ -1448,19 +1476,28 @@ class PackageSelectionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Builds the repository fixture on disk and returns its Satis config entry.
|
* Builds the repository fixture on disk and returns its Satis config entry.
|
||||||
*
|
*
|
||||||
|
* @param array<string, string> $requires
|
||||||
|
*
|
||||||
* @return array<string, mixed>
|
* @return array<string, mixed>
|
||||||
*/
|
*/
|
||||||
private function createLocalRepositoryConfig(string $repositoryType, string $packageName, string $workDir): array
|
private function createLocalRepositoryConfig(
|
||||||
{
|
string $repositoryType,
|
||||||
$composerJson = json_encode(
|
string $packageName,
|
||||||
['name' => $packageName, 'version' => self::FIXTURE_VERSION],
|
string $workDir,
|
||||||
\JSON_THROW_ON_ERROR
|
array $requires = [],
|
||||||
);
|
): array {
|
||||||
|
$manifest = ['name' => $packageName, 'version' => self::FIXTURE_VERSION];
|
||||||
|
|
||||||
|
if ([] !== $requires) {
|
||||||
|
$manifest['require'] = $requires;
|
||||||
|
}
|
||||||
|
|
||||||
|
$composerJson = json_encode($manifest, \JSON_THROW_ON_ERROR);
|
||||||
|
|
||||||
if (self::REPOSITORY_TYPE_PACKAGE === $repositoryType) {
|
if (self::REPOSITORY_TYPE_PACKAGE === $repositoryType) {
|
||||||
return [
|
return [
|
||||||
'type' => self::REPOSITORY_TYPE_PACKAGE,
|
'type' => self::REPOSITORY_TYPE_PACKAGE,
|
||||||
'package' => ['name' => $packageName, 'version' => self::FIXTURE_VERSION],
|
'package' => $manifest,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user