| Viewing file:  11.php (10.98 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
<?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.16
 * @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 command
 if (!isset($latest)) {
 $latest = false;
 }
 
 if ($dostable) {
 // $state is not set if there are no releases
 if (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 command
 if (!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 == true
 if (!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>.xml
 if (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);
 }
 }
 ?>
 
 |