3 * PEAR_REST_11 - implement faster list-all/remote-list command
9 * @author Greg Beaver <cellog@php.net>
10 * @copyright 1997-2009 The Authors
11 * @license http://opensource.org/licenses/bsd-license.php New BSD License
12 * @version CVS: $Id: 11.php 313023 2011-07-06 19:17:11Z dufuz $
13 * @link http://pear.php.net/package/PEAR
14 * @since File available since Release 1.4.3
18 * For downloading REST xml/txt files
20 require_once 'PEAR/REST.php';
27 * @author Greg Beaver <cellog@php.net>
28 * @copyright 1997-2009 The Authors
29 * @license http://opensource.org/licenses/bsd-license.php New BSD License
30 * @version Release: 1.9.4
31 * @link http://pear.php.net/package/PEAR
32 * @since Class available since Release 1.4.3
41 function PEAR_REST_11($config, $options = array())
43 $this->_rest = &new PEAR_REST($config, $options);
46 function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false)
48 $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
49 if (PEAR::isError($categorylist)) {
54 if (!is_array($categorylist['c']) || !isset($categorylist['c'][0])) {
55 $categorylist['c'] = array($categorylist['c']);
58 PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
60 foreach ($categorylist['c'] as $progress => $category) {
61 $category = $category['_content'];
62 $packagesinfo = $this->_rest->retrieveData($base .
63 'c/' . urlencode($category) . '/packagesinfo.xml', false, false, $channel);
65 if (PEAR::isError($packagesinfo)) {
69 if (!is_array($packagesinfo) || !isset($packagesinfo['pi'])) {
73 if (!is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) {
74 $packagesinfo['pi'] = array($packagesinfo['pi']);
77 foreach ($packagesinfo['pi'] as $packageinfo) {
78 if (empty($packageinfo)) {
82 $info = $packageinfo['p'];
83 $package = $info['n'];
84 $releases = isset($packageinfo['a']) ? $packageinfo['a'] : false;
91 if (!isset($releases['r'][0])) {
92 $releases['r'] = array($releases['r']);
95 foreach ($releases['r'] as $release) {
96 if (!isset($latest)) {
97 if ($dostable && $release['s'] == 'stable') {
98 $latest = $release['v'];
102 $latest = $release['v'];
103 $state = $release['s'];
107 if (!isset($stable) && $release['s'] == 'stable') {
108 $stable = $release['v'];
109 if (!isset($unstable)) {
114 if (!isset($unstable) && $release['s'] != 'stable') {
115 $unstable = $release['v'];
116 $state = $release['s'];
119 if (isset($latest) && !isset($state)) {
120 $state = $release['s'];
123 if (isset($latest) && isset($stable) && isset($unstable)) {
129 if ($basic) { // remote-list command
130 if (!isset($latest)) {
135 // $state is not set if there are no releases
136 if (isset($state) && $state == 'stable') {
137 $ret[$package] = array('stable' => $latest);
139 $ret[$package] = array('stable' => '-n/a-');
142 $ret[$package] = array('stable' => $latest);
149 if (!isset($unstable)) {
152 if (isset($stable)) {
153 $latest = $unstable = $stable;
159 if (!isset($latest)) {
164 if ($latest && isset($packageinfo['deps'])) {
165 if (!is_array($packageinfo['deps']) ||
166 !isset($packageinfo['deps'][0])
168 $packageinfo['deps'] = array($packageinfo['deps']);
172 foreach ($packageinfo['deps'] as $dep) {
173 if ($dep['v'] == $latest) {
174 $d = unserialize($dep['d']);
179 if (isset($d['required'])) {
180 if (!class_exists('PEAR_PackageFile_v2')) {
181 require_once 'PEAR/PackageFile/v2.php';
185 $pf = new PEAR_PackageFile_v2;
189 $tdeps = $pf->getDeps();
194 foreach ($tdeps as $dep) {
195 if ($dep['type'] !== 'pkg') {
206 'summary' => $info['s'],
207 'description' => $info['d'],
209 'category' => $info['ca']['_content'],
210 'unstable' => $unstable,
213 $ret[$package] = $info;
217 PEAR::popErrorHandling();
222 * List all categories of a REST server
224 * @param string $base base URL of the server
225 * @return array of categorynames
227 function listCategories($base, $channel = false)
229 $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
230 if (PEAR::isError($categorylist)) {
231 return $categorylist;
234 if (!is_array($categorylist) || !isset($categorylist['c'])) {
238 if (isset($categorylist['c']['_content'])) {
240 $categorylist['c'] = array($categorylist['c']);
243 return $categorylist['c'];
247 * List packages in a category of a REST server
249 * @param string $base base URL of the server
250 * @param string $category name of the category
251 * @param boolean $info also download full package info
252 * @return array of packagenames
254 function listCategory($base, $category, $info = false, $channel = false)
256 if ($info == false) {
257 $url = '%s'.'c/%s/packages.xml';
259 $url = '%s'.'c/%s/packagesinfo.xml';
263 urlencode($category));
265 // gives '404 Not Found' error when category doesn't exist
266 $packagelist = $this->_rest->retrieveData($url, false, false, $channel);
267 if (PEAR::isError($packagelist)) {
270 if (!is_array($packagelist)) {
274 if ($info == false) {
275 if (!isset($packagelist['p'])) {
278 if (!is_array($packagelist['p']) ||
279 !isset($packagelist['p'][0])) { // only 1 pkg
280 $packagelist = array($packagelist['p']);
282 $packagelist = $packagelist['p'];
288 if (!isset($packagelist['pi'])) {
292 if (!is_array($packagelist['pi']) ||
293 !isset($packagelist['pi'][0])) { // only 1 pkg
294 $packagelist_pre = array($packagelist['pi']);
296 $packagelist_pre = $packagelist['pi'];
299 $packagelist = array();
300 foreach ($packagelist_pre as $i => $item) {
301 // compatibility with r/<latest.txt>.xml
302 if (isset($item['a']['r'][0])) {
304 $item['p']['v'] = $item['a']['r'][0]['v'];
305 $item['p']['st'] = $item['a']['r'][0]['s'];
306 } elseif (isset($item['a'])) {
307 // first and only release
308 $item['p']['v'] = $item['a']['r']['v'];
309 $item['p']['st'] = $item['a']['r']['s'];
312 $packagelist[$i] = array('attribs' => $item['p']['r'],
313 '_content' => $item['p']['n'],
314 'info' => $item['p']);
321 * Return an array containing all of the states that are more stable than
322 * or equal to the passed in state
324 * @param string Release state
325 * @param boolean Determines whether to include $state in the list
326 * @return false|array False if $state is not a valid release state
328 function betterStates($state, $include = false)
330 static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
331 $i = array_search($state, $states);
338 return array_slice($states, $i + 1);