Эх сурвалжийг харах

Add aliasing: `foo as bar` will require foo and automatically make it replace the bar version

Jordi Boggiano 13 жил өмнө
parent
commit
82054f2060

+ 27 - 3
src/Composer/Command/InstallCommand.php

@@ -21,6 +21,7 @@ use Composer\DependencyResolver\Pool;
 use Composer\DependencyResolver\Request;
 use Composer\DependencyResolver\Operation;
 use Composer\Package\MemoryPackage;
+use Composer\Package\Link;
 use Composer\Package\LinkConstraint\VersionConstraint;
 use Composer\Package\PackageInterface;
 use Composer\Repository\CompositeRepository;
@@ -92,8 +93,10 @@ EOT
             $composer->getDownloadManager()->setPreferSource(true);
         }
 
+        $repoManager = $composer->getRepositoryManager();
+
         // create local repo, this contains all packages that are installed in the local project
-        $localRepo = $composer->getRepositoryManager()->getLocalRepository();
+        $localRepo = $repoManager->getLocalRepository();
         // create installed repo, this contains all local packages + platform packages (php & extensions)
         $installedRepo = new CompositeRepository(array($localRepo, new PlatformRepository()));
         if ($additionalInstalledRepository) {
@@ -103,7 +106,7 @@ EOT
         // creating repository pool
         $pool = new Pool;
         $pool->addRepository($installedRepo);
-        foreach ($composer->getRepositoryManager()->getRepositories() as $repository) {
+        foreach ($repoManager->getRepositories() as $repository) {
             $pool->addRepository($repository);
         }
 
@@ -148,6 +151,27 @@ EOT
             }
         }
 
+        // prepare aliased packages
+        foreach ($composer->getPackage()->getAliases() as $alias) {
+            $candidates = array_merge(
+                $repoManager->findPackages($alias['package'], $alias['version']),
+                $repoManager->getLocalRepository()->findPackages($alias['package'], $alias['version'])
+            );
+            foreach ($candidates as $package) {
+                $replaces = $package->getReplaces();
+                foreach ($replaces as $index => $link) {
+                    // link is self.version, but must be replacing also the replaced version
+                    if ('self.version' === $link->getPrettyConstraint()) {
+                        $replaces[] = new Link($link->getSource(), $link->getTarget(), new VersionConstraint('=', $alias['replaces']), 'replaces', $alias['replaces']);
+                    }
+                }
+
+                // add replace of itself
+                $replaces[] = new Link($alias['package'], $alias['package'], new VersionConstraint('=', $alias['replaces']), 'replaces', $alias['replaces']);
+                $package->setReplaces($replaces);
+            }
+        }
+
         // prepare solver
         $installationManager = $composer->getInstallationManager();
         $policy              = new DependencyResolver\DefaultPolicy();
@@ -179,7 +203,7 @@ EOT
                 }
 
                 // force update
-                $newPackage = $composer->getRepositoryManager()->findPackage($package->getName(), $package->getVersion());
+                $newPackage = $repoManager->findPackage($package->getName(), $package->getVersion());
                 if ($newPackage && $newPackage->getSourceReference() !== $package->getSourceReference()) {
                     $operations[] = new UpdateOperation($package, $newPackage);
                 }

+ 15 - 0
src/Composer/Package/Loader/RootPackageLoader.php

@@ -43,6 +43,21 @@ class RootPackageLoader extends ArrayLoader
 
         $package = parent::load($config);
 
+        if (isset($config['require'])) {
+            $aliases = array();
+            foreach ($config['require'] as $reqName => $reqVersion) {
+                if (preg_match('{^([^,\s]+) +as +([^,\s]+)$}', $reqVersion, $match)) {
+                    $aliases[] = array(
+                        'package' => strtolower($reqName),
+                        'version' => $this->versionParser->normalize($match[1]),
+                        'replaces' => $this->versionParser->normalize($match[2]),
+                    );
+                }
+            }
+
+            $package->setAliases($aliases);
+        }
+
         if (isset($config['repositories'])) {
             foreach ($config['repositories'] as $index => $repo) {
                 if (isset($repo['packagist']) && $repo['packagist'] === false) {

+ 17 - 0
src/Composer/Package/MemoryPackage.php

@@ -41,6 +41,7 @@ class MemoryPackage extends BasePackage
     protected $extra = array();
     protected $binaries = array();
     protected $scripts = array();
+    protected $aliases = array();
     protected $dev;
 
     protected $requires = array();
@@ -156,6 +157,22 @@ class MemoryPackage extends BasePackage
         return $this->scripts;
     }
 
+    /**
+     * @param array $aliases
+     */
+    public function setAliases(array $aliases)
+    {
+        $this->aliases = $aliases;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public function getAliases()
+    {
+        return $this->aliases;
+    }
+
     /**
      * {@inheritDoc}
      */

+ 5 - 0
src/Composer/Package/Version/VersionParser.php

@@ -34,6 +34,11 @@ class VersionParser
     {
         $version = trim($version);
 
+        // ignore aliases and just assume the alias is required instead of the source
+        if (preg_match('{^([^,\s]+) +as +([^,\s]+)$}', $version, $match)) {
+            $version = $match[1];
+        }
+
         // match master-like branches
         if (preg_match('{^(?:dev-)?(?:master|trunk|default)$}i', $version)) {
             return '9999999-dev';

+ 1 - 0
tests/Composer/Test/Package/Version/VersionParserTest.php

@@ -53,6 +53,7 @@ class VersionParserTest extends \PHPUnit_Framework_TestCase
             'parses trunk'      => array('dev-trunk',           '9999999-dev'),
             'parses arbitrary'  => array('dev-feature-foo',     'dev-feature-foo'),
             'parses arbitrary2' => array('DEV-FOOBAR',          'dev-foobar'),
+            'ignores aliases'   => array('dev-master as 1.0.0', '9999999-dev'),
         );
     }