diff --git a/src/Composer/Plugin/PluginManager.php b/src/Composer/Plugin/PluginManager.php index 0305d31df..fdd952ae3 100644 --- a/src/Composer/Plugin/PluginManager.php +++ b/src/Composer/Plugin/PluginManager.php @@ -37,6 +37,7 @@ class PluginManager protected $versionParser; protected $plugins = array(); + protected $registeredPlugins = array(); private static $classCounter = 0; @@ -195,6 +196,10 @@ class PluginManager { $oldInstallerPlugin = ($package->getType() === 'composer-installer'); + if (in_array($package->getName(), $this->registeredPlugins)) { + return; + } + $extra = $package->getExtra(); if (empty($extra['class'])) { throw new \UnexpectedValueException('Error while installing '.$package->getPrettyName().', composer-plugin packages should have a class defined in their extra key to be usable.'); @@ -237,6 +242,7 @@ class PluginManager } else { $plugin = new $class(); $this->addPlugin($plugin); + $this->registeredPlugins[] = $package->getName(); } } } diff --git a/tests/Composer/Test/Plugin/PluginInstallerTest.php b/tests/Composer/Test/Plugin/PluginInstallerTest.php index 08d0d1aab..bd9e2b554 100644 --- a/tests/Composer/Test/Plugin/PluginInstallerTest.php +++ b/tests/Composer/Test/Plugin/PluginInstallerTest.php @@ -164,4 +164,21 @@ class PluginInstallerTest extends \PHPUnit_Framework_TestCase $plugins = $this->pm->getPlugins(); $this->assertEquals('installer-v3', $plugins[1]->version); } + + public function testRegisterPluginOnlyOneTime() + { + $this->repository + ->expects($this->exactly(2)) + ->method('getPackages') + ->will($this->returnValue(array())); + $installer = new PluginInstaller($this->io, $this->composer); + $this->pm->loadInstalledPlugins(); + + $installer->install($this->repository, $this->packages[0]); + $installer->install($this->repository, clone $this->packages[0]); + + $plugins = $this->pm->getPlugins(); + $this->assertCount(1, $plugins); + $this->assertEquals('installer-v1', $plugins[0]->version); + } }