1
0
Fork 0

Implemented new option (ignore-missing-metadata) for composer install command

The command allows to slightly change how repository updates are handled during install

In the previous version composer failed to updated if .git|.svn|.hg folder was missing from the package
In the current version, with the option enabled, if the update fails for exactly this reason,
it'll try to remove the package completely and install it from remote
pull/4878/head
bogdan 2016-02-04 03:16:39 +02:00
parent a77e2fb093
commit 581ce91f90
2 changed files with 27 additions and 4 deletions

View File

@ -48,6 +48,7 @@ class InstallCommand extends Command
new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'), new InputOption('optimize-autoloader', 'o', InputOption::VALUE_NONE, 'Optimize autoloader during autoloader dump'),
new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'), new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize-autoloader`.'),
new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore platform requirements (php & ext- packages).'), new InputOption('ignore-platform-reqs', null, InputOption::VALUE_NONE, 'Ignore platform requirements (php & ext- packages).'),
new InputOption('ignore-missing-metadata', null, InputOption::VALUE_NONE, 'Ignore missing .git|.svn|.hg metadata repositories (when updating or reinstalling).'),
new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Should not be provided, use composer require instead to add a given package to composer.json.'), new InputArgument('packages', InputArgument::IS_ARRAY | InputArgument::OPTIONAL, 'Should not be provided, use composer require instead to add a given package to composer.json.'),
)) ))
->setHelp(<<<EOT ->setHelp(<<<EOT
@ -83,6 +84,7 @@ EOT
$composer = $this->getComposer(true, $input->getOption('no-plugins')); $composer = $this->getComposer(true, $input->getOption('no-plugins'));
$composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress')); $composer->getDownloadManager()->setOutputProgress(!$input->getOption('no-progress'));
$composer->getDownloadManager()->setForceUpdate($input->getOption('ignore-missing-metadata'));
$commandEvent = new CommandEvent(PluginEvents::COMMAND, 'install', $input, $output); $commandEvent = new CommandEvent(PluginEvents::COMMAND, 'install', $input, $output);
$composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent); $composer->getEventDispatcher()->dispatch($commandEvent->getName(), $commandEvent);

View File

@ -26,6 +26,7 @@ class DownloadManager
private $io; private $io;
private $preferDist = false; private $preferDist = false;
private $preferSource = false; private $preferSource = false;
private $forceUpdate = false;
private $filesystem; private $filesystem;
private $downloaders = array(); private $downloaders = array();
@ -69,6 +70,20 @@ class DownloadManager
return $this; return $this;
} }
/**
* set force update mode
* forces to update the repository event when missing metadata
*
* @param $forceUpdate
* @return DownloadManager
*/
public function setForceUpdate($forceUpdate)
{
$this->forceUpdate = (boolean) $forceUpdate;
return $this;
}
/** /**
* Sets whether to output download progress information for all registered * Sets whether to output download progress information for all registered
* downloaders * downloaders
@ -250,11 +265,17 @@ class DownloadManager
if ($initialType === $targetType) { if ($initialType === $targetType) {
$target->setInstallationSource($installationSource); $target->setInstallationSource($installationSource);
$downloader->update($initial, $target, $targetDir); try {
} else { $downloader->update($initial, $target, $targetDir);
$downloader->remove($initial, $targetDir); return;
$this->download($target, $targetDir, 'source' === $installationSource); } catch (VcsMissingMetadataException $ex) {
if ($this->forceUpdate === false) {
throw $ex;
}
}
} }
$downloader->remove($initial, $targetDir);
$this->download($target, $targetDir, 'source' === $installationSource);
} }
/** /**