As preparation for composer plugins, rename custom installers to plugins
parent
ef072ff8c0
commit
01a08a2ff3
doc
tests/Composer/Test
Fixtures/installer
Installer
Fixtures
installer-v1
installer-v2
installer-v3
installer-v4
|
@ -99,7 +99,7 @@ Out of the box, composer supports three types:
|
|||
their installation, but contains no files and will not write anything to the
|
||||
filesystem. As such, it does not require a dist or source key to be
|
||||
installable.
|
||||
- **composer-installer:** A package of type `composer-installer` provides an
|
||||
- **composer-plugin:** A package of type `composer-plugin` may provide an
|
||||
installer for other packages that have a custom type. Read more in the
|
||||
[dedicated article](articles/custom-installers.md).
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
"required": true
|
||||
},
|
||||
"type": {
|
||||
"description": "Package type, either 'library' for common packages, 'composer-installer' for custom installers, 'metapackage' for empty packages, or a custom type ([a-z0-9-]+) defined by whatever project this package applies to.",
|
||||
"description": "Package type, either 'library' for common packages, 'composer-plugin' for plugins, 'metapackage' for empty packages, or a custom type ([a-z0-9-]+) defined by whatever project this package applies to.",
|
||||
"type": "string"
|
||||
},
|
||||
"target-dir": {
|
||||
|
@ -180,7 +180,7 @@
|
|||
},
|
||||
"extra": {
|
||||
"type": ["object", "array"],
|
||||
"description": "Arbitrary extra data that can be used by custom installers, for example, package of type composer-installer must have a 'class' key defining the installer class name.",
|
||||
"description": "Arbitrary extra data that can be used by plugins, for example, package of type composer-plugin may have a 'class' key defining an installer class name.",
|
||||
"additionalProperties": true
|
||||
},
|
||||
"autoload": {
|
||||
|
|
|
@ -62,7 +62,7 @@ class CreateProjectCommand extends Command
|
|||
new InputOption('repository-url', null, InputOption::VALUE_REQUIRED, 'Pick a different repository url to look for the package.'),
|
||||
new InputOption('dev', null, InputOption::VALUE_NONE, 'Enables installation of require-dev packages (enabled by default, only present for BC).'),
|
||||
new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'),
|
||||
new InputOption('no-custom-installers', null, InputOption::VALUE_NONE, 'Whether to disable custom installers.'),
|
||||
new InputOption('no-plugins', null, InputOption::VALUE_NONE, 'Whether to disable plugins.'),
|
||||
new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Whether to prevent execution of all defined scripts in the root package.'),
|
||||
new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'),
|
||||
new InputOption('keep-vcs', null, InputOption::VALUE_NONE, 'Whether to prevent deletion vcs folder.'),
|
||||
|
@ -127,19 +127,19 @@ EOT
|
|||
$preferDist,
|
||||
!$input->getOption('no-dev'),
|
||||
$input->getOption('repository-url'),
|
||||
$input->getOption('no-custom-installers'),
|
||||
$input->getOption('no-plugins'),
|
||||
$input->getOption('no-scripts'),
|
||||
$input->getOption('keep-vcs'),
|
||||
$input->getOption('no-progress')
|
||||
);
|
||||
}
|
||||
|
||||
public function installProject(IOInterface $io, $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repositoryUrl = null, $disableCustomInstallers = false, $noScripts = false, $keepVcs = false, $noProgress = false)
|
||||
public function installProject(IOInterface $io, $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repositoryUrl = null, $disablePlugins = false, $noScripts = false, $keepVcs = false, $noProgress = false)
|
||||
{
|
||||
$oldCwd = getcwd();
|
||||
|
||||
if ($packageName !== null) {
|
||||
$installedFromVcs = $this->installRootPackage($io, $config, $packageName, $directory, $packageVersion, $stability, $preferSource, $preferDist, $installDevPackages, $repositoryUrl, $disableCustomInstallers, $noScripts, $keepVcs, $noProgress);
|
||||
$installedFromVcs = $this->installRootPackage($io, $config, $packageName, $directory, $packageVersion, $stability, $preferSource, $preferDist, $installDevPackages, $repositoryUrl, $disablePlugins, $noScripts, $keepVcs, $noProgress);
|
||||
} else {
|
||||
$installedFromVcs = false;
|
||||
}
|
||||
|
@ -158,8 +158,8 @@ EOT
|
|||
->setDevMode($installDevPackages)
|
||||
->setRunScripts( ! $noScripts);
|
||||
|
||||
if ($disableCustomInstallers) {
|
||||
$installer->disableCustomInstallers();
|
||||
if ($disablePlugins) {
|
||||
$installer->disablePlugins();
|
||||
}
|
||||
|
||||
if (!$installer->run()) {
|
||||
|
@ -226,7 +226,7 @@ EOT
|
|||
return 0;
|
||||
}
|
||||
|
||||
protected function installRootPackage(IOInterface $io, $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repositoryUrl = null, $disableCustomInstallers = false, $noScripts = false, $keepVcs = false, $noProgress = false)
|
||||
protected function installRootPackage(IOInterface $io, $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repositoryUrl = null, $disablePlugins = false, $noScripts = false, $keepVcs = false, $noProgress = false)
|
||||
{
|
||||
$stability = strtolower($stability);
|
||||
if ($stability === 'rc') {
|
||||
|
@ -285,8 +285,8 @@ EOT
|
|||
|
||||
$io->write('<info>Installing ' . $package->getName() . ' (' . VersionParser::formatVersion($package, false) . ')</info>');
|
||||
|
||||
if ($disableCustomInstallers) {
|
||||
$io->write('<info>Custom installers have been disabled.</info>');
|
||||
if ($disablePlugins) {
|
||||
$io->write('<info>Plugins have been disabled.</info>');
|
||||
}
|
||||
|
||||
if (0 === strpos($package->getPrettyVersion(), 'dev-') && in_array($package->getSourceType(), array('git', 'hg'))) {
|
||||
|
|
|
@ -35,7 +35,7 @@ class InstallCommand extends Command
|
|||
new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything (implicitly enables --verbose).'),
|
||||
new InputOption('dev', null, InputOption::VALUE_NONE, 'Enables installation of require-dev packages (enabled by default, only present for BC).'),
|
||||
new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'),
|
||||
new InputOption('no-custom-installers', null, InputOption::VALUE_NONE, 'Disables all custom installers.'),
|
||||
new InputOption('no-plugins', null, InputOption::VALUE_NONE, 'Disables all plugins.'),
|
||||
new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Skips the execution of all scripts defined in composer.json file.'),
|
||||
new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'),
|
||||
new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Shows more details including new commits pulled in when updating packages.'),
|
||||
|
@ -90,8 +90,8 @@ EOT
|
|||
->setOptimizeAutoloader($input->getOption('optimize-autoloader'))
|
||||
;
|
||||
|
||||
if ($input->getOption('no-custom-installers')) {
|
||||
$install->disableCustomInstallers();
|
||||
if ($input->getOption('no-plugins')) {
|
||||
$install->disablePlugins();
|
||||
}
|
||||
|
||||
return $install->run() ? 0 : 1;
|
||||
|
|
|
@ -36,7 +36,7 @@ class UpdateCommand extends Command
|
|||
new InputOption('dev', null, InputOption::VALUE_NONE, 'Enables installation of require-dev packages (enabled by default, only present for BC).'),
|
||||
new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables installation of require-dev packages.'),
|
||||
new InputOption('lock', null, InputOption::VALUE_NONE, 'Only updates the lock file hash to suppress warning about the lock file being out of date.'),
|
||||
new InputOption('no-custom-installers', null, InputOption::VALUE_NONE, 'Disables all custom installers.'),
|
||||
new InputOption('no-plugins', null, InputOption::VALUE_NONE, 'Disables all plugins.'),
|
||||
new InputOption('no-scripts', null, InputOption::VALUE_NONE, 'Skips the execution of all scripts defined in composer.json file.'),
|
||||
new InputOption('no-progress', null, InputOption::VALUE_NONE, 'Do not output download progress.'),
|
||||
new InputOption('verbose', 'v|vv|vvv', InputOption::VALUE_NONE, 'Shows more details including new commits pulled in when updating packages.'),
|
||||
|
@ -96,8 +96,8 @@ EOT
|
|||
->setUpdateWhitelist($input->getOption('lock') ? array('lock') : $input->getArgument('packages'))
|
||||
;
|
||||
|
||||
if ($input->getOption('no-custom-installers')) {
|
||||
$install->disableCustomInstallers();
|
||||
if ($input->getOption('no-plugins')) {
|
||||
$install->disablePlugins();
|
||||
}
|
||||
|
||||
return $install->run() ? 0 : 1;
|
||||
|
|
|
@ -370,7 +370,7 @@ class Factory
|
|||
{
|
||||
$im->addInstaller(new Installer\LibraryInstaller($io, $composer, null));
|
||||
$im->addInstaller(new Installer\PearInstaller($io, $composer, 'pear-library'));
|
||||
$im->addInstaller(new Installer\InstallerInstaller($io, $composer));
|
||||
$im->addInstaller(new Installer\PluginInstaller($io, $composer));
|
||||
$im->addInstaller(new Installer\MetapackageInstaller($io));
|
||||
}
|
||||
|
||||
|
|
|
@ -461,7 +461,7 @@ class Installer
|
|||
$this->io->write('Nothing to install or update');
|
||||
}
|
||||
|
||||
$operations = $this->moveCustomInstallersToFront($operations);
|
||||
$operations = $this->movePluginsToFront($operations);
|
||||
|
||||
foreach ($operations as $operation) {
|
||||
// collect suggestions
|
||||
|
@ -540,7 +540,7 @@ class Installer
|
|||
|
||||
|
||||
/**
|
||||
* Workaround: if your packages depend on custom installers, we must be sure
|
||||
* Workaround: if your packages depend on plugins, we must be sure
|
||||
* that those are installed / updated first; else it would lead to packages
|
||||
* being installed multiple times in different folders, when running Composer
|
||||
* twice.
|
||||
|
@ -552,7 +552,7 @@ class Installer
|
|||
* @param OperationInterface[] $operations
|
||||
* @return OperationInterface[] reordered operation list
|
||||
*/
|
||||
private function moveCustomInstallersToFront(array $operations)
|
||||
private function movePluginsToFront(array $operations)
|
||||
{
|
||||
$installerOps = array();
|
||||
foreach ($operations as $idx => $op) {
|
||||
|
@ -564,7 +564,7 @@ class Installer
|
|||
continue;
|
||||
}
|
||||
|
||||
if ($package->getRequires() === array() && $package->getType() === 'composer-installer') {
|
||||
if ($package->getRequires() === array() && ($package->getType() === 'composer-plugin' || $package->getType() === 'composer-installer')) {
|
||||
$installerOps[] = $op;
|
||||
unset($operations[$idx]);
|
||||
}
|
||||
|
@ -1055,7 +1055,7 @@ class Installer
|
|||
}
|
||||
|
||||
/**
|
||||
* Disables custom installers.
|
||||
* Disables plugins.
|
||||
*
|
||||
* Call this if you want to ensure that third-party code never gets
|
||||
* executed. The default is to automatically install, and execute
|
||||
|
@ -1063,9 +1063,9 @@ class Installer
|
|||
*
|
||||
* @return Installer
|
||||
*/
|
||||
public function disableCustomInstallers()
|
||||
public function disablePlugins()
|
||||
{
|
||||
$this->installationManager->disableCustomInstallers();
|
||||
$this->installationManager->disablePlugins();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
|
|
@ -66,16 +66,16 @@ class InstallationManager
|
|||
}
|
||||
|
||||
/**
|
||||
* Disables custom installers.
|
||||
* Disables plugins.
|
||||
*
|
||||
* We prevent any custom installers from being instantiated by simply
|
||||
* We prevent any plugins from being instantiated by simply
|
||||
* deactivating the installer for them. This ensure that no third-party
|
||||
* code is ever executed.
|
||||
*/
|
||||
public function disableCustomInstallers()
|
||||
public function disablePlugins()
|
||||
{
|
||||
foreach ($this->installers as $i => $installer) {
|
||||
if (!$installer instanceof InstallerInstaller) {
|
||||
if (!$installer instanceof PluginInstaller) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ use Composer\Package\PackageInterface;
|
|||
*
|
||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||
*/
|
||||
class InstallerInstaller extends LibraryInstaller
|
||||
class PluginInstaller extends LibraryInstaller
|
||||
{
|
||||
private $installationManager;
|
||||
private static $classCounter = 0;
|
||||
|
@ -37,7 +37,7 @@ class InstallerInstaller extends LibraryInstaller
|
|||
*/
|
||||
public function __construct(IOInterface $io, Composer $composer, $type = 'library')
|
||||
{
|
||||
parent::__construct($io, $composer, 'composer-installer');
|
||||
parent::__construct($io, $composer, $type);
|
||||
$this->installationManager = $composer->getInstallationManager();
|
||||
|
||||
$repo = $composer->getRepositoryManager()->getLocalRepository();
|
||||
|
@ -45,6 +45,9 @@ class InstallerInstaller extends LibraryInstaller
|
|||
if ('composer-installer' === $package->getType()) {
|
||||
$this->registerInstaller($package);
|
||||
}
|
||||
if ('composer-plugin' === $package->getType()) {
|
||||
$this->registerInstaller($package);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -55,7 +58,7 @@ class InstallerInstaller extends LibraryInstaller
|
|||
{
|
||||
$extra = $package->getExtra();
|
||||
if (empty($extra['class'])) {
|
||||
throw new \UnexpectedValueException('Error while installing '.$package->getPrettyName().', composer-installer packages should have a class defined in their extra key to be usable.');
|
||||
throw new \UnexpectedValueException('Error while installing '.$package->getPrettyName().', composer-plugin packages should have a class defined in their extra key to be usable.');
|
||||
}
|
||||
|
||||
parent::install($repo, $package);
|
||||
|
@ -69,7 +72,7 @@ class InstallerInstaller extends LibraryInstaller
|
|||
{
|
||||
$extra = $target->getExtra();
|
||||
if (empty($extra['class'])) {
|
||||
throw new \UnexpectedValueException('Error while installing '.$target->getPrettyName().', composer-installer packages should have a class defined in their extra key to be usable.');
|
||||
throw new \UnexpectedValueException('Error while installing '.$target->getPrettyName().', composer-plugin packages should have a class defined in their extra key to be usable.');
|
||||
}
|
||||
|
||||
parent::update($repo, $initial, $target);
|
|
@ -8,8 +8,8 @@ Composer installers are installed first if they have no requirements
|
|||
"package": [
|
||||
{ "name": "pkg", "version": "1.0.0" },
|
||||
{ "name": "pkg2", "version": "1.0.0" },
|
||||
{ "name": "inst", "version": "1.0.0", "type": "composer-installer" },
|
||||
{ "name": "inst2", "version": "1.0.0", "type": "composer-installer", "require": { "pkg2": "*" } }
|
||||
{ "name": "inst", "version": "1.0.0", "type": "composer-plugin" },
|
||||
{ "name": "inst2", "version": "1.0.0", "type": "composer-plugin", "require": { "pkg2": "*" } }
|
||||
]
|
||||
}
|
||||
],
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "",
|
||||
"version": "1.0.0",
|
||||
"type": "composer-installer",
|
||||
"type": "composer-plugin",
|
||||
"autoload": { "psr-0": { "Installer": "" } },
|
||||
"extra": {
|
||||
"class": "Installer\\Custom"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "",
|
||||
"version": "2.0.0",
|
||||
"type": "composer-installer",
|
||||
"type": "composer-plugin",
|
||||
"autoload": { "psr-0": { "Installer": "" } },
|
||||
"extra": {
|
||||
"class": "Installer\\Custom2"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "",
|
||||
"version": "3.0.0",
|
||||
"type": "composer-installer",
|
||||
"type": "composer-plugin",
|
||||
"autoload": { "psr-0": { "Installer": "" } },
|
||||
"extra": {
|
||||
"class": "Installer\\Custom2"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "",
|
||||
"version": "4.0.0",
|
||||
"type": "composer-installer",
|
||||
"type": "composer-plugin",
|
||||
"autoload": { "psr-0": { "Installer": "" } },
|
||||
"extra": {
|
||||
"class": [
|
||||
|
|
|
@ -14,13 +14,13 @@ namespace Composer\Test\Installer;
|
|||
|
||||
use Composer\Composer;
|
||||
use Composer\Config;
|
||||
use Composer\Installer\InstallerInstaller;
|
||||
use Composer\Installer\PluginInstaller;
|
||||
use Composer\Package\Loader\JsonLoader;
|
||||
use Composer\Package\Loader\ArrayLoader;
|
||||
use Composer\Package\PackageInterface;
|
||||
use Composer\Autoload\AutoloadGenerator;
|
||||
|
||||
class InstallerInstallerTest extends \PHPUnit_Framework_TestCase
|
||||
class PluginInstallerTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
protected $composer;
|
||||
protected $packages;
|
||||
|
@ -81,7 +81,7 @@ class InstallerInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
->expects($this->once())
|
||||
->method('getPackages')
|
||||
->will($this->returnValue(array()));
|
||||
$installer = new InstallerInstallerMock($this->io, $this->composer);
|
||||
$installer = new PluginInstallerMock($this->io, $this->composer);
|
||||
|
||||
$test = $this;
|
||||
$this->im
|
||||
|
@ -101,7 +101,7 @@ class InstallerInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
->method('getPackages')
|
||||
->will($this->returnValue(array()));
|
||||
|
||||
$installer = new InstallerInstallerMock($this->io, $this->composer);
|
||||
$installer = new PluginInstallerMock($this->io, $this->composer);
|
||||
|
||||
$test = $this;
|
||||
|
||||
|
@ -134,7 +134,7 @@ class InstallerInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
->expects($this->exactly(2))
|
||||
->method('hasPackage')
|
||||
->will($this->onConsecutiveCalls(true, false));
|
||||
$installer = new InstallerInstallerMock($this->io, $this->composer);
|
||||
$installer = new PluginInstallerMock($this->io, $this->composer);
|
||||
|
||||
$test = $this;
|
||||
$this->im
|
||||
|
@ -157,7 +157,7 @@ class InstallerInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
->expects($this->exactly(2))
|
||||
->method('hasPackage')
|
||||
->will($this->onConsecutiveCalls(true, false));
|
||||
$installer = new InstallerInstallerMock($this->io, $this->composer);
|
||||
$installer = new PluginInstallerMock($this->io, $this->composer);
|
||||
|
||||
$test = $this;
|
||||
$this->im
|
||||
|
@ -171,7 +171,7 @@ class InstallerInstallerTest extends \PHPUnit_Framework_TestCase
|
|||
}
|
||||
}
|
||||
|
||||
class InstallerInstallerMock extends InstallerInstaller
|
||||
class PluginInstallerMock extends PluginInstaller
|
||||
{
|
||||
public function getInstallPath(PackageInterface $package)
|
||||
{
|
Loading…
Reference in New Issue