]> granicus.if.org Git - php/commitdiff
better fix for #45.
authorGreg Beaver <cellog@php.net>
Tue, 30 Sep 2003 02:56:42 +0000 (02:56 +0000)
committerGreg Beaver <cellog@php.net>
Tue, 30 Sep 2003 02:56:42 +0000 (02:56 +0000)
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

pear/PEAR/Installer.php

index 2beba5700fac5c262987914a673d7e099f9682d1..0c5dbd01b595b4767d4b2aa2b14fe7ae6a5b18c0 100644 (file)
@@ -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);