public function testGetModules() { $filesystemTmp = CM_Service_Manager::getInstance()->getFilesystems()->getTmp(); $dirRoot = $filesystemTmp->getAdapter()->getPathPrefix() . '/foo-app/'; $composerFile = new \Composer\Json\JsonFile($dirRoot . 'composer.json'); $composerFile->write(array('name' => 'foo/bar', 'require' => array('cargomedia/cm' => '*'), 'extra' => ['cm-modules' => ['Package' => ['path' => 'package/']]])); $filesystemTmp->ensureDirectory('foo-app/vendor/composer/'); $installedFile = new \Composer\Json\JsonFile($dirRoot . 'vendor/composer/installed.json'); $installedFile->write([['name' => 'cargomedia/cm', 'version' => '1.3.10', 'type' => 'library', 'extra' => ['cm-modules' => ['CM' => ['path' => '']]], 'autoload' => ['psr-0' => ['CM_' => 'library/']]]]); $installation = new CM_App_Installation($dirRoot); $expectedModules = [new CM_App_Module('CM', 'vendor/cargomedia/cm/'), new CM_App_Module('Package', 'package/')]; $this->assertEquals($expectedModules, $installation->getModules()); }
#!/usr/bin/env php <?php require_once __DIR__ . '/vendor/autoload.php'; $args = array_reverse($argv); $version = array_shift($args); $package_name = array_shift($args); print 'Update: ' . $package_name . ' - ' . $version . PHP_EOL; if (empty($package_name) || empty($version)) { return; } $filepath = $_SERVER['PWD'] . '/composer.lock'; $composer_lock = json_decode(file_get_contents($filepath), TRUE); $write = FALSE; if (isset($composer_lock['packages'])) { foreach ($composer_lock['packages'] as &$package) { if ($package['name'] == $package_name) { $git_url = $package['source']['url']; $output = shell_exec('git ls-remote ' . $git_url . ' ' . $version); $hash = substr($output, 0, 40); print $hash . PHP_EOL; $package['source']['reference'] = $hash; $package['time'] = date('Y-m-d H:i:s'); $write = TRUE; } } } if ($write) { file_put_contents($filepath, json_encode($composer_lock, 448 & 128)); $file = new \Composer\Json\JsonFile($filepath); $file->write($composer_lock); }
/** * @param array $hash */ private function _writeToComposerFile(array $hash) { $composerFile = new Composer\Json\JsonFile($this->_installation->getDirRoot() . 'composer.json'); $configCurrent = $composerFile->read(); $this->_filesystemHelper->notify('modify', 'composer.json'); $configMerged = $this->_mergeConfigs($configCurrent, $hash); $composerFile->write($configMerged); $this->_installation->reload(); }
/** * @param \Symfony\Component\Console\Input\InputInterface $input * @param \Symfony\Component\Console\Output\OutputInterface $output */ 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); }
/** * @throws CM_Exception_Invalid * @throws Exception * @throws \Mocka\Exception * @return CM_Tools_AppInstallation|\Mocka\AbstractClassTrait */ private function _mockAppInstallation() { $appName = uniqid('foo-app-'); $filesystemTmp = CM_Service_Manager::getInstance()->getFilesystems()->getTmp(); $dirRoot = $filesystemTmp->getAdapter()->getPathPrefix() . '/' . $appName . '/'; $frameworkLocal = DIR_ROOT . CM_Bootloader::getInstance()->getModulePath('CM'); $frameworkTest = $dirRoot . 'vendor/cargomedia/cm'; $filesystemTmp->ensureDirectory("{$appName}/vendor/cargomedia"); if (false === symlink($frameworkLocal, $frameworkTest)) { throw new CM_Exception_Invalid('Symlink failed to be created'); } $composerFile = new \Composer\Json\JsonFile($dirRoot . 'composer.json'); $composerFile->write(array('name' => 'foo/bar', 'require' => array('cargomedia/cm' => '*'))); $filesystemTmp->ensureDirectory("{$appName}/vendor/composer/"); $installedFile = new \Composer\Json\JsonFile($dirRoot . 'vendor/composer/installed.json'); $installedFile->write([['name' => 'cargomedia/cm', 'version' => '1.3.10', 'type' => 'library', 'extra' => ['cm-modules' => ['CM' => ['path' => '']]], 'autoload' => ['psr-0' => ['CM_' => 'library/']]]]); return $this->mockObject('CM_Tools_AppInstallation', [$dirRoot]); }