From 4279740ff7f140588f8f300573fb9a53dba1e928 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 9 Sep 2018 15:52:29 +0200 Subject: [PATCH] [MB] Add validation into merge command [closes #1071] --- composer.json | 1 + .../src/Console/Command/MergeCommand.php | 57 +++++++++++++------ .../ConflictingPackageVersionsReporter.php | 8 ++- .../MonorepoBuilder/src/VersionValidator.php | 2 +- 4 files changed, 48 insertions(+), 20 deletions(-) diff --git a/composer.json b/composer.json index 5f30345b55..6cc71db0d4 100644 --- a/composer.json +++ b/composer.json @@ -36,6 +36,7 @@ "nette/application": "^2.4", "phpstan/phpstan": "^0.10.3|^0.9", "phpunit/phpunit": "^7.3", + "slam/php-cs-fixer-extensions": "^1.17", "tracy/tracy": "^2.4" }, "replace": { diff --git a/packages/MonorepoBuilder/src/Console/Command/MergeCommand.php b/packages/MonorepoBuilder/src/Console/Command/MergeCommand.php index d66805d569..dfc66d123a 100644 --- a/packages/MonorepoBuilder/src/Console/Command/MergeCommand.php +++ b/packages/MonorepoBuilder/src/Console/Command/MergeCommand.php @@ -6,9 +6,11 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +use Symplify\MonorepoBuilder\Console\Reporter\ConflictingPackageVersionsReporter; use Symplify\MonorepoBuilder\DependenciesMerger; +use Symplify\MonorepoBuilder\FileSystem\ComposerJsonProvider; use Symplify\MonorepoBuilder\Package\PackageComposerJsonMerger; -use Symplify\MonorepoBuilder\PackageComposerFinder; +use Symplify\MonorepoBuilder\VersionValidator; use Symplify\PackageBuilder\Console\Command\CommandNaming; final class MergeCommand extends Command @@ -29,14 +31,24 @@ final class MergeCommand extends Command private $mergeSections = []; /** - * @var PackageComposerFinder + * @var DependenciesMerger */ - private $packageComposerFinder; + private $dependenciesMerger; /** - * @var DependenciesMerger + * @var VersionValidator */ - private $dependenciesMerger; + private $versionValidator; + + /** + * @var ComposerJsonProvider + */ + private $composerJsonProvider; + + /** + * @var ConflictingPackageVersionsReporter + */ + private $conflictingPackageVersionsReporter; /** * @param string[] $mergeSections @@ -45,16 +57,20 @@ public function __construct( array $mergeSections, SymfonyStyle $symfonyStyle, PackageComposerJsonMerger $packageComposerJsonMerger, - PackageComposerFinder $packageComposerFinder, - DependenciesMerger $dependenciesMerger + DependenciesMerger $dependenciesMerger, + VersionValidator $versionValidator, + ComposerJsonProvider $composerJsonProvider, + ConflictingPackageVersionsReporter $conflictingPackageVersionsReporter ) { + parent::__construct(); $this->symfonyStyle = $symfonyStyle; $this->packageComposerJsonMerger = $packageComposerJsonMerger; - $this->packageComposerFinder = $packageComposerFinder; $this->dependenciesMerger = $dependenciesMerger; $this->mergeSections = $mergeSections; + $this->versionValidator = $versionValidator; + $this->composerJsonProvider = $composerJsonProvider; - parent::__construct(); + $this->conflictingPackageVersionsReporter = $conflictingPackageVersionsReporter; } protected function configure(): void @@ -65,7 +81,7 @@ protected function configure(): void protected function execute(InputInterface $input, OutputInterface $output): int { - $composerPackageFiles = $this->packageComposerFinder->getPackageComposerFiles(); + $composerPackageFiles = $this->composerJsonProvider->getPackagesComposerJsonFileInfos(); if (! count($composerPackageFiles)) { $this->symfonyStyle->error('No "composer.json" were found in packages.'); return 1; @@ -73,23 +89,32 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($this->mergeSections === []) { $this->symfonyStyle->error( - 'The "merge_sections:" parameter is empty, add "require", "require-dev", "autoload", "autoload-dev" and or "repositories" to your config' + 'The "parameters > merge_sections:" is empty, add "require", "require-dev", "autoload", "autoload-dev" and or "repositories" to your config' ); return 1; } - $merged = $this->packageComposerJsonMerger->mergeFileInfos($composerPackageFiles, $this->mergeSections); + $allComposerJsonFiles[] = $composerPackageFiles + [$this->composerJsonProvider->getRootComposerJsonFileInfo()]; + + $conflictingPackageVersions = $this->versionValidator->findConflictingPackageVersionsInFileInfos( + $allComposerJsonFiles + ); + + if (count($conflictingPackageVersions) > 0) { + $this->conflictingPackageVersionsReporter->report($conflictingPackageVersions); + // fail + return 1; + } + + $merged = $this->packageComposerJsonMerger->mergeFileInfos($composerPackageFiles, $this->mergeSections); if ($merged === []) { $this->symfonyStyle->note('Nothing to merge.'); // success return 0; } - $this->dependenciesMerger->mergeJsonToRootFilePathAndSave( - $merged, - getcwd() . DIRECTORY_SEPARATOR . 'composer.json' - ); + $this->dependenciesMerger->mergeJsonToRootFilePathAndSave($merged, getcwd() . '/composer.json'); $this->symfonyStyle->success('Main "composer.json" was updated.'); diff --git a/packages/MonorepoBuilder/src/Console/Reporter/ConflictingPackageVersionsReporter.php b/packages/MonorepoBuilder/src/Console/Reporter/ConflictingPackageVersionsReporter.php index 4fc6756b8a..24c262b583 100644 --- a/packages/MonorepoBuilder/src/Console/Reporter/ConflictingPackageVersionsReporter.php +++ b/packages/MonorepoBuilder/src/Console/Reporter/ConflictingPackageVersionsReporter.php @@ -4,7 +4,7 @@ use Symfony\Component\Console\Style\SymfonyStyle; -final class ConflictingVersionsReporter +final class ConflictingPackageVersionsReporter { /** * @var SymfonyStyle @@ -19,7 +19,7 @@ public function __construct(SymfonyStyle $symfonyStyle) /** * @param mixed[] $conflictingPackages */ - public function reportConflictingPackages(array $conflictingPackages): void + public function report(array $conflictingPackages): void { foreach ($conflictingPackages as $packageName => $filesToVersions) { $tableData = []; @@ -30,5 +30,7 @@ public function reportConflictingPackages(array $conflictingPackages): void $this->symfonyStyle->title(sprintf('Package "%s" has various version', $packageName)); $this->symfonyStyle->table(['File', 'Version'], $tableData); } + + $this->symfonyStyle->error('Found conflicting package versions, fix them first.'); } -} \ No newline at end of file +} diff --git a/packages/MonorepoBuilder/src/VersionValidator.php b/packages/MonorepoBuilder/src/VersionValidator.php index fe5c0cd93f..7d2c86e3bf 100644 --- a/packages/MonorepoBuilder/src/VersionValidator.php +++ b/packages/MonorepoBuilder/src/VersionValidator.php @@ -27,7 +27,7 @@ public function __construct(JsonFileManager $jsonFileManager) * @param SplFileInfo[] $fileInfos * @return string[][] */ - public function findConflictingPackageInFileInfos(array $fileInfos): array + public function findConflictingPackageVersionsInFileInfos(array $fileInfos): array { $packageVersionsPerFile = [];