From: Greg Beaver Date: Mon, 29 Sep 2003 17:36:00 +0000 (+0000) Subject: Bug #45 preferred_state works incorrectly X-Git-Tag: RELEASE_1_3b2~31 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f688e33454725341394fdd7f222311f1605220a1;p=php Bug #45 preferred_state works incorrectly --- diff --git a/pear/PEAR/Installer.php b/pear/PEAR/Installer.php index 468339464f..2beba5700f 100644 --- a/pear/PEAR/Installer.php +++ b/pear/PEAR/Installer.php @@ -28,6 +28,7 @@ require_once 'System.php'; define('PEAR_INSTALLER_OK', 1); define('PEAR_INSTALLER_FAILED', 0); define('PEAR_INSTALLER_SKIPPED', -1); +define('PEAR_INSTALLER_ERROR_NO_PREF_STATE', 2); /** * Administration class used to install PEAR packages and maintain the @@ -583,6 +584,7 @@ class PEAR_Installer extends PEAR_Common * @param string version/state * @param string original value passed to command-line * @param string preferred state (snapshot/devel/alpha/beta/stable) + * @return null|PEAR_Error|string * @access private */ function _downloadFile($pkgfile, &$config, $options, &$errors, $version, @@ -637,7 +639,8 @@ class PEAR_Installer extends PEAR_Common return $this->raiseError('No releases of preferred state "' . $state . '" exist for package ' . $origpkgfile . '. Use ' . $origpkgfile . '-state to install another' . - ' state (like ' . $origpkgfile .'-beta)'); + ' state (like ' . $origpkgfile .'-beta)', + PEAR_INSTALLER_ERROR_NO_PREF_STATE); } } else { return $pkgfile; @@ -708,9 +711,11 @@ 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)) { @@ -719,10 +724,44 @@ class PEAR_Installer extends PEAR_Common continue; } } - $pkgfile = $this->_downloadFile($pkgfile, $config, $options, $errors, - $version, $origpkgfile, $state); - if (PEAR::isError($pkgfile)) { - return $pkgfile; + 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); + $pkgfile = $this->_downloadFile($pkgfile, $config, $options, + $errors, $nextstate, $origpkgfile, + $state); + PEAR::popErrorHandling(); + } + 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); @@ -867,7 +906,7 @@ class PEAR_Installer extends PEAR_Common * - alldeps : install all dependencies * - onlyreqdeps : install only required dependencies * - * @return array package info if successful, null if not + * @return array|PEAR_Error package info if successful */ function install($pkgfile, $options = array()) @@ -1101,6 +1140,7 @@ class PEAR_Installer extends PEAR_Common return $this->raiseError("commit failed", PEAR_INSTALLER_FAILED); } + $ret = false; // Register that the package is installed ----------------------- if (empty($options['upgrade'])) { // if 'force' is used, replace the info in registry @@ -1117,7 +1157,7 @@ class PEAR_Installer extends PEAR_Common } } if (!$ret) { - return null; + return $this->raiseError("Adding package $pkgname to registry failed"); } return $pkginfo; }