protected function createPackage($extra) { $package = new CompletePackage('test/package', '1.0.0.0', '1.0.0'); $package->setExtra($extra); $package->setTargetDir('Some/Namespace'); return $package; }
/** * @api */ public function __construct(\Composer\Package\CompletePackage $pkgInstance = null) { parent::__construct(); $this->packageInstance = $pkgInstance; if ($pkgInstance) { $this->composerPackageName = $pkgInstance->getName(); } $this->type = Event\TYPE_BROADCAST_POST_ORDER; }
public function latest(CompletePackage $package) { $response = json_decode($this->client->get('/packages/' . $package->getName() . '.json')->send()->getBody(), true); $versions = $response['package']['versions']; $stability = VersionParser::parseStability($package->getPrettyVersion()); $versions = $this->trim->trim($versions, $stability); $versions = $this->sort->nameSort($versions); return array_shift($versions); }
/** * Get the directory name from the package's type * * @param CompletePackage $package * * @return string|bool */ protected static function getDirectoryType($package) { switch ($package->getType()) { case "wordpress-muplugin": return 'mu-plugins'; case "wordpress-plugin": return 'plugins'; case "wordpress-theme": return 'themes'; default: return false; } }
/** * Merge suggested packages into a RootPackage * * @param RootPackage $root */ protected function mergeSuggests(RootPackage $root) { $suggests = $this->package->getSuggests(); if (!empty($suggests)) { $root->setSuggests(array_merge($root->getSuggests(), $suggests)); } }
public function testRun() { $app = $this->getApp(); $testPackage = new CompletePackage('test', '1.0.1', '1.0'); $testPackage->setDescription('An extension'); $testPackage->setType('bolt-extension'); $runner = $this->getMockBuilder(PackageManager::class)->setMethods(['showPackage'])->setConstructorArgs([$app])->getMock(); $runner->expects($this->any())->method('showPackage')->will($this->returnValue(['test' => ['package' => $testPackage]])); $app['extend.manager'] = $runner; $command = new Extensions($app); $tester = new CommandTester($command); $tester->execute([]); $result = $tester->getDisplay(); $this->assertRegExp('/Name.*Version/', $result); $this->assertRegExp('/test.*1.0/', $result); }
public function testRun() { $app = $this->getApp(); $testPackage = new CompletePackage('test', '1.0.1', '1.0'); $testPackage->setDescription('An extension'); $testPackage->setType('bolt-extension'); $runner = $this->getMock("Bolt\\Composer\\PackageManager", array('showPackage'), array($app)); $runner->expects($this->any())->method('showPackage')->will($this->returnValue(array('test' => array('package' => $testPackage)))); $app['extend.manager'] = $runner; $command = new Extensions($app); $command->setHelperSet(new HelperSet(array(new TableHelper()))); $tester = new CommandTester($command); $tester->execute(array()); $result = $tester->getDisplay(); $this->assertRegexp('/Name.*Version/', $result); $this->assertRegexp('/test.*1.0/', $result); }
/** * @dataProvider dataAbandoned * * @param bool|string $abandoned * @param string $expected */ public function testAbandoned($abandoned, $expected) { $webBuilder = new WebBuilder(new NullOutput(), vfsStream::url('build'), [], false); $webBuilder->setRootPackage($this->rootPackage); $this->package->setAbandoned($abandoned); $webBuilder->dump([$this->package]); $html = $this->root->getChild('build/index.html')->getContent(); $this->assertRegExp('/Package is abandoned, you should avoid using it/', $html); $this->assertRegExp($expected, $html); }
/** * Filter the package to add dist and other meta information. */ function filterPackage(CompletePackage $package) { list($vendor, $shortName) = explode('/', $package->getName()); if (($themeInfo = $this->getThemeInfo()) && isset($themeInfo[$shortName])) { $info = $themeInfo[$shortName]; // set the dist info $package->setDistType('zip'); $package->setDistUrl($info['download_uri']); // additional meta info $package->setDescription($info['description']); $package->setAuthors([['name' => $info['author'], 'homepage' => $info['author_uri']]]); $package->setHomepage($info['theme_uri']); // is this theme retired? if (in_array($shortName, $this->getRetiredThemes())) { $package->setAbandoned(true); } } }
/** * Merge extra config into a RootPackageInterface * * @param RootPackageInterface $root * @param PluginState $state */ public function mergeExtra(RootPackageInterface $root, PluginState $state) { $extra = $this->package->getExtra(); unset($extra['merge-plugin']); if (!$state->shouldMergeExtra() || empty($extra)) { return; } $rootExtra = $root->getExtra(); $unwrapped = self::unwrapIfNeeded($root, 'setExtra'); if ($state->replaceDuplicateLinks()) { $unwrapped->setExtra(array_merge($rootExtra, $extra)); } else { foreach (array_intersect(array_keys($extra), array_keys($rootExtra)) as $key) { $this->logger->info("Ignoring duplicate <comment>{$key}</comment> in " . "<comment>{$this->path}</comment> extra config."); } $unwrapped->setExtra(array_merge($extra, $rootExtra)); } }
static function filterPackage(CompletePackage $package) { // strip out "tags", slashes, and spaces $version = preg_replace('/tags|[\\/ ]/', '', $package->getSourceReference()); // trunk does not have a dist version if ($version !== 'trunk') { // set the dist info $package->setDistType('zip'); // if there is a version identifier, prepend with a period $version = "-{$version}"; // set the dist url $package->setDistUrl('https://wordpress.org/wordpress' . urlencode($version) . '.zip'); } // set some additional meta info // this is inconsequential to the solver, but it gets stored in composer.lock // and appears when running `composer show vendor/package` $package->setDescription('WordPress is web software you can use to create a beautiful website, blog, or app.'); $package->setSupport(['forum' => 'https://wordpress.org/support/', 'source' => 'https://core.trac.wordpress.org/browser/' . $package->getSourceReference(), 'docs' => 'https://codex.wordpress.org/Main_Page']); $package->setHomepage('https://wordpress.org/'); }
/** * Merge extra config into a RootPackage * * @param RootPackage $root * @param PluginState $state */ public function mergeExtra(RootPackage $root, PluginState $state) { $extra = $this->package->getExtra(); unset($extra['merge-plugin']); if (!$state->shouldMergeExtra() || empty($extra)) { return; } $rootExtra = $root->getExtra(); if ($state->replaceDuplicateLinks()) { $root->setExtra(array_merge($rootExtra, $extra)); } else { foreach ($extra as $key => $value) { if (isset($rootExtra[$key])) { $this->logger->debug("Ignoring duplicate <comment>{$key}</comment> in " . "<comment>{$this->path}</comment> extra config."); } } $root->setExtra(array_merge($extra, $rootExtra)); } }
/** * @param \Composer\Package\CompletePackage $package * @return CM_App_Package * @throws CM_Exception_Invalid */ protected function _getPackageFromComposerPackage(\Composer\Package\CompletePackage $package) { $pathRelative = ''; if (!$package instanceof \Composer\Package\RootPackage) { $vendorDir = $this->_getComposerVendorDir(); $pathRelative = $vendorDir . $package->getPrettyName() . '/'; } $extra = $package->getExtra(); $modules = array(); if (array_key_exists('cm-modules', $extra)) { $modules = $extra['cm-modules']; } return new CM_App_Package($package->getName(), $pathRelative, $modules); }
/** * construct a folder to where magerun will download the source to, cache git/hg repositories under COMPOSER_HOME * * @param Composer $composer * @param CompletePackage $package * @param $installationFolder * * @return string */ protected function getTargetFolderByType(Composer $composer, CompletePackage $package, $installationFolder) { $type = $package->getSourceType(); if ($this->isSourceTypeRepository($type)) { $targetPath = sprintf('%s/%s/%s/%s', $composer->getConfig()->get('cache-dir'), '_n98_magerun_download', $type, preg_replace('{[^a-z0-9.]}i', '-', $package->getSourceUrl())); } else { $targetPath = sprintf('%s/%s', $installationFolder, '_n98_magerun_download'); } return $targetPath; }
/** * {@inheritdoc} */ public function getSupport() { $this->initialize(); return parent::getSupport(); }
/** * Returns the list of installed plugin packages, with extra information * relative to their options. Local packages (i.e. not manager by composer) * are also included in the list. * * @return CompletePackageInterface[] */ public function getPluginList() { $repoPackages = $this->getInstalledByType(self::CLAROLINE_PLUGIN_TYPE); $registeredPlugins = $this->om->getRepository('ClarolineCoreBundle:Plugin')->findAll(); $packages = []; foreach ($registeredPlugins as $plugin) { $targetPackage = null; $isInRepo = true; // looks for the corresponding package foreach ($repoPackages as $package) { $packageParts = explode('/', $package->getName()); $bundleParts = explode('-', $packageParts[1]); $vendorName = $packageParts[0]; $bundleName = ''; foreach ($bundleParts as $part) { $bundleName .= $part; } if (strtoupper($plugin->getVendorName()) === strtoupper($vendorName) && strtoupper($plugin->getBundleName()) === strtoupper($bundleName)) { $targetPackage = $package; break; } } // builds a "fake" package if the plugin is not managed by composer if (!$targetPackage) { $isInRepo = false; $vendorName = strtolower($plugin->getVendorName()); $bundleParts = preg_split('/(?=[A-Z])/', $plugin->getBundleName()); array_shift($bundleParts); $bundleName = strtolower(implode('-', $bundleParts)); $targetPackage = new CompletePackage("{$vendorName}/{$bundleName}", '9999999-dev', 'unknown / local'); } // adds plugin options info in the "extra" attribute $extra = $targetPackage->getExtra(); $extra['is_in_repo'] = $isInRepo; $extra['has_options'] = $plugin->hasOptions(); $extra['plugin_short_name'] = $plugin->getShortName(); $targetPackage->setExtra($extra); $packages[] = $targetPackage; } return $packages; }
private function buildComposerPackages(ChannelInfo $channelInfo, VersionParser $versionParser) { $result = array(); foreach ($channelInfo->getPackages() as $packageDefinition) { foreach ($packageDefinition->getReleases() as $version => $releaseInfo) { try { $normalizedVersion = $versionParser->normalize($version); } catch (\UnexpectedValueException $e) { if ($this->io->isVerbose()) { $this->io->write('Could not load ' . $packageDefinition->getPackageName() . ' ' . $version . ': ' . $e->getMessage()); } continue; } $composerPackageName = $this->buildComposerPackageName($packageDefinition->getChannelName(), $packageDefinition->getPackageName()); $urlBits = parse_url($this->url); $scheme = isset($urlBits['scheme']) && 'https' === $urlBits['scheme'] && extension_loaded('openssl') ? 'https' : 'http'; $distUrl = "{$scheme}://{$packageDefinition->getChannelName()}/get/{$packageDefinition->getPackageName()}-{$version}.tgz"; $requires = array(); $suggests = array(); $conflicts = array(); $replaces = array(); if ($channelInfo->getName() == $packageDefinition->getChannelName()) { $composerPackageAlias = $this->buildComposerPackageName($channelInfo->getAlias(), $packageDefinition->getPackageName()); $aliasConstraint = new VersionConstraint('==', $normalizedVersion); $replaces[] = new Link($composerPackageName, $composerPackageAlias, $aliasConstraint, 'replaces', (string) $aliasConstraint); } if (!empty($this->vendorAlias) && ($this->vendorAlias != 'pear-' . $channelInfo->getAlias() || $channelInfo->getName() != $packageDefinition->getChannelName())) { $composerPackageAlias = "{$this->vendorAlias}/{$packageDefinition->getPackageName()}"; $aliasConstraint = new VersionConstraint('==', $normalizedVersion); $replaces[] = new Link($composerPackageName, $composerPackageAlias, $aliasConstraint, 'replaces', (string) $aliasConstraint); } foreach ($releaseInfo->getDependencyInfo()->getRequires() as $dependencyConstraint) { $dependencyPackageName = $this->buildComposerPackageName($dependencyConstraint->getChannelName(), $dependencyConstraint->getPackageName()); $constraint = $versionParser->parseConstraints($dependencyConstraint->getConstraint()); $link = new Link($composerPackageName, $dependencyPackageName, $constraint, $dependencyConstraint->getType(), $dependencyConstraint->getConstraint()); switch ($dependencyConstraint->getType()) { case 'required': $requires[] = $link; break; case 'conflicts': $conflicts[] = $link; break; case 'replaces': $replaces[] = $link; break; } } foreach ($releaseInfo->getDependencyInfo()->getOptionals() as $group => $dependencyConstraints) { foreach ($dependencyConstraints as $dependencyConstraint) { $dependencyPackageName = $this->buildComposerPackageName($dependencyConstraint->getChannelName(), $dependencyConstraint->getPackageName()); $suggests[$group . '-' . $dependencyPackageName] = $dependencyConstraint->getConstraint(); } } $package = new CompletePackage($composerPackageName, $normalizedVersion, $version); $package->setType('pear-library'); $package->setDescription($packageDefinition->getDescription()); $package->setDistType('file'); $package->setDistUrl($distUrl); $package->setAutoload(array('classmap' => array(''))); $package->setIncludePaths(array('/')); $package->setRequires($requires); $package->setConflicts($conflicts); $package->setSuggests($suggests); $package->setReplaces($replaces); $result[] = $package; } } return $result; }
/** * Group packages in a repository by vendor and return a sorted and grouped list. * * @param RepositoryInterface $repository * * @return array */ protected function buildGroupedPackagesList(RootPackageInterface $rootPackage, RepositoryInterface $repository, $requiresList, $dependencyMap, $notInstalledList) { $groupedPackages = array(); $requires = $rootPackage->getRequires(); $extra = $rootPackage->getExtra(); $versionLocks = isset($extra['contao']['version-locks']) ? (array) $extra['contao']['version-locks'] : array(); /** @var \Composer\Package\PackageInterface $package */ foreach ($repository->getPackages() as $package) { // skip aliases if ($package instanceof AliasPackage) { continue; } $name = $package->getPrettyName(); list($group) = explode('/', $name); $dependencyOf = false; if (isset($dependencyMap[$package->getName()])) { $dependencyOf = $dependencyMap[$package->getName()]; } if (count($package->getReplaces())) { foreach (array_keys($package->getReplaces()) as $replace) { if (isset($dependencyMap[$replace])) { $dependencyOf = $dependencyMap[$replace]; break; } } } $item = (object) array('group' => $group, 'name' => $package->getPrettyName(), 'package' => $package, 'dependencyOf' => $dependencyOf, 'installing' => false, 'removeable' => in_array($name, $requiresList), 'removing' => !in_array($name, $requiresList) && !isset($dependencyMap[$name]), 'pinable' => $package->getStability() != 'dev', 'pinned' => array_key_exists($name, $versionLocks), 'versionConstraint' => $this->createConstraint('=', $package->getVersion()), 'requireConstraint' => isset($requires[$package->getName()]) ? $requires[$package->getName()]->getConstraint() : false); if (isset($groupedPackages[$group])) { $groupedPackages[$group][] = $item; } else { $groupedPackages[$group] = array($item); } } /** @var Link $notInstalledPackageConstraint */ foreach ($notInstalledList as $notInstalledPackageName => $notInstalledPackageConstraint) { list($group) = explode('/', $notInstalledPackageName); $package = new CompletePackage($notInstalledPackageName, $notInstalledPackageConstraint->getPrettyConstraint(), $notInstalledPackageConstraint->getPrettyConstraint()); $item = (object) array('group' => $group, 'name' => $notInstalledPackageName, 'version' => $notInstalledPackageConstraint->getPrettyConstraint(), 'package' => $package, 'dependencyOf' => false, 'installing' => true, 'removeable' => true, 'removing' => false, 'pinable' => false, 'pinned' => false, 'versionConstraint' => $this->createConstraint('=', $package->getVersion()), 'requireConstraint' => false); if (isset($groupedPackages[$group])) { $groupedPackages[$group][] = $item; } else { $groupedPackages[$group] = array($item); } } foreach (array_keys($groupedPackages) as $group) { usort($groupedPackages[$group], function ($a, $b) { return strnatcasecmp($a->package->getPrettyName(), $b->package->getPrettyName()); }); } uksort($groupedPackages, 'strnatcasecmp'); return $groupedPackages; }
protected function initialize() { parent::initialize(); $versionParser = new VersionParser(); try { $prettyVersion = PHP_VERSION; $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = preg_replace('#^(.+?)(-.+)?$#', '$1', PHP_VERSION); $version = $versionParser->normalize($prettyVersion); } $php = new CompletePackage('php', $version, $prettyVersion); $php->setDescription('The PHP interpreter'); parent::addPackage($php); $loadedExtensions = get_loaded_extensions(); // Extensions scanning foreach ($loadedExtensions as $name) { if (in_array($name, array('standard', 'Core'))) { continue; } $reflExt = new \ReflectionExtension($name); try { $prettyVersion = $reflExt->getVersion(); $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = '0'; $version = $versionParser->normalize($prettyVersion); } $ext = new CompletePackage('ext-' . $name, $version, $prettyVersion); $ext->setDescription('The ' . $name . ' PHP extension'); parent::addPackage($ext); } // Another quick loop, just for possible libraries // Doing it this way to know that functions or constants exist before // relying on them. foreach ($loadedExtensions as $name) { switch ($name) { case 'curl': $curlVersion = curl_version(); $prettyVersion = $curlVersion['version']; break; case 'iconv': $prettyVersion = ICONV_VERSION; break; case 'libxml': $prettyVersion = LIBXML_DOTTED_VERSION; break; case 'openssl': $prettyVersion = preg_replace_callback('{^(?:OpenSSL\\s*)?([0-9.]+)([a-z]?).*}', function ($match) { return $match[1] . (empty($match[2]) ? '' : '.' . (ord($match[2]) - 96)); }, OPENSSL_VERSION_TEXT); break; case 'pcre': $prettyVersion = preg_replace('{^(\\S+).*}', '$1', PCRE_VERSION); break; case 'uuid': $prettyVersion = phpversion('uuid'); break; case 'xsl': $prettyVersion = LIBXSLT_DOTTED_VERSION; break; default: // None handled extensions have no special cases, skip continue 2; } try { $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { continue; } $lib = new CompletePackage('lib-' . $name, $version, $prettyVersion); $lib->setDescription('The ' . $name . ' PHP library'); parent::addPackage($lib); } }
/** * Add some package meta info. */ static function filterPackage(CompletePackage $package) { // set the VIP plugins landing page as the homepage as some do not have individual overview pages $package->setHomepage('https://vip.wordpress.com/plugins/'); }
/** * @dataProvider dataSetSelectedAsAbandoned * * @param array $expected * @param array $config */ public function testSetSelectedAsAbandoned($expected, $config) { $package = new CompletePackage('vendor/name', '1.0.0.0', '1.0'); $builder = new PackageSelection(new NullOutput(), 'build', ['abandoned' => $config], false); $reflection = new \ReflectionClass(get_class($builder)); $method = $reflection->getMethod('setSelectedAsAbandoned'); $method->setAccessible(true); $property = $reflection->getProperty('selected'); $property->setAccessible(true); $property->setValue($builder, [$package->getUniqueName() => $package]); $method->invokeArgs($builder, []); $this->assertEquals($expected, $property->getValue($builder)); }
/** * @param RootPackage $root * @param CompletePackage $package * @param string $path */ protected function mergeAutoload(RootPackage $root, CompletePackage $package, $path) { $autoload = $package->getAutoload(); if (empty($autoload)) { return; } $packagePath = substr($path, 0, strrpos($path, '/') + 1); array_walk_recursive($autoload, function (&$path) use($packagePath) { $path = $packagePath . $path; }); $root->setAutoload(array_merge_recursive($root->getAutoload(), $autoload)); }
protected function initialize() { parent::initialize(); $versionParser = new VersionParser(); $prettyVersion = PluginInterface::PLUGIN_API_VERSION; $version = $versionParser->normalize($prettyVersion); $composerPluginApi = new CompletePackage('composer-plugin-api', $version, $prettyVersion); $composerPluginApi->setDescription('The Composer Plugin API'); parent::addPackage($composerPluginApi); try { $prettyVersion = PHP_VERSION; $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = preg_replace('#^([^~+-]+).*$#', '$1', PHP_VERSION); $version = $versionParser->normalize($prettyVersion); } $php = new CompletePackage('php', $version, $prettyVersion); $php->setDescription('The PHP interpreter'); parent::addPackage($php); if (PHP_INT_SIZE === 8) { $php64 = new CompletePackage('php-64bit', $version, $prettyVersion); $php64->setDescription('The PHP interpreter (64bit)'); parent::addPackage($php64); } $loadedExtensions = get_loaded_extensions(); foreach ($loadedExtensions as $name) { if (in_array($name, array('standard', 'Core'))) { continue; } $reflExt = new \ReflectionExtension($name); try { $prettyVersion = $reflExt->getVersion(); $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = '0'; $version = $versionParser->normalize($prettyVersion); } $packageName = $this->buildPackageName($name); $ext = new CompletePackage($packageName, $version, $prettyVersion); $ext->setDescription('The ' . $name . ' PHP extension'); parent::addPackage($ext); } foreach ($loadedExtensions as $name) { $prettyVersion = null; switch ($name) { case 'curl': $curlVersion = curl_version(); $prettyVersion = $curlVersion['version']; break; case 'iconv': $prettyVersion = ICONV_VERSION; break; case 'intl': $name = 'ICU'; if (defined('INTL_ICU_VERSION')) { $prettyVersion = INTL_ICU_VERSION; } else { $reflector = new \ReflectionExtension('intl'); ob_start(); $reflector->info(); $output = ob_get_clean(); preg_match('/^ICU version => (.*)$/m', $output, $matches); $prettyVersion = $matches[1]; } break; case 'libxml': $prettyVersion = LIBXML_DOTTED_VERSION; break; case 'openssl': $prettyVersion = preg_replace_callback('{^(?:OpenSSL\\s*)?([0-9.]+)([a-z]?).*}', function ($match) { return $match[1] . (empty($match[2]) ? '' : '.' . (ord($match[2]) - 96)); }, OPENSSL_VERSION_TEXT); break; case 'pcre': $prettyVersion = preg_replace('{^(\\S+).*}', '$1', PCRE_VERSION); break; case 'uuid': $prettyVersion = phpversion('uuid'); break; case 'xsl': $prettyVersion = LIBXSLT_DOTTED_VERSION; break; default: continue 2; } try { $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { continue; } $lib = new CompletePackage('lib-' . $name, $version, $prettyVersion); $lib->setDescription('The ' . $name . ' PHP library'); parent::addPackage($lib); } if (defined('HHVM_VERSION')) { try { $prettyVersion = HHVM_VERSION; $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = preg_replace('#^([^~+-]+).*$#', '$1', HHVM_VERSION); $version = $versionParser->normalize($prettyVersion); } $hhvm = new CompletePackage('hhvm', $version, $prettyVersion); $hhvm->setDescription('The HHVM Runtime (64bit)'); parent::addPackage($hhvm); } }
public function testDoNotAddInstalledRunOnce3() { RunonceManager::clearRunonces(); $package = new CompletePackage('test/package', '1.0.0.0', '1.0.0'); $package->setExtra(array('contao' => array('sources' => array('test' => 'system/modules/test'), 'runonce' => array('system/runonce.php')))); $package->setTargetDir('Some/Namespace'); RunonceManager::addRunonces($package, $this->rootDir); $this->assertEquals(array(), RunonceManager::getRunonces(), 'Installed runonce has been added.'); $this->assertEmpty(RunonceManager::getRunonces(), 'Installed runonce has been added.'); }
protected function initialize() { parent::initialize(); $versionParser = new VersionParser(); // Add each of the override versions as options. // Later we might even replace the extensions instead. foreach ($this->overrides as $override) { // Check that it's a platform package. if (!preg_match(self::PLATFORM_PACKAGE_REGEX, $override['name'])) { throw new \InvalidArgumentException('Invalid platform package name in config.platform: ' . $override['name']); } $version = $versionParser->normalize($override['version']); $package = new CompletePackage($override['name'], $version, $override['version']); $package->setDescription('Package overridden via config.platform'); $package->setExtra(array('config.platform' => true)); parent::addPackage($package); } $prettyVersion = PluginInterface::PLUGIN_API_VERSION; $version = $versionParser->normalize($prettyVersion); $composerPluginApi = new CompletePackage('composer-plugin-api', $version, $prettyVersion); $composerPluginApi->setDescription('The Composer Plugin API'); $this->addPackage($composerPluginApi); try { $prettyVersion = PHP_VERSION; $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = preg_replace('#^([^~+-]+).*$#', '$1', PHP_VERSION); $version = $versionParser->normalize($prettyVersion); } $php = new CompletePackage('php', $version, $prettyVersion); $php->setDescription('The PHP interpreter'); $this->addPackage($php); if (PHP_INT_SIZE === 8) { $php64 = new CompletePackage('php-64bit', $version, $prettyVersion); $php64->setDescription('The PHP interpreter, 64bit'); $this->addPackage($php64); } $loadedExtensions = get_loaded_extensions(); // Extensions scanning foreach ($loadedExtensions as $name) { if (in_array($name, array('standard', 'Core'))) { continue; } $reflExt = new \ReflectionExtension($name); try { $prettyVersion = $reflExt->getVersion(); $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = '0'; $version = $versionParser->normalize($prettyVersion); } $packageName = $this->buildPackageName($name); $ext = new CompletePackage($packageName, $version, $prettyVersion); $ext->setDescription('The ' . $name . ' PHP extension'); $this->addPackage($ext); } // Another quick loop, just for possible libraries // Doing it this way to know that functions or constants exist before // relying on them. foreach ($loadedExtensions as $name) { $prettyVersion = null; $description = 'The ' . $name . ' PHP library'; switch ($name) { case 'curl': $curlVersion = curl_version(); $prettyVersion = $curlVersion['version']; break; case 'iconv': $prettyVersion = ICONV_VERSION; break; case 'intl': $name = 'ICU'; if (defined('INTL_ICU_VERSION')) { $prettyVersion = INTL_ICU_VERSION; } else { $reflector = new \ReflectionExtension('intl'); ob_start(); $reflector->info(); $output = ob_get_clean(); preg_match('/^ICU version => (.*)$/m', $output, $matches); $prettyVersion = $matches[1]; } break; case 'libxml': $prettyVersion = LIBXML_DOTTED_VERSION; break; case 'openssl': $prettyVersion = preg_replace_callback('{^(?:OpenSSL\\s*)?([0-9.]+)([a-z]*).*}', function ($match) { if (empty($match[2])) { return $match[1]; } // OpenSSL versions add another letter when they reach Z. // e.g. OpenSSL 0.9.8zh 3 Dec 2015 if (!preg_match('{^z*[a-z]$}', $match[2])) { // 0.9.8abc is garbage return 0; } $len = strlen($match[2]); $patchVersion = ($len - 1) * 26; // All Z $patchVersion += ord($match[2][$len - 1]) - 96; return $match[1] . '.' . $patchVersion; }, OPENSSL_VERSION_TEXT); $description = OPENSSL_VERSION_TEXT; break; case 'pcre': $prettyVersion = preg_replace('{^(\\S+).*}', '$1', PCRE_VERSION); break; case 'uuid': $prettyVersion = phpversion('uuid'); break; case 'xsl': $prettyVersion = LIBXSLT_DOTTED_VERSION; break; default: // None handled extensions have no special cases, skip continue 2; } try { $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { continue; } $lib = new CompletePackage('lib-' . $name, $version, $prettyVersion); $lib->setDescription($description); $this->addPackage($lib); } if (defined('HHVM_VERSION')) { try { $prettyVersion = HHVM_VERSION; $version = $versionParser->normalize($prettyVersion); } catch (\UnexpectedValueException $e) { $prettyVersion = preg_replace('#^([^~+-]+).*$#', '$1', HHVM_VERSION); $version = $versionParser->normalize($prettyVersion); } $hhvm = new CompletePackage('hhvm', $version, $prettyVersion); $hhvm->setDescription('The HHVM Runtime (64bit)'); $this->addPackage($hhvm); } }
/** * @param RootPackageInterface $root * @param CompletePackage $package */ protected function mergeDevRequires(RootPackageInterface $root, CompletePackage $package) { $requires = $package->getDevRequires(); if (!$requires) { return; } $this->mergeStabilityFlags($root, $requires); $root->setDevRequires($this->mergeLinks($root->getDevRequires(), $requires, $this->duplicateLinks['require-dev'])); }
/** * Inject the currently installed contao/core as meta package. * * @return void * * @throws ConstantsNotFoundException When the root path could not be determined. */ public function injectContaoCore() { $roots = Environment::findContaoRoots($this->composer->getPackage()); if (0 === count($roots)) { throw new ConstantsNotFoundException('Could not find contao root path and therefore no constants.php'); } // Duplicate installation, remove from vendor folder $removeVendor = count($roots) > 1 && isset($roots['vendor']); $root = $this->getContaoRoot($this->composer->getPackage()); $repositoryManager = $this->composer->getRepositoryManager(); $localRepository = $repositoryManager->getLocalRepository(); $versionParser = new VersionParser(); $prettyVersion = $this->prepareContaoVersion($this->getContaoVersion(), $this->getContaoBuild()); $version = $versionParser->normalize($prettyVersion); // @codingStandardsIgnoreStart // Sadly we can not add the bundles as provided packages, as the Pool cleans them up. // See also: https://github.com/composer/composer/blob/2d19cf/src/Composer/DependencyResolver/Pool.php#L174 // The skipping in there ignores any provided packages, even from already installed ones, and therefore makes // this approach impossible. // We therefore register them all as meta packages in the local repository and require them in the same version // below then. // @codingStandardsIgnoreEnd $this->injectContaoBundles($localRepository, $version, $prettyVersion); /** @var PackageInterface $localPackage */ foreach ($localRepository->getPackages() as $localPackage) { if ($localPackage->getName() === 'contao/core') { if ($removeVendor) { $this->composer->getInstallationManager()->uninstall($localRepository, new UninstallOperation($localPackage)); } elseif ($this->isNotMetaPackageOrHasSameVersion($localPackage, $version)) { // stop if the contao package is required somehow and must not be injected or // if the virtual contao package is already injected return; } // Remove package otherwise. $localRepository->removePackage($localPackage); break; } } $contaoCore = new CompletePackage('contao/core', $version, $prettyVersion); $contaoCore->setType('metapackage'); $this->injectSwiftMailer($root, $contaoCore); $clientLink = new Link('contao/core', 'contao-community-alliance/composer-client', $this->createEmptyConstraint('~0.14'), 'requires', '~0.14'); $requires = array('contao-community-alliance/composer-client' => $clientLink); // Add the bundles now. foreach (Environment::$bundleNames as $bundleName) { if ($package = $localRepository->findPackage($bundleName, '*')) { $requires[$bundleName] = new Link('contao/core', $bundleName, $this->createEmptyConstraint($package->getVersion()), 'requires', $package->getVersion()); } } $contaoCore->setRequires($requires); $localRepository->addPackage($contaoCore); }
public function testShouldCreatePackages() { $reader = $this->getMockBuilder('\\Composer\\Repository\\PearRepository')->disableOriginalConstructor()->getMock(); $ref = new \ReflectionMethod($reader, 'buildComposerPackages'); $ref->setAccessible(true); $channelInfo = new ChannelInfo('test.loc', 'test', array(new PackageInfo('test.loc', 'sample', 'license', 'shortDescription', 'description', array('1.0.0.1' => new ReleaseInfo('stable', new DependencyInfo(array(new DependencyConstraint('required', '> 5.2.0.0', 'php', ''), new DependencyConstraint('conflicts', '== 2.5.6.0', 'pear.php.net', 'broken')), array('*' => array(new DependencyConstraint('optional', '*', 'ext', 'xml'))))))))); $packages = $ref->invoke($reader, $channelInfo, new VersionParser()); $expectedPackage = new CompletePackage('pear-test.loc/sample', '1.0.0.1', '1.0.0.1'); $expectedPackage->setType('pear-library'); $expectedPackage->setDistType('file'); $expectedPackage->setDescription('description'); $expectedPackage->setDistUrl("http://test.loc/get/sample-1.0.0.1.tgz"); $expectedPackage->setAutoload(array('classmap' => array(''))); $expectedPackage->setIncludePaths(array('/')); $expectedPackage->setRequires(array(new Link('pear-test.loc/sample', 'php', $this->createConstraint('>', '5.2.0.0'), 'required', '> 5.2.0.0'))); $expectedPackage->setConflicts(array(new Link('pear-test.loc/sample', 'pear-pear.php.net/broken', $this->createConstraint('==', '2.5.6.0'), 'conflicts', '== 2.5.6.0'))); $expectedPackage->setSuggests(array('*-ext-xml' => '*')); $expectedPackage->setReplaces(array(new Link('pear-test.loc/sample', 'pear-test/sample', new VersionConstraint('==', '1.0.0.1'), 'replaces', '== 1.0.0.1'))); $this->assertCount(1, $packages); $this->assertEquals($expectedPackage, $packages[0], 0, 1); }
/** * Builds CompletePackages from PEAR package definition data. * * @param ChannelInfo $channelInfo * @param VersionParser $versionParser * @return CompletePackage */ private function buildComposerPackages(ChannelInfo $channelInfo, VersionParser $versionParser) { $result = array(); foreach ($channelInfo->getPackages() as $packageDefinition) { foreach ($packageDefinition->getReleases() as $version => $releaseInfo) { try { $normalizedVersion = $versionParser->normalize($version); } catch (\UnexpectedValueException $e) { if ($this->io->isVerbose()) { $this->io->writeError('Could not load ' . $packageDefinition->getPackageName() . ' ' . $version . ': ' . $e->getMessage()); } continue; } $composerPackageName = $this->buildComposerPackageName($packageDefinition->getChannelName(), $packageDefinition->getPackageName()); // distribution url must be read from /r/{packageName}/{version}.xml::/r/g:text() // but this location is 'de-facto' standard $urlBits = parse_url($this->url); $scheme = isset($urlBits['scheme']) && 'https' === $urlBits['scheme'] && extension_loaded('openssl') ? 'https' : 'http'; $distUrl = "{$scheme}://{$packageDefinition->getChannelName()}/get/{$packageDefinition->getPackageName()}-{$version}.tgz"; $requires = array(); $suggests = array(); $conflicts = array(); $replaces = array(); // alias package only when its channel matches repository channel, // cause we've know only repository channel alias if ($channelInfo->getName() == $packageDefinition->getChannelName()) { $composerPackageAlias = $this->buildComposerPackageName($channelInfo->getAlias(), $packageDefinition->getPackageName()); $aliasConstraint = new VersionConstraint('==', $normalizedVersion); $replaces[] = new Link($composerPackageName, $composerPackageAlias, $aliasConstraint, 'replaces', (string) $aliasConstraint); } // alias package with user-specified prefix. it makes private pear channels looks like composer's. if (!empty($this->vendorAlias) && ($this->vendorAlias != 'pear-' . $channelInfo->getAlias() || $channelInfo->getName() != $packageDefinition->getChannelName())) { $composerPackageAlias = "{$this->vendorAlias}/{$packageDefinition->getPackageName()}"; $aliasConstraint = new VersionConstraint('==', $normalizedVersion); $replaces[] = new Link($composerPackageName, $composerPackageAlias, $aliasConstraint, 'replaces', (string) $aliasConstraint); } foreach ($releaseInfo->getDependencyInfo()->getRequires() as $dependencyConstraint) { $dependencyPackageName = $this->buildComposerPackageName($dependencyConstraint->getChannelName(), $dependencyConstraint->getPackageName()); $constraint = $versionParser->parseConstraints($dependencyConstraint->getConstraint()); $link = new Link($composerPackageName, $dependencyPackageName, $constraint, $dependencyConstraint->getType(), $dependencyConstraint->getConstraint()); switch ($dependencyConstraint->getType()) { case 'required': $requires[] = $link; break; case 'conflicts': $conflicts[] = $link; break; case 'replaces': $replaces[] = $link; break; } } foreach ($releaseInfo->getDependencyInfo()->getOptionals() as $group => $dependencyConstraints) { foreach ($dependencyConstraints as $dependencyConstraint) { $dependencyPackageName = $this->buildComposerPackageName($dependencyConstraint->getChannelName(), $dependencyConstraint->getPackageName()); $suggests[$group . '-' . $dependencyPackageName] = $dependencyConstraint->getConstraint(); } } $package = new CompletePackage($composerPackageName, $normalizedVersion, $version); $package->setType('pear-library'); $package->setDescription($packageDefinition->getDescription()); $package->setLicense(array($packageDefinition->getLicense())); $package->setDistType('file'); $package->setDistUrl($distUrl); $package->setAutoload(array('classmap' => array(''))); $package->setIncludePaths(array('/')); $package->setRequires($requires); $package->setConflicts($conflicts); $package->setSuggests($suggests); $package->setReplaces($replaces); $result[] = $package; } } return $result; }
private function updateAuthors(AddonVersion $version, CompletePackage $package) { if ($package->getAuthors()) { foreach ($package->getAuthors() as $details) { $author = null; if (!$details->getName() && !$details->getEmail()) { continue; } if ($details->getEmail()) { $author = AddonAuthor::get()->filter('Email', $details->getEmail())->first(); } if (!$author && $details->getHomepage()) { $author = AddonAuthor::get()->filter('Name', $details->getName())->filter('Homepage', $details->getHomepage())->first(); } if (!$author && $details->getName()) { $author = AddonAuthor::get()->filter('Name', $details->getName())->filter('Versions.Addon.Name', $package->getName())->first(); } if (!$author) { $author = new AddonAuthor(); } if ($details->getName()) { $author->Name = $details->getName(); } if ($details->getEmail()) { $author->Email = $details->getEmail(); } if ($details->getHomepage()) { $author->Homepage = $details->getHomepage(); } //to-do not supported by API //if(isset($details['role'])) $author->Role = $details['role']; $version->Authors()->add($author->write()); } } }