diff options
author | Greg Beaver <cellog@php.net> | 2003-09-30 02:56:42 +0000 |
---|---|---|
committer | Greg Beaver <cellog@php.net> | 2003-09-30 02:56:42 +0000 |
commit | e898d7c25a971d9a64e624b9b73e33ce383b2b8e (patch) | |
tree | ef5d03507df8869d2ea0ebd9f47024ef47904264 | |
parent | 77726c734e311837c49a4ae898c5f82c622f0161 (diff) | |
download | php-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.php | 72 |
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); |