Редакция 69 | Только различия | Не учитывать пробелы | Содержимое файла | Авторство | Последнее изменение | Открыть журнал | RSS
Редакция 69 | Редакция 87 | ||
---|---|---|---|
1 | <?php
|
1 | <?php
|
2 | /**
|
2 | /**
|
3 | * PEAR_REST_11 - implement faster list-all/remote-list command
|
3 | * PEAR_REST_11 - implement faster list-all/remote-list command
|
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: 11.php,v 1.14 2008/04/11 01:16:40 dufuz Exp $
|
18 | * @version CVS: $Id: 11.php,v 1.14 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.3
|
20 | * @since File available since Release 1.4.3
|
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 | 27 | ||
28 | /**
|
28 | /**
|
29 | * Implement REST 1.1
|
29 | * Implement REST 1.1
|
30 | *
|
30 | *
|
31 | * @category pear
|
31 | * @category pear
|
32 | * @package PEAR
|
32 | * @package PEAR
|
33 | * @author Greg Beaver <cellog@php.net>
|
33 | * @author Greg Beaver <cellog@php.net>
|
34 | * @copyright 1997-2008 The PHP Group
|
34 | * @copyright 1997-2008 The PHP Group
|
35 | * @license http://www.php.net/license/3_0.txt PHP License 3.0
|
35 | * @license http://www.php.net/license/3_0.txt PHP License 3.0
|
36 | * @version Release: 1.7.2
|
36 | * @version Release: 1.7.2
|
37 | * @link http://pear.php.net/package/PEAR
|
37 | * @link http://pear.php.net/package/PEAR
|
38 | * @since Class available since Release 1.4.3
|
38 | * @since Class available since Release 1.4.3
|
39 | */
|
39 | */
|
40 | class PEAR_REST_11
|
40 | class PEAR_REST_11
|
41 | {
|
41 | {
|
42 | /**
|
42 | /**
|
43 | * @var PEAR_REST
|
43 | * @var PEAR_REST
|
44 | */
|
44 | */
|
45 | var $_rest; |
45 | var $_rest; |
46 | 46 | ||
47 | function PEAR_REST_11($config, $options = array()) |
47 | function PEAR_REST_11($config, $options = array()) |
48 | {
|
48 | {
|
49 | $this->_rest = &new PEAR_REST($config, $options); |
49 | $this->_rest = &new PEAR_REST($config, $options); |
50 | }
|
50 | }
|
51 | 51 | ||
52 | function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false) |
52 | function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false) |
53 | {
|
53 | {
|
54 | $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel); |
54 | $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel); |
55 | if (PEAR::isError($categorylist)) { |
55 | if (PEAR::isError($categorylist)) { |
56 | return $categorylist; |
56 | return $categorylist; |
57 | }
|
57 | }
|
58 | $ret = array(); |
58 | $ret = array(); |
59 | if (!is_array($categorylist['c']) || !isset($categorylist['c'][0])) { |
59 | if (!is_array($categorylist['c']) || !isset($categorylist['c'][0])) { |
60 | $categorylist['c'] = array($categorylist['c']); |
60 | $categorylist['c'] = array($categorylist['c']); |
61 | }
|
61 | }
|
62 | PEAR::pushErrorHandling(PEAR_ERROR_RETURN); |
62 | PEAR::pushErrorHandling(PEAR_ERROR_RETURN); |
63 | 63 | ||
64 | foreach ($categorylist['c'] as $progress => $category) { |
64 | foreach ($categorylist['c'] as $progress => $category) { |
65 | $category = $category['_content']; |
65 | $category = $category['_content']; |
66 | $packagesinfo = $this->_rest->retrieveData($base . |
66 | $packagesinfo = $this->_rest->retrieveData($base . |
67 | 'c/' . urlencode($category) . '/packagesinfo.xml', false, false, $channel); |
67 | 'c/' . urlencode($category) . '/packagesinfo.xml', false, false, $channel); |
68 | 68 | ||
69 | if (PEAR::isError($packagesinfo)) { |
69 | if (PEAR::isError($packagesinfo)) { |
70 | continue; |
70 | continue; |
71 | }
|
71 | }
|
72 | 72 | ||
73 | if (!is_array($packagesinfo) || !isset($packagesinfo['pi'])) { |
73 | if (!is_array($packagesinfo) || !isset($packagesinfo['pi'])) { |
74 | continue; |
74 | continue; |
75 | }
|
75 | }
|
76 | 76 | ||
77 | if (!is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) { |
77 | if (!is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) { |
78 | $packagesinfo['pi'] = array($packagesinfo['pi']); |
78 | $packagesinfo['pi'] = array($packagesinfo['pi']); |
79 | }
|
79 | }
|
80 | 80 | ||
81 | foreach ($packagesinfo['pi'] as $packageinfo) { |
81 | foreach ($packagesinfo['pi'] as $packageinfo) { |
82 | $info = $packageinfo['p']; |
82 | $info = $packageinfo['p']; |
83 | $package = $info['n']; |
83 | $package = $info['n']; |
84 | $releases = isset($packageinfo['a']) ? $packageinfo['a'] : false; |
84 | $releases = isset($packageinfo['a']) ? $packageinfo['a'] : false; |
85 | unset($latest); |
85 | unset($latest); |
86 | unset($unstable); |
86 | unset($unstable); |
87 | unset($stable); |
87 | unset($stable); |
88 | unset($state); |
88 | unset($state); |
89 | 89 | ||
90 | if ($releases) { |
90 | if ($releases) { |
91 | if (!isset($releases['r'][0])) { |
91 | if (!isset($releases['r'][0])) { |
92 | $releases['r'] = array($releases['r']); |
92 | $releases['r'] = array($releases['r']); |
93 | }
|
93 | }
|
94 | foreach ($releases['r'] as $release) { |
94 | foreach ($releases['r'] as $release) { |
95 | if (!isset($latest)) { |
95 | if (!isset($latest)) { |
96 | if ($dostable && $release['s'] == 'stable') { |
96 | if ($dostable && $release['s'] == 'stable') { |
97 | $latest = $release['v']; |
97 | $latest = $release['v']; |
98 | $state = 'stable'; |
98 | $state = 'stable'; |
99 | }
|
99 | }
|
100 | if (!$dostable) { |
100 | if (!$dostable) { |
101 | $latest = $release['v']; |
101 | $latest = $release['v']; |
102 | $state = $release['s']; |
102 | $state = $release['s']; |
103 | }
|
103 | }
|
104 | }
|
104 | }
|
105 | if (!isset($stable) && $release['s'] == 'stable') { |
105 | if (!isset($stable) && $release['s'] == 'stable') { |
106 | $stable = $release['v']; |
106 | $stable = $release['v']; |
107 | if (!isset($unstable)) { |
107 | if (!isset($unstable)) { |
108 | $unstable = $stable; |
108 | $unstable = $stable; |
109 | }
|
109 | }
|
110 | }
|
110 | }
|
111 | if (!isset($unstable) && $release['s'] != 'stable') { |
111 | if (!isset($unstable) && $release['s'] != 'stable') { |
112 | $unstable = $release['v']; |
112 | $unstable = $release['v']; |
113 | $state = $release['s']; |
113 | $state = $release['s']; |
114 | }
|
114 | }
|
115 | if (isset($latest) && !isset($state)) { |
115 | if (isset($latest) && !isset($state)) { |
116 | $state = $release['s']; |
116 | $state = $release['s']; |
117 | }
|
117 | }
|
118 | if (isset($latest) && isset($stable) && isset($unstable)) { |
118 | if (isset($latest) && isset($stable) && isset($unstable)) { |
119 | break; |
119 | break; |
120 | }
|
120 | }
|
121 | }
|
121 | }
|
122 | }
|
122 | }
|
123 | 123 | ||
124 | if ($basic) { // remote-list command |
124 | if ($basic) { // remote-list command |
125 | if (!isset($latest)) { |
125 | if (!isset($latest)) { |
126 | $latest = false; |
126 | $latest = false; |
127 | }
|
127 | }
|
128 | if ($dostable) { |
128 | if ($dostable) { |
129 | // $state is not set if there are no releases
|
129 | // $state is not set if there are no releases
|
130 | if (isset($state) && $state == 'stable') { |
130 | if (isset($state) && $state == 'stable') { |
131 | $ret[$package] = array('stable' => $latest); |
131 | $ret[$package] = array('stable' => $latest); |
132 | } else { |
132 | } else { |
133 | $ret[$package] = array('stable' => '-n/a-'); |
133 | $ret[$package] = array('stable' => '-n/a-'); |
134 | }
|
134 | }
|
135 | } else { |
135 | } else { |
136 | $ret[$package] = array('stable' => $latest); |
136 | $ret[$package] = array('stable' => $latest); |
137 | }
|
137 | }
|
138 | continue; |
138 | continue; |
139 | }
|
139 | }
|
140 | 140 | ||
141 | // list-all command
|
141 | // list-all command
|
142 | $deps = array(); |
142 | $deps = array(); |
143 | if (!isset($unstable)) { |
143 | if (!isset($unstable)) { |
144 | $unstable = false; |
144 | $unstable = false; |
145 | $state = 'stable'; |
145 | $state = 'stable'; |
146 | if (isset($stable)) { |
146 | if (isset($stable)) { |
147 | $latest = $unstable = $stable; |
147 | $latest = $unstable = $stable; |
148 | }
|
148 | }
|
149 | } else { |
149 | } else { |
150 | $latest = $unstable; |
150 | $latest = $unstable; |
151 | }
|
151 | }
|
152 | 152 | ||
153 | if (!isset($latest)) { |
153 | if (!isset($latest)) { |
154 | $latest = false; |
154 | $latest = false; |
155 | }
|
155 | }
|
156 | 156 | ||
157 | if ($latest && isset($packageinfo['deps'])) { |
157 | if ($latest && isset($packageinfo['deps'])) { |
158 | if (!is_array($packageinfo['deps']) || |
158 | if (!is_array($packageinfo['deps']) || |
159 | !isset($packageinfo['deps'][0])) { |
159 | !isset($packageinfo['deps'][0])) { |
160 | $packageinfo['deps'] = array($packageinfo['deps']); |
160 | $packageinfo['deps'] = array($packageinfo['deps']); |
161 | }
|
161 | }
|
162 | $d = false; |
162 | $d = false; |
163 | foreach ($packageinfo['deps'] as $dep) { |
163 | foreach ($packageinfo['deps'] as $dep) { |
164 | if ($dep['v'] == $latest) { |
164 | if ($dep['v'] == $latest) { |
165 | $d = unserialize($dep['d']); |
165 | $d = unserialize($dep['d']); |
166 | }
|
166 | }
|
167 | }
|
167 | }
|
168 | if ($d) { |
168 | if ($d) { |
169 | if (isset($d['required'])) { |
169 | if (isset($d['required'])) { |
170 | if (!class_exists('PEAR_PackageFile_v2')) { |
170 | if (!class_exists('PEAR_PackageFile_v2')) { |
171 | require_once 'PEAR/PackageFile/v2.php'; |
171 | require_once 'PEAR/PackageFile/v2.php'; |
172 | }
|
172 | }
|
173 | if (!isset($pf)) { |
173 | if (!isset($pf)) { |
174 | $pf = new PEAR_PackageFile_v2; |
174 | $pf = new PEAR_PackageFile_v2; |
175 | }
|
175 | }
|
176 | $pf->setDeps($d); |
176 | $pf->setDeps($d); |
177 | $tdeps = $pf->getDeps(); |
177 | $tdeps = $pf->getDeps(); |
178 | } else { |
178 | } else { |
179 | $tdeps = $d; |
179 | $tdeps = $d; |
180 | }
|
180 | }
|
181 | foreach ($tdeps as $dep) { |
181 | foreach ($tdeps as $dep) { |
182 | if ($dep['type'] !== 'pkg') { |
182 | if ($dep['type'] !== 'pkg') { |
183 | continue; |
183 | continue; |
184 | }
|
184 | }
|
185 | $deps[] = $dep; |
185 | $deps[] = $dep; |
186 | }
|
186 | }
|
187 | }
|
187 | }
|
188 | }
|
188 | }
|
189 | 189 | ||
190 | $info = array('stable' => $latest, 'summary' => $info['s'], |
190 | $info = array('stable' => $latest, 'summary' => $info['s'], |
191 | 'description' => |
191 | 'description' => |
192 | $info['d'], 'deps' => $deps, 'category' => $info['ca']['_content'], |
192 | $info['d'], 'deps' => $deps, 'category' => $info['ca']['_content'], |
193 | 'unstable' => $unstable, 'state' => $state); |
193 | 'unstable' => $unstable, 'state' => $state); |
194 | $ret[$package] = $info; |
194 | $ret[$package] = $info; |
195 | }
|
195 | }
|
196 | }
|
196 | }
|
197 | PEAR::popErrorHandling(); |
197 | PEAR::popErrorHandling(); |
198 | return $ret; |
198 | return $ret; |
199 | }
|
199 | }
|
200 | 200 | ||
201 | /**
|
201 | /**
|
202 | * List all categories of a REST server
|
202 | * List all categories of a REST server
|
203 | *
|
203 | *
|
204 | * @param string $base base URL of the server
|
204 | * @param string $base base URL of the server
|
205 | * @return array of categorynames
|
205 | * @return array of categorynames
|
206 | */
|
206 | */
|
207 | function listCategories($base, $channel = false) |
207 | function listCategories($base, $channel = false) |
208 | {
|
208 | {
|
209 | $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel); |
209 | $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel); |
210 | if (PEAR::isError($categorylist)) { |
210 | if (PEAR::isError($categorylist)) { |
211 | return $categorylist; |
211 | return $categorylist; |
212 | }
|
212 | }
|
213 | if (!is_array($categorylist) || !isset($categorylist['c'])) { |
213 | if (!is_array($categorylist) || !isset($categorylist['c'])) { |
214 | return array(); |
214 | return array(); |
215 | }
|
215 | }
|
216 | if (isset($categorylist['c']['_content'])) { |
216 | if (isset($categorylist['c']['_content'])) { |
217 | // only 1 category
|
217 | // only 1 category
|
218 | $categorylist['c'] = array($categorylist['c']); |
218 | $categorylist['c'] = array($categorylist['c']); |
219 | }
|
219 | }
|
220 | return $categorylist['c']; |
220 | return $categorylist['c']; |
221 | }
|
221 | }
|
222 | 222 | ||
223 | /**
|
223 | /**
|
224 | * List packages in a category of a REST server
|
224 | * List packages in a category of a REST server
|
225 | *
|
225 | *
|
226 | * @param string $base base URL of the server
|
226 | * @param string $base base URL of the server
|
227 | * @param string $category name of the category
|
227 | * @param string $category name of the category
|
228 | * @param boolean $info also download full package info
|
228 | * @param boolean $info also download full package info
|
229 | * @return array of packagenames
|
229 | * @return array of packagenames
|
230 | */
|
230 | */
|
231 | function listCategory($base, $category, $info = false, $channel = false) |
231 | function listCategory($base, $category, $info = false, $channel = false) |
232 | {
|
232 | {
|
233 | if ($info == false) { |
233 | if ($info == false) { |
234 | $url = '%s'.'c/%s/packages.xml'; |
234 | $url = '%s'.'c/%s/packages.xml'; |
235 | } else { |
235 | } else { |
236 | $url = '%s'.'c/%s/packagesinfo.xml'; |
236 | $url = '%s'.'c/%s/packagesinfo.xml'; |
237 | }
|
237 | }
|
238 | $url = sprintf($url, |
238 | $url = sprintf($url, |
239 | $base, |
239 | $base, |
240 | urlencode($category)); |
240 | urlencode($category)); |
241 | 241 | ||
242 | // gives '404 Not Found' error when category doesn't exist
|
242 | // gives '404 Not Found' error when category doesn't exist
|
243 | $packagelist = $this->_rest->retrieveData($url, false, false, $channel); |
243 | $packagelist = $this->_rest->retrieveData($url, false, false, $channel); |
244 | if (PEAR::isError($packagelist)) { |
244 | if (PEAR::isError($packagelist)) { |
245 | return $packagelist; |
245 | return $packagelist; |
246 | }
|
246 | }
|
247 | if (!is_array($packagelist)) { |
247 | if (!is_array($packagelist)) { |
248 | return array(); |
248 | return array(); |
249 | }
|
249 | }
|
250 | 250 | ||
251 | if ($info == false) { |
251 | if ($info == false) { |
252 | if (!isset($packagelist['p'])) { |
252 | if (!isset($packagelist['p'])) { |
253 | return array(); |
253 | return array(); |
254 | }
|
254 | }
|
255 | if (!is_array($packagelist['p']) || |
255 | if (!is_array($packagelist['p']) || |
256 | !isset($packagelist['p'][0])) { // only 1 pkg |
256 | !isset($packagelist['p'][0])) { // only 1 pkg |
257 | $packagelist = array($packagelist['p']); |
257 | $packagelist = array($packagelist['p']); |
258 | } else { |
258 | } else { |
259 | $packagelist = $packagelist['p']; |
259 | $packagelist = $packagelist['p']; |
260 | }
|
260 | }
|
261 | return $packagelist; |
261 | return $packagelist; |
262 | } else { |
262 | } else { |
263 | // info == true
|
263 | // info == true
|
264 | if (!isset($packagelist['pi'])) { |
264 | if (!isset($packagelist['pi'])) { |
265 | return array(); |
265 | return array(); |
266 | }
|
266 | }
|
267 | if (!is_array($packagelist['pi']) || |
267 | if (!is_array($packagelist['pi']) || |
268 | !isset($packagelist['pi'][0])) { // only 1 pkg |
268 | !isset($packagelist['pi'][0])) { // only 1 pkg |
269 | $packagelist_pre = array($packagelist['pi']); |
269 | $packagelist_pre = array($packagelist['pi']); |
270 | } else { |
270 | } else { |
271 | $packagelist_pre = $packagelist['pi']; |
271 | $packagelist_pre = $packagelist['pi']; |
272 | }
|
272 | }
|
273 | 273 | ||
274 | $packagelist = array(); |
274 | $packagelist = array(); |
275 | foreach ($packagelist_pre as $i => $item) { |
275 | foreach ($packagelist_pre as $i => $item) { |
276 | // compatibility with r/<latest.txt>.xml
|
276 | // compatibility with r/<latest.txt>.xml
|
277 | if (isset($item['a']['r'][0])) { |
277 | if (isset($item['a']['r'][0])) { |
278 | // multiple releases
|
278 | // multiple releases
|
279 | $item['p']['v'] = $item['a']['r'][0]['v']; |
279 | $item['p']['v'] = $item['a']['r'][0]['v']; |
280 | $item['p']['st'] = $item['a']['r'][0]['s']; |
280 | $item['p']['st'] = $item['a']['r'][0]['s']; |
281 | } elseif (isset($item['a'])) { |
281 | } elseif (isset($item['a'])) { |
282 | // first and only release
|
282 | // first and only release
|
283 | $item['p']['v'] = $item['a']['r']['v']; |
283 | $item['p']['v'] = $item['a']['r']['v']; |
284 | $item['p']['st'] = $item['a']['r']['s']; |
284 | $item['p']['st'] = $item['a']['r']['s']; |
285 | }
|
285 | }
|
286 | 286 | ||
287 | $packagelist[$i] = array('attribs' => $item['p']['r'], |
287 | $packagelist[$i] = array('attribs' => $item['p']['r'], |
288 | '_content' => $item['p']['n'], |
288 | '_content' => $item['p']['n'], |
289 | 'info' => $item['p']); |
289 | 'info' => $item['p']); |
290 | }
|
290 | }
|
291 | }
|
291 | }
|
292 | 292 | ||
293 | return $packagelist; |
293 | return $packagelist; |
294 | }
|
294 | }
|
295 | 295 | ||
296 | /**
|
296 | /**
|
297 | * Return an array containing all of the states that are more stable than
|
297 | * Return an array containing all of the states that are more stable than
|
298 | * or equal to the passed in state
|
298 | * or equal to the passed in state
|
299 | *
|
299 | *
|
300 | * @param string Release state
|
300 | * @param string Release state
|
301 | * @param boolean Determines whether to include $state in the list
|
301 | * @param boolean Determines whether to include $state in the list
|
302 | * @return false|array False if $state is not a valid release state
|
302 | * @return false|array False if $state is not a valid release state
|
303 | */
|
303 | */
|
304 | function betterStates($state, $include = false) |
304 | function betterStates($state, $include = false) |
305 | {
|
305 | {
|
306 | static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable'); |
306 | static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable'); |
307 | $i = array_search($state, $states); |
307 | $i = array_search($state, $states); |
308 | if ($i === false) { |
308 | if ($i === false) { |
309 | return false; |
309 | return false; |
310 | }
|
310 | }
|
311 | if ($include) { |
311 | if ($include) { |
312 | $i--; |
312 | $i--; |
313 | }
|
313 | }
|
314 | return array_slice($states, $i + 1); |
314 | return array_slice($states, $i + 1); |
315 | }
|
315 | }
|
316 | }
|
316 | }
|
317 | ?>
|
317 | ?>
|