diff --git a/.travis.yml b/.travis.yml index 62e6af4..7edb4fc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,9 @@ matrix: include: - php: 5.3 env: COMPOSER_FLAGS="--prefer-lowest" + # Special case for https://github.com/Soullivaneuh/composer-versions-check/issues/8 + - php: 5.6 + env: WITHOUT_SEMVER=1 allow_failures: - php: nightly - php: hhvm @@ -29,14 +32,20 @@ cache: directories: - $HOME/.composer/cache/files -before_script: +before_install: - composer selfupdate - composer config -g github-oauth.github.com $GITHUB_OAUTH_TOKEN - composer global require phpunit/phpunit:^4.8 --no-update - - composer global update --prefer-dist --no-interaction - if [ "$PHP_CS_FIXER_VERSION" != "" ]; then composer require "fabpot/php-cs-fixer:${PHP_CS_FIXER_VERSION}" --no-update; fi; + - if [ "$WITHOUT_SEMVER" = 1 ]; then composer require "composer/composer:dev-master#013a748" --no-update; fi; + +install: + - composer global update --prefer-dist --no-interaction - composer update --prefer-dist --no-interaction $COMPOSER_FLAGS +before_script: + - if [ "$WITHOUT_SEMVER" = 1 ]; then rm -rf vendor/composer/semver; fi; + script: make test after_script: diff --git a/src/VersionsCheck.php b/src/VersionsCheck.php index 67ccd16..d891e86 100644 --- a/src/VersionsCheck.php +++ b/src/VersionsCheck.php @@ -2,6 +2,7 @@ namespace SLLH\ComposerVersionsCheck; +use Composer\Package\LinkConstraint\VersionConstraint; use Composer\Package\PackageInterface; use Composer\Package\RootPackageInterface; use Composer\Repository\ArrayRepository; @@ -19,6 +20,11 @@ final class VersionsCheck */ private $outdatedPackages = array(); + /** + * @var VersionConstraint|null + */ + private $oldComparator = null; + /** * @param ArrayRepository $distRepository * @param WritableRepositoryInterface $localRepository @@ -30,8 +36,14 @@ public function checkPackages(ArrayRepository $distRepository, WritableRepositor /** @var PackageInterface[] $packages */ $packages = $localRepository->getPackages(); foreach ($packages as $package) { + // Old composer versions BC + $versionConstraint = class_exists('Composer\Semver\Constraint\Constraint') + ? new Constraint('>', $package->getVersion()) + : new VersionConstraint('>', $package->getVersion()) + ; + /** @var PackageInterface[] $higherPackages */ - $higherPackages = $distRepository->findPackages($package->getName(), new Constraint('>', $package->getVersion())); + $higherPackages = $distRepository->findPackages($package->getName(), $versionConstraint); // Remove not stable packages if unwanted if (true === $rootPackage->getPreferStable()) { $higherPackages = array_filter($higherPackages, function (PackageInterface $package) { @@ -41,7 +53,7 @@ public function checkPackages(ArrayRepository $distRepository, WritableRepositor if (count($higherPackages) > 0) { // Sort packages by highest version to lowest usort($higherPackages, function (PackageInterface $p1, PackageInterface $p2) { - return Comparator::lessThan($p1->getVersion(), $p2->getVersion()); + return $this->versionCompare($p1->getVersion(), '<', $p2->getVersion()); }); // Push actual and last package on outdated array array_push($this->outdatedPackages, new OutdatedPackage($package, $higherPackages[0])); @@ -81,4 +93,24 @@ private function createNotUpToDateOutput(array &$output) $output[] = ''; } + + /** + * Version comparator bridge to handle BC with old composer versions. + * + * @param string $version1 + * @param string $operator + * @param string $version2 + * + * @return bool + */ + private function versionCompare($version1, $operator, $version2) + { + if (!class_exists('Composer\Semver\Comparator')) { + $this->oldComparator = $this->oldComparator ?: new VersionConstraint('==', '1.0'); + + return $this->oldComparator->versionCompare($version1, $version2, $operator); + } + + return Comparator::compare($version1, $operator, $version2); + } }