1
0
Fork 0

Fix regression added in 33af9eea95, fixes #1841

pull/1812/merge
Jordi Boggiano 2013-04-28 22:32:46 +02:00
parent 823ca21e6c
commit 5264d0637b
11 changed files with 112 additions and 93 deletions

View File

@ -16,7 +16,7 @@ use Composer\Config;
use Composer\Installer\InstallationManager; use Composer\Installer\InstallationManager;
use Composer\Package\AliasPackage; use Composer\Package\AliasPackage;
use Composer\Package\PackageInterface; use Composer\Package\PackageInterface;
use Composer\Repository\RepositoryInterface; use Composer\Repository\InstalledRepositoryInterface;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Script\EventDispatcher; use Composer\Script\EventDispatcher;
use Composer\Script\ScriptEvents; use Composer\Script\ScriptEvents;
@ -37,7 +37,7 @@ class AutoloadGenerator
$this->eventDispatcher = $eventDispatcher; $this->eventDispatcher = $eventDispatcher;
} }
public function dump(Config $config, RepositoryInterface $localRepo, PackageInterface $mainPackage, InstallationManager $installationManager, $targetDir, $scanPsr0Packages = false, $suffix = '') public function dump(Config $config, InstalledRepositoryInterface $localRepo, PackageInterface $mainPackage, InstallationManager $installationManager, $targetDir, $scanPsr0Packages = false, $suffix = '')
{ {
$filesystem = new Filesystem(); $filesystem = new Filesystem();
$filesystem->ensureDirectoryExists($config->get('vendor-dir')); $filesystem->ensureDirectoryExists($config->get('vendor-dir'));
@ -66,7 +66,7 @@ return array(
EOF; EOF;
$packageMap = $this->buildPackageMap($installationManager, $mainPackage, $localRepo->getPackages()); $packageMap = $this->buildPackageMap($installationManager, $mainPackage, $localRepo->getCanonicalPackages());
$autoloads = $this->parseAutoloads($packageMap, $mainPackage); $autoloads = $this->parseAutoloads($packageMap, $mainPackage);
foreach ($autoloads['psr-0'] as $namespace => $paths) { foreach ($autoloads['psr-0'] as $namespace => $paths) {
@ -205,10 +205,6 @@ EOF;
$packageMap = array(array($mainPackage, '')); $packageMap = array(array($mainPackage, ''));
foreach ($packages as $package) { foreach ($packages as $package) {
// unfold aliased packages
while ($package instanceof AliasPackage && !in_array($package->getAliasOf(), $packages, true)) {
$package = $package->getAliasOf();
}
if ($package instanceof AliasPackage) { if ($package instanceof AliasPackage) {
continue; continue;
} }

View File

@ -259,7 +259,7 @@ class Installer
$platformDevReqs = $this->devMode ? $this->extractPlatformRequirements($this->package->getDevRequires()) : array(); $platformDevReqs = $this->devMode ? $this->extractPlatformRequirements($this->package->getDevRequires()) : array();
$updatedLock = $this->locker->setLockData( $updatedLock = $this->locker->setLockData(
array_diff($localRepo->getPackages(), (array) $devPackages), array_diff($localRepo->getCanonicalPackages(), (array) $devPackages),
$devPackages, $devPackages,
$platformReqs, $platformReqs,
$platformDevReqs, $platformDevReqs,
@ -582,16 +582,12 @@ class Installer
$operations = array(); $operations = array();
} }
foreach ($localRepo->getPackages() as $package) { foreach ($localRepo->getCanonicalPackages() as $package) {
// skip non-dev packages // skip non-dev packages
if (!$package->isDev()) { if (!$package->isDev()) {
continue; continue;
} }
if ($package instanceof AliasPackage) {
continue;
}
// skip packages that will be updated/uninstalled // skip packages that will be updated/uninstalled
foreach ($operations as $operation) { foreach ($operations as $operation) {
if (('update' === $operation->getJobType() && $operation->getInitialPackage()->equals($package)) if (('update' === $operation->getJobType() && $operation->getInitialPackage()->equals($package))

View File

@ -13,7 +13,6 @@
namespace Composer\Repository; namespace Composer\Repository;
use Composer\Json\JsonFile; use Composer\Json\JsonFile;
use Composer\Package\AliasPackage;
use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ArrayLoader;
use Composer\Package\Dumper\ArrayDumper; use Composer\Package\Dumper\ArrayDumper;
@ -23,7 +22,7 @@ use Composer\Package\Dumper\ArrayDumper;
* @author Konstantin Kudryashov <ever.zet@gmail.com> * @author Konstantin Kudryashov <ever.zet@gmail.com>
* @author Jordi Boggiano <j.boggiano@seld.be> * @author Jordi Boggiano <j.boggiano@seld.be>
*/ */
class FilesystemRepository extends ArrayRepository implements WritableRepositoryInterface class FilesystemRepository extends WritableArrayRepository
{ {
private $file; private $file;
@ -77,16 +76,10 @@ class FilesystemRepository extends ArrayRepository implements WritableRepository
public function write() public function write()
{ {
$data = array(); $data = array();
$dumper = new ArrayDumper(); $dumper = new ArrayDumper();
$packages = $this->getPackages();
foreach ($packages as $package) { foreach ($this->getCanonicalPackages() as $package) {
// unfold aliased packages $data[] = $dumper->dump($package);
while ($package instanceof AliasPackage && !in_array($package->getAliasOf(), $packages, true)) {
$package = $package->getAliasOf();
}
if (!$package instanceof AliasPackage) {
$data[] = $dumper->dump($package);
}
} }
$this->file->write($data); $this->file->write($data);

View File

@ -19,19 +19,6 @@ namespace Composer\Repository;
* *
* @author Jordi Boggiano <j.boggiano@seld.be> * @author Jordi Boggiano <j.boggiano@seld.be>
*/ */
class InstalledArrayRepository extends ArrayRepository implements InstalledRepositoryInterface class InstalledArrayRepository extends WritableArrayRepository implements InstalledRepositoryInterface
{ {
/**
* {@inheritDoc}
*/
public function write()
{
}
/**
* {@inheritDoc}
*/
public function reload()
{
}
} }

View File

@ -125,9 +125,9 @@ class RepositoryManager
/** /**
* Sets local repository for the project. * Sets local repository for the project.
* *
* @param RepositoryInterface $repository repository instance * @param WritableRepositoryInterface $repository repository instance
*/ */
public function setLocalRepository(RepositoryInterface $repository) public function setLocalRepository(WritableRepositoryInterface $repository)
{ {
$this->localRepository = $repository; $this->localRepository = $repository;
} }
@ -135,7 +135,7 @@ class RepositoryManager
/** /**
* Returns local repository for the project. * Returns local repository for the project.
* *
* @return RepositoryInterface * @return WritableRepositoryInterface
*/ */
public function getLocalRepository() public function getLocalRepository()
{ {

View File

@ -0,0 +1,66 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Repository;
use Composer\Package\AliasPackage;
/**
* Writable array repository.
*
* @author Jordi Boggiano <j.boggiano@seld.be>
*/
class WritableArrayRepository extends ArrayRepository implements WritableRepositoryInterface
{
/**
* {@inheritDoc}
*/
public function write()
{
}
/**
* {@inheritDoc}
*/
public function reload()
{
}
/**
* {@inheritDoc}
*/
public function getCanonicalPackages()
{
$packages = $this->getPackages();
// get at most one package of each name, prefering non-aliased ones
$packagesByName = array();
foreach ($packages as $package) {
if (!isset($packagesByName[$package->getName()]) || $packagesByName[$package->getName()] instanceof AliasPackage) {
$packagesByName[$package->getName()] = $package;
}
}
$canonicalPackages = array();
// unfold aliased packages
foreach ($packagesByName as $package) {
while ($package instanceof AliasPackage) {
$package = $package->getAliasOf();
}
$canonicalPackages[] = $package;
}
return $canonicalPackages;
}
}

View File

@ -40,6 +40,13 @@ interface WritableRepositoryInterface extends RepositoryInterface
*/ */
public function removePackage(PackageInterface $package); public function removePackage(PackageInterface $package);
/**
* Get unique packages, with aliases resolved and removed
*
* @return PackageInterface[]
*/
public function getCanonicalPackages();
/** /**
* Forces a reload of all packages * Forces a reload of all packages
*/ */

View File

@ -155,7 +155,7 @@ class EventDispatcher
} }
$generator = $this->composer->getAutoloadGenerator(); $generator = $this->composer->getAutoloadGenerator();
$packages = $this->composer->getRepositoryManager()->getLocalRepository()->getPackages(); $packages = $this->composer->getRepositoryManager()->getLocalRepository()->getCanonicalPackages();
$packageMap = $generator->buildPackageMap($this->composer->getInstallationManager(), $package, $packages); $packageMap = $generator->buildPackageMap($this->composer->getInstallationManager(), $package, $packages);
$map = $generator->parseAutoloads($packageMap, $package); $map = $generator->parseAutoloads($packageMap, $package);
$this->loader = $generator->createLoader($map); $this->loader = $generator->createLoader($map);

View File

@ -69,7 +69,7 @@ class AutoloadGeneratorTest extends TestCase
$targetDir = $package->getTargetDir(); $targetDir = $package->getTargetDir();
return $that->vendorDir.'/'.$package->getName() . ($targetDir ? '/'.$targetDir : ''); return $that->vendorDir.'/'.$package->getName() . ($targetDir ? '/'.$targetDir : '');
})); }));
$this->repository = $this->getMock('Composer\Repository\RepositoryInterface'); $this->repository = $this->getMock('Composer\Repository\InstalledRepositoryInterface');
$this->eventDispatcher = $this->getMockBuilder('Composer\Script\EventDispatcher') $this->eventDispatcher = $this->getMockBuilder('Composer\Script\EventDispatcher')
->disableOriginalConstructor() ->disableOriginalConstructor()
@ -99,7 +99,7 @@ class AutoloadGeneratorTest extends TestCase
)); ));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$this->fs->ensureDirectoryExists($this->workingDir.'/composer'); $this->fs->ensureDirectoryExists($this->workingDir.'/composer');
@ -125,7 +125,7 @@ class AutoloadGeneratorTest extends TestCase
)); ));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$this->fs->ensureDirectoryExists($this->vendorDir.'/composer'); $this->fs->ensureDirectoryExists($this->vendorDir.'/composer');
@ -149,7 +149,7 @@ class AutoloadGeneratorTest extends TestCase
)); ));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$this->vendorDir .= '/subdir'; $this->vendorDir .= '/subdir';
@ -175,7 +175,7 @@ class AutoloadGeneratorTest extends TestCase
$package->setTargetDir('Main/Foo/'); $package->setTargetDir('Main/Foo/');
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$this->fs->ensureDirectoryExists($this->vendorDir.'/a'); $this->fs->ensureDirectoryExists($this->vendorDir.'/a');
@ -205,7 +205,7 @@ class AutoloadGeneratorTest extends TestCase
$b->setAutoload(array('psr-0' => array('B\\Sub\\Name' => 'src/'))); $b->setAutoload(array('psr-0' => array('B\\Sub\\Name' => 'src/')));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
$this->fs->ensureDirectoryExists($this->vendorDir.'/composer'); $this->fs->ensureDirectoryExists($this->vendorDir.'/composer');
@ -225,7 +225,7 @@ class AutoloadGeneratorTest extends TestCase
$package->setAutoload(array('psr-0' => array('foo/bar/non/existing/'))); $package->setAutoload(array('psr-0' => array('foo/bar/non/existing/')));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_8'); $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_8');
@ -247,7 +247,7 @@ class AutoloadGeneratorTest extends TestCase
$b->setAutoload(array('classmap' => array('src/', 'lib/'))); $b->setAutoload(array('classmap' => array('src/', 'lib/')));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
$this->fs->ensureDirectoryExists($this->vendorDir.'/composer'); $this->fs->ensureDirectoryExists($this->vendorDir.'/composer');
@ -283,7 +283,7 @@ class AutoloadGeneratorTest extends TestCase
$b->setAutoload(array('classmap' => array('src/'))); $b->setAutoload(array('classmap' => array('src/')));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
$this->fs->ensureDirectoryExists($this->vendorDir.'/composer'); $this->fs->ensureDirectoryExists($this->vendorDir.'/composer');
@ -319,7 +319,7 @@ class AutoloadGeneratorTest extends TestCase
$c->setAutoload(array('classmap' => array('./'))); $c->setAutoload(array('classmap' => array('./')));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
$this->fs->ensureDirectoryExists($this->vendorDir.'/composer'); $this->fs->ensureDirectoryExists($this->vendorDir.'/composer');
@ -358,7 +358,7 @@ class AutoloadGeneratorTest extends TestCase
$c->setTargetDir('foo/bar'); $c->setTargetDir('foo/bar');
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
$this->fs->ensureDirectoryExists($this->vendorDir.'/a/a'); $this->fs->ensureDirectoryExists($this->vendorDir.'/a/a');
@ -412,7 +412,7 @@ class AutoloadGeneratorTest extends TestCase
$e->setRequires(array(new Link('e/e', 'c/lorem'))); $e->setRequires(array(new Link('e/e', 'c/lorem')));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
$this->fs->ensureDirectoryExists($this->vendorDir . '/z/foo'); $this->fs->ensureDirectoryExists($this->vendorDir . '/z/foo');
@ -454,7 +454,7 @@ class AutoloadGeneratorTest extends TestCase
$b->setAutoload(array('psr-0' => array('B\\Sub\\Name' => 'src/'))); $b->setAutoload(array('psr-0' => array('B\\Sub\\Name' => 'src/')));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
$this->fs->ensureDirectoryExists($this->workingDir.'/lib/A/B'); $this->fs->ensureDirectoryExists($this->workingDir.'/lib/A/B');
@ -524,7 +524,7 @@ EOF;
$packages[] = $c; $packages[] = $c;
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method("getPackages") ->method("getCanonicalPackages")
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
$this->fs->ensureDirectoryExists($this->vendorDir.'/composer'); $this->fs->ensureDirectoryExists($this->vendorDir.'/composer');
@ -553,7 +553,7 @@ EOF;
$packages[] = $a; $packages[] = $a;
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method("getPackages") ->method("getCanonicalPackages")
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
mkdir($this->vendorDir."/composer", 0777, true); mkdir($this->vendorDir."/composer", 0777, true);
@ -581,7 +581,7 @@ EOF;
$a->setIncludePaths(array("lib/")); $a->setIncludePaths(array("lib/"));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method("getPackages") ->method("getCanonicalPackages")
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
mkdir($this->vendorDir."/composer", 0777, true); mkdir($this->vendorDir."/composer", 0777, true);
@ -609,7 +609,7 @@ EOF;
$packages[] = $a; $packages[] = $a;
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method("getPackages") ->method("getCanonicalPackages")
->will($this->returnValue($packages)); ->will($this->returnValue($packages));
mkdir($this->vendorDir."/composer", 0777, true); mkdir($this->vendorDir."/composer", 0777, true);
@ -630,7 +630,7 @@ EOF;
$package->setAutoload(array('psr-0' => array('foo/bar/non/existing/'))); $package->setAutoload(array('psr-0' => array('foo/bar/non/existing/')));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_8'); $this->generator->dump($this->config, $this->repository, $package, $this->im, 'composer', true, '_8');
@ -645,7 +645,7 @@ EOF;
$package->setTargetDir('Main/Foo/'); $package->setTargetDir('Main/Foo/');
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$this->config->expects($this->at(2)) $this->config->expects($this->at(2))
@ -682,7 +682,7 @@ EOF;
)); ));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue(array($vendorPackage))); ->will($this->returnValue(array($vendorPackage)));
$im = $this->getMockBuilder('Composer\Installer\InstallationManager') $im = $this->getMockBuilder('Composer\Installer\InstallationManager')
@ -764,7 +764,7 @@ EOF;
)); ));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$this->fs->ensureDirectoryExists($this->workingDir.'/src/Foo'); $this->fs->ensureDirectoryExists($this->workingDir.'/src/Foo');
@ -818,7 +818,7 @@ EOF;
)); ));
$this->repository->expects($this->once()) $this->repository->expects($this->once())
->method('getPackages') ->method('getCanonicalPackages')
->will($this->returnValue(array())); ->will($this->returnValue(array()));
$this->fs->ensureDirectoryExists($this->workingDir.'/Foo'); $this->fs->ensureDirectoryExists($this->workingDir.'/Foo');

