Browse Source

Add composer mirror class

Jordi Boggiano 11 years ago
parent
commit
ba776c06ee

+ 1 - 2
src/Composer/Downloader/FileDownloader.php

@@ -88,8 +88,7 @@ class FileDownloader implements DownloaderInterface
         $urls = $package->getDistUrls();
         while ($url = array_shift($urls)) {
             try {
-                $this->doDownload($package, $path, $url);
-                break;
+                return $this->doDownload($package, $path, $url);
             } catch (\Exception $e) {
                 if ($this->io->isDebug()) {
                     $this->io->write('');

+ 6 - 6
src/Composer/Package/Package.php

@@ -13,6 +13,7 @@
 namespace Composer\Package;
 
 use Composer\Package\Version\VersionParser;
+use Composer\Util\ComposerMirror;
 
 /**
  * Core package definitions that are needed to resolve dependencies and install packages
@@ -581,14 +582,13 @@ class Package extends BasePackage
 
     protected function getUrls($url, $mirrors, $ref, $type)
     {
-        $urls = array($url);
+        $urls = array();
+        if ($url) {
+            $urls[] = $url;
+        }
         if ($mirrors) {
             foreach ($mirrors as $mirror) {
-                $mirrorUrl = str_replace(
-                    array('%package%', '%version%', '%reference%', '%type%'),
-                    array($this->name, $this->version, $ref, $type),
-                    $mirror['url']
-                );
+                $mirrorUrl = ComposerMirror::processUrl($mirror['url'], $this->name, $this->version, $ref, $type);
                 $func = $mirror['preferred'] ? 'array_unshift' : 'array_push';
                 $func($urls, $mirrorUrl);
             }

+ 33 - 0
src/Composer/Util/ComposerMirror.php

@@ -0,0 +1,33 @@
+<?php
+
+
+
+
+
+
+
+
+
+
+
+namespace Composer\Util;
+
+
+
+
+
+
+class ComposerMirror
+{
+    public static function processUrl($mirrorUrl, $packageName, $version, $reference, $type)
+    {
+        $reference = preg_match('{^([a-f0-9]*|%reference%)$}', $reference) ? $reference : md5($reference);
+        $version = strpos($version, '/') === false ? $version : md5($version);
+
+        return str_replace(
+            array('%package%', '%version%', '%reference%', '%type%'),
+            array($packageName, $version, $reference, $type),
+            $mirrorUrl
+        );
+    }
+}