Chris@14
|
1 <?php
|
Chris@14
|
2 /*
|
Chris@14
|
3 * This file is part of PharIo\Version.
|
Chris@14
|
4 *
|
Chris@14
|
5 * (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@14
|
6 *
|
Chris@14
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@14
|
8 * file that was distributed with this source code.
|
Chris@14
|
9 */
|
Chris@14
|
10
|
Chris@14
|
11 namespace PharIo\Version;
|
Chris@14
|
12
|
Chris@14
|
13 class Version {
|
Chris@14
|
14 /**
|
Chris@14
|
15 * @var VersionNumber
|
Chris@14
|
16 */
|
Chris@14
|
17 private $major;
|
Chris@14
|
18
|
Chris@14
|
19 /**
|
Chris@14
|
20 * @var VersionNumber
|
Chris@14
|
21 */
|
Chris@14
|
22 private $minor;
|
Chris@14
|
23
|
Chris@14
|
24 /**
|
Chris@14
|
25 * @var VersionNumber
|
Chris@14
|
26 */
|
Chris@14
|
27 private $patch;
|
Chris@14
|
28
|
Chris@14
|
29 /**
|
Chris@14
|
30 * @var PreReleaseSuffix
|
Chris@14
|
31 */
|
Chris@14
|
32 private $preReleaseSuffix;
|
Chris@14
|
33
|
Chris@14
|
34 /**
|
Chris@14
|
35 * @var string
|
Chris@14
|
36 */
|
Chris@14
|
37 private $versionString = '';
|
Chris@14
|
38
|
Chris@14
|
39 /**
|
Chris@14
|
40 * @param string $versionString
|
Chris@14
|
41 */
|
Chris@14
|
42 public function __construct($versionString) {
|
Chris@14
|
43 $this->ensureVersionStringIsValid($versionString);
|
Chris@14
|
44
|
Chris@14
|
45 $this->versionString = $versionString;
|
Chris@14
|
46 }
|
Chris@14
|
47
|
Chris@14
|
48 /**
|
Chris@14
|
49 * @param array $matches
|
Chris@14
|
50 */
|
Chris@14
|
51 private function parseVersion(array $matches) {
|
Chris@14
|
52 $this->major = new VersionNumber($matches['Major']);
|
Chris@14
|
53 $this->minor = new VersionNumber($matches['Minor']);
|
Chris@14
|
54 $this->patch = isset($matches['Patch']) ? new VersionNumber($matches['Patch']) : new VersionNumber(null);
|
Chris@14
|
55
|
Chris@14
|
56 if (isset($matches['ReleaseType'])) {
|
Chris@14
|
57 $preReleaseNumber = isset($matches['ReleaseTypeCount']) ? (int) $matches['ReleaseTypeCount'] : null;
|
Chris@14
|
58
|
Chris@14
|
59 $this->preReleaseSuffix = new PreReleaseSuffix($matches['ReleaseType'], $preReleaseNumber);
|
Chris@14
|
60 }
|
Chris@14
|
61 }
|
Chris@14
|
62
|
Chris@14
|
63 /**
|
Chris@14
|
64 * @return PreReleaseSuffix
|
Chris@14
|
65 */
|
Chris@14
|
66 public function getPreReleaseSuffix()
|
Chris@14
|
67 {
|
Chris@14
|
68 return $this->preReleaseSuffix;
|
Chris@14
|
69 }
|
Chris@14
|
70
|
Chris@14
|
71 /**
|
Chris@14
|
72 * @return string
|
Chris@14
|
73 */
|
Chris@14
|
74 public function getVersionString() {
|
Chris@14
|
75 return $this->versionString;
|
Chris@14
|
76 }
|
Chris@14
|
77
|
Chris@14
|
78 /**
|
Chris@14
|
79 * @param Version $version
|
Chris@14
|
80 *
|
Chris@14
|
81 * @return bool
|
Chris@14
|
82 */
|
Chris@14
|
83 public function isGreaterThan(Version $version) {
|
Chris@14
|
84 if ($version->getMajor()->getValue() > $this->getMajor()->getValue()) {
|
Chris@14
|
85 return false;
|
Chris@14
|
86 }
|
Chris@14
|
87
|
Chris@14
|
88 if ($version->getMajor()->getValue() < $this->getMajor()->getValue()) {
|
Chris@14
|
89 return true;
|
Chris@14
|
90 }
|
Chris@14
|
91
|
Chris@14
|
92 if ($version->getMinor()->getValue() > $this->getMinor()->getValue()) {
|
Chris@14
|
93 return false;
|
Chris@14
|
94 }
|
Chris@14
|
95
|
Chris@14
|
96 if ($version->getMinor()->getValue() < $this->getMinor()->getValue()) {
|
Chris@14
|
97 return true;
|
Chris@14
|
98 }
|
Chris@14
|
99
|
Chris@14
|
100 if ($version->getPatch()->getValue() >= $this->getPatch()->getValue()) {
|
Chris@14
|
101 return false;
|
Chris@14
|
102 }
|
Chris@14
|
103
|
Chris@14
|
104 if ($version->getPatch()->getValue() < $this->getPatch()->getValue()) {
|
Chris@14
|
105 return true;
|
Chris@14
|
106 }
|
Chris@14
|
107
|
Chris@14
|
108 return false;
|
Chris@14
|
109 }
|
Chris@14
|
110
|
Chris@14
|
111 /**
|
Chris@14
|
112 * @return VersionNumber
|
Chris@14
|
113 */
|
Chris@14
|
114 public function getMajor() {
|
Chris@14
|
115 return $this->major;
|
Chris@14
|
116 }
|
Chris@14
|
117
|
Chris@14
|
118 /**
|
Chris@14
|
119 * @return VersionNumber
|
Chris@14
|
120 */
|
Chris@14
|
121 public function getMinor() {
|
Chris@14
|
122 return $this->minor;
|
Chris@14
|
123 }
|
Chris@14
|
124
|
Chris@14
|
125 /**
|
Chris@14
|
126 * @return VersionNumber
|
Chris@14
|
127 */
|
Chris@14
|
128 public function getPatch() {
|
Chris@14
|
129 return $this->patch;
|
Chris@14
|
130 }
|
Chris@14
|
131
|
Chris@14
|
132 /**
|
Chris@14
|
133 * @param string $version
|
Chris@14
|
134 *
|
Chris@14
|
135 * @throws InvalidVersionException
|
Chris@14
|
136 */
|
Chris@14
|
137 private function ensureVersionStringIsValid($version) {
|
Chris@14
|
138 $regex = '/^v?
|
Chris@14
|
139 (?<Major>(0|(?:[1-9][0-9]*)))
|
Chris@14
|
140 \\.
|
Chris@14
|
141 (?<Minor>(0|(?:[1-9][0-9]*)))
|
Chris@14
|
142 (\\.
|
Chris@14
|
143 (?<Patch>(0|(?:[1-9][0-9]*)))
|
Chris@14
|
144 )?
|
Chris@14
|
145 (?:
|
Chris@14
|
146 -
|
Chris@14
|
147 (?<ReleaseType>(?:(dev|beta|b|RC|alpha|a|patch|p)))
|
Chris@14
|
148 (?:
|
Chris@14
|
149 (?<ReleaseTypeCount>[0-9])
|
Chris@14
|
150 )?
|
Chris@14
|
151 )?
|
Chris@14
|
152 $/x';
|
Chris@14
|
153
|
Chris@14
|
154 if (preg_match($regex, $version, $matches) !== 1) {
|
Chris@14
|
155 throw new InvalidVersionException(
|
Chris@14
|
156 sprintf("Version string '%s' does not follow SemVer semantics", $version)
|
Chris@14
|
157 );
|
Chris@14
|
158 }
|
Chris@14
|
159
|
Chris@14
|
160 $this->parseVersion($matches);
|
Chris@14
|
161 }
|
Chris@14
|
162 }
|