Skip to content

Commit 5902f59

Browse files
Unpack recursively
1 parent 1cea72f commit 5902f59

File tree

3 files changed

+49
-21
lines changed

3 files changed

+49
-21
lines changed

src/Command/UnpackCommand.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
6161
$lockData = $locker->getLockData();
6262
$installedRepo = $composer->getRepositoryManager()->getLocalRepository();
6363
$versionParser = new VersionParser();
64+
$dryRun = $input->hasOption('dry-run') && $input->getOption('dry-run');
6465

6566
$op = new Operation(true, $input->getOption('sort-packages') || $composer->getConfig()->get('sort-packages'));
6667
foreach ($versionParser->parseNameVersionPairs($packages) as $package) {
@@ -82,7 +83,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
8283
$op->addPackage($pkg->getName(), $pkg->getVersion(), $dev);
8384
}
8485

85-
$unpacker = new Unpacker($composer, $this->resolver);
86+
$unpacker = new Unpacker($composer, $this->resolver, $dryRun);
8687
$result = $unpacker->unpack($op);
8788

8889
// remove the packages themselves
@@ -115,8 +116,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
115116
$lockData['content-hash'] = $locker->getContentHash(file_get_contents($json->getPath()));
116117
$lockFile = new JsonFile(substr($json->getPath(), 0, -4).'lock', null, $io);
117118

118-
$dryRun = $input->hasOption('dry-run') && !$input->getOption('dry-run');
119-
if ($dryRun) {
119+
if (!$dryRun) {
120120
$lockFile->write($lockData);
121121
}
122122

src/Unpack/Result.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,17 @@ class Result
1818
private $unpacked = [];
1919
private $required = [];
2020

21-
public function addUnpacked(PackageInterface $package)
21+
public function addUnpacked(PackageInterface $package): bool
2222
{
23-
$this->unpacked[] = $package;
23+
$name = $package->getName();
24+
25+
if (!isset($this->unpacked[$name])) {
26+
$this->unpacked[$name] = $package;
27+
28+
return true;
29+
}
30+
31+
return false;
2432
}
2533

2634
/**

src/Unpacker.php

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
use Composer\Composer;
1515
use Composer\DependencyResolver\Pool;
1616
use Composer\Factory;
17-
use Composer\Json\JsonFile;
1817
use Composer\Json\JsonManipulator;
1918
use Composer\Package\Version\VersionSelector;
2019
use Composer\Repository\CompositeRepository;
@@ -26,18 +25,25 @@ class Unpacker
2625
{
2726
private $composer;
2827
private $resolver;
28+
private $dryRun;
29+
private $jsonPath;
30+
private $manipulator;
2931

30-
public function __construct(Composer $composer, PackageResolver $resolver)
32+
public function __construct(Composer $composer, PackageResolver $resolver, bool $dryRun)
3133
{
3234
$this->composer = $composer;
3335
$this->resolver = $resolver;
36+
$this->dryRun = $dryRun;
3437
}
3538

36-
public function unpack(Operation $op): Result
39+
public function unpack(Operation $op, Result $result = null): Result
3740
{
38-
$result = new Result();
39-
$json = new JsonFile(Factory::getComposerFile());
40-
$manipulator = new JsonManipulator(file_get_contents($json->getPath()));
41+
if (null === $result) {
42+
$result = new Result();
43+
$this->jsonPath = Factory::getComposerFile();
44+
$this->manipulator = new JsonManipulator(file_get_contents($this->jsonPath));
45+
}
46+
4147
$localRepo = $this->composer->getRepositoryManager()->getLocalRepository();
4248
foreach ($op->getPackages() as $package) {
4349
$pkg = $localRepo->findPackage($package['name'], $package['version'] ?: '*');
@@ -55,8 +61,11 @@ public function unpack(Operation $op): Result
5561
continue;
5662
}
5763

64+
if (!$result->addUnpacked($pkg)) {
65+
continue;
66+
}
67+
5868
$versionSelector = null;
59-
$result->addUnpacked($pkg);
6069
foreach ($pkg->getRequires() as $link) {
6170
if ('php' === $link->getTarget()) {
6271
continue;
@@ -65,24 +74,35 @@ public function unpack(Operation $op): Result
6574
$constraint = $link->getPrettyConstraint();
6675
$constraint = substr($this->resolver->parseVersion($link->getTarget(), $constraint, !$package['dev']), 1) ?: $constraint;
6776

68-
if ('*' === $constraint && $subPkg = $localRepo->findPackage($link->getTarget(), '*')) {
69-
if (null === $versionSelector) {
70-
$pool = class_exists(RepositorySet::class) ? RepositorySet::class : Pool::class;
71-
$pool = new $pool($this->composer->getPackage()->getMinimumStability(), $this->composer->getPackage()->getStabilityFlags());
72-
$pool->addRepository(new CompositeRepository($this->composer->getRepositoryManager()->getRepositories()));
73-
$versionSelector = new VersionSelector($pool);
77+
if ($subPkg = $localRepo->findPackage($link->getTarget(), '*')) {
78+
if ('symfony-pack' === $subPkg->getType()) {
79+
$subOp = new Operation(true, $op->shouldSort());
80+
$subOp->addPackage($subPkg->getName(), $constraint, $package['dev']);
81+
$result = $this->unpack($subOp, $result);
82+
continue;
7483
}
7584

76-
$constraint = $versionSelector->findRecommendedRequireVersion($subPkg);
85+
if ('*' === $constraint) {
86+
if (null === $versionSelector) {
87+
$pool = class_exists(RepositorySet::class) ? RepositorySet::class : Pool::class;
88+
$pool = new $pool($this->composer->getPackage()->getMinimumStability(), $this->composer->getPackage()->getStabilityFlags());
89+
$pool->addRepository(new CompositeRepository($this->composer->getRepositoryManager()->getRepositories()));
90+
$versionSelector = new VersionSelector($pool);
91+
}
92+
93+
$constraint = $versionSelector->findRecommendedRequireVersion($subPkg);
94+
}
7795
}
7896

79-
if (!$manipulator->addLink($package['dev'] ? 'require-dev' : 'require', $link->getTarget(), $constraint, $op->shouldSort())) {
97+
if (!$this->manipulator->addLink($package['dev'] ? 'require-dev' : 'require', $link->getTarget(), $constraint, $op->shouldSort())) {
8098
throw new \RuntimeException(sprintf('Unable to unpack package "%s".', $link->getTarget()));
8199
}
82100
}
83101
}
84102

85-
file_put_contents($json->getPath(), $manipulator->getContents());
103+
if (!$this->dryRun && 1 === \func_num_args()) {
104+
file_put_contents($this->jsonPath, $this->manipulator->getContents());
105+
}
86106

87107
return $result;
88108
}

0 commit comments

Comments
 (0)