Skip to content

Commit a4a9a89

Browse files
authored
tv is source (#75)
* add is source to analyse directly * add --is-source option to load versions of multiple projects
1 parent e4c7553 commit a4a9a89

File tree

4 files changed

+69
-9
lines changed

4 files changed

+69
-9
lines changed

src/Command/MultiPackageComposerStatsCommand.php

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Symfony\Component\Console\Helper\TableStyle;
1313
use Symfony\Component\Console\Input\InputArgument;
1414
use Symfony\Component\Console\Input\InputInterface;
15+
use Symfony\Component\Console\Input\InputOption;
1516
use Symfony\Component\Console\Output\OutputInterface;
1617
use Symfony\Component\Console\Style\SymfonyStyle;
1718
use Webmozart\Assert\Assert;
@@ -40,6 +41,13 @@ protected function configure(): void
4041
'One or more repositories to compare package versions of'
4142
);
4243

44+
$this->addOption(
45+
'is-source',
46+
null,
47+
InputOption::VALUE_NONE,
48+
'Provided repositories are main sources, analyze their dependencies instead'
49+
);
50+
4351
$this->setDescription(
4452
'Compares package versions in multiple repositories, to easily sync multiple package upgrade'
4553
);
@@ -48,21 +56,33 @@ protected function configure(): void
4856
protected function execute(InputInterface $input, OutputInterface $output): int
4957
{
5058
$repositories = (array) $input->getArgument('repositories');
59+
$isSource = (bool) $input->getOption('is-source');
5160
Assert::allString($repositories);
5261

62+
if ($isSource) {
63+
$this->symfonyStyle->title(sprintf('Loading dependencies for %d projects', count($repositories)));
64+
65+
$projectsComposerJson = $this->composerJsonResolver->resolveFromRepositories($repositories);
66+
foreach ($projectsComposerJson->all() as $i => $projectComposerJson) {
67+
$this->symfonyStyle->section(sprintf(
68+
'%d) Showing external repositories for "%s" project',
69+
$i + 1,
70+
$projectComposerJson->getRepositoryName()
71+
));
72+
73+
$this->renderTableForRepositories($projectComposerJson->getRequiredRepositories());
74+
$this->symfonyStyle->newLine();
75+
}
76+
77+
return self::SUCCESS;
78+
}
79+
5380
$this->symfonyStyle->title(sprintf(
5481
'Loading "composer.json" files for %d repositories',
5582
count($repositories)
5683
));
5784

58-
$composerJsonCollection = $this->composerJsonResolver->resolveFromRepositories($repositories);
59-
60-
$requiredPackageNames = $composerJsonCollection->getRequiredPackageNames();
61-
62-
$tableHeadlines = array_merge(['dependency'], $composerJsonCollection->getRepositoryNames());
63-
$tableRows = $this->createTableRows($requiredPackageNames, $composerJsonCollection);
64-
65-
$this->renderTable($tableHeadlines, $tableRows);
85+
$this->renderTableForRepositories($repositories);
6686

6787
return self::SUCCESS;
6888
}
@@ -93,7 +113,7 @@ private function createTableRows(array $requiredPackageNames, ComposerJsonCollec
93113
}
94114

95115
// we need at least 2 values to compare
96-
if ($knownValuesCount < 2) {
116+
if ($requiredPackageName !== 'php' && $knownValuesCount < 2) {
97117
continue;
98118
}
99119

@@ -136,4 +156,18 @@ private function isUnknownPhp(string $packageName, ?string $packageVersion): boo
136156

137157
return $packageVersion === null;
138158
}
159+
160+
/**
161+
* @param string[] $repositories
162+
*/
163+
private function renderTableForRepositories(array $repositories): void
164+
{
165+
$composerJsonCollection = $this->composerJsonResolver->resolveFromRepositories($repositories);
166+
$requiredPackageNames = $composerJsonCollection->getRequiredPackageNames();
167+
168+
$tableHeadlines = array_merge(['dependency'], $composerJsonCollection->getRepositoryNames());
169+
$tableRows = $this->createTableRows($requiredPackageNames, $composerJsonCollection);
170+
171+
$this->renderTable($tableHeadlines, $tableRows);
172+
}
139173
}

src/Composer/ComposerJsonResolver.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ private function getComposerJsonForRepository(string $repository, bool $useCache
7575
$bareComposerJson = [
7676
'require' => $projectsComposerJson['require'] ?? [],
7777
'require-dev' => $projectsComposerJson['require-dev'] ?? [],
78+
'repositories' => $projectsComposerJson['repositories'] ?? [],
7879
];
7980

8081
FileSystem::write($cacheFilePath, Json::encode($bareComposerJson, pretty: true));

src/Helper/SymfonyColumnStyler.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public static function styleHighsAndLows(array $tableRow): array
5858
public static function createRedCell(string $content): TableCell
5959
{
6060
return self::cellWithStyle($content, [
61+
'align' => 'center',
6162
'bg' => 'red',
6263
'fg' => 'white',
6364
]);

src/ValueObject/ComposerJson.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,30 @@ public function getPackageVersion(string $packageName): ?string
4141
return $this->getBothRequires()[$packageName] ?? null;
4242
}
4343

44+
/**
45+
* @return string[]
46+
*/
47+
public function getRequiredRepositories(): array
48+
{
49+
$repositories = [];
50+
51+
$repositoriesData = $this->composerJson['repositories'] ?? [];
52+
foreach ($repositoriesData as $repositoryData) {
53+
if (! isset($repositoryData['url'])) {
54+
continue;
55+
}
56+
57+
// not a git repository reference
58+
if (! str_ends_with($repositoryData['url'], '.git')) {
59+
continue;
60+
}
61+
62+
$repositories[] = $repositoryData['url'];
63+
}
64+
65+
return $repositories;
66+
}
67+
4468
/**
4569
* @return array<string, string>
4670
*/

0 commit comments

Comments
 (0)