composer = $composer;
$this->io = $io;
}
/**
* Run the uninstall operation.
*/
public function __invoke()
{
$this->io->write(sprintf('Removing %s...', self::PLUGIN_NAME));
$this->removePluginInstall();
$this->removePluginFromComposer();
$this->io->write(' Complete!');
}
/**
* Remove the plugin installation itself.
*/
private function removePluginInstall()
{
$installer = $this->composer->getInstallationManager();
$repository = $this->composer->getRepositoryManager()->getLocalRepository();
$package = $repository->findPackage(self::PLUGIN_NAME, '*');
if (! $package) {
$this->io->write(' Package not installed; nothing to do.');
return;
}
$installer->uninstall($repository, new UninstallOperation($package));
$this->io->write(sprintf(' Removed plugin %s.', self::PLUGIN_NAME));
$this->updateLockFile($repository);
}
/**
* Remove the plugin from the composer.json
*/
private function removePluginFromComposer()
{
$this->io->write(' Removing from composer.json');
$composerJson = $this->getComposerJson();
$json = $composerJson->read();
unset($json['require'][self::PLUGIN_NAME]);
$composerJson->write($json);
}
/**
* Update the lock file
*/
private function updateLockFile(RepositoryInterface $repository)
{
$locker = $this->composer->getLocker();
$allPackages = Collection::create($repository->getPackages())
->reject(function ($package) {
return self::PLUGIN_NAME === $package->getName();
});
$aliases = $allPackages->filter(function ($package) {
return $package instanceof AliasPackage;
});
$devPackages = $allPackages->filter(function ($package) {
return $package->isDev();
});
$packages = $allPackages->filter(function ($package) {
return ! $package instanceof AliasPackage && ! $package->isDev();
});
$platformReqs = $locker->getPlatformRequirements(false);
$platformDevReqs = array_diff($locker->getPlatformRequirements(true), $platformReqs);
$result = $locker->setLockData(
$packages->toArray(),
$devPackages->toArray(),
$platformReqs,
$platformDevReqs,
$aliases->toArray(),
$locker->getMinimumStability(),
$locker->getStabilityFlags(),
$locker->getPreferStable(),
$locker->getPreferLowest(),
$locker->getPlatformOverrides()
);
if (! $result) {
$this->io->write('Unable to update lock file after removal of laminas-skeleton-installer');
}
}
}