]> granicus.if.org Git - php/commitdiff
Bug #45 preferred_state works incorrectly
authorGreg Beaver <cellog@php.net>
Mon, 29 Sep 2003 17:36:00 +0000 (17:36 +0000)
committerGreg Beaver <cellog@php.net>
Mon, 29 Sep 2003 17:36:00 +0000 (17:36 +0000)
pear/PEAR/Installer.php

index 468339464f82fa908515b06a9884cbb04b0cd970..2beba5700fac5c262987914a673d7e099f9682d1 100644 (file)
@@ -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;
     }