浏览代码

Fix PEAR dependencies

Jordi Boggiano 13 年之前
父节点
当前提交
7dfb2724cb
共有 1 个文件被更改,包括 24 次插入2 次删除
  1. 24 2
      src/Composer/Repository/PearRepository.php

+ 24 - 2
src/Composer/Repository/PearRepository.php

@@ -23,6 +23,8 @@ use Composer\Downloader\TransportException;
  */
 class PearRepository extends ArrayRepository
 {
+    private static $channelNames = array();
+
     private $url;
     private $channel;
     private $io;
@@ -54,11 +56,12 @@ class PearRepository extends ArrayRepository
 
     protected function fetchFromServer()
     {
+        $channelXML = $this->requestXml($this->url . "/channel.xml");
         if (!$this->channel) {
-            $channelXML = $this->requestXml($this->url . "/channel.xml");
             $this->channel = $channelXML->getElementsByTagName("suggestedalias")->item(0)->nodeValue
                                     ?: $channelXML->getElementsByTagName("name")->item(0)->nodeValue;
         }
+        self::$channelNames[$channelXML->getElementsByTagName("name")->item(0)->nodeValue] = $this->channel;
 
         $categoryXML = $this->requestXml($this->url . "/rest/c/categories.xml");
         $categories = $categoryXML->getElementsByTagName("c");
@@ -177,7 +180,10 @@ class PearRepository extends ArrayRepository
                 foreach ($options as $key => $value) {
                     if (is_array($value)) {
                         $dataKey = $value['name'];
-                        $data[$dataKey] = $this->parseVersion($value);
+                        if (false === strpos($dataKey, '/')) {
+                            $dataKey = $this->getChannelShorthand($value['channel']).'/'.$dataKey;
+                        }
+                        $data['pear-'.$dataKey] = $this->parseVersion($value);
                     }
                 }
             } elseif ('extension' == $name) {
@@ -299,4 +305,20 @@ class PearRepository extends ArrayRepository
 
         return $dom;
     }
+
+    private function getChannelShorthand($url)
+    {
+        if (!isset(self::$channelNames[$url])) {
+            try {
+                $channelXML = $this->requestXml('http://'.$url."/channel.xml");
+                $shorthand = $channelXML->getElementsByTagName("suggestedalias")->item(0)->nodeValue
+                    ?: $channelXML->getElementsByTagName("name")->item(0)->nodeValue;
+                self::$channelNames[$url] = $shorthand;
+            } catch (\Exception $e) {
+                self::$channelNames[$url] = substr($url, 0, strpos($url, '.'));
+            }
+        }
+
+        return self::$channelNames[$url];
+    }
 }