Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view Chris@0: * the LICENSE file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Composer\Semver; Chris@0: Chris@0: use Composer\Semver\Constraint\Constraint; Chris@0: Chris@0: class Semver Chris@0: { Chris@0: const SORT_ASC = 1; Chris@0: const SORT_DESC = -1; Chris@0: Chris@0: /** @var VersionParser */ Chris@0: private static $versionParser; Chris@0: Chris@0: /** Chris@0: * Determine if given version satisfies given constraints. Chris@0: * Chris@0: * @param string $version Chris@0: * @param string $constraints Chris@0: * Chris@0: * @return bool Chris@0: */ Chris@0: public static function satisfies($version, $constraints) Chris@0: { Chris@0: if (null === self::$versionParser) { Chris@0: self::$versionParser = new VersionParser(); Chris@0: } Chris@0: Chris@0: $versionParser = self::$versionParser; Chris@0: $provider = new Constraint('==', $versionParser->normalize($version)); Chris@0: $constraints = $versionParser->parseConstraints($constraints); Chris@0: Chris@0: return $constraints->matches($provider); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Return all versions that satisfy given constraints. Chris@0: * Chris@0: * @param array $versions Chris@0: * @param string $constraints Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: public static function satisfiedBy(array $versions, $constraints) Chris@0: { Chris@0: $versions = array_filter($versions, function ($version) use ($constraints) { Chris@0: return Semver::satisfies($version, $constraints); Chris@0: }); Chris@0: Chris@0: return array_values($versions); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sort given array of versions. Chris@0: * Chris@0: * @param array $versions Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: public static function sort(array $versions) Chris@0: { Chris@0: return self::usort($versions, self::SORT_ASC); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sort given array of versions in reverse. Chris@0: * Chris@0: * @param array $versions Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: public static function rsort(array $versions) Chris@0: { Chris@0: return self::usort($versions, self::SORT_DESC); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param array $versions Chris@0: * @param int $direction Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: private static function usort(array $versions, $direction) Chris@0: { Chris@0: if (null === self::$versionParser) { Chris@0: self::$versionParser = new VersionParser(); Chris@0: } Chris@0: Chris@0: $versionParser = self::$versionParser; Chris@0: $normalized = array(); Chris@0: Chris@0: // Normalize outside of usort() scope for minor performance increase. Chris@0: // Creates an array of arrays: [[normalized, key], ...] Chris@0: foreach ($versions as $key => $version) { Chris@0: $normalized[] = array($versionParser->normalize($version), $key); Chris@0: } Chris@0: Chris@0: usort($normalized, function (array $left, array $right) use ($direction) { Chris@0: if ($left[0] === $right[0]) { Chris@0: return 0; Chris@0: } Chris@0: Chris@0: if (Comparator::lessThan($left[0], $right[0])) { Chris@0: return -$direction; Chris@0: } Chris@0: Chris@0: return $direction; Chris@0: }); Chris@0: Chris@0: // Recreate input array, using the original indexes which are now in sorted order. Chris@0: $sorted = array(); Chris@0: foreach ($normalized as $item) { Chris@0: $sorted[] = $versions[$item[1]]; Chris@0: } Chris@0: Chris@0: return $sorted; Chris@0: } Chris@0: }