Source for file 10.php
Documentation is available at 10.php
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: 10.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a12
* For downloading REST xml/txt files
require_once 'PEAR/REST.php';
* @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.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a12
$this->_rest = &new PEAR_REST($config, $options);
* Retrieve information about a remote package to be downloaded from a REST server
* @param string $base The uri to prepend to all REST calls
* @param array $packageinfo an array of format:
* 'package' => 'packagename',
* 'channel' => 'channelname',
* ['state' => 'alpha' (or valid state),]
* ['version' => '1.whatever']
* @param string $prefstate Current preferred_state config variable value
* @param bool $installed the installed version of this package to compare against
* @return array|false|PEAR_Errorsee {@link _returnDownloadURL()}
function getDownloadURL($base, $packageinfo, $prefstate, $installed, $channel = false )
$channel = $packageinfo['channel'];
$package = $packageinfo['package'];
$state = isset ($packageinfo['state']) ? $packageinfo['state'] : null;
$version = isset ($packageinfo['version']) ? $packageinfo['version'] : null;
$restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml';
$info = $this->_rest->retrieveData($restFile, false , false , $channel);
$channel . '/' . $package . '"');
if (!isset ($info['r'])) {
$release = $found = false;
if (!is_array($info['r']) || !isset ($info['r'][0 ])) {
$info['r'] = array ($info['r']);
foreach ($info['r'] as $release) {
if (!isset ($this->_rest->_options['force']) && ($installed &&
// try our preferred state first
if ($release['s'] == $state) {
// see if there is something newer and more stable
} elseif (isset ($version)) {
if ($release['v'] == $version) {
return $this->_returnDownloadURL ($base, $package, $release, $info, $found, false , $channel);
$prefstate = 'stable', $installed = false , $channel = false )
$channel = $dependency['channel'];
$package = $dependency['name'];
$state = isset ($dependency['state']) ? $dependency['state'] : null;
$version = isset ($dependency['version']) ? $dependency['version'] : null;
$restFile = $base . 'r/' . strtolower($package) . '/allreleases.xml';
$info = $this->_rest->retrieveData($restFile, false , false , $channel);
return PEAR::raiseError('Package "' . $deppackage['channel'] . '/' . $deppackage['package']
. '" dependency "' . $channel . '/' . $package . '" has no releases');
if (!is_array($info) || !isset ($info['r'])) {
$min = $max = $recommended = false;
if ($xsdversion == '1.0') {
switch ($dependency['rel']) {
$min = $dependency['version'];
$min = $dependency['version'];
$exclude = array ($dependency['version']);
$recommended = $dependency['version'];
$max = $dependency['version'];
$exclude = array ($dependency['version']);
$max = $dependency['version'];
$exclude = array ($dependency['version']);
$min = isset ($dependency['min']) ? $dependency['min'] : false;
$max = isset ($dependency['max']) ? $dependency['max'] : false;
$recommended = isset ($dependency['recommended']) ?
$dependency['recommended'] : false;
if (isset ($dependency['exclude'])) {
if (!isset ($dependency['exclude'][0 ])) {
$exclude = array ($dependency['exclude']);
$release = $found = false;
if (!is_array($info['r']) || !isset ($info['r'][0 ])) {
$info['r'] = array ($info['r']);
foreach ($info['r'] as $release) {
if (!isset ($this->_rest->_options['force']) && ($installed &&
if (in_array($release['v'], $exclude)) { // skip excluded versions
// allow newer releases to say "I'm OK with the dependent package"
if ($xsdversion == '2.0' && isset ($release['co'])) {
if (!is_array($release['co']) || !isset ($release['co'][0 ])) {
$release['co'] = array ($release['co']);
foreach ($release['co'] as $entry) {
if (isset ($entry['x']) && !is_array($entry['x'])) {
$entry['x'] = array ($entry['x']);
} elseif (!isset ($entry['x'])) {
if ($entry['c'] == $deppackage['channel'] &&
!in_array($release['v'], $entry['x'])) {
$recommended = $release['v'];
if ($release['v'] != $recommended) { // if we want a specific
// version, then skip all others
if (!in_array($release['s'], $states)) {
// the stability is too low, but we must return the
// recommended version if possible
return $this->_returnDownloadURL ($base, $package, $release, $info, true , false , $channel);
if ($min && version_compare($release['v'], $min, 'lt')) { // skip too old versions
if ($max && version_compare($release['v'], $max, 'gt')) { // skip too new versions
if (in_array($release['s'], $states)) { // if in the preferred state...
$found = true; // ... then use it
return $this->_returnDownloadURL ($base, $package, $release, $info, $found, false , $channel);
* Take raw data and return the array needed for processing a download URL
* @param string $base REST base uri
* @param string $package Package name
* @param array $release an array of format array('v' => version, 's' => state)
* describing the release to download
* @param array $info list of all releases as defined by allreleases.xml
* @param bool|null$found determines whether the release was found or this is the next
* best alternative. If null, then versions were skipped because
* @return array|PEAR_Error
function _returnDownloadURL ($base, $package, $release, $info, $found, $phpversion = false , $channel = false )
$release = $info['r'][0 ];
'info.xml', false , false , $channel);
'" does not have REST info xml available');
$release['v'] . '.xml', false , false , $channel);
return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] .
'" does not have REST xml available');
'deps.' . $release['v'] . '.txt', false , true , $channel);
return PEAR::raiseError('Package "' . $package . '" Version "' . $release['v'] .
'" does not have REST dependency information available');
$allinfo = $this->_rest->retrieveData($base . 'r/' . $packageLower .
'/allreleases.xml', false , false , $channel);
if (!is_array($allinfo['r']) || !isset ($allinfo['r'][0 ])) {
$allinfo['r'] = array ($allinfo['r']);
foreach ($allinfo['r'] as $release) {
if ($release['v'] != $releaseinfo['v']) {
if (!isset ($release['co'])) {
if (!is_array($release['co']) || !isset ($release['co'][0 ])) {
$release['co'] = array ($release['co']);
foreach ($release['co'] as $entry) {
$comp['name'] = $entry['p'];
$comp['channel'] = $entry['c'];
$comp['min'] = $entry['min'];
$comp['max'] = $entry['max'];
if (isset ($entry['x']) && !is_array($entry['x'])) {
$comp['exclude'] = $entry['x'];
if (count($compatible) == 1 ) {
$compatible = $compatible[0 ];
if (isset ($pinfo['dc']) && isset ($pinfo['dp'])) {
$deprecated = array ('channel' => (string) $pinfo['dc'],
'package' => trim($pinfo['dp']['_content']));
$deprecated = array ('channel' => (string) $pinfo['dc'],
'package' => trim($pinfo['dp']));
'version' => $releaseinfo['v'],
'package' => $releaseinfo['p']['_content'],
'stability' => $releaseinfo['st'],
'compatible' => $compatible,
'deprecated' => $deprecated,
$return['url'] = $releaseinfo['g'];
$return['php'] = $phpversion;
$packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false , false , $channel);
if (!is_array($packagelist) || !isset ($packagelist['p'])) {
$packagelist['p'] = array ($packagelist['p']);
return $packagelist['p'];
* List all categories of a REST server
* @param string $base base URL of the server
* @return array of categorynames
// c/categories.xml does not exist;
// check for every package its category manually
// This is SLOOOWWWW : ///
$packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false , false , $channel);
if (!is_array($packagelist) || !isset ($packagelist['p'])) {
$packagelist['p'] = array ($packagelist['p']);
foreach ($packagelist['p'] as $package) {
$cat = $inf['ca']['_content'];
if (!isset ($categories[$cat])) {
$categories[$cat] = $inf['ca'];
* List 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 )
// gives '404 Not Found' error when category doesn't exist
$packagelist = $this->_rest->retrieveData($base. 'c/'. urlencode($category). '/packages.xml', false , false , $channel);
if (!is_array($packagelist) || !isset ($packagelist['p'])) {
!isset ($packagelist['p'][0 ])) { // only 1 pkg
$packagelist = array ($packagelist['p']);
$packagelist = $packagelist['p'];
// get individual package info
foreach ($packagelist as $i => $packageitem) {
$url = sprintf('%s'. 'r/%s/latest.txt',
$version = $this->_rest->retrieveData($url, false , false , $channel);
$info = $this->_rest->retrieveData($url, false , false , $channel);
$packagelist[$i]['info'] = $info;
function listAll($base, $dostable, $basic = true , $searchpackage = false , $searchsummary = false , $channel = false )
$packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false , false , $channel);
if ($this->_rest->config->get ('verbose') > 0 ) {
$ui->log ('Retrieving data...0%', true );
if (!is_array($packagelist) || !isset ($packagelist['p'])) {
$packagelist['p'] = array ($packagelist['p']);
// only search-packagename = quicksearch !
if ($searchpackage && (!$searchsummary || empty ($searchpackage))) {
$newpackagelist = array ();
foreach ($packagelist['p'] as $package) {
if (!empty ($searchpackage) && stristr($package, $searchpackage) !== false ) {
$newpackagelist[] = $package;
$packagelist['p'] = $newpackagelist;
foreach ($packagelist['p'] as $progress => $package) {
if ($this->_rest->config->get ('verbose') > 0 ) {
if ($progress / count($packagelist['p']) >= $next) {
if ($basic) { // remote-list command
'/stable.txt', false , false , $channel);
'/latest.txt', false , false , $channel);
$info = array ('stable' => $latest);
} else { // list-all command
$found = (!empty ($searchpackage) && stristr($package, $searchpackage) !== false );
if (!$found && !(isset ($searchsummary) && !empty ($searchsummary)
&& (stristr($inf['s'], $searchsummary) !== false
|| stristr($inf['d'], $searchsummary) !== false )))
'/allreleases.xml', false , false , $channel);
if (!isset ($releases['r'][0 ])) {
$releases['r'] = array ($releases['r']);
foreach ($releases['r'] as $release) {
if ($dostable && $release['s'] == 'stable') {
if (!isset ($stable) && $release['s'] == 'stable') {
if (!isset ($unstable) && $release['s'] != 'stable') {
$latest = $unstable = $release['v'];
if (isset ($latest) && !isset ($state)) {
if (isset ($latest) && isset ($stable) && isset ($unstable)) {
$latest = $unstable = $stable;
$latest . '.txt', false , false , $channel);
if (isset ($d['required'])) {
require_once 'PEAR/PackageFile/v2.php';
foreach ($tdeps as $dep) {
if ($dep['type'] !== 'pkg') {
$info = array ('stable' => $latest, 'summary' => $inf['s'], 'description' =>
$inf['d'], 'deps' => $deps, 'category' => $inf['ca']['_content'],
'unstable' => $unstable, 'state' => $state);
$info = array ('stable' => $stable, 'summary' => $inf['s'], 'description' =>
$inf['d'], 'deps' => $deps, 'category' => $inf['ca']['_content'],
'unstable' => $unstable, 'state' => $state);
$packagelist = $this->_rest->retrieveData($base . 'p/packages.xml', false , false , $channel);
if (!is_array($packagelist) || !isset ($packagelist['p'])) {
$packagelist['p'] = array ($packagelist['p']);
foreach ($packagelist['p'] as $package) {
$inst_version = $reg->packageInfo ($package, 'version', $channel);
$inst_state = $reg->packageInfo ($package, 'release_state', $channel);
'/allreleases.xml', false , false , $channel);
continue; // no remote releases
if (!isset ($info['r'])) {
$release = $found = false;
if (!is_array($info['r']) || !isset ($info['r'][0 ])) {
$info['r'] = array ($info['r']);
// $info['r'] is sorted by version number
usort($info['r'], array ($this, '_sortReleasesByVersionNumber'));
foreach ($info['r'] as $release) {
if ($inst_version && version_compare($release['v'], $inst_version, '<=')) {
// not newer than the one installed
// new version > installed version
// every state is a good state
$new_state = $release['s'];
// if new state >= installed state: go
// only allow to lower the state of package,
// if new state >= preferred state: go
$release['v'] . '.xml', false , false , $channel);
'version' => $release['v'],
'state' => $release['s'],
'filesize' => $relinfo['f'],
function packageInfo($base, $package, $channel = false )
$pinfo = $this->_rest->retrieveData($base . 'p/' . strtolower($package) . '/info.xml', false , false , $channel);
return PEAR::raiseError('Unknown package: "' . $package . '" in channel "' . $channel . '"' . "\n". 'Debug: ' .
'/allreleases.xml', false , false , $channel);
require_once 'PEAR/PackageFile/v2.php';
if (!is_array($allreleases['r']) || !isset ($allreleases['r'][0 ])) {
$allreleases['r'] = array ($allreleases['r']);
foreach ($allreleases['r'] as $release) {
$release['v'] . '.txt', false , false , $channel);
. '/' . $release['v'] . '.xml', false , false , $channel);
$releases[$release['v']] = array (
'description' => $info['d'],
'releasedate' => $info['da'],
'releasenotes' => $info['n'],
'state' => $release['s'],
'deps' => $ds ? $ds : array (),
if (isset ($pinfo['dc']) && isset ($pinfo['dp'])) {
$deprecated = array ('channel' => (string) $pinfo['dc'],
'package' => trim($pinfo['dp']['_content']));
$deprecated = array ('channel' => (string) $pinfo['dc'],
'package' => trim($pinfo['dp']));
'channel' => $pinfo['c'],
'category' => $pinfo['ca']['_content'],
'license' => $pinfo['l'],
'summary' => $pinfo['s'],
'description' => $pinfo['d'],
'deprecated' => $deprecated,
* 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|arrayFalse if $state is not a valid release state
static $states = array ('snapshot', 'devel', 'alpha', 'beta', 'stable');
$i = array_search ($state, $states);
* Sort releases by version number
function _sortReleasesByVersionNumber ($a, $b)
Documentation generated on Wed, 06 Jul 2011 23:30:23 +0000 by phpDocumentor 1.4.3. PEAR Logo Copyright © PHP Group 2004.
|