Chris@14: , Sebastian Heuer , Sebastian Bergmann Chris@14: * Chris@14: * For the full copyright and license information, please view the LICENSE Chris@14: * file that was distributed with this source code. Chris@14: */ Chris@14: Chris@14: namespace PharIo\Version; Chris@14: Chris@14: class Version { Chris@14: /** Chris@14: * @var VersionNumber Chris@14: */ Chris@14: private $major; Chris@14: Chris@14: /** Chris@14: * @var VersionNumber Chris@14: */ Chris@14: private $minor; Chris@14: Chris@14: /** Chris@14: * @var VersionNumber Chris@14: */ Chris@14: private $patch; Chris@14: Chris@14: /** Chris@14: * @var PreReleaseSuffix Chris@14: */ Chris@14: private $preReleaseSuffix; Chris@14: Chris@14: /** Chris@14: * @var string Chris@14: */ Chris@14: private $versionString = ''; Chris@14: Chris@14: /** Chris@14: * @param string $versionString Chris@14: */ Chris@14: public function __construct($versionString) { Chris@14: $this->ensureVersionStringIsValid($versionString); Chris@14: Chris@14: $this->versionString = $versionString; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @param array $matches Chris@14: */ Chris@14: private function parseVersion(array $matches) { Chris@14: $this->major = new VersionNumber($matches['Major']); Chris@14: $this->minor = new VersionNumber($matches['Minor']); Chris@14: $this->patch = isset($matches['Patch']) ? new VersionNumber($matches['Patch']) : new VersionNumber(null); Chris@14: Chris@14: if (isset($matches['ReleaseType'])) { Chris@14: $preReleaseNumber = isset($matches['ReleaseTypeCount']) ? (int) $matches['ReleaseTypeCount'] : null; Chris@14: Chris@14: $this->preReleaseSuffix = new PreReleaseSuffix($matches['ReleaseType'], $preReleaseNumber); Chris@14: } Chris@14: } Chris@14: Chris@14: /** Chris@14: * @return PreReleaseSuffix Chris@14: */ Chris@14: public function getPreReleaseSuffix() Chris@14: { Chris@14: return $this->preReleaseSuffix; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @return string Chris@14: */ Chris@14: public function getVersionString() { Chris@14: return $this->versionString; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @param Version $version Chris@14: * Chris@14: * @return bool Chris@14: */ Chris@14: public function isGreaterThan(Version $version) { Chris@14: if ($version->getMajor()->getValue() > $this->getMajor()->getValue()) { Chris@14: return false; Chris@14: } Chris@14: Chris@14: if ($version->getMajor()->getValue() < $this->getMajor()->getValue()) { Chris@14: return true; Chris@14: } Chris@14: Chris@14: if ($version->getMinor()->getValue() > $this->getMinor()->getValue()) { Chris@14: return false; Chris@14: } Chris@14: Chris@14: if ($version->getMinor()->getValue() < $this->getMinor()->getValue()) { Chris@14: return true; Chris@14: } Chris@14: Chris@14: if ($version->getPatch()->getValue() >= $this->getPatch()->getValue()) { Chris@14: return false; Chris@14: } Chris@14: Chris@14: if ($version->getPatch()->getValue() < $this->getPatch()->getValue()) { Chris@14: return true; Chris@14: } Chris@14: Chris@14: return false; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @return VersionNumber Chris@14: */ Chris@14: public function getMajor() { Chris@14: return $this->major; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @return VersionNumber Chris@14: */ Chris@14: public function getMinor() { Chris@14: return $this->minor; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @return VersionNumber Chris@14: */ Chris@14: public function getPatch() { Chris@14: return $this->patch; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @param string $version Chris@14: * Chris@14: * @throws InvalidVersionException Chris@14: */ Chris@14: private function ensureVersionStringIsValid($version) { Chris@14: $regex = '/^v? Chris@14: (?(0|(?:[1-9][0-9]*))) Chris@14: \\. Chris@14: (?(0|(?:[1-9][0-9]*))) Chris@14: (\\. Chris@14: (?(0|(?:[1-9][0-9]*))) Chris@14: )? Chris@14: (?: Chris@14: - Chris@14: (?(?:(dev|beta|b|RC|alpha|a|patch|p))) Chris@14: (?: Chris@14: (?[0-9]) Chris@14: )? Chris@14: )? Chris@14: $/x'; Chris@14: Chris@14: if (preg_match($regex, $version, $matches) !== 1) { Chris@14: throw new InvalidVersionException( Chris@14: sprintf("Version string '%s' does not follow SemVer semantics", $version) Chris@14: ); Chris@14: } Chris@14: Chris@14: $this->parseVersion($matches); Chris@14: } Chris@14: }