From: Greg Beaver Date: Tue, 30 Sep 2003 02:57:28 +0000 (+0000) Subject: MFH better #45 fix X-Git-Tag: php-4.3.4RC2~91 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a07e4ef2ffdf943db3d4a0d0f8558962bcbb7f1f;p=php MFH better #45 fix --- diff --git a/pear/PEAR/Installer.php b/pear/PEAR/Installer.php index 2735b8adf1..affc284644 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);