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 * @link http://pear.php.net/package/PEAR
13 * @since File available since Release 1.4.3
17 * For downloading REST xml/txt files
19 require_once 'PEAR/REST.php';
26 * @author Greg Beaver <cellog@php.net>
27 * @copyright 1997-2009 The Authors
28 * @license http://opensource.org/licenses/bsd-license.php New BSD License
29 * @version Release: 1.10.1
30 * @link http://pear.php.net/package/PEAR
31 * @since Class available since Release 1.4.3
40 function __construct($config, $options = array())
42 $this->_rest = new PEAR_REST($config, $options);
45 function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false)
47 $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
48 if (PEAR::isError($categorylist)) {
53 if (!is_array($categorylist['c']) || !isset($categorylist['c'][0])) {
54 $categorylist['c'] = array($categorylist['c']);
57 PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
59 foreach ($categorylist['c'] as $progress => $category) {
60 $category = $category['_content'];
61 $packagesinfo = $this->_rest->retrieveData($base .
62 'c/' . urlencode($category) . '/packagesinfo.xml', false, false, $channel);
64 if (PEAR::isError($packagesinfo)) {
68 if (!is_array($packagesinfo) || !isset($packagesinfo['pi'])) {
72 if (!is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) {
73 $packagesinfo['pi'] = array($packagesinfo['pi']);
76 foreach ($packagesinfo['pi'] as $packageinfo) {
77 if (empty($packageinfo)) {
81 $info = $packageinfo['p'];
82 $package = $info['n'];
83 $releases = isset($packageinfo['a']) ? $packageinfo['a'] : false;
90 if (!isset($releases['r'][0])) {
91 $releases['r'] = array($releases['r']);
94 foreach ($releases['r'] as $release) {
95 if (!isset($latest)) {
96 if ($dostable && $release['s'] == 'stable') {
97 $latest = $release['v'];
101 $latest = $release['v'];
102 $state = $release['s'];
106 if (!isset($stable) && $release['s'] == 'stable') {
107 $stable = $release['v'];
108 if (!isset($unstable)) {
113 if (!isset($unstable) && $release['s'] != 'stable') {
114 $unstable = $release['v'];
115 $state = $release['s'];
118 if (isset($latest) && !isset($state)) {
119 $state = $release['s'];
122 if (isset($latest) && isset($stable) && isset($unstable)) {
128 if ($basic) { // remote-list command
129 if (!isset($latest)) {
134 // $state is not set if there are no releases
135 if (isset($state) && $state == 'stable') {
136 $ret[$package] = array('stable' => $latest);
138 $ret[$package] = array('stable' => '-n/a-');
141 $ret[$package] = array('stable' => $latest);
148 if (!isset($unstable)) {
151 if (isset($stable)) {
152 $latest = $unstable = $stable;
158 if (!isset($latest)) {
163 if ($latest && isset($packageinfo['deps'])) {
164 if (!is_array($packageinfo['deps']) ||
165 !isset($packageinfo['deps'][0])
167 $packageinfo['deps'] = array($packageinfo['deps']);
171 foreach ($packageinfo['deps'] as $dep) {
172 if ($dep['v'] == $latest) {
173 $d = unserialize($dep['d']);
178 if (isset($d['required'])) {
179 if (!class_exists('PEAR_PackageFile_v2')) {
180 require_once 'PEAR/PackageFile/v2.php';
184 $pf = new PEAR_PackageFile_v2;
188 $tdeps = $pf->getDeps();
193 foreach ($tdeps as $dep) {
194 if ($dep['type'] !== 'pkg') {
205 'summary' => $info['s'],
206 'description' => $info['d'],
208 'category' => $info['ca']['_content'],
209 'unstable' => $unstable,
212 $ret[$package] = $info;
216 PEAR::popErrorHandling();
221 * List all categories of a REST server
223 * @param string $base base URL of the server
224 * @return array of categorynames
226 function listCategories($base, $channel = false)
228 $categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);
229 if (PEAR::isError($categorylist)) {
230 return $categorylist;
233 if (!is_array($categorylist) || !isset($categorylist['c'])) {
237 if (isset($categorylist['c']['_content'])) {
239 $categorylist['c'] = array($categorylist['c']);
242 return $categorylist['c'];
246 * List packages in a category of a REST server
248 * @param string $base base URL of the server
249 * @param string $category name of the category
250 * @param boolean $info also download full package info
251 * @return array of packagenames
253 function listCategory($base, $category, $info = false, $channel = false)
255 if ($info == false) {
256 $url = '%s'.'c/%s/packages.xml';
258 $url = '%s'.'c/%s/packagesinfo.xml';
262 urlencode($category));
264 // gives '404 Not Found' error when category doesn't exist
265 $packagelist = $this->_rest->retrieveData($url, false, false, $channel);
266 if (PEAR::isError($packagelist)) {
269 if (!is_array($packagelist)) {
273 if ($info == false) {
274 if (!isset($packagelist['p'])) {
277 if (!is_array($packagelist['p']) ||
278 !isset($packagelist['p'][0])) { // only 1 pkg
279 $packagelist = array($packagelist['p']);
281 $packagelist = $packagelist['p'];
287 if (!isset($packagelist['pi'])) {
291 if (!is_array($packagelist['pi']) ||
292 !isset($packagelist['pi'][0])) { // only 1 pkg
293 $packagelist_pre = array($packagelist['pi']);
295 $packagelist_pre = $packagelist['pi'];
298 $packagelist = array();
299 foreach ($packagelist_pre as $i => $item) {
300 // compatibility with r/<latest.txt>.xml
301 if (isset($item['a']['r'][0])) {
303 $item['p']['v'] = $item['a']['r'][0]['v'];
304 $item['p']['st'] = $item['a']['r'][0]['s'];
305 } elseif (isset($item['a'])) {
306 // first and only release
307 $item['p']['v'] = $item['a']['r']['v'];
308 $item['p']['st'] = $item['a']['r']['s'];
311 $packagelist[$i] = array('attribs' => $item['p']['r'],
312 '_content' => $item['p']['n'],
313 'info' => $item['p']);
320 * Return an array containing all of the states that are more stable than
321 * or equal to the passed in state
323 * @param string Release state
324 * @param boolean Determines whether to include $state in the list
325 * @return false|array False if $state is not a valid release state
327 function betterStates($state, $include = false)
329 static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');
330 $i = array_search($state, $states);
337 return array_slice($states, $i + 1);