protected function execute(InputInterface $input, OutputInterface $output)
{
$processExecutor = new \Composer\Util\ProcessExecutor();
$composerUrl = $input->getArgument('composerUrl');
$repositoryName = $input->getArgument('name');
$repositoryUrl = rtrim($input->getOption('base-url'), '/') . '/' . $repositoryName;
$targetDir = rtrim($input->getOption('base-dir'), '/') . '/' . $repositoryName;
$cacheDir = rtrim($input->getOption('cache-dir'), '/') . '/' . $repositoryName;
if ($input->getOption('clean-cache')) {
$output->writeln('Cleaning cached sources');
$processExecutor->execute('rm -rf ' . escapeshellarg($cacheDir));
}
$output->writeln(sprintf('Creating repository "%s"', $repositoryName));
if (!is_dir($cacheDir)) {
mkdir($cacheDir, 0777, true);
}
putenv('COMPOSER_VENDOR_DIR=' . $cacheDir);
putenv('COMPOSER_BIN_DIR=' . $cacheDir . '/bin');
$output->writeln(sprintf('Loading composer file "%s"', $composerUrl));
$json = new \Composer\Json\JsonFile($composerUrl);
$jsonData = $originalJsonData = $json->read();
// if 'require-only-dependencies-of' is found, rewrite json data to composer format
if (isset($originalJsonData['require-only-dependencies-of'])) {
$jsonData['require'] += $jsonData['require-only-dependencies-of'];
unset($jsonData['require-only-dependencies-of']);
$composerUrl = $cacheDir . '/broker.json';
$composerJson = new \Composer\Json\JsonFile($composerUrl);
$composerJson->write($jsonData);
}
$io = new \Composer\IO\ConsoleIO($input, $output, $this->getHelperSet());
$composer = \Composer\Factory::create($io, $composerUrl);
/*
* add custom pear installer to fix binary and setup issues
*/
$customPearInstaller = new \rg\broker\customizations\PearInstaller($io, $composer, 'pear-library');
$composer->getInstallationManager()->addInstaller($customPearInstaller);
$composer->setLocker(new \rg\broker\customizations\Locker());
$installer = \Composer\Installer::create($io, $composer);
$installer->setRunScripts(false);
$installer->setPreferDist(true);
$installer->setUpdate(true);
if (!$installer->run()) {
$output->writeln('Composer installer failed!');
return 1;
}
if (file_exists($targetDir)) {
$processExecutor->execute('rm -rf ' . $targetDir);
}
mkdir($targetDir, 0777, true);
mkdir($targetDir . '/dists');
$packages = array('packages' => array());
$dumper = new \Composer\Package\Dumper\ArrayDumper();
$installedPackages = $this->getInstalledPackages($cacheDir);
$localRepo = $composer->getRepositoryManager()->getLocalRepository();
$output->writeln('Creating dists for packages');
foreach ($installedPackages as $installedPackage) {
/** @var \Composer\Package\PackageInterface $package */
$package = $localRepo->findPackage($installedPackage['name'], $installedPackage['version']);
// skip if package was in 'require-only-dependencies-of' section
if (isset($originalJsonData['require-only-dependencies-of'][$package->getName()]) || isset($originalJsonData['require-only-dependencies-of'][$package->getPrettyName()])) {
continue;
}
$zipfileName = $this->createZipFile($cacheDir, $targetDir, $package, $output, $processExecutor);
$packageArray = $this->getPackageArray($targetDir, $repositoryUrl, $dumper, $package, $zipfileName);
$packages['packages'][$package->getPrettyName()][$package->getPrettyVersion()] = $packageArray;
}
ksort($packages['packages'], SORT_STRING);
$output->writeln('Writing packages.json');
$repoJson = new \Composer\Json\JsonFile($targetDir . '/packages.json');
$repoJson->write($packages);
}