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

Commit

Permalink
Merge 18cbe07 into b08d8e4
Browse files Browse the repository at this point in the history
  • Loading branch information
TomasVotruba committed Sep 9, 2018
2 parents b08d8e4 + 18cbe07 commit 17ff4fe
Show file tree
Hide file tree
Showing 9 changed files with 147 additions and 49 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
36 changes: 26 additions & 10 deletions packages/MonorepoBuilder/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,32 @@ composer require symplify/monorepo-builder --dev

### 1. Merge local `composer.json` to the Root One

Merges following sections to the root `composer.json`, so you can only edit `composer.json` of particular packages and let script to synchronize it.

- 'require'
- 'require-dev'
- 'autoload'
- 'autoload-dev'
- 'repositories'
- 'scripts'
- 'extra'
- ...
Merges configured sections to the root `composer.json`, so you can only edit `composer.json` of particular packages and let script to synchronize it.

```yaml
# monorepo-builder.yml
parameters:
merge_sections:
# default values
- 'require'
- 'require-dev'
- 'autoload'
- 'autoload-dev'
- 'repositories'
```

You can configure it and add `minimum-stablity` for example or remove any of those default values:

```yaml
# monorepo-builder.yml
parameters:
merge_sections:
- 'require'
- 'require-dev'
- 'minimum-stability'
```

To merge just run:

```bash
vendor/bin/monorepo-builder merge
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
31 changes: 15 additions & 16 deletions packages/MonorepoBuilder/src/Console/Command/ValidateCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
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\FileSystem\ComposerJsonProvider;
use Symplify\MonorepoBuilder\VersionValidator;
use Symplify\PackageBuilder\Console\Command\CommandNaming;
Expand All @@ -27,16 +28,22 @@ final class ValidateCommand extends Command
*/
private $composerJsonProvider;

/**
* @var ConflictingPackageVersionsReporter
*/
private $conflictingPackageVersionsReporter;

public function __construct(
SymfonyStyle $symfonyStyle,
ComposerJsonProvider $composerJsonProvider,
VersionValidator $versionValidator
VersionValidator $versionValidator,
ConflictingPackageVersionsReporter $conflictingPackageVersionsReporter
) {
parent::__construct();
$this->symfonyStyle = $symfonyStyle;
$this->versionValidator = $versionValidator;
$this->composerJsonProvider = $composerJsonProvider;

parent::__construct();
$this->conflictingPackageVersionsReporter = $conflictingPackageVersionsReporter;
}

protected function configure(): void
Expand All @@ -55,25 +62,17 @@ protected function execute(InputInterface $input, OutputInterface $output): int

$composerFileInfos[] = $this->composerJsonProvider->getRootComposerJsonFileInfo();

$conflictingPackage = $this->versionValidator->findConflictingPackageInFileInfos($composerFileInfos);
if ($conflictingPackage === []) {
$conflictingPackageVersions = $this->versionValidator->findConflictingPackageVersionsInFileInfos(
$composerFileInfos
);
if ($conflictingPackageVersions === []) {
$this->symfonyStyle->success('All packages "composer.json" files use same package versions.');

// success
return 0;
}

foreach ($conflictingPackage as $packageName => $filesToVersions) {
$tableData = [];
foreach ($filesToVersions as $file => $version) {
$tableData[] = [$file, $version];
}

$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.');
$this->conflictingPackageVersionsReporter->report($conflictingPackageVersions);

// fail
return 1;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php declare(strict_types=1);

namespace Symplify\MonorepoBuilder\Console\Reporter;

use Symfony\Component\Console\Style\SymfonyStyle;

final class ConflictingPackageVersionsReporter
{
/**
* @var SymfonyStyle
*/
private $symfonyStyle;

public function __construct(SymfonyStyle $symfonyStyle)
{
$this->symfonyStyle = $symfonyStyle;
}

/**
* @param mixed[] $conflictingPackages
*/
public function report(array $conflictingPackages): void
{
foreach ($conflictingPackages as $packageName => $filesToVersions) {
$tableData = [];
foreach ($filesToVersions as $file => $version) {
$tableData[] = [$file, $version];
}

$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.');
}
}
28 changes: 24 additions & 4 deletions packages/MonorepoBuilder/src/Package/PackageComposerJsonMerger.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,33 @@ public function mergeFileInfos(array $composerPackageFileInfos, array $sections)
continue;
}

$merged[$section] = $this->parametersMerger->merge(
$merged[$section] ?? [],
$packageComposerJson[$section]
);
$merged = $this->mergeSection($packageComposerJson, $section, $merged);
}
}

return $merged;
}

/**
* @param mixed[] $packageComposerJson
* @param mixed[] $merged
* @return mixed[]
*/
private function mergeSection(array $packageComposerJson, string $section, array $merged): array
{
// array sections
if (is_array($packageComposerJson[$section])) {
$merged[$section] = $this->parametersMerger->merge(
$merged[$section] ?? [],
$packageComposerJson[$section]
);

return $merged;
}

// key: value sections, like "minimum-stability: dev"
$merged[$section] = $packageComposerJson[$section];

return $merged;
}
}
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
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ public function test(): void
{
$fileInfos = iterator_to_array(Finder::create()->name('*.json')->in(__DIR__ . '/Source') ->getIterator());

$conflictingPackageVersionsPerFile = $this->versionValidator->findConflictingPackageInFileInfos($fileInfos);
$conflictingPackageVersionsPerFile = $this->versionValidator->findConflictingPackageVersionsInFileInfos(
$fileInfos
);

$this->assertArrayHasKey('some/package', $conflictingPackageVersionsPerFile);

Expand Down
1 change: 0 additions & 1 deletion phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ parameters:
- '#Method Symplify\\EasyCodingStandard\\Finder\\SourceFinder::find\(\) should return array<Symfony\\Component\\Finder\\SplFileInfo> but returns array<SplFileInfo>#'
- '#Property Symplify\\EasyCodingStandard\\Yaml\\CheckerServiceParametersShifter::\$serviceKeywords \(array<string>\) does not accept ReflectionProperty#'
- '#Method Symplify\\EasyCodingStandard\\Tests\\Indentation\\IndentationTest::getIndentationTypeFixerFromContainer\(\) should return PhpCsFixer\\Fixer\\Whitespace\\IndentationTypeFixer but returns PhpCsFixer\\Fixer\\FixerInterface\|null#'
- '#Method Symplify\\MonorepoBuilder\\Package\\PackageComposerJsonMerger::mergeFileInfos\(\) should return array<string> but returns array<string, array\|string>#'
- '#Parameter \#1 \$path of function dirname expects string, string\|false given#'
- '#Method Symplify\\PackageBuilder\\Console\\Command\\CommandNaming::getShortClassName\(\) should return string but returns string\|null#'
- '#Method Symplify\\PackageBuilder\\Tests\\Console\\ThrowableRendererTest::getTestErrorOutput\(\) should return string but returns string\|false#'
Expand Down

0 comments on commit 17ff4fe

Please sign in to comment.