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