Skip to content

Commit

Permalink
Further decoupling from symfony/symfony replace section
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolas-grekas committed Jun 3, 2019
1 parent 15de149 commit 48e90bf
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 50 deletions.
85 changes: 45 additions & 40 deletions src/Cache.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,32 @@ class Cache extends BaseCache
private $versionParser;
private $symfonyRequire;
private $symfonyConstraints;
private $io;

public function setSymfonyRequire(string $symfonyRequire, array $versions, IOInterface $io = null)
{
$this->versionParser = new VersionParser();
$this->symfonyRequire = $symfonyRequire;
$this->symfonyConstraints = $this->versionParser->parseConstraints($symfonyRequire);

foreach ($versions['splits'] as $name => $vers) {
foreach ($vers as $i => $v) {
$v = $this->versionParser->normalize($v);

if (!$this->symfonyConstraints->matches(new Constraint('==', $v))) {
if (null !== $io) {
$io->writeError(sprintf('<info>Restricting packages listed in "symfony/symfony" to "%s"</info>', $this->symfonyRequire));
$io = null;
}
unset($vers[$i]);
}
}

if (!$vers || $vers === $versions['splits'][$name]) {
unset($versions['splits'][$name]);
}
}

$this->versions = $versions;
$this->io = $io;
}

public function read($file)
Expand All @@ -49,60 +66,48 @@ public function read($file)

public function removeLegacyTags(array $data): array
{
if (!$this->symfonyConstraints || !isset($data['packages']['symfony/symfony'])) {
if (!$this->symfonyConstraints) {
return $data;
}

$masterVersion = $this->versions['master'];
$symfonySymfony = $data['packages']['symfony/symfony'];

foreach ($symfonySymfony as $version => $composerJson) {
if ('dev-master' === $version) {
$normalizedVersion = $this->versionParser->normalize($masterVersion);
} else {
$normalizedVersion = $composerJson['version_normalized'];
foreach ($data['packages'] as $name => $versions) {
if (!isset($this->versions['splits'][$name]) || null === $devMasterAlias = $versions['dev-master']['extra']['branch-alias']['dev-master'] ?? null) {
continue;
}

if (!$this->symfonyConstraints->matches(new Constraint('==', $normalizedVersion))) {
if (null !== $this->io) {
$this->io->writeError(sprintf('<info>Restricting packages listed in "symfony/symfony" to "%s"</info>', $this->symfonyRequire));
$this->io = null;
foreach ($versions as $version => $composerJson) {
if ('dev-master' === $version) {
$normalizedVersion = $this->versionParser->normalize($devMasterAlias);
} else {
$normalizedVersion = $composerJson['version_normalized'];
}
unset($symfonySymfony[$version]);
}
}

if (!$symfonySymfony) {
// ignore requirements: their intersection with versions of symfony/symfony is empty
return $data;
}

$symfonyPackages = [];
foreach ($this->versions['splits'] as $name => $versions) {
foreach ($versions as $version) {
if ($this->symfonyConstraints->matches(new Constraint('==', $this->versionParser->normalize($version)))) {
$symfonyPackages[$name] = true;
if (!$this->symfonyConstraints->matches(new Constraint('==', $normalizedVersion))) {
unset($versions[$version]);
}
}

$data['packages'][$name] = $versions;
}

$data['packages']['symfony/symfony'] = $symfonySymfony;
unset($symfonySymfony['dev-master']);
if (null === $symfonySymfony = $data['packages']['symfony/symfony'] ?? null) {
return $data;
}

foreach ($data['packages'] as $name => $versions) {
if (!isset($symfonyPackages[$name]) || null === $devMasterAlias = $versions['dev-master']['extra']['branch-alias']['dev-master'] ?? null) {
continue;
foreach ($symfonySymfony as $version => $composerJson) {
if ('dev-master' === $version) {
$normalizedVersion = $this->versionParser->normalize($composerJson['extra']['branch-alias']['dev-master']);
} else {
$normalizedVersion = $composerJson['version_normalized'];
}
$devMaster = $versions['dev-master'];
$versions = array_intersect_key($versions, $symfonySymfony);

if ($this->symfonyConstraints->matches(new Constraint('==', $this->versionParser->normalize($devMasterAlias)))) {
$versions['dev-master'] = $devMaster;
if (!$this->symfonyConstraints->matches(new Constraint('==', $normalizedVersion))) {
unset($symfonySymfony[$version]);
}
}

if ($versions) {
$data['packages'][$name] = $versions;
}
if ($symfonySymfony) {
$data['packages']['symfony/symfony'] = $symfonySymfony;
}

return $data;
Expand Down
20 changes: 10 additions & 10 deletions tests/CacheTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function testRemoveLegacyTags(array $expected, array $packages, string $s

public function provideRemoveLegacyTags()
{
yield 'no-symfony/symfony' => [[123], [123], '~1', ['master' => '3.5', 'splits' => []]];
yield 'no-symfony/symfony' => [[123], [123], '~1', ['splits' => []]];

$branchAlias = function ($versionAlias) {
return [
Expand Down Expand Up @@ -61,26 +61,26 @@ public function provideRemoveLegacyTags()
],
];

yield 'empty-intersection-ignores' => [$packages, $packages, '~2.0', ['master' => '3.5', 'splits' => [
yield 'empty-intersection-ignores' => [$packages, $packages, '~2.0', ['splits' => [
'symfony/foo' => ['3.3', '3.4', '3.5'],
]]];
yield 'empty-intersection-ignores' => [$packages, $packages, '~4.0', ['master' => '3.5', 'splits' => [
yield 'empty-intersection-ignores' => [$packages, $packages, '~4.0', ['splits' => [
'symfony/foo' => ['3.3', '3.4', '3.5'],
]]];

$expected = $packages;
unset($expected['symfony/symfony']['3.3.0']);
unset($expected['symfony/foo']['3.3.0']);

yield 'non-empty-intersection-filters' => [$expected, $packages, '~3.4', ['master' => '3.5', 'splits' => [
'symfony/foo' => ['3.4', '3.5'],
yield 'non-empty-intersection-filters' => [$expected, $packages, '~3.4', ['splits' => [
'symfony/foo' => ['3.3', '3.4', '3.5'],
]]];

unset($expected['symfony/symfony']['3.4.0']);
unset($expected['symfony/foo']['3.4.0']);

yield 'master-only' => [$expected, $packages, '~3.5', ['master' => '3.5', 'splits' => [
'symfony/foo' => ['3.5'],
yield 'master-only' => [$expected, $packages, '~3.5', ['splits' => [
'symfony/foo' => ['3.4', '3.5'],
]]];

$packages = [
Expand All @@ -95,7 +95,7 @@ public function provideRemoveLegacyTags()
],
];

yield 'legacy-are-not-filtered' => [$packages, $packages, '~3.0', ['master' => '3.5', 'splits' => [
yield 'legacy-are-not-filtered' => [$packages, $packages, '~3.0', ['splits' => [
'symfony/legacy' => ['2.8'],
'symfony/foo' => ['2.8'],
]]];
Expand All @@ -120,9 +120,9 @@ public function provideRemoveLegacyTags()
unset($expected['symfony/symfony']['dev-master']);
unset($expected['symfony/foo']['dev-master']);

yield 'master-is-filtered-only-when-in-range' => [$expected, $packages, '~2.8', ['master' => '3.0', 'splits' => [
yield 'master-is-filtered-only-when-in-range' => [$expected, $packages, '~2.8', ['splits' => [
'symfony/foo' => ['2.8', '3.0'],
'symfony/new' => ['2.8', '3.0'],
'symfony/new' => ['3.0'],
]]];
}
}

0 comments on commit 48e90bf

Please sign in to comment.