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

Commit

Permalink
Merge f7bfd76 into b08d8e4
Browse files Browse the repository at this point in the history
  • Loading branch information
TomasVotruba committed Sep 9, 2018
2 parents b08d8e4 + f7bfd76 commit e2ea87b
Show file tree
Hide file tree
Showing 24 changed files with 308 additions and 111 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
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,14 @@ protected function execute(InputInterface $input, OutputInterface $output): int
{
$version = $input->getArgument(self::VERSION_ARGUMENT);

$rootComposerJson = $this->composerJsonProvider->getRootComposerJson();
$rootComposerJson = $this->composerJsonProvider->getRootJson();

// @todo resolve better for only found packages
// see https://github.com/Symplify/Symplify/pull/1037/files
[$vendor,] = explode('/', $rootComposerJson['name']);

$this->interdependencyUpdater->updateFileInfosWithVendorAndVersion(
$this->composerJsonProvider->getPackagesComposerJsonFileInfos(),
$this->composerJsonProvider->getPackagesFileInfos(),
$vendor,
$version
);
Expand Down
69 changes: 46 additions & 23 deletions packages/MonorepoBuilder/src/Console/Command/MergeCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,12 @@
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\Guard\ComposerJsonFilesGuard;
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 +32,29 @@ 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;

/**
* @var ComposerJsonFilesGuard
*/
private $composerJsonFilesGuard;

/**
* @param string[] $mergeSections
Expand All @@ -45,16 +63,22 @@ public function __construct(
array $mergeSections,
SymfonyStyle $symfonyStyle,
PackageComposerJsonMerger $packageComposerJsonMerger,
PackageComposerFinder $packageComposerFinder,
DependenciesMerger $dependenciesMerger
DependenciesMerger $dependenciesMerger,
VersionValidator $versionValidator,
ComposerJsonProvider $composerJsonProvider,
ConflictingPackageVersionsReporter $conflictingPackageVersionsReporter,
ComposerJsonFilesGuard $composerJsonFilesGuard
) {
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;
$this->composerJsonFilesGuard = $composerJsonFilesGuard;
}

protected function configure(): void
Expand All @@ -65,31 +89,30 @@ protected function configure(): void

protected function execute(InputInterface $input, OutputInterface $output): int
{
$composerPackageFiles = $this->packageComposerFinder->getPackageComposerFiles();
if (! count($composerPackageFiles)) {
$this->symfonyStyle->error('No "composer.json" were found in packages.');
return 1;
}
$this->composerJsonFilesGuard->ensurePackageJsonFilesAreFound();

$conflictingPackageVersions = $this->versionValidator->findConflictingPackageVersionsInFileInfos(
$this->composerJsonProvider->getRootAndPackageFileInfos()
);
if (count($conflictingPackageVersions) > 0) {
$this->conflictingPackageVersionsReporter->report($conflictingPackageVersions);

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'
);
// fail
return 1;
}

$merged = $this->packageComposerJsonMerger->mergeFileInfos($composerPackageFiles, $this->mergeSections);
$merged = $this->packageComposerJsonMerger->mergeFileInfos(
$this->composerJsonProvider->getPackagesFileInfos(),
$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 @@ -132,14 +132,14 @@ private function setMutualDependenciesToVersion(string $version): void
{
$this->symfonyStyle->note(sprintf('Setting packages mutual dependencies to "%s" version', $version));

$rootComposerJson = $this->composerJsonProvider->getRootComposerJson();
$rootComposerJson = $this->composerJsonProvider->getRootJson();

// @todo resolve better for only found packages
// see https://github.com/Symplify/Symplify/pull/1037/files
[$vendor,] = explode('/', $rootComposerJson['name']);

$this->interdependencyUpdater->updateFileInfosWithVendorAndVersion(
$this->composerJsonProvider->getPackagesComposerJsonFileInfos(),
$this->composerJsonProvider->getPackagesFileInfos(),
$vendor,
$version
);
Expand Down Expand Up @@ -188,7 +188,7 @@ private function setBranchAliasesToVersion(string $version): void
$this->symfonyStyle->note(sprintf('Setting "%s" as branch dev alias to packages', $version));

$this->devMasterAliasUpdater->updateFileInfosWithAlias(
$this->composerJsonProvider->getPackagesComposerJsonFileInfos(),
$this->composerJsonProvider->getPackagesFileInfos(),
$version
);

Expand Down
47 changes: 24 additions & 23 deletions packages/MonorepoBuilder/src/Console/Command/ValidateCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
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\Guard\ComposerJsonFilesGuard;
use Symplify\MonorepoBuilder\VersionValidator;
use Symplify\PackageBuilder\Console\Command\CommandNaming;

Expand All @@ -27,16 +29,29 @@ final class ValidateCommand extends Command
*/
private $composerJsonProvider;

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

/**
* @var ComposerJsonFilesGuard
*/
private $composerJsonFilesGuard;

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

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

protected function configure(): void
Expand All @@ -47,33 +62,19 @@ protected function configure(): void

protected function execute(InputInterface $input, OutputInterface $output): int
{
$composerFileInfos = $this->composerJsonProvider->getPackagesComposerJsonFileInfos();
if (! count($composerFileInfos)) {
$this->symfonyStyle->error('No package "composer.json" were found.');
return 1;
}

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

$conflictingPackage = $this->versionValidator->findConflictingPackageInFileInfos($composerFileInfos);
if ($conflictingPackage === []) {
$conflictingPackageVersions = $this->versionValidator->findConflictingPackageVersionsInFileInfos(
$this->composerJsonProvider->getRootAndPackageFileInfos()
);
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.');
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php declare(strict_types=1);

namespace Symplify\MonorepoBuilder\Exception;

use Exception;

final class MissingComposerJsonFilesException extends Exception
{
}
17 changes: 10 additions & 7 deletions packages/MonorepoBuilder/src/FileSystem/ComposerJsonProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,24 +23,27 @@ public function __construct(JsonFileManager $jsonFileManager, PackageComposerFin
$this->packageComposerFinder = $packageComposerFinder;
}

public function getRootComposerJsonFileInfo(): SplFileInfo
{
return $this->packageComposerFinder->getRootPackageComposerFile();
}

/**
* @return mixed[]
*/
public function getRootComposerJson(): array
public function getRootJson(): array
{
return $this->jsonFileManager->loadFromFilePath(getcwd() . '/composer.json');
}

/**
* @return SplFileInfo[]
*/
public function getPackagesComposerJsonFileInfos(): array
public function getPackagesFileInfos(): array
{
return $this->packageComposerFinder->getPackageComposerFiles();
}

/**
* @return SplFileInfo[]
*/
public function getRootAndPackageFileInfos(): array
{
return array_merge($this->getPackagesFileInfos(), [$this->packageComposerFinder->getRootPackageComposerFile()]);
}
}

0 comments on commit e2ea87b

Please sign in to comment.