View File

@ -17,13 +17,13 @@ use Composer\Config;
use Composer\Json\JsonFile; use Composer\Json\JsonFile;
use Composer\Repository\ArrayRepository; use Composer\Repository\ArrayRepository;
use Composer\Repository\RepositoryManager; use Composer\Repository\RepositoryManager;
use Composer\Repository\InstalledArrayRepository;
use Composer\Package\RootPackageInterface; use Composer\Package\RootPackageInterface;
use Composer\Package\Link; use Composer\Package\Link;
use Composer\Package\Locker; use Composer\Package\Locker;
use Composer\Test\Mock\FactoryMock; use Composer\Test\Mock\FactoryMock;
use Composer\Test\Mock\InstalledFilesystemRepositoryMock; use Composer\Test\Mock\InstalledFilesystemRepositoryMock;
use Composer\Test\Mock\InstallationManagerMock; use Composer\Test\Mock\InstallationManagerMock;
use Composer\Test\Mock\WritableRepositoryMock;
use Symfony\Component\Console\Input\StringInput; use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\StreamOutput; use Symfony\Component\Console\Output\StreamOutput;
@ -53,7 +53,7 @@ class InstallerTest extends TestCase
$config = $this->getMock('Composer\Config'); $config = $this->getMock('Composer\Config');
$repositoryManager = new RepositoryManager($io, $config); $repositoryManager = new RepositoryManager($io, $config);
$repositoryManager->setLocalRepository(new WritableRepositoryMock()); $repositoryManager->setLocalRepository(new InstalledArrayRepository());
if (!is_array($repositories)) { if (!is_array($repositories)) {
$repositories = array($repositories); $repositories = array($repositories);

View File

@ -1,26 +0,0 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Test\Mock;
use Composer\Repository\ArrayRepository;
use Composer\Repository\WritableRepositoryInterface;
class WritableRepositoryMock extends ArrayRepository implements WritableRepositoryInterface
{
public function reload()
{
}
public function write()
{
}
}