Редакция 69 | Только различия | Не учитывать пробелы | Содержимое файла | Авторство | Последнее изменение | Открыть журнал | RSS
Редакция 69 | Редакция 87 | ||
---|---|---|---|
1 | <?php
|
1 | <?php
|
2 | /**
|
2 | /**
|
3 | * PEAR_REST_13
|
3 | * PEAR_REST_13
|
4 | *
|
4 | *
|
5 | * PHP versions 4 and 5
|
5 | * PHP versions 4 and 5
|
6 | *
|
6 | *
|
7 | * LICENSE: This source file is subject to version 3.0 of the PHP license
|
7 | * LICENSE: This source file is subject to version 3.0 of the PHP license
|
8 | * that is available through the world-wide-web at the following URI:
|
8 | * that is available through the world-wide-web at the following URI:
|
9 | * http://www.php.net/license/3_0.txt. If you did not receive a copy of
|
9 | * http://www.php.net/license/3_0.txt. If you did not receive a copy of
|
10 | * the PHP License and are unable to obtain it through the web, please
|
10 | * the PHP License and are unable to obtain it through the web, please
|
11 | * send a note to license@php.net so we can mail you a copy immediately.
|
11 | * send a note to license@php.net so we can mail you a copy immediately.
|
12 | *
|
12 | *
|
13 | * @category pear
|
13 | * @category pear
|
14 | * @package PEAR
|
14 | * @package PEAR
|
15 | * @author Greg Beaver <cellog@php.net>
|
15 | * @author Greg Beaver <cellog@php.net>
|
16 | * @copyright 1997-2008 The PHP Group
|
16 | * @copyright 1997-2008 The PHP Group
|
17 | * @license http://www.php.net/license/3_0.txt PHP License 3.0
|
17 | * @license http://www.php.net/license/3_0.txt PHP License 3.0
|
18 | * @version CVS: $Id: 13.php,v 1.6 2008/04/11 01:16:40 dufuz Exp $
|
18 | * @version CVS: $Id: 13.php,v 1.6 2008/04/11 01:16:40 dufuz Exp $
|
19 | * @link http://pear.php.net/package/PEAR
|
19 | * @link http://pear.php.net/package/PEAR
|
20 | * @since File available since Release 1.4.0a12
|
20 | * @since File available since Release 1.4.0a12
|
21 | */
|
21 | */
|
22 | 22 | ||
23 | /**
|
23 | /**
|
24 | * For downloading REST xml/txt files
|
24 | * For downloading REST xml/txt files
|
25 | */
|
25 | */
|
26 | require_once 'PEAR/REST.php'; |
26 | require_once 'PEAR/REST.php'; |
27 | require_once 'PEAR/REST/10.php'; |
27 | require_once 'PEAR/REST/10.php'; |
28 | 28 | ||
29 | /**
|
29 | /**
|
30 | * Implement REST 1.3
|
30 | * Implement REST 1.3
|
31 | *
|
31 | *
|
32 | * @category pear
|
32 | * @category pear
|
33 | * @package PEAR
|
33 | * @package PEAR
|
34 | * @author Greg Beaver <cellog@php.net>
|
34 | * @author Greg Beaver <cellog@php.net>
|
35 | * @copyright 1997-2008 The PHP Group
|
35 | * @copyright 1997-2008 The PHP Group
|
36 | * @license http://www.php.net/license/3_0.txt PHP License 3.0
|
36 | * @license http://www.php.net/license/3_0.txt PHP License 3.0
|
37 | * @version Release: 1.7.2
|
37 | * @version Release: 1.7.2
|
38 | * @link http://pear.php.net/package/PEAR
|
38 | * @link http://pear.php.net/package/PEAR
|
39 | * @since Class available since Release 1.4.0a12
|
39 | * @since Class available since Release 1.4.0a12
|
40 | */
|
40 | */
|
41 | class PEAR_REST_13 extends PEAR_REST_10 |
41 | class PEAR_REST_13 extends PEAR_REST_10 |
42 | {
|
42 | {
|
43 | /**
|
43 | /**
|
44 | * Retrieve information about a remote package to be downloaded from a REST server
|
44 | * Retrieve information about a remote package to be downloaded from a REST server
|
45 | *
|
45 | *
|
46 | * This is smart enough to resolve the minimum PHP version dependency prior to download
|
46 | * This is smart enough to resolve the minimum PHP version dependency prior to download
|
47 | * @param string $base The uri to prepend to all REST calls
|
47 | * @param string $base The uri to prepend to all REST calls
|
48 | * @param array $packageinfo an array of format:
|
48 | * @param array $packageinfo an array of format:
|
49 | * <pre>
|
49 | * <pre>
|
50 | * array(
|
50 | * array(
|
51 | * 'package' => 'packagename',
|
51 | * 'package' => 'packagename',
|
52 | * 'channel' => 'channelname',
|
52 | * 'channel' => 'channelname',
|
53 | * ['state' => 'alpha' (or valid state),]
|
53 | * ['state' => 'alpha' (or valid state),]
|
54 | * -or-
|
54 | * -or-
|
55 | * ['version' => '1.whatever']
|
55 | * ['version' => '1.whatever']
|
56 | * </pre>
|
56 | * </pre>
|
57 | * @param string $prefstate Current preferred_state config variable value
|
57 | * @param string $prefstate Current preferred_state config variable value
|
58 | * @param bool $installed the installed version of this package to compare against
|
58 | * @param bool $installed the installed version of this package to compare against
|
59 | * @return array|false|PEAR_Error see {@link _returnDownloadURL()}
|
59 | * @return array|false|PEAR_Error see {@link _returnDownloadURL()}
|
60 | */
|
60 | */
|
61 | function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false) |
61 | function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false) |
62 | {
|
62 | {
|
63 | $channel = $packageinfo['channel']; |
63 | $channel = $packageinfo['channel']; |
64 | $package = $packageinfo['package']; |
64 | $package = $packageinfo['package']; |
65 | $states = $this->betterStates($prefstate, true); |
65 | $states = $this->betterStates($prefstate, true); |
66 | if (!$states) { |
66 | if (!$states) { |
67 | return PEAR::raiseError('"' . $prefstate . '" is not a valid state'); |
67 | return PEAR::raiseError('"' . $prefstate . '" is not a valid state'); |
68 | }
|
68 | }
|
69 | $state = isset($packageinfo['state']) ? $packageinfo['state'] : null; |
69 | $state = isset($packageinfo['state']) ? $packageinfo['state'] : null; |
70 | $version = isset($packageinfo['version']) ? $packageinfo['version'] : null; |
70 | $version = isset($packageinfo['version']) ? $packageinfo['version'] : null; |
71 | $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . |
71 | $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . |
72 | '/allreleases2.xml'); |
72 | '/allreleases2.xml'); |
73 | if (PEAR::isError($info)) { |
73 | if (PEAR::isError($info)) { |
74 | return PEAR::raiseError('No releases available for package "' . |
74 | return PEAR::raiseError('No releases available for package "' . |
75 | $channel . '/' . $package . '"'); |
75 | $channel . '/' . $package . '"'); |
76 | }
|
76 | }
|
77 | if (!isset($info['r'])) { |
77 | if (!isset($info['r'])) { |
78 | return false; |
78 | return false; |
79 | }
|
79 | }
|
80 | $release = $found = false; |
80 | $release = $found = false; |
81 | if (!is_array($info['r']) || !isset($info['r'][0])) { |
81 | if (!is_array($info['r']) || !isset($info['r'][0])) { |
82 | $info['r'] = array($info['r']); |
82 | $info['r'] = array($info['r']); |
83 | }
|
83 | }
|
84 | $skippedphp = false; |
84 | $skippedphp = false; |
85 | foreach ($info['r'] as $release) { |
85 | foreach ($info['r'] as $release) { |
86 | if (!isset($this->_rest->_options['force']) && ($installed && |
86 | if (!isset($this->_rest->_options['force']) && ($installed && |
87 | version_compare($release['v'], $installed, '<'))) { |
87 | version_compare($release['v'], $installed, '<'))) { |
88 | continue; |
88 | continue; |
89 | }
|
89 | }
|
90 | if (isset($state)) { |
90 | if (isset($state)) { |
91 | // try our preferred state first
|
91 | // try our preferred state first
|
92 | if ($release['s'] == $state) { |
92 | if ($release['s'] == $state) { |
93 | if (!isset($version) && version_compare($release['m'], phpversion(), '>')) { |
93 | if (!isset($version) && version_compare($release['m'], phpversion(), '>')) { |
94 | // skip releases that require a PHP version newer than our PHP version
|
94 | // skip releases that require a PHP version newer than our PHP version
|
95 | $skippedphp = $release; |
95 | $skippedphp = $release; |
96 | continue; |
96 | continue; |
97 | }
|
97 | }
|
98 | $found = true; |
98 | $found = true; |
99 | break; |
99 | break; |
100 | }
|
100 | }
|
101 | // see if there is something newer and more stable
|
101 | // see if there is something newer and more stable
|
102 | // bug #7221
|
102 | // bug #7221
|
103 | if (in_array($release['s'], $this->betterStates($state), true)) { |
103 | if (in_array($release['s'], $this->betterStates($state), true)) { |
104 | if (!isset($version) && version_compare($release['m'], phpversion(), '>')) { |
104 | if (!isset($version) && version_compare($release['m'], phpversion(), '>')) { |
105 | // skip releases that require a PHP version newer than our PHP version
|
105 | // skip releases that require a PHP version newer than our PHP version
|
106 | $skippedphp = $release; |
106 | $skippedphp = $release; |
107 | continue; |
107 | continue; |
108 | }
|
108 | }
|
109 | $found = true; |
109 | $found = true; |
110 | break; |
110 | break; |
111 | }
|
111 | }
|
112 | } elseif (isset($version)) { |
112 | } elseif (isset($version)) { |
113 | if ($release['v'] == $version) { |
113 | if ($release['v'] == $version) { |
114 | if (!isset($this->_rest->_options['force']) && |
114 | if (!isset($this->_rest->_options['force']) && |
115 | !isset($version) && |
115 | !isset($version) && |
116 | version_compare($release['m'], phpversion(), '>')) { |
116 | version_compare($release['m'], phpversion(), '>')) { |
117 | // skip releases that require a PHP version newer than our PHP version
|
117 | // skip releases that require a PHP version newer than our PHP version
|
118 | $skippedphp = $release; |
118 | $skippedphp = $release; |
119 | continue; |
119 | continue; |
120 | }
|
120 | }
|
121 | $found = true; |
121 | $found = true; |
122 | break; |
122 | break; |
123 | }
|
123 | }
|
124 | } else { |
124 | } else { |
125 | if (in_array($release['s'], $states)) { |
125 | if (in_array($release['s'], $states)) { |
126 | if (version_compare($release['m'], phpversion(), '>')) { |
126 | if (version_compare($release['m'], phpversion(), '>')) { |
127 | // skip releases that require a PHP version newer than our PHP version
|
127 | // skip releases that require a PHP version newer than our PHP version
|
128 | $skippedphp = $release; |
128 | $skippedphp = $release; |
129 | continue; |
129 | continue; |
130 | }
|
130 | }
|
131 | $found = true; |
131 | $found = true; |
132 | break; |
132 | break; |
133 | }
|
133 | }
|
134 | }
|
134 | }
|
135 | }
|
135 | }
|
136 | if (!$found && $skippedphp) { |
136 | if (!$found && $skippedphp) { |
137 | $found = null; |
137 | $found = null; |
138 | }
|
138 | }
|
139 | return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel); |
139 | return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel); |
140 | }
|
140 | }
|
141 | 141 | ||
142 | function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage, |
142 | function getDepDownloadURL($base, $xsdversion, $dependency, $deppackage, |
143 | $prefstate = 'stable', $installed = false, $channel = false) |
143 | $prefstate = 'stable', $installed = false, $channel = false) |
144 | {
|
144 | {
|
145 | $channel = $dependency['channel']; |
145 | $channel = $dependency['channel']; |
146 | $package = $dependency['name']; |
146 | $package = $dependency['name']; |
147 | $states = $this->betterStates($prefstate, true); |
147 | $states = $this->betterStates($prefstate, true); |
148 | if (!$states) { |
148 | if (!$states) { |
149 | return PEAR::raiseError('"' . $prefstate . '" is not a valid state'); |
149 | return PEAR::raiseError('"' . $prefstate . '" is not a valid state'); |
150 | }
|
150 | }
|
151 | $state = isset($dependency['state']) ? $dependency['state'] : null; |
151 | $state = isset($dependency['state']) ? $dependency['state'] : null; |
152 | $version = isset($dependency['version']) ? $dependency['version'] : null; |
152 | $version = isset($dependency['version']) ? $dependency['version'] : null; |
153 | $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . |
153 | $info = $this->_rest->retrieveData($base . 'r/' . strtolower($package) . |
154 | '/allreleases2.xml'); |
154 | '/allreleases2.xml'); |
155 | if (PEAR::isError($info)) { |
155 | if (PEAR::isError($info)) { |
156 | return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package'] |
156 | return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package'] |
157 | . '" dependency "' . $channel . '/' . $package . '" has no releases'); |
157 | . '" dependency "' . $channel . '/' . $package . '" has no releases'); |
158 | }
|
158 | }
|
159 | if (!is_array($info) || !isset($info['r'])) { |
159 | if (!is_array($info) || !isset($info['r'])) { |
160 | return false; |
160 | return false; |
161 | }
|
161 | }
|
162 | $exclude = array(); |
162 | $exclude = array(); |
163 | $min = $max = $recommended = false; |
163 | $min = $max = $recommended = false; |
164 | if ($xsdversion == '1.0') { |
164 | if ($xsdversion == '1.0') { |
165 | $pinfo['package'] = $dependency['name']; |
165 | $pinfo['package'] = $dependency['name']; |
166 | $pinfo['channel'] = 'pear.php.net'; // this is always true - don't change this |
166 | $pinfo['channel'] = 'pear.php.net'; // this is always true - don't change this |
167 | switch ($dependency['rel']) { |
167 | switch ($dependency['rel']) { |
168 | case 'ge' : |
168 | case 'ge' : |
169 | $min = $dependency['version']; |
169 | $min = $dependency['version']; |
170 | break; |
170 | break; |
171 | case 'gt' : |
171 | case 'gt' : |
172 | $min = $dependency['version']; |
172 | $min = $dependency['version']; |
173 | $exclude = array($dependency['version']); |
173 | $exclude = array($dependency['version']); |
174 | break; |
174 | break; |
175 | case 'eq' : |
175 | case 'eq' : |
176 | $recommended = $dependency['version']; |
176 | $recommended = $dependency['version']; |
177 | break; |
177 | break; |
178 | case 'lt' : |
178 | case 'lt' : |
179 | $max = $dependency['version']; |
179 | $max = $dependency['version']; |
180 | $exclude = array($dependency['version']); |
180 | $exclude = array($dependency['version']); |
181 | break; |
181 | break; |
182 | case 'le' : |
182 | case 'le' : |
183 | $max = $dependency['version']; |
183 | $max = $dependency['version']; |
184 | break; |
184 | break; |
185 | case 'ne' : |
185 | case 'ne' : |
186 | $exclude = array($dependency['version']); |
186 | $exclude = array($dependency['version']); |
187 | break; |
187 | break; |
188 | }
|
188 | }
|
189 | } else { |
189 | } else { |
190 | $pinfo['package'] = $dependency['name']; |
190 | $pinfo['package'] = $dependency['name']; |
191 | $min = isset($dependency['min']) ? $dependency['min'] : false; |
191 | $min = isset($dependency['min']) ? $dependency['min'] : false; |
192 | $max = isset($dependency['max']) ? $dependency['max'] : false; |
192 | $max = isset($dependency['max']) ? $dependency['max'] : false; |
193 | $recommended = isset($dependency['recommended']) ? |
193 | $recommended = isset($dependency['recommended']) ? |
194 | $dependency['recommended'] : false; |
194 | $dependency['recommended'] : false; |
195 | if (isset($dependency['exclude'])) { |
195 | if (isset($dependency['exclude'])) { |
196 | if (!isset($dependency['exclude'][0])) { |
196 | if (!isset($dependency['exclude'][0])) { |
197 | $exclude = array($dependency['exclude']); |
197 | $exclude = array($dependency['exclude']); |
198 | }
|
198 | }
|
199 | }
|
199 | }
|
200 | }
|
200 | }
|
201 | $found = false; |
201 | $found = false; |
202 | $release = false; |
202 | $release = false; |
203 | $skippedphp = false; |
203 | $skippedphp = false; |
204 | if (!is_array($info['r']) || !isset($info['r'][0])) { |
204 | if (!is_array($info['r']) || !isset($info['r'][0])) { |
205 | $info['r'] = array($info['r']); |
205 | $info['r'] = array($info['r']); |
206 | }
|
206 | }
|
207 | foreach ($info['r'] as $release) { |
207 | foreach ($info['r'] as $release) { |
208 | if (!isset($this->_rest->_options['force']) && ($installed && |
208 | if (!isset($this->_rest->_options['force']) && ($installed && |
209 | version_compare($release['v'], $installed, '<'))) { |
209 | version_compare($release['v'], $installed, '<'))) { |
210 | continue; |
210 | continue; |
211 | }
|
211 | }
|
212 | if (in_array($release['v'], $exclude)) { // skip excluded versions |
212 | if (in_array($release['v'], $exclude)) { // skip excluded versions |
213 | continue; |
213 | continue; |
214 | }
|
214 | }
|
215 | // allow newer releases to say "I'm OK with the dependent package"
|
215 | // allow newer releases to say "I'm OK with the dependent package"
|
216 | if ($xsdversion == '2.0' && isset($release['co'])) { |
216 | if ($xsdversion == '2.0' && isset($release['co'])) { |
217 | if (!is_array($release['co']) || !isset($release['co'][0])) { |
217 | if (!is_array($release['co']) || !isset($release['co'][0])) { |
218 | $release['co'] = array($release['co']); |
218 | $release['co'] = array($release['co']); |
219 | }
|
219 | }
|
220 | foreach ($release['co'] as $entry) { |
220 | foreach ($release['co'] as $entry) { |
221 | if (isset($entry['x']) && !is_array($entry['x'])) { |
221 | if (isset($entry['x']) && !is_array($entry['x'])) { |
222 | $entry['x'] = array($entry['x']); |
222 | $entry['x'] = array($entry['x']); |
223 | } elseif (!isset($entry['x'])) { |
223 | } elseif (!isset($entry['x'])) { |
224 | $entry['x'] = array(); |
224 | $entry['x'] = array(); |
225 | }
|
225 | }
|
226 | if ($entry['c'] == $deppackage['channel'] && |
226 | if ($entry['c'] == $deppackage['channel'] && |
227 | strtolower($entry['p']) == strtolower($deppackage['package']) && |
227 | strtolower($entry['p']) == strtolower($deppackage['package']) && |
228 | version_compare($deppackage['version'], $entry['min'], '>=') && |
228 | version_compare($deppackage['version'], $entry['min'], '>=') && |
229 | version_compare($deppackage['version'], $entry['max'], '<=') && |
229 | version_compare($deppackage['version'], $entry['max'], '<=') && |
230 | !in_array($release['v'], $entry['x'])) { |
230 | !in_array($release['v'], $entry['x'])) { |
231 | if (version_compare($release['m'], phpversion(), '>')) { |
231 | if (version_compare($release['m'], phpversion(), '>')) { |
232 | // skip dependency releases that require a PHP version
|
232 | // skip dependency releases that require a PHP version
|
233 | // newer than our PHP version
|
233 | // newer than our PHP version
|
234 | $skippedphp = $release; |
234 | $skippedphp = $release; |
235 | continue; |
235 | continue; |
236 | }
|
236 | }
|
237 | $recommended = $release['v']; |
237 | $recommended = $release['v']; |
238 | break; |
238 | break; |
239 | }
|
239 | }
|
240 | }
|
240 | }
|
241 | }
|
241 | }
|
242 | if ($recommended) { |
242 | if ($recommended) { |
243 | if ($release['v'] != $recommended) { // if we want a specific |
243 | if ($release['v'] != $recommended) { // if we want a specific |
244 | // version, then skip all others
|
244 | // version, then skip all others
|
245 | continue; |
245 | continue; |
246 | } else { |
246 | } else { |
247 | if (!in_array($release['s'], $states)) { |
247 | if (!in_array($release['s'], $states)) { |
248 | // the stability is too low, but we must return the
|
248 | // the stability is too low, but we must return the
|
249 | // recommended version if possible
|
249 | // recommended version if possible
|
250 | return $this->_returnDownloadURL($base, $package, $release, $info, true, false, $channel); |
250 | return $this->_returnDownloadURL($base, $package, $release, $info, true, false, $channel); |
251 | }
|
251 | }
|
252 | }
|
252 | }
|
253 | }
|
253 | }
|
254 | if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions |
254 | if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions |
255 | continue; |
255 | continue; |
256 | }
|
256 | }
|
257 | if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions |
257 | if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions |
258 | continue; |
258 | continue; |
259 | }
|
259 | }
|
260 | if ($installed && version_compare($release['v'], $installed, '<')) { |
260 | if ($installed && version_compare($release['v'], $installed, '<')) { |
261 | continue; |
261 | continue; |
262 | }
|
262 | }
|
263 | if (in_array($release['s'], $states)) { // if in the preferred state... |
263 | if (in_array($release['s'], $states)) { // if in the preferred state... |
264 | if (version_compare($release['m'], phpversion(), '>')) { |
264 | if (version_compare($release['m'], phpversion(), '>')) { |
265 | // skip dependency releases that require a PHP version
|
265 | // skip dependency releases that require a PHP version
|
266 | // newer than our PHP version
|
266 | // newer than our PHP version
|
267 | $skippedphp = $release; |
267 | $skippedphp = $release; |
268 | continue; |
268 | continue; |
269 | }
|
269 | }
|
270 | $found = true; // ... then use it |
270 | $found = true; // ... then use it |
271 | break; |
271 | break; |
272 | }
|
272 | }
|
273 | }
|
273 | }
|
274 | if (!$found && $skippedphp) { |
274 | if (!$found && $skippedphp) { |
275 | $found = null; |
275 | $found = null; |
276 | }
|
276 | }
|
277 | return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel); |
277 | return $this->_returnDownloadURL($base, $package, $release, $info, $found, $skippedphp, $channel); |
278 | }
|
278 | }
|
279 | }
|
279 | }
|
280 | ?>
|
280 | ?>
|