From 9a10d0def282bfebab13a2891b2fed948637a96e Mon Sep 17 00:00:00 2001 From: valentin Date: Sat, 18 Apr 2020 16:39:32 +0200 Subject: [PATCH 1/7] Add option to ignore sub dependencies checking --- README.md | 2 ++ src/VersionsCheck.php | 9 ++++++++- src/VersionsCheckPlugin.php | 5 ++++- tests/VersionsCheckPluginTest.php | 33 +++++++++++++++++++++++++++++++ tests/VersionsCheckTest.php | 2 +- 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 83d40e5..c4f4097 100644 --- a/README.md +++ b/README.md @@ -52,10 +52,12 @@ You can configure the plugin via the [`COMPOSER_HOME/config.json`](https://getco { "config": { "sllh-composer-versions-check": { + "ignore-sub-dependencies": false, "show-links": false } } } ``` +* `ignore-sub-dependencies`: Shows only outdated package required in composer.json. * `show-links`: Shows outdated package links. Set to `true` to get a larger output, like the demo. diff --git a/src/VersionsCheck.php b/src/VersionsCheck.php index d5a1ce2..efdb933 100644 --- a/src/VersionsCheck.php +++ b/src/VersionsCheck.php @@ -22,15 +22,22 @@ final class VersionsCheck */ private $outdatedPackages = array(); - public function checkPackages(ArrayRepository $distRepository, WritableRepositoryInterface $localRepository, RootPackageInterface $rootPackage) + public function checkPackages(ArrayRepository $distRepository, WritableRepositoryInterface $localRepository, RootPackageInterface $rootPackage, bool $ignoreSubDependencies) { $packages = $localRepository->getPackages(); + $rootRequires = array_keys($rootPackage->getRequires()) + array_keys($rootPackage->getDevRequires()); + foreach ($packages as $package) { // Do not compare aliases. Aliased packages are also provided. if ($package instanceof AliasPackage) { continue; } + // Sub dependencies are ignored and package is not require in root. Skip. + if ($ignoreSubDependencies && !in_array($package->getName(), $rootRequires, true)) { + continue; + } + // Old composer versions BC $versionConstraint = class_exists('Composer\Semver\Constraint\Constraint') ? new Constraint('>', $package->getVersion()) diff --git a/src/VersionsCheckPlugin.php b/src/VersionsCheckPlugin.php index 92631cf..424b09f 100644 --- a/src/VersionsCheckPlugin.php +++ b/src/VersionsCheckPlugin.php @@ -111,6 +111,7 @@ private function resolveOptions() ; $options = array( + 'ignore-sub-dependencies' => false, 'show-links' => false, ); @@ -118,6 +119,7 @@ private function resolveOptions() return $options; } + $options['ignore-sub-dependencies'] = isset($pluginConfig['ignore-sub-dependencies']) ? (bool) $pluginConfig['ignore-sub-dependencies'] : $options['ignore-sub-dependencies']; $options['show-links'] = isset($pluginConfig['show-links']) ? (bool) $pluginConfig['show-links'] : $options['show-links']; return $options; @@ -129,7 +131,8 @@ private function checkVersions(RepositoryManager $repositoryManager, RootPackage $this->versionsCheck->checkPackages( $repository, $repositoryManager->getLocalRepository(), - $rootPackage + $rootPackage, + $this->options['ignore-sub-dependencies'] ); } diff --git a/tests/VersionsCheckPluginTest.php b/tests/VersionsCheckPluginTest.php index 0da5b67..20459fd 100644 --- a/tests/VersionsCheckPluginTest.php +++ b/tests/VersionsCheckPluginTest.php @@ -94,12 +94,14 @@ public function getTestOptionsData() 'No option' => array( null, array( + 'ignore-sub-dependencies' => false, 'show-links' => false, ), ), 'Empty array options' => array( array(), array( + 'ignore-sub-dependencies' => false, 'show-links' => false, ), ), @@ -110,6 +112,7 @@ public function getTestOptionsData() ), ), array( + 'ignore-sub-dependencies' => false, 'show-links' => false, ), ), @@ -120,6 +123,7 @@ public function getTestOptionsData() ), ), array( + 'ignore-sub-dependencies' => false, 'show-links' => false, ), ), @@ -130,6 +134,33 @@ public function getTestOptionsData() ), ), array( + 'ignore-sub-dependencies' => false, + 'show-links' => false, + ), + ), + 'Activate ignore-sub-dependencies' => array( + array( + 'config' => array( + 'sllh-composer-versions-check' => array( + 'ignore-sub-dependencies' => true, + ), + ), + ), + array( + 'ignore-sub-dependencies' => true, + 'show-links' => false, + ), + ), + 'Disable ignore-sub-dependencies' => array( + array( + 'config' => array( + 'sllh-composer-versions-check' => array( + 'ignore-sub-dependencies' => false, + ), + ), + ), + array( + 'ignore-sub-dependencies' => false, 'show-links' => false, ), ), @@ -142,6 +173,7 @@ public function getTestOptionsData() ), ), array( + 'ignore-sub-dependencies' => false, 'show-links' => true, ), ), @@ -154,6 +186,7 @@ public function getTestOptionsData() ), ), array( + 'ignore-sub-dependencies' => false, 'show-links' => false, ), ), diff --git a/tests/VersionsCheckTest.php b/tests/VersionsCheckTest.php index 30acc56..166e5f0 100644 --- a/tests/VersionsCheckTest.php +++ b/tests/VersionsCheckTest.php @@ -207,6 +207,6 @@ public function testOutdatedWithLinks() */ private function checkPackages() { - $this->versionsCheck->checkPackages($this->distRepository, $this->localRepository, $this->rootPackage); + $this->versionsCheck->checkPackages($this->distRepository, $this->localRepository, $this->rootPackage, false); } } From a8ed64f8c37f5d06a0a88dc688ebe9ec068b0b2d Mon Sep 17 00:00:00 2001 From: valentin Date: Tue, 5 May 2020 10:06:38 +0200 Subject: [PATCH 2/7] Remove BC Type Hinting for php5.3 --- src/VersionsCheck.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VersionsCheck.php b/src/VersionsCheck.php index efdb933..1edbbe9 100644 --- a/src/VersionsCheck.php +++ b/src/VersionsCheck.php @@ -22,7 +22,7 @@ final class VersionsCheck */ private $outdatedPackages = array(); - public function checkPackages(ArrayRepository $distRepository, WritableRepositoryInterface $localRepository, RootPackageInterface $rootPackage, bool $ignoreSubDependencies) + public function checkPackages(ArrayRepository $distRepository, WritableRepositoryInterface $localRepository, RootPackageInterface $rootPackage, $ignoreSubDependencies) { $packages = $localRepository->getPackages(); $rootRequires = array_keys($rootPackage->getRequires()) + array_keys($rootPackage->getDevRequires()); From 50fa3ec3d5b3a7c181a025fc0cd815b3b491518a Mon Sep 17 00:00:00 2001 From: valentin Date: Tue, 5 May 2020 10:26:16 +0200 Subject: [PATCH 3/7] Fixed a mistake when joining root package arrays --- src/VersionsCheck.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VersionsCheck.php b/src/VersionsCheck.php index 1edbbe9..32ea5bb 100644 --- a/src/VersionsCheck.php +++ b/src/VersionsCheck.php @@ -25,7 +25,7 @@ final class VersionsCheck public function checkPackages(ArrayRepository $distRepository, WritableRepositoryInterface $localRepository, RootPackageInterface $rootPackage, $ignoreSubDependencies) { $packages = $localRepository->getPackages(); - $rootRequires = array_keys($rootPackage->getRequires()) + array_keys($rootPackage->getDevRequires()); + $rootRequires = array_keys($rootPackage->getRequires() + $rootPackage->getDevRequires()); foreach ($packages as $package) { // Do not compare aliases. Aliased packages are also provided. From 29d8b87e0ed58196cf80c33039a836076fe95108 Mon Sep 17 00:00:00 2001 From: valentin Date: Tue, 5 May 2020 10:39:04 +0200 Subject: [PATCH 4/7] Fixed lint error --- src/VersionsCheck.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VersionsCheck.php b/src/VersionsCheck.php index 32ea5bb..4397b71 100644 --- a/src/VersionsCheck.php +++ b/src/VersionsCheck.php @@ -34,7 +34,7 @@ public function checkPackages(ArrayRepository $distRepository, WritableRepositor } // Sub dependencies are ignored and package is not require in root. Skip. - if ($ignoreSubDependencies && !in_array($package->getName(), $rootRequires, true)) { + if ($ignoreSubDependencies && !\in_array($package->getName(), $rootRequires, true)) { continue; } From 4416b3a7ee357f6ac17c2e80da8e0c7443d03f63 Mon Sep 17 00:00:00 2001 From: valentin Date: Tue, 5 May 2020 17:18:31 +0200 Subject: [PATCH 5/7] Change ignore-sub-dependencies option to root-packages-only --- README.md | 4 ++-- src/VersionsCheck.php | 6 +++--- src/VersionsCheckPlugin.php | 6 +++--- tests/VersionsCheckPluginTest.php | 26 +++++++++++++------------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index c4f4097..5f122f3 100644 --- a/README.md +++ b/README.md @@ -52,12 +52,12 @@ You can configure the plugin via the [`COMPOSER_HOME/config.json`](https://getco { "config": { "sllh-composer-versions-check": { - "ignore-sub-dependencies": false, + "root-packages-only": false, "show-links": false } } } ``` -* `ignore-sub-dependencies`: Shows only outdated package required in composer.json. +* `ignore-sub-dependencies`: Shows only outdated root packages. * `show-links`: Shows outdated package links. Set to `true` to get a larger output, like the demo. diff --git a/src/VersionsCheck.php b/src/VersionsCheck.php index 4397b71..4e25cc6 100644 --- a/src/VersionsCheck.php +++ b/src/VersionsCheck.php @@ -22,7 +22,7 @@ final class VersionsCheck */ private $outdatedPackages = array(); - public function checkPackages(ArrayRepository $distRepository, WritableRepositoryInterface $localRepository, RootPackageInterface $rootPackage, $ignoreSubDependencies) + public function checkPackages(ArrayRepository $distRepository, WritableRepositoryInterface $localRepository, RootPackageInterface $rootPackage, $rootPackagesOnly) { $packages = $localRepository->getPackages(); $rootRequires = array_keys($rootPackage->getRequires() + $rootPackage->getDevRequires()); @@ -33,8 +33,8 @@ public function checkPackages(ArrayRepository $distRepository, WritableRepositor continue; } - // Sub dependencies are ignored and package is not require in root. Skip. - if ($ignoreSubDependencies && !\in_array($package->getName(), $rootRequires, true)) { + // No root package are ignored and it is one. Skip. + if ($rootPackagesOnly && !\in_array($package->getName(), $rootRequires, true)) { continue; } diff --git a/src/VersionsCheckPlugin.php b/src/VersionsCheckPlugin.php index 424b09f..57391f2 100644 --- a/src/VersionsCheckPlugin.php +++ b/src/VersionsCheckPlugin.php @@ -111,7 +111,7 @@ private function resolveOptions() ; $options = array( - 'ignore-sub-dependencies' => false, + 'root-packages-only' => false, 'show-links' => false, ); @@ -119,7 +119,7 @@ private function resolveOptions() return $options; } - $options['ignore-sub-dependencies'] = isset($pluginConfig['ignore-sub-dependencies']) ? (bool) $pluginConfig['ignore-sub-dependencies'] : $options['ignore-sub-dependencies']; + $options['root-packages-only'] = isset($pluginConfig['root-packages-only']) ? (bool) $pluginConfig['root-packages-only'] : $options['root-packages-only']; $options['show-links'] = isset($pluginConfig['show-links']) ? (bool) $pluginConfig['show-links'] : $options['show-links']; return $options; @@ -132,7 +132,7 @@ private function checkVersions(RepositoryManager $repositoryManager, RootPackage $repository, $repositoryManager->getLocalRepository(), $rootPackage, - $this->options['ignore-sub-dependencies'] + $this->options['root-packages-only'] ); } diff --git a/tests/VersionsCheckPluginTest.php b/tests/VersionsCheckPluginTest.php index 20459fd..30c4f22 100644 --- a/tests/VersionsCheckPluginTest.php +++ b/tests/VersionsCheckPluginTest.php @@ -94,14 +94,14 @@ public function getTestOptionsData() 'No option' => array( null, array( - 'ignore-sub-dependencies' => false, + 'root-packages-only' => false, 'show-links' => false, ), ), 'Empty array options' => array( array(), array( - 'ignore-sub-dependencies' => false, + 'root-packages-only' => false, 'show-links' => false, ), ), @@ -112,7 +112,7 @@ public function getTestOptionsData() ), ), array( - 'ignore-sub-dependencies' => false, + 'root-packages-only' => false, 'show-links' => false, ), ), @@ -123,7 +123,7 @@ public function getTestOptionsData() ), ), array( - 'ignore-sub-dependencies' => false, + 'root-packages-only' => false, 'show-links' => false, ), ), @@ -134,33 +134,33 @@ public function getTestOptionsData() ), ), array( - 'ignore-sub-dependencies' => false, + 'root-packages-only' => false, 'show-links' => false, ), ), - 'Activate ignore-sub-dependencies' => array( + 'Activate root-packages-only' => array( array( 'config' => array( 'sllh-composer-versions-check' => array( - 'ignore-sub-dependencies' => true, + 'root-packages-only' => true, ), ), ), array( - 'ignore-sub-dependencies' => true, + 'root-packages-only' => true, 'show-links' => false, ), ), - 'Disable ignore-sub-dependencies' => array( + 'Disable root-packages-only' => array( array( 'config' => array( 'sllh-composer-versions-check' => array( - 'ignore-sub-dependencies' => false, + 'root-packages-only' => false, ), ), ), array( - 'ignore-sub-dependencies' => false, + 'root-packages-only' => false, 'show-links' => false, ), ), @@ -173,7 +173,7 @@ public function getTestOptionsData() ), ), array( - 'ignore-sub-dependencies' => false, + 'root-packages-only' => false, 'show-links' => true, ), ), @@ -186,7 +186,7 @@ public function getTestOptionsData() ), ), array( - 'ignore-sub-dependencies' => false, + 'root-packages-only' => false, 'show-links' => false, ), ), From ded4bfcc780f9916f8d65202cd7109034e6ada28 Mon Sep 17 00:00:00 2001 From: valentin Date: Fri, 8 May 2020 18:25:33 +0200 Subject: [PATCH 6/7] Add method testRootOnlyPackage --- tests/VersionsCheckTest.php | 77 ++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/tests/VersionsCheckTest.php b/tests/VersionsCheckTest.php index 166e5f0..c4ca8b1 100644 --- a/tests/VersionsCheckTest.php +++ b/tests/VersionsCheckTest.php @@ -202,11 +202,84 @@ public function testOutdatedWithLinks() , $this->versionsCheck->getOutput(false)); } + /** + * @dataProvider getRootOnlyPackageTestsData + */ + public function testRootOnlyPackage(array $packagesData, array $packagesRequired, array $packagesDevRequired, $rootOnly, $outdatedPackagesCount) + { + + foreach ($packagesData as $name => $packageData) { + list($actualVersion, $availableVersions, $expectedVersion) = $packageData; + $this->localRepository->addPackage(new Package($name, $actualVersion, $actualVersion)); + foreach ($availableVersions as $availableVersion) { + $this->distRepository->addPackage(new Package($name, $availableVersion, $availableVersion)); + } + + if (false !== $expectedVersion) { + $shouldBeUpdatedOutput[] = sprintf( + ' - %s (%s) latest is %s', + $name, $actualVersion, $expectedVersion + ); + } + } + + $this->rootPackage->setRequires($packagesRequired); + $this->rootPackage->setDevRequires($packagesDevRequired); + + $this->checkPackages($rootOnly); + + $this->assertSame(sprintf(<<<'EOF' +%d packages are not up to date: + +%s + + +EOF + , $outdatedPackagesCount, implode("\n\n", $shouldBeUpdatedOutput)), $this->versionsCheck->getOutput()); + } + + /** + * @return array + */ + public function getRootOnlyPackageTestsData() + { + return array( + array(array( + 'foo/bar' => array('1.0.0', array('1.0.0', '1.0.1', '1.0.2', '1.0.4', '2.0.0'), '2.0.0'), + 'some/package' => array('1.0.4', array('1.0.0', '1.0.1', '1.0.2', '1.0.4', '2.0.0'), false), + 'vendor/package-1' => array('2.0.0', array('1.0.0', '1.0.1', '1.0.2', '1.0.4', '2.0.0'), false), + 'vendor/up-to-date' => array('9.9.0', array('8.0.0', '9.9.0', '1.0-dev'), false), + 'vendor/dev-master' => array('9.9.0', array('8.0.0', '9.9.0', '10.0-dev'), false), + 'vendor/package-2' => array('1.0.0', array('1.0.0', '1.0.1', '2.0.0', '2.0.0-alpha1'), '2.0.0'), + 'vendor/package-3' => array('1.0.1', array('1.0.0', '1.0.1', '2.0.0-alpha1'), false), + 'vendor/prefer-stable' => array('1.0.1', array('1.0.0', '1.0.1', '2.0.0-alpha1'), false), + ), array( + 'foo/bar' => new Link('foo/bar', 'foo/bar') + ), array( + 'vendor/package-2' => new Link('vendor/package-2', 'vendor/package-2') + ), true, 2), + array(array( + 'foo/bar' => array('1.0.0', array('1.0.0', '1.0.1', '1.0.2', '1.0.4', '2.0.0'), '2.0.0'), + 'some/package' => array('1.0.4', array('1.0.0', '1.0.1', '1.0.2', '1.0.4', '2.0.0'), '2.0.0'), + 'vendor/package-1' => array('2.0.0', array('1.0.0', '1.0.1', '1.0.2', '1.0.4', '2.0.0'), false), + 'vendor/up-to-date' => array('9.9.0', array('8.0.0', '9.9.0', '1.0-dev'), false), + 'vendor/dev-master' => array('9.9.0', array('8.0.0', '9.9.0', '10.0-dev'), '10.0-dev'), + 'vendor/package-2' => array('1.0.0', array('1.0.0', '1.0.1', '2.0.0', '2.0.0-alpha1'), '2.0.0'), + 'vendor/package-3' => array('1.0.1', array('1.0.0', '1.0.1', '2.0.0-alpha1'), '2.0.0-alpha1'), + 'vendor/prefer-stable' => array('1.0.1', array('1.0.0', '1.0.1', '2.0.0-alpha1'), '2.0.0-alpha1'), + ), array( + 'foo/bar' => new Link('foo/bar', 'foo/bar') + ), array( + 'vendor/package-2' => new Link('vendor/package-2', 'vendor/package-2') + ), false, 6), + ); + } + /** * Calls VersionsCheck::checkPackages. */ - private function checkPackages() + private function checkPackages($rootPackageOnly = false) { - $this->versionsCheck->checkPackages($this->distRepository, $this->localRepository, $this->rootPackage, false); + $this->versionsCheck->checkPackages($this->distRepository, $this->localRepository, $this->rootPackage, $rootPackageOnly); } } From 680ea0838e616246a048634392d1010d63f80770 Mon Sep 17 00:00:00 2001 From: valentin Date: Fri, 8 May 2020 18:42:04 +0200 Subject: [PATCH 7/7] Fixies --- tests/VersionsCheckTest.php | 64 ++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/tests/VersionsCheckTest.php b/tests/VersionsCheckTest.php index c4ca8b1..150df25 100644 --- a/tests/VersionsCheckTest.php +++ b/tests/VersionsCheckTest.php @@ -109,22 +109,7 @@ public function testMultiplePackagesComparison(array $packagesData, $preferStabl $this->rootPackage->setMinimumStability('dev'); $this->rootPackage->setPreferStable($preferStable); - $shouldBeUpdatedOutput = array(); - - foreach ($packagesData as $name => $packageData) { - list($actualVersion, $availableVersions, $expectedVersion) = $packageData; - $this->localRepository->addPackage(new Package($name, $actualVersion, $actualVersion)); - foreach ($availableVersions as $availableVersion) { - $this->distRepository->addPackage(new Package($name, $availableVersion, $availableVersion)); - } - - if (false !== $expectedVersion) { - $shouldBeUpdatedOutput[] = sprintf( - ' - %s (%s) latest is %s', - $name, $actualVersion, $expectedVersion - ); - } - } + $shouldBeUpdatedOutput = $this->addPackagesAndGetShouldBeUpdatedOutput($packagesData); $this->checkPackages(); @@ -207,22 +192,7 @@ public function testOutdatedWithLinks() */ public function testRootOnlyPackage(array $packagesData, array $packagesRequired, array $packagesDevRequired, $rootOnly, $outdatedPackagesCount) { - - foreach ($packagesData as $name => $packageData) { - list($actualVersion, $availableVersions, $expectedVersion) = $packageData; - $this->localRepository->addPackage(new Package($name, $actualVersion, $actualVersion)); - foreach ($availableVersions as $availableVersion) { - $this->distRepository->addPackage(new Package($name, $availableVersion, $availableVersion)); - } - - if (false !== $expectedVersion) { - $shouldBeUpdatedOutput[] = sprintf( - ' - %s (%s) latest is %s', - $name, $actualVersion, $expectedVersion - ); - } - } - + $shouldBeUpdatedOutput = $this->addPackagesAndGetShouldBeUpdatedOutput($packagesData); $this->rootPackage->setRequires($packagesRequired); $this->rootPackage->setDevRequires($packagesDevRequired); @@ -254,9 +224,9 @@ public function getRootOnlyPackageTestsData() 'vendor/package-3' => array('1.0.1', array('1.0.0', '1.0.1', '2.0.0-alpha1'), false), 'vendor/prefer-stable' => array('1.0.1', array('1.0.0', '1.0.1', '2.0.0-alpha1'), false), ), array( - 'foo/bar' => new Link('foo/bar', 'foo/bar') + 'foo/bar' => new Link('foo/bar', 'foo/bar'), ), array( - 'vendor/package-2' => new Link('vendor/package-2', 'vendor/package-2') + 'vendor/package-2' => new Link('vendor/package-2', 'vendor/package-2'), ), true, 2), array(array( 'foo/bar' => array('1.0.0', array('1.0.0', '1.0.1', '1.0.2', '1.0.4', '2.0.0'), '2.0.0'), @@ -268,13 +238,35 @@ public function getRootOnlyPackageTestsData() 'vendor/package-3' => array('1.0.1', array('1.0.0', '1.0.1', '2.0.0-alpha1'), '2.0.0-alpha1'), 'vendor/prefer-stable' => array('1.0.1', array('1.0.0', '1.0.1', '2.0.0-alpha1'), '2.0.0-alpha1'), ), array( - 'foo/bar' => new Link('foo/bar', 'foo/bar') + 'foo/bar' => new Link('foo/bar', 'foo/bar'), ), array( - 'vendor/package-2' => new Link('vendor/package-2', 'vendor/package-2') + 'vendor/package-2' => new Link('vendor/package-2', 'vendor/package-2'), ), false, 6), ); } + private function addPackagesAndGetShouldBeUpdatedOutput(array $packagesData) + { + $shouldBeUpdatedOutput = array(); + + foreach ($packagesData as $name => $packageData) { + list($actualVersion, $availableVersions, $expectedVersion) = $packageData; + $this->localRepository->addPackage(new Package($name, $actualVersion, $actualVersion)); + foreach ($availableVersions as $availableVersion) { + $this->distRepository->addPackage(new Package($name, $availableVersion, $availableVersion)); + } + + if (false !== $expectedVersion) { + $shouldBeUpdatedOutput[] = sprintf( + ' - %s (%s) latest is %s', + $name, $actualVersion, $expectedVersion + ); + } + } + + return $shouldBeUpdatedOutput; + } + /** * Calls VersionsCheck::checkPackages. */