summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Beaver <cellog@php.net>2003-09-30 02:56:42 +0000
committerGreg Beaver <cellog@php.net>2003-09-30 02:56:42 +0000
commite898d7c25a971d9a64e624b9b73e33ce383b2b8e (patch)
treeef5d03507df8869d2ea0ebd9f47024ef47904264
parent77726c734e311837c49a4ae898c5f82c622f0161 (diff)
downloadphp-git-e898d7c25a971d9a64e624b9b73e33ce383b2b8e.tar.gz
better fix for #45.
Now, it will install the newest version that is preferred_state or stabler. to request a specific state, append -state like pear install Net_NNTP-beta
-rw-r--r--pear/PEAR/Installer.php72
1 files changed, 31 insertions, 41 deletions
diff --git a/pear/PEAR/Installer.php b/pear/PEAR/Installer.php
index 2beba5700f..0c5dbd01b5 100644
--- a/pear/PEAR/Installer.php
+++ b/pear/PEAR/Installer.php
@@ -711,57 +711,47 @@ class PEAR_Installer extends PEAR_Common
if (!is_file($pkgfile)) {
$origpkgfile = $pkgfile;
$pkgfile = $this->extractDownloadFileName($pkgfile, $version);
- $version_is_state = false;
- if ($version === null) {
- // use preferred state if no version number was specified
- $version = $state;
- $version_is_state = true;
- }
- if ($this->validPackageName($pkgfile) && !isset($options['upgrade'])) {
- if ($this->registry->packageExists($pkgfile)) {
+ if ($this->validPackageName($pkgfile)) {
+ if ($this->registry->packageExists($pkgfile)
+ && !isset($options['upgrade'])) {
$this->log(0, "Package '$pkgfile' already installed, skipping");
// ignore dependencies that are installed unless we are upgrading
continue;
}
- }
- if ($version_is_state) {
- $savepkgfile = $pkgfile;
- PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
- $pkgfile = $this->_downloadFile($pkgfile, $config, $options,
- $errors, $version, $origpkgfile,
- $state);
- PEAR::popErrorHandling();
- if (PEAR::isError($pkgfile) &&
- $pkgfile->getCode() != PEAR_INSTALLER_ERROR_NO_PREF_STATE) {
- return $pkgfile;
- } elseif (PEAR::isError($pkgfile)) {
- $pkgfile = $savepkgfile;
- $states = $this->betterStates($state, false);
- $init = true;
- // try from stable down to preferred_state
- while(($init || (PEAR::isError($pkgfile) &&
- $pkgfile->getCode() == PEAR_INSTALLER_ERROR_NO_PREF_STATE))
- && count($states)) {
- $pkgfile = $savepkgfile;
- $init = false;
- $nextstate = array_pop($states);
- PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
+ if ($version === null) {
+ // use preferred state if no version number was specified
+ include_once 'PEAR/Remote.php';
+ $curver = $this->registry->packageInfo($pkgfile, 'version');
+ $remote = &new PEAR_Remote($config);
+ $releases = $remote->call('package.info', $pkgfile, 'releases');
+ $states = $this->betterStates($state, true);
+ $possible = false;
+ foreach($releases as $ver => $inf) {
+ if (in_array($inf['state'], $states)) {
+ if (is_array($possible)) {
+ if (version_compare(key($possible), $ver) < 0) {
+ $possible = array($ver => $inf['state']);
+ }
+ } else {
+ if (version_compare($ver, $curver) > 0) {
+ $possible = array($ver => $inf['state']);
+ }
+ }
+ }
+ }
+ if ($possible) {
$pkgfile = $this->_downloadFile($pkgfile, $config, $options,
- $errors, $nextstate, $origpkgfile,
- $state);
- PEAR::popErrorHandling();
+ $errors, key($possible), $origpkgfile,
+ $state);
}
+ } else {
+ $pkgfile = $this->_downloadFile($pkgfile, $config, $options,
+ $errors, $version, $origpkgfile,
+ $state);
if (PEAR::isError($pkgfile)) {
return $pkgfile;
}
}
- } else {
- $pkgfile = $this->_downloadFile($pkgfile, $config, $options,
- $errors, $version, $origpkgfile,
- $state);
- if (PEAR::isError($pkgfile)) {
- return $pkgfile;
- }
}
}
$tempinfo = $this->infoFromAny($pkgfile);