Rev 187 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** PEAR_REST_11 - implement faster list-all/remote-list command** PHP versions 4 and 5** @category pear* @package PEAR* @author Greg Beaver <cellog@php.net>* @copyright 1997-2009 The Authors* @license http://opensource.org/licenses/bsd-license.php New BSD License* @link http://pear.php.net/package/PEAR* @since File available since Release 1.4.3*//*** For downloading REST xml/txt files*/require_once 'PEAR/REST.php';/*** Implement REST 1.1** @category pear* @package PEAR* @author Greg Beaver <cellog@php.net>* @copyright 1997-2009 The Authors* @license http://opensource.org/licenses/bsd-license.php New BSD License* @version Release: 1.10.1* @link http://pear.php.net/package/PEAR* @since Class available since Release 1.4.3*/class PEAR_REST_11{/*** @var PEAR_REST*/var $_rest;function __construct($config, $options = array()){$this->_rest = new PEAR_REST($config, $options);}function listAll($base, $dostable, $basic = true, $searchpackage = false, $searchsummary = false, $channel = false){$categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);if (PEAR::isError($categorylist)) {return $categorylist;}$ret = array();if (!is_array($categorylist['c']) || !isset($categorylist['c'][0])) {$categorylist['c'] = array($categorylist['c']);}PEAR::pushErrorHandling(PEAR_ERROR_RETURN);foreach ($categorylist['c'] as $progress => $category) {$category = $category['_content'];$packagesinfo = $this->_rest->retrieveData($base .'c/' . urlencode($category) . '/packagesinfo.xml', false, false, $channel);if (PEAR::isError($packagesinfo)) {continue;}if (!is_array($packagesinfo) || !isset($packagesinfo['pi'])) {continue;}if (!is_array($packagesinfo['pi']) || !isset($packagesinfo['pi'][0])) {$packagesinfo['pi'] = array($packagesinfo['pi']);}foreach ($packagesinfo['pi'] as $packageinfo) {if (empty($packageinfo)) {continue;}$info = $packageinfo['p'];$package = $info['n'];$releases = isset($packageinfo['a']) ? $packageinfo['a'] : false;unset($latest);unset($unstable);unset($stable);unset($state);if ($releases) {if (!isset($releases['r'][0])) {$releases['r'] = array($releases['r']);}foreach ($releases['r'] as $release) {if (!isset($latest)) {if ($dostable && $release['s'] == 'stable') {$latest = $release['v'];$state = 'stable';}if (!$dostable) {$latest = $release['v'];$state = $release['s'];}}if (!isset($stable) && $release['s'] == 'stable') {$stable = $release['v'];if (!isset($unstable)) {$unstable = $stable;}}if (!isset($unstable) && $release['s'] != 'stable') {$unstable = $release['v'];$state = $release['s'];}if (isset($latest) && !isset($state)) {$state = $release['s'];}if (isset($latest) && isset($stable) && isset($unstable)) {break;}}}if ($basic) { // remote-list commandif (!isset($latest)) {$latest = false;}if ($dostable) {// $state is not set if there are no releasesif (isset($state) && $state == 'stable') {$ret[$package] = array('stable' => $latest);} else {$ret[$package] = array('stable' => '-n/a-');}} else {$ret[$package] = array('stable' => $latest);}continue;}// list-all commandif (!isset($unstable)) {$unstable = false;$state = 'stable';if (isset($stable)) {$latest = $unstable = $stable;}} else {$latest = $unstable;}if (!isset($latest)) {$latest = false;}$deps = array();if ($latest && isset($packageinfo['deps'])) {if (!is_array($packageinfo['deps']) ||!isset($packageinfo['deps'][0])) {$packageinfo['deps'] = array($packageinfo['deps']);}$d = false;foreach ($packageinfo['deps'] as $dep) {if ($dep['v'] == $latest) {$d = unserialize($dep['d']);}}if ($d) {if (isset($d['required'])) {if (!class_exists('PEAR_PackageFile_v2')) {require_once 'PEAR/PackageFile/v2.php';}if (!isset($pf)) {$pf = new PEAR_PackageFile_v2;}$pf->setDeps($d);$tdeps = $pf->getDeps();} else {$tdeps = $d;}foreach ($tdeps as $dep) {if ($dep['type'] !== 'pkg') {continue;}$deps[] = $dep;}}}$info = array('stable' => $latest,'summary' => $info['s'],'description' => $info['d'],'deps' => $deps,'category' => $info['ca']['_content'],'unstable' => $unstable,'state' => $state);$ret[$package] = $info;}}PEAR::popErrorHandling();return $ret;}/*** List all categories of a REST server** @param string $base base URL of the server* @return array of categorynames*/function listCategories($base, $channel = false){$categorylist = $this->_rest->retrieveData($base . 'c/categories.xml', false, false, $channel);if (PEAR::isError($categorylist)) {return $categorylist;}if (!is_array($categorylist) || !isset($categorylist['c'])) {return array();}if (isset($categorylist['c']['_content'])) {// only 1 category$categorylist['c'] = array($categorylist['c']);}return $categorylist['c'];}/*** List packages in a category of a REST server** @param string $base base URL of the server* @param string $category name of the category* @param boolean $info also download full package info* @return array of packagenames*/function listCategory($base, $category, $info = false, $channel = false){if ($info == false) {$url = '%s'.'c/%s/packages.xml';} else {$url = '%s'.'c/%s/packagesinfo.xml';}$url = sprintf($url,$base,urlencode($category));// gives '404 Not Found' error when category doesn't exist$packagelist = $this->_rest->retrieveData($url, false, false, $channel);if (PEAR::isError($packagelist)) {return $packagelist;}if (!is_array($packagelist)) {return array();}if ($info == false) {if (!isset($packagelist['p'])) {return array();}if (!is_array($packagelist['p']) ||!isset($packagelist['p'][0])) { // only 1 pkg$packagelist = array($packagelist['p']);} else {$packagelist = $packagelist['p'];}return $packagelist;}// info == trueif (!isset($packagelist['pi'])) {return array();}if (!is_array($packagelist['pi']) ||!isset($packagelist['pi'][0])) { // only 1 pkg$packagelist_pre = array($packagelist['pi']);} else {$packagelist_pre = $packagelist['pi'];}$packagelist = array();foreach ($packagelist_pre as $i => $item) {// compatibility with r/<latest.txt>.xmlif (isset($item['a']['r'][0])) {// multiple releases$item['p']['v'] = $item['a']['r'][0]['v'];$item['p']['st'] = $item['a']['r'][0]['s'];} elseif (isset($item['a'])) {// first and only release$item['p']['v'] = $item['a']['r']['v'];$item['p']['st'] = $item['a']['r']['s'];}$packagelist[$i] = array('attribs' => $item['p']['r'],'_content' => $item['p']['n'],'info' => $item['p']);}return $packagelist;}/*** Return an array containing all of the states that are more stable than* or equal to the passed in state** @param string Release state* @param boolean Determines whether to include $state in the list* @return false|array False if $state is not a valid release state*/function betterStates($state, $include = false){static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable');$i = array_search($state, $states);if ($i === false) {return false;}if ($include) {$i--;}return array_slice($states, $i + 1);}}?>