4,18 → 4,11 |
* |
* PHP versions 4 and 5 |
* |
* LICENSE: This source file is subject to version 3.0 of the PHP license |
* that is available through the world-wide-web at the following URI: |
* http://www.php.net/license/3_0.txt. If you did not receive a copy of |
* the PHP License and are unable to obtain it through the web, please |
* send a note to license@php.net so we can mail you a copy immediately. |
* |
* @category pear |
* @package PEAR |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2006 The PHP Group |
* @license http://www.php.net/license/3_0.txt PHP License 3.0 |
* @version CVS: $Id: Dependency2.php,v 1.54 2007/02/13 04:16:25 cellog Exp $ |
* @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.0a1 |
*/ |
35,9 → 28,9 |
* @category pear |
* @package PEAR |
* @author Greg Beaver <cellog@php.net> |
* @copyright 1997-2006 The PHP Group |
* @license http://www.php.net/license/3_0.txt PHP License 3.0 |
* @version Release: 1.5.1 |
* @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.0a1 |
*/ |
49,32 → 42,39 |
* @var integer |
*/ |
var $_state; |
|
/** |
* Command-line options to install/upgrade/uninstall commands |
* @param array |
*/ |
var $_options; |
|
/** |
* @var OS_Guess |
*/ |
var $_os; |
|
/** |
* @var PEAR_Registry |
*/ |
var $_registry; |
|
/** |
* @var PEAR_Config |
*/ |
var $_config; |
|
/** |
* @var PEAR_DependencyDB |
*/ |
var $_dependencydb; |
|
/** |
* Output of PEAR_Registry::parsedPackageName() |
* @var array |
*/ |
var $_currentPackage; |
|
/** |
* @param PEAR_Config |
* @param array installation options |
81,7 → 81,7 |
* @param array format of PEAR_Registry::parsedPackageName() |
* @param int installation state (one of PEAR_VALIDATE_*) |
*/ |
function PEAR_Dependency2(&$config, $installoptions, $package, |
function __construct(&$config, $installoptions, $package, |
$state = PEAR_VALIDATE_INSTALLING) |
{ |
$this->_config = &$config; |
88,20 → 88,24 |
if (!class_exists('PEAR_DependencyDB')) { |
require_once 'PEAR/DependencyDB.php'; |
} |
|
if (isset($installoptions['packagingroot'])) { |
// make sure depdb is in the right location |
$config->setInstallRoot($installoptions['packagingroot']); |
} |
|
$this->_registry = &$config->getRegistry(); |
$this->_dependencydb = &PEAR_DependencyDB::singleton($config); |
if (isset($installoptions['packagingroot'])) { |
$config->setInstallRoot(false); |
} |
|
$this->_options = $installoptions; |
$this->_state = $state; |
if (!class_exists('OS_Guess')) { |
require_once 'OS/Guess.php'; |
} |
|
$this->_os = new OS_Guess; |
$this->_currentPackage = $package; |
} |
112,6 → 116,7 |
if (isset($dep['uri'])) { |
return ''; |
} |
|
if (isset($dep['recommended'])) { |
$extra .= 'recommended version ' . $dep['recommended']; |
} else { |
118,6 → 123,7 |
if (isset($dep['min'])) { |
$extra .= 'version >= ' . $dep['min']; |
} |
|
if (isset($dep['max'])) { |
if ($extra != ' (') { |
$extra .= ', '; |
124,13 → 130,16 |
} |
$extra .= 'version <= ' . $dep['max']; |
} |
|
if (isset($dep['exclude'])) { |
if (!is_array($dep['exclude'])) { |
$dep['exclude'] = array($dep['exclude']); |
} |
|
if ($extra != ' (') { |
$extra .= ', '; |
} |
|
$extra .= 'excluded versions: '; |
foreach ($dep['exclude'] as $i => $exclude) { |
if ($i) { |
140,10 → 149,12 |
} |
} |
} |
|
$extra .= ')'; |
if ($extra == ' ()') { |
$extra = ''; |
} |
|
return $extra; |
} |
|
171,37 → 182,32 |
*/ |
function validateOsDependency($dep) |
{ |
if ($this->_state != PEAR_VALIDATE_INSTALLING && |
$this->_state != PEAR_VALIDATE_DOWNLOADING) { |
if ($this->_state != PEAR_VALIDATE_INSTALLING && $this->_state != PEAR_VALIDATE_DOWNLOADING) { |
return true; |
} |
if (isset($dep['conflicts'])) { |
$not = true; |
} else { |
$not = false; |
} |
|
if ($dep['name'] == '*') { |
return true; |
} |
|
$not = isset($dep['conflicts']) ? true : false; |
switch (strtolower($dep['name'])) { |
case 'windows' : |
if ($not) { |
if (strtolower(substr($this->getPHP_OS(), 0, 3)) == 'win') { |
if (!isset($this->_options['nodeps']) && |
!isset($this->_options['force'])) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError("Cannot install %s on Windows"); |
} else { |
return $this->warning("warning: Cannot install %s on Windows"); |
} |
|
return $this->warning("warning: Cannot install %s on Windows"); |
} |
} else { |
if (strtolower(substr($this->getPHP_OS(), 0, 3)) != 'win') { |
if (!isset($this->_options['nodeps']) && |
!isset($this->_options['force'])) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError("Can only install %s on Windows"); |
} else { |
return $this->warning("warning: Can only install %s on Windows"); |
} |
|
return $this->warning("warning: Can only install %s on Windows"); |
} |
} |
break; |
209,23 → 215,19 |
$unices = array('linux', 'freebsd', 'darwin', 'sunos', 'irix', 'hpux', 'aix'); |
if ($not) { |
if (in_array($this->getSysname(), $unices)) { |
if (!isset($this->_options['nodeps']) && |
!isset($this->_options['force'])) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError("Cannot install %s on any Unix system"); |
} else { |
return $this->warning( |
"warning: Cannot install %s on any Unix system"); |
} |
|
return $this->warning( "warning: Cannot install %s on any Unix system"); |
} |
} else { |
if (!in_array($this->getSysname(), $unices)) { |
if (!isset($this->_options['nodeps']) && |
!isset($this->_options['force'])) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError("Can only install %s on a Unix system"); |
} else { |
return $this->warning( |
"warning: Can only install %s on a Unix system"); |
} |
|
return $this->warning("warning: Can only install %s on a Unix system"); |
} |
} |
break; |
236,23 → 238,22 |
!isset($this->_options['force'])) { |
return $this->raiseError('Cannot install %s on ' . $dep['name'] . |
' operating system'); |
} else { |
return $this->warning('warning: Cannot install %s on ' . |
$dep['name'] . ' operating system'); |
} |
|
return $this->warning('warning: Cannot install %s on ' . |
$dep['name'] . ' operating system'); |
} |
} else { |
if (strtolower($dep['name']) != strtolower($this->getSysname())) { |
if (!isset($this->_options['nodeps']) && |
!isset($this->_options['force'])) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('Cannot install %s on ' . |
$this->getSysname() . |
' operating system, can only install on ' . $dep['name']); |
} else { |
return $this->warning('warning: Cannot install %s on ' . |
$this->getSysname() . |
' operating system, can only install on ' . $dep['name']); |
} |
|
return $this->warning('warning: Cannot install %s on ' . |
$this->getSysname() . |
' operating system, can only install on ' . $dep['name']); |
} |
} |
} |
279,34 → 280,33 |
if ($this->_state != PEAR_VALIDATE_INSTALLING) { |
return true; |
} |
if (isset($dep['conflicts'])) { |
$not = true; |
} else { |
$not = false; |
} |
|
$not = isset($dep['conflicts']) ? true : false; |
if (!$this->matchSignature($dep['pattern'])) { |
if (!$not) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s Architecture dependency failed, does not ' . |
'match "' . $dep['pattern'] . '"'); |
} else { |
return $this->warning('warning: %s Architecture dependency failed, does ' . |
'not match "' . $dep['pattern'] . '"'); |
} |
|
return $this->warning('warning: %s Architecture dependency failed, does ' . |
'not match "' . $dep['pattern'] . '"'); |
} |
|
return true; |
} else { |
if ($not) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s Architecture dependency failed, required "' . |
$dep['pattern'] . '"'); |
} else { |
return $this->warning('warning: %s Architecture dependency failed, ' . |
'required "' . $dep['pattern'] . '"'); |
} |
} |
|
if ($not) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s Architecture dependency failed, required "' . |
$dep['pattern'] . '"'); |
} |
return true; |
|
return $this->warning('warning: %s Architecture dependency failed, ' . |
'required "' . $dep['pattern'] . '"'); |
} |
|
return true; |
} |
|
/** |
324,9 → 324,9 |
{ |
if ($name !== null) { |
return phpversion($name); |
} else { |
return phpversion(); |
} |
|
return phpversion(); |
} |
|
function validateExtensionDependency($dep, $required = true) |
335,92 → 335,101 |
$this->_state != PEAR_VALIDATE_DOWNLOADING) { |
return true; |
} |
|
$loaded = $this->extension_loaded($dep['name']); |
$extra = $this->_getExtraString($dep); |
$extra = $this->_getExtraString($dep); |
if (isset($dep['exclude'])) { |
if (!is_array($dep['exclude'])) { |
$dep['exclude'] = array($dep['exclude']); |
} |
} |
|
if (!isset($dep['min']) && !isset($dep['max']) && |
!isset($dep['recommended']) && !isset($dep['exclude'])) { |
!isset($dep['recommended']) && !isset($dep['exclude']) |
) { |
if ($loaded) { |
if (isset($dep['conflicts'])) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s conflicts with PHP extension "' . |
$dep['name'] . '"' . $extra); |
} else { |
return $this->warning('warning: %s conflicts with PHP extension "' . |
$dep['name'] . '"' . $extra); |
} |
|
return $this->warning('warning: %s conflicts with PHP extension "' . |
$dep['name'] . '"' . $extra); |
} |
|
return true; |
} else { |
if (isset($dep['conflicts'])) { |
return true; |
} |
if ($required) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires PHP extension "' . |
$dep['name'] . '"' . $extra); |
} else { |
return $this->warning('warning: %s requires PHP extension "' . |
$dep['name'] . '"' . $extra); |
} |
} else { |
return $this->warning('%s can optionally use PHP extension "' . |
} |
|
if (isset($dep['conflicts'])) { |
return true; |
} |
|
if ($required) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires PHP extension "' . |
$dep['name'] . '"' . $extra); |
} |
|
return $this->warning('warning: %s requires PHP extension "' . |
$dep['name'] . '"' . $extra); |
} |
|
return $this->warning('%s can optionally use PHP extension "' . |
$dep['name'] . '"' . $extra); |
} |
|
if (!$loaded) { |
if (isset($dep['conflicts'])) { |
return true; |
} |
|
if (!$required) { |
return $this->warning('%s can optionally use PHP extension "' . |
$dep['name'] . '"' . $extra); |
} else { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires PHP extension "' . $dep['name'] . |
'"' . $extra); |
} |
return $this->warning('warning: %s requires PHP extension "' . $dep['name'] . |
'"' . $extra); |
} |
|
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires PHP extension "' . $dep['name'] . |
'"' . $extra); |
} |
|
return $this->warning('warning: %s requires PHP extension "' . $dep['name'] . |
'"' . $extra); |
} |
|
$version = (string) $this->phpversion($dep['name']); |
if (empty($version)) { |
$version = '0'; |
} |
|
$fail = false; |
if (isset($dep['min'])) { |
if (!version_compare($version, $dep['min'], '>=')) { |
$fail = true; |
} |
if (isset($dep['min']) && !version_compare($version, $dep['min'], '>=')) { |
$fail = true; |
} |
if (isset($dep['max'])) { |
if (!version_compare($version, $dep['max'], '<=')) { |
$fail = true; |
} |
|
if (isset($dep['max']) && !version_compare($version, $dep['max'], '<=')) { |
$fail = true; |
} |
|
if ($fail && !isset($dep['conflicts'])) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires PHP extension "' . $dep['name'] . |
'"' . $extra . ', installed version is ' . $version); |
} else { |
return $this->warning('warning: %s requires PHP extension "' . $dep['name'] . |
'"' . $extra . ', installed version is ' . $version); |
} |
|
return $this->warning('warning: %s requires PHP extension "' . $dep['name'] . |
'"' . $extra . ', installed version is ' . $version); |
} elseif ((isset($dep['min']) || isset($dep['max'])) && !$fail && isset($dep['conflicts'])) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s conflicts with PHP extension "' . |
$dep['name'] . '"' . $extra . ', installed version is ' . $version); |
} else { |
return $this->warning('warning: %s conflicts with PHP extension "' . |
$dep['name'] . '"' . $extra . ', installed version is ' . $version); |
} |
|
return $this->warning('warning: %s conflicts with PHP extension "' . |
$dep['name'] . '"' . $extra . ', installed version is ' . $version); |
} |
|
if (isset($dep['exclude'])) { |
foreach ($dep['exclude'] as $exclude) { |
if (version_compare($version, $exclude, '==')) { |
427,43 → 436,45 |
if (isset($dep['conflicts'])) { |
continue; |
} |
if (!isset($this->_options['nodeps']) && |
!isset($this->_options['force'])) { |
|
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s is not compatible with PHP extension "' . |
$dep['name'] . '" version ' . |
$exclude); |
} else { |
return $this->warning('warning: %s is not compatible with PHP extension "' . |
$dep['name'] . '" version ' . |
$exclude); |
} |
|
return $this->warning('warning: %s is not compatible with PHP extension "' . |
$dep['name'] . '" version ' . |
$exclude); |
} elseif (version_compare($version, $exclude, '!=') && isset($dep['conflicts'])) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s conflicts with PHP extension "' . |
$dep['name'] . '"' . $extra . ', installed version is ' . $version); |
} else { |
return $this->warning('warning: %s conflicts with PHP extension "' . |
$dep['name'] . '"' . $extra . ', installed version is ' . $version); |
} |
|
return $this->warning('warning: %s conflicts with PHP extension "' . |
$dep['name'] . '"' . $extra . ', installed version is ' . $version); |
} |
} |
} |
|
if (isset($dep['recommended'])) { |
if (version_compare($version, $dep['recommended'], '==')) { |
return true; |
} else { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s dependency: PHP extension ' . $dep['name'] . |
' version "' . $version . '"' . |
' is not the recommended version "' . $dep['recommended'] . |
'", but may be compatible, use --force to install'); |
} else { |
return $this->warning('warning: %s dependency: PHP extension ' . |
$dep['name'] . ' version "' . $version . '"' . |
' is not the recommended version "' . $dep['recommended'].'"'); |
} |
} |
|
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s dependency: PHP extension ' . $dep['name'] . |
' version "' . $version . '"' . |
' is not the recommended version "' . $dep['recommended'] . |
'", but may be compatible, use --force to install'); |
} |
|
return $this->warning('warning: %s dependency: PHP extension ' . |
$dep['name'] . ' version "' . $version . '"' . |
' is not the recommended version "' . $dep['recommended'].'"'); |
} |
|
return true; |
} |
|
473,50 → 484,54 |
$this->_state != PEAR_VALIDATE_DOWNLOADING) { |
return true; |
} |
|
$version = $this->phpversion(); |
$extra = $this->_getExtraString($dep); |
$extra = $this->_getExtraString($dep); |
if (isset($dep['exclude'])) { |
if (!is_array($dep['exclude'])) { |
$dep['exclude'] = array($dep['exclude']); |
} |
} |
|
if (isset($dep['min'])) { |
if (!version_compare($version, $dep['min'], '>=')) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires PHP' . |
$extra . ', installed version is ' . $version); |
} else { |
return $this->warning('warning: %s requires PHP' . |
$extra . ', installed version is ' . $version); |
} |
|
return $this->warning('warning: %s requires PHP' . |
$extra . ', installed version is ' . $version); |
} |
} |
|
if (isset($dep['max'])) { |
if (!version_compare($version, $dep['max'], '<=')) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires PHP' . |
$extra . ', installed version is ' . $version); |
} else { |
return $this->warning('warning: %s requires PHP' . |
$extra . ', installed version is ' . $version); |
} |
|
return $this->warning('warning: %s requires PHP' . |
$extra . ', installed version is ' . $version); |
} |
} |
|
if (isset($dep['exclude'])) { |
foreach ($dep['exclude'] as $exclude) { |
if (version_compare($version, $exclude, '==')) { |
if (!isset($this->_options['nodeps']) && |
!isset($this->_options['force'])) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s is not compatible with PHP version ' . |
$exclude); |
} else { |
return $this->warning( |
'warning: %s is not compatible with PHP version ' . |
$exclude); |
} |
|
return $this->warning( |
'warning: %s is not compatible with PHP version ' . |
$exclude); |
} |
} |
} |
|
return true; |
} |
|
525,7 → 540,7 |
*/ |
function getPEARVersion() |
{ |
return '1.5.1'; |
return '1.10.1'; |
} |
|
function validatePearinstallerDependency($dep) |
537,42 → 552,47 |
$dep['exclude'] = array($dep['exclude']); |
} |
} |
|
if (version_compare($pearversion, $dep['min'], '<')) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires PEAR Installer' . $extra . |
', installed version is ' . $pearversion); |
} else { |
return $this->warning('warning: %s requires PEAR Installer' . $extra . |
', installed version is ' . $pearversion); |
} |
|
return $this->warning('warning: %s requires PEAR Installer' . $extra . |
', installed version is ' . $pearversion); |
} |
|
if (isset($dep['max'])) { |
if (version_compare($pearversion, $dep['max'], '>')) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires PEAR Installer' . $extra . |
', installed version is ' . $pearversion); |
} else { |
return $this->warning('warning: %s requires PEAR Installer' . $extra . |
', installed version is ' . $pearversion); |
} |
|
return $this->warning('warning: %s requires PEAR Installer' . $extra . |
', installed version is ' . $pearversion); |
} |
} |
|
if (isset($dep['exclude'])) { |
if (!isset($dep['exclude'][0])) { |
$dep['exclude'] = array($dep['exclude']); |
} |
|
foreach ($dep['exclude'] as $exclude) { |
if (version_compare($exclude, $pearversion, '==')) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s is not compatible with PEAR Installer ' . |
'version ' . $exclude); |
} else { |
return $this->warning('warning: %s is not compatible with PEAR ' . |
'Installer version ' . $exclude); |
} |
|
return $this->warning('warning: %s is not compatible with PEAR ' . |
'Installer version ' . $exclude); |
} |
} |
} |
|
return true; |
} |
|
586,7 → 606,7 |
* @param boolean whether this is a required dependency |
* @param array a list of downloaded packages to be installed, if any |
* @param boolean if true, then deps on pear.php.net that fail will also check |
* against pecl.php.net packages to accomodate extensions that have |
* against pecl.php.net packages to accommodate extensions that have |
* moved to pecl.php.net from pear.php.net |
*/ |
function validatePackageDependency($dep, $required, $params, $depv1 = false) |
595,6 → 615,7 |
$this->_state != PEAR_VALIDATE_DOWNLOADING) { |
return true; |
} |
|
if (isset($dep['providesextension'])) { |
if ($this->extension_loaded($dep['providesextension'])) { |
$save = $dep; |
608,9 → 629,11 |
} |
} |
} |
|
if ($this->_state == PEAR_VALIDATE_INSTALLING) { |
return $this->_validatePackageInstall($dep, $required, $depv1); |
} |
|
if ($this->_state == PEAR_VALIDATE_DOWNLOADING) { |
return $this->_validatePackageDownload($dep, $required, $params, $depv1); |
} |
622,6 → 645,7 |
if (isset($dep['uri'])) { |
$dep['channel'] = '__uri'; |
} |
|
$depname = $this->_registry->parsedPackageNameToString($dep, true); |
$found = false; |
foreach ($params as $param) { |
631,6 → 655,7 |
$found = true; |
break; |
} |
|
if ($depv1 && $dep['channel'] == 'pear.php.net') { |
if ($param->isEqual( |
array('package' => $dep['name'], |
640,6 → 665,7 |
} |
} |
} |
|
if (!$found && isset($dep['providesextension'])) { |
foreach ($params as $param) { |
if ($param->isExtension($dep['providesextension'])) { |
648,6 → 674,7 |
} |
} |
} |
|
if ($found) { |
$version = $param->getVersion(); |
$installed = false; |
672,77 → 699,73 |
} |
} |
} |
|
$extra = $this->_getExtraString($dep); |
if (isset($dep['exclude'])) { |
if (!is_array($dep['exclude'])) { |
$dep['exclude'] = array($dep['exclude']); |
} |
if (isset($dep['exclude']) && !is_array($dep['exclude'])) { |
$dep['exclude'] = array($dep['exclude']); |
} |
|
if (!isset($dep['min']) && !isset($dep['max']) && |
!isset($dep['recommended']) && !isset($dep['exclude'])) { |
!isset($dep['recommended']) && !isset($dep['exclude']) |
) { |
if ($installed || $downloaded) { |
$installed = $installed ? 'installed' : 'downloaded'; |
if (isset($dep['conflicts'])) { |
$rest = ''; |
if ($version) { |
$rest = ", $installed version is " . $version; |
} else { |
$rest = ''; |
} |
|
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s conflicts with package "' . $depname . '"' . |
$extra . $rest); |
} else { |
return $this->warning('warning: %s conflicts with package "' . $depname . '"' . |
$extra . $rest); |
return $this->raiseError('%s conflicts with package "' . $depname . '"' . $extra . $rest); |
} |
|
return $this->warning('warning: %s conflicts with package "' . $depname . '"' . $extra . $rest); |
} |
|
return true; |
} else { |
if (isset($dep['conflicts'])) { |
return true; |
} |
|
if (isset($dep['conflicts'])) { |
return true; |
} |
|
if ($required) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires package "' . $depname . '"' . $extra); |
} |
if ($required) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires package "' . $depname . '"' . |
$extra); |
} else { |
return $this->warning('warning: %s requires package "' . $depname . '"' . |
$extra); |
} |
} else { |
return $this->warning('%s can optionally use package "' . $depname . '"' . |
$extra); |
} |
|
return $this->warning('warning: %s requires package "' . $depname . '"' . $extra); |
} |
|
return $this->warning('%s can optionally use package "' . $depname . '"' . $extra); |
} |
|
if (!$installed && !$downloaded) { |
if (isset($dep['conflicts'])) { |
return true; |
} |
|
if ($required) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires package "' . $depname . '"' . |
$extra); |
} else { |
return $this->warning('warning: %s requires package "' . $depname . '"' . |
$extra); |
return $this->raiseError('%s requires package "' . $depname . '"' . $extra); |
} |
} else { |
return $this->warning('%s can optionally use package "' . $depname . '"' . |
$extra); |
|
return $this->warning('warning: %s requires package "' . $depname . '"' . $extra); |
} |
|
return $this->warning('%s can optionally use package "' . $depname . '"' . $extra); |
} |
|
$fail = false; |
if (isset($dep['min'])) { |
if (version_compare($version, $dep['min'], '<')) { |
$fail = true; |
} |
if (isset($dep['min']) && version_compare($version, $dep['min'], '<')) { |
$fail = true; |
} |
if (isset($dep['max'])) { |
if (version_compare($version, $dep['max'], '>')) { |
$fail = true; |
} |
|
if (isset($dep['max']) && version_compare($version, $dep['max'], '>')) { |
$fail = true; |
} |
|
if ($fail && !isset($dep['conflicts'])) { |
$installed = $installed ? 'installed' : 'downloaded'; |
$dep['package'] = $dep['name']; |
750,10 → 773,10 |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s requires package "' . $depname . '"' . |
$extra . ", $installed version is " . $version); |
} else { |
return $this->warning('warning: %s requires package "' . $depname . '"' . |
$extra . ", $installed version is " . $version); |
} |
|
return $this->warning('warning: %s requires package "' . $depname . '"' . |
$extra . ", $installed version is " . $version); |
} elseif ((isset($dep['min']) || isset($dep['max'])) && !$fail && |
isset($dep['conflicts']) && !isset($dep['exclude'])) { |
$installed = $installed ? 'installed' : 'downloaded'; |
760,82 → 783,88 |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s conflicts with package "' . $depname . '"' . $extra . |
", $installed version is " . $version); |
} else { |
return $this->warning('warning: %s conflicts with package "' . $depname . '"' . |
$extra . ", $installed version is " . $version); |
} |
|
return $this->warning('warning: %s conflicts with package "' . $depname . '"' . |
$extra . ", $installed version is " . $version); |
} |
|
if (isset($dep['exclude'])) { |
$installed = $installed ? 'installed' : 'downloaded'; |
foreach ($dep['exclude'] as $exclude) { |
if (version_compare($version, $exclude, '==') && !isset($dep['conflicts'])) { |
if (!isset($this->_options['nodeps']) && |
!isset($this->_options['force'])) { |
!isset($this->_options['force']) |
) { |
return $this->raiseError('%s is not compatible with ' . |
$installed . ' package "' . |
$depname . '" version ' . |
$exclude); |
} else { |
return $this->warning('warning: %s is not compatible with ' . |
$installed . ' package "' . |
$depname . '" version ' . |
$exclude); |
} |
|
return $this->warning('warning: %s is not compatible with ' . |
$installed . ' package "' . |
$depname . '" version ' . |
$exclude); |
} elseif (version_compare($version, $exclude, '!=') && isset($dep['conflicts'])) { |
$installed = $installed ? 'installed' : 'downloaded'; |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('%s conflicts with package "' . $depname . '"' . |
$extra . ", $installed version is " . $version); |
} else { |
return $this->warning('warning: %s conflicts with package "' . $depname . '"' . |
$extra . ", $installed version is " . $version); |
} |
|
return $this->warning('warning: %s conflicts with package "' . $depname . '"' . |
$extra . ", $installed version is " . $version); |
} |
} |
} |
|
if (isset($dep['recommended'])) { |
$installed = $installed ? 'installed' : 'downloaded'; |
if (version_compare($version, $dep['recommended'], '==')) { |
return true; |
} else { |
if (!$found && $installed) { |
$param = $this->_registry->getPackage($dep['name'], $dep['channel']); |
} |
|
if (!$found && $installed) { |
$param = $this->_registry->getPackage($dep['name'], $dep['channel']); |
} |
|
if ($param) { |
$found = false; |
foreach ($params as $parent) { |
if ($parent->isEqual($this->_currentPackage)) { |
$found = true; |
break; |
} |
} |
if ($param) { |
$found = false; |
foreach ($params as $parent) { |
if ($parent->isEqual($this->_currentPackage)) { |
$found = true; |
break; |
} |
|
if ($found) { |
if ($param->isCompatible($parent)) { |
return true; |
} |
if ($found) { |
if ($param->isCompatible($parent)) { |
return true; |
} |
} else { // this is for validPackage() calls |
$parent = $this->_registry->getPackage($this->_currentPackage['package'], |
$this->_currentPackage['channel']); |
if ($parent !== null) { |
if ($param->isCompatible($parent)) { |
return true; |
} |
} |
} else { // this is for validPackage() calls |
$parent = $this->_registry->getPackage($this->_currentPackage['package'], |
$this->_currentPackage['channel']); |
if ($parent !== null && $param->isCompatible($parent)) { |
return true; |
} |
} |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force']) && |
!isset($this->_options['loose'])) { |
return $this->raiseError('%s dependency package "' . $depname . |
'" ' . $installed . ' version ' . $version . |
' is not the recommended version ' . $dep['recommended'] . |
', but may be compatible, use --force to install'); |
} else { |
return $this->warning('warning: %s dependency package "' . $depname . |
'" ' . $installed . ' version ' . $version . |
' is not the recommended version ' . $dep['recommended']); |
} |
} |
|
if (!isset($this->_options['nodeps']) && !isset($this->_options['force']) && |
!isset($this->_options['loose']) |
) { |
return $this->raiseError('%s dependency package "' . $depname . |
'" ' . $installed . ' version ' . $version . |
' is not the recommended version ' . $dep['recommended'] . |
', but may be compatible, use --force to install'); |
} |
|
return $this->warning('warning: %s dependency package "' . $depname . |
'" ' . $installed . ' version ' . $version . |
' is not the recommended version ' . $dep['recommended']); |
} |
|
return true; |
} |
|
855,6 → 884,7 |
if (PEAR::isError($this->_dependencydb)) { |
return $this->_dependencydb; |
} |
|
$params = array(); |
// construct an array of "downloaded" packages to fool the package dependency checker |
// into using these to validate uninstalls of circular dependencies |
863,10 → 893,11 |
if (!class_exists('PEAR_Downloader_Package')) { |
require_once 'PEAR/Downloader/Package.php'; |
} |
$dp = &new PEAR_Downloader_Package($dl); |
$dp = new PEAR_Downloader_Package($dl); |
$dp->setPackageFile($downloaded[$i]); |
$params[$i] = &$dp; |
$params[$i] = $dp; |
} |
|
// check cache |
$memyselfandI = strtolower($this->_currentPackage['channel']) . '/' . |
strtolower($this->_currentPackage['package']); |
877,27 → 908,38 |
$dl->log(0, $warning[0]); |
} |
} |
|
if (isset($badpackages[$memyselfandI]['errors'])) { |
foreach ($badpackages[$memyselfandI]['errors'] as $error) { |
$dl->log(0, $error->getMessage()); |
if (is_array($error)) { |
$dl->log(0, $error[0]); |
} else { |
$dl->log(0, $error->getMessage()); |
} |
} |
|
if (isset($this->_options['nodeps']) || isset($this->_options['force'])) { |
return $this->warning( |
'warning: %s should not be uninstalled, other installed packages depend ' . |
'on this package'); |
} else { |
return $this->raiseError( |
'%s cannot be uninstalled, other installed packages depend on this package'); |
} |
|
return $this->raiseError( |
'%s cannot be uninstalled, other installed packages depend on this package'); |
} |
|
return true; |
} |
|
// first, list the immediate parents of each package to be uninstalled |
$perpackagelist = array(); |
$allparents = array(); |
foreach ($params as $i => $param) { |
$a = array('channel' => strtolower($param->getChannel()), |
'package' => strtolower($param->getPackage())); |
$a = array( |
'channel' => strtolower($param->getChannel()), |
'package' => strtolower($param->getPackage()) |
); |
|
$deps = $this->_dependencydb->getDependentPackages($a); |
if ($deps) { |
foreach ($deps as $d) { |
924,6 → 966,7 |
} |
} |
} |
|
// next, remove any packages from the parents list that are not installed |
$remove = array(); |
foreach ($allparents as $parent => $d1) { |
934,6 → 977,7 |
$remove[$parent] = true; |
} |
} |
|
// next remove any packages from the parents list that are not passed in for |
// uninstallation |
foreach ($allparents as $parent => $d1) { |
948,6 → 992,7 |
$remove[$parent] = true; |
} |
} |
|
// remove all packages whose dependencies fail |
// save which ones failed for error reporting |
$badchildren = array(); |
957,6 → 1002,7 |
if (!isset($allparents[$package])) { |
continue; |
} |
|
foreach ($allparents[$package] as $kid => $d1) { |
foreach ($d1 as $depinfo) { |
if ($depinfo[1]['type'] != 'optional') { |
976,6 → 1022,7 |
} |
} |
} while ($fail); |
|
// next, construct the list of packages that can't be uninstalled |
$badpackages = array(); |
$save = $this->_currentPackage; |
984,6 → 1031,7 |
if (!isset($remove[$parent[0]])) { |
continue; |
} |
|
$packagename = $this->_registry->parsePackageName($parent[0]); |
$packagename['channel'] = $this->_registry->channelAlias($packagename['channel']); |
$pa = $this->_registry->getPackage($packagename['package'], $packagename['channel']); |
1009,7 → 1057,8 |
} |
} |
} |
$this->_currentPackage = $save; |
|
$this->_currentPackage = $save; |
$dl->___uninstall_package_cache = $badpackages; |
if (isset($badpackages[$memyselfandI])) { |
if (isset($badpackages[$memyselfandI]['warnings'])) { |
1017,20 → 1066,27 |
$dl->log(0, $warning[0]); |
} |
} |
|
if (isset($badpackages[$memyselfandI]['errors'])) { |
foreach ($badpackages[$memyselfandI]['errors'] as $error) { |
$dl->log(0, $error->getMessage()); |
if (is_array($error)) { |
$dl->log(0, $error[0]); |
} else { |
$dl->log(0, $error->getMessage()); |
} |
} |
|
if (isset($this->_options['nodeps']) || isset($this->_options['force'])) { |
return $this->warning( |
'warning: %s should not be uninstalled, other installed packages depend ' . |
'on this package'); |
} else { |
return $this->raiseError( |
'%s cannot be uninstalled, other installed packages depend on this package'); |
} |
|
return $this->raiseError( |
'%s cannot be uninstalled, other installed packages depend on this package'); |
} |
} |
|
return true; |
} |
|
1037,65 → 1093,63 |
function _validatePackageUninstall($dep, $required, $dl) |
{ |
$depname = $this->_registry->parsedPackageNameToString($dep, true); |
$version = $this->_registry->packageinfo($dep['package'], 'version', |
$dep['channel']); |
$version = $this->_registry->packageinfo($dep['package'], 'version', $dep['channel']); |
if (!$version) { |
return true; |
} |
|
$extra = $this->_getExtraString($dep); |
if (isset($dep['exclude'])) { |
if (!is_array($dep['exclude'])) { |
$dep['exclude'] = array($dep['exclude']); |
} |
if (isset($dep['exclude']) && !is_array($dep['exclude'])) { |
$dep['exclude'] = array($dep['exclude']); |
} |
|
if (isset($dep['conflicts'])) { |
return true; // uninstall OK - these packages conflict (probably installed with --force) |
} |
|
if (!isset($dep['min']) && !isset($dep['max'])) { |
if ($required) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('"' . $depname . '" is required by ' . |
'installed package %s' . $extra); |
} else { |
return $this->warning('warning: "' . $depname . '" is required by ' . |
'installed package %s' . $extra); |
} |
} else { |
if (!$required) { |
return $this->warning('"' . $depname . '" can be optionally used by ' . |
'installed package %s' . $extra); |
} |
|
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError('"' . $depname . '" is required by ' . |
'installed package %s' . $extra); |
} |
|
return $this->warning('warning: "' . $depname . '" is required by ' . |
'installed package %s' . $extra); |
} |
|
$fail = false; |
if (isset($dep['min'])) { |
if (version_compare($version, $dep['min'], '>=')) { |
$fail = true; |
} |
if (isset($dep['min']) && version_compare($version, $dep['min'], '>=')) { |
$fail = true; |
} |
if (isset($dep['max'])) { |
if (version_compare($version, $dep['max'], '<=')) { |
$fail = true; |
} |
|
if (isset($dep['max']) && version_compare($version, $dep['max'], '<=')) { |
$fail = true; |
} |
|
// we re-use this variable, preserve the original value |
$saverequired = $required; |
if ($required) { |
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError($depname . $extra . ' is required by installed package' . |
' "%s"'); |
} else { |
return $this->raiseError('warning: ' . $depname . $extra . |
' is required by installed package "%s"'); |
} |
} else { |
if (!$required) { |
return $this->warning($depname . $extra . ' can be optionally used by installed package' . |
' "%s"'); |
} |
return true; |
|
if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) { |
return $this->raiseError($depname . $extra . ' is required by installed package' . |
' "%s"'); |
} |
|
return $this->raiseError('warning: ' . $depname . $extra . |
' is required by installed package "%s"'); |
} |
|
/** |
* validate a downloaded package against installed packages |
* |
* |
* As of PEAR 1.4.3, this will only validate |
* |
* @param array|PEAR_Downloader_Package|PEAR_PackageFile_v1|PEAR_PackageFile_v2 |
1113,17 → 1167,20 |
} else { |
$deps = $this->_dependencydb->getDependentPackageDependencies($pkg); |
} |
|
$fail = false; |
if ($deps) { |
if (!class_exists('PEAR_Downloader_Package')) { |
require_once 'PEAR/Downloader/Package.php'; |
} |
$dp = &new PEAR_Downloader_Package($dl); |
|
$dp = new PEAR_Downloader_Package($dl); |
if (is_object($pkg)) { |
$dp->setPackageFile($pkg); |
} else { |
$dp->setDownloadURL($pkg); |
} |
|
PEAR::pushErrorHandling(PEAR_ERROR_RETURN); |
foreach ($deps as $channel => $info) { |
foreach ($info as $package => $ds) { |
1139,8 → 1196,9 |
continue 2; // jump to next package |
} |
} |
|
foreach ($ds as $d) { |
$checker = &new PEAR_Dependency2($this->_config, $this->_options, |
$checker = new PEAR_Dependency2($this->_config, $this->_options, |
array('channel' => $channel, 'package' => $package), $this->_state); |
$dep = $d['dep']; |
$required = $d['type'] == 'required'; |
1156,10 → 1214,12 |
} |
PEAR::popErrorHandling(); |
} |
|
if ($fail) { |
return $this->raiseError( |
'%s cannot be installed, conflicts with installed packages'); |
} |
|
return true; |
} |
|
1171,10 → 1231,12 |
if (!isset($dep['optional'])) { |
$dep['optional'] = 'no'; |
} |
|
list($newdep, $type) = $this->normalizeDep($dep); |
if (!$newdep) { |
return $this->raiseError("Invalid Dependency"); |
} |
|
if (method_exists($this, "validate{$type}Dependency")) { |
return $this->{"validate{$type}Dependency"}($newdep, $dep['optional'] == 'no', |
$params, true); |
1192,11 → 1254,13 |
'os' => 'Os', |
'php' => 'Php' |
); |
if (isset($types[$dep['type']])) { |
$type = $types[$dep['type']]; |
} else { |
|
if (!isset($types[$dep['type']])) { |
return array(false, false); |
} |
|
$type = $types[$dep['type']]; |
|
$newdep = array(); |
switch ($type) { |
case 'Package' : |
1206,6 → 1270,7 |
$newdep['name'] = $dep['name']; |
break; |
} |
|
$dep['rel'] = PEAR_Dependency2::signOperator($dep['rel']); |
switch ($dep['rel']) { |
case 'has' : |
1241,8 → 1306,9 |
} |
if ($type == 'Php') { |
if (!isset($newdep['min'])) { |
$newdep['min'] = '4.2.0'; |
$newdep['min'] = '4.4.0'; |
} |
|
if (!isset($newdep['max'])) { |
$newdep['max'] = '6.0.0'; |
} |
1278,6 → 1344,7 |
if (isset($this->_options['ignore-errors'])) { |
return $this->warning($msg); |
} |
|
return PEAR::raiseError(sprintf($msg, $this->_registry->parsedPackageNameToString( |
$this->_currentPackage, true))); |
} |
1288,4 → 1355,3 |
$this->_currentPackage, true))); |
} |
} |
?> |