-
Notifications
You must be signed in to change notification settings - Fork 0
/
UpdateType.php
129 lines (108 loc) · 4.15 KB
/
UpdateType.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
<?php
require_once dirname(__FILE__) . '/db.php';
require_once dirname(__FILE__) . '/modules/HttpException/HttpException.php';
require_once dirname(__FILE__) . '/modules/semver/semver.php';
class UpdateType
{
const MAJOR = 4;
const MINOR = 3;
const PATCH = 2;
const BUILD_INCREASE = 6;
const PRERELEASE_INCREASE = 7;
const ADD = 1;
const REMOVE = 5;
private static $map = array(self::MAJOR => 'major', self::MINOR => 'minor', self::PATCH => 'patch',
self::BUILD_INCREASE => 'build-increase', self::PRERELEASE_INCREASE => 'prerelease-increase',
self::ADD => 'add', self::REMOVE => 'remove');
const USAGE_ITEMS = 'items';
const USAGE_STDLIB = 'stdlib';
const USAGE_STDLIB_RELEASES = 'stdlib_releases';
private static $usage = array(self::USAGE_ITEMS => array(self::MAJOR, self::MINOR, self::PATCH, self::BUILD_INCREASE, self::PRERELEASE_INCREASE, self::ADD),
self::USAGE_STDLIB => array(self::MAJOR, self::MINOR, self::PATCH, self::ADD, self::REMOVE),
self::USAGE_STDLIB_RELEASES => array(self::MAJOR, self::MINOR, self::PATCH)); # stdlib/pending/list relies on this not to be changed
public static function getCode($str, $usage)
{
$code = array_search(strtolower($str), self::$map);
if (!$code)
{
throw new HttpException(400);
}
if (!isset(self::$usage[$usage]) || array_search($code, self::$usage[$usage]) === FALSE)
{
throw new HttpException(400);
}
return $code;
}
public static function getName($id)
{
if (isset(self::$map[$id]))
return self::$map[$id];
throw new HttpException(500, 'Unknown update type!');
}
public static function getUpdate($old, $new) {
# separate versions
$old_parts = array();
$new_parts = array();
if (!semver_parts($old, $old_parts) || !semver_parts($new, $new_parts)) {
throw new HttpException(500);
}
if (semver_compare($old, $new) > -1) { # ensure correct version order
throw new HttpException(500);
}
foreach (array('major' => self::MAJOR, 'minor' => self::MINOR, 'patch' => self::PATCH) AS $part => $type) {
if ((int)$new_parts[$part] > (int)$old_parts[$part])
return $type;
}
foreach (array('prerelease' => self::PRERELEASE_INCREASE, 'build' => self::BUILD_INCREASE) AS $part => $type) {
if (!empty($new_parts[$part]) && !empty($old_parts[$part])) { # optional parts
$new_fragments = explode('.', $new_parts[$part]);
$old_fragments = explode('.', $old_parts[$part]);
for ($index = 0; $index < min(count($new_fragments), count($old_fragments)); $index++) { # use the smaller amount of parts
$new_frag = $new_fragments[$index]; $old_frag = $old_fragments[$index];
if (ctype_digit($new_frag) && ctype_digit($old_frag)) {
if ((int)$new_frag != (int)$old_frag)
return $type;
continue;
}
# at least one is non-numeric: compare by characters (chars > numeric is still ensured)
else if ($new_frag < $old_frag || $new_frag > $old_frag)
return $type;
}
if (count($new_fragments) != count($old_fragments))
return $type;
}
else if ($type == self::PRERELEASE_INCREASE && empty($new_parts[$part]) && !empty($old_parts[$part])) # no prerelease > any prerelease
return $type;
else if ($type == self::BUILD_INCREASE && !empty($new_parts[$part]) && empty($old_parts[$part])) # any build > no build
return $type;
}
throw new HttpException(500);
}
public static function bumpVersion($base, $type) {
$parts = array();
if (!semver_parts($base, $parts)) { # split into parts
throw new HttpException(500);
}
$reset = array('minor' => 0, 'patch' => 0, 'prerelease' => NULL, 'build' => NULL);
switch ($type) {
case self::MAJOR: $field = 'major';
break;
case self::MINOR: $field = 'minor';
unset($reset['minor']); # must not reset minor field
break;
case self::PATCH: $field = 'patch';
unset($reset['minor']); # must not reset minor field
unset($reset['patch']); # must not reset patch field
break;
default:
throw new HttpException(500); # bumping other parts is not supported
break;
}
$parts[$field]++;
foreach ($reset AS $field => $value) { # reset lower parts to default value
$parts[$field] = $value;
}
return semver_string($parts);
}
}
?>