Skip to content
This repository has been archived by the owner on Dec 3, 2023. It is now read-only.

Commit

Permalink
[MB] Add validation into merge command [closes #1071]
Browse files Browse the repository at this point in the history
  • Loading branch information
TomasVotruba committed Sep 9, 2018
1 parent dfd5d42 commit 4279740
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 20 deletions.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
57 changes: 41 additions & 16 deletions packages/MonorepoBuilder/src/Console/Command/MergeCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -65,31 +81,40 @@ 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;
}

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.');

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use Symfony\Component\Console\Style\SymfonyStyle;

final class ConflictingVersionsReporter
final class ConflictingPackageVersionsReporter
{
/**
* @var SymfonyStyle
Expand All @@ -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 = [];
Expand All @@ -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.');
}
}
}
2 changes: 1 addition & 1 deletion packages/MonorepoBuilder/src/VersionValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 = [];

Expand Down

0 comments on commit 4279740

Please sign in to comment.