public function update() { $versions = $this->packagist->getPackageVersions('silverstripe/framework'); foreach ($versions as $package) { $version = $package->getVersion(); // Replace version by branch alias if applicable $extra = $package->getExtra(); if (isset($extra['branch-alias'][$version])) { $version = $extra['branch-alias'][$version]; } $stability = VersionParser::parseStability($version); $isDev = $stability === 'dev'; if (!$isDev || in_array($version, $this->versionBlacklist)) { continue; } $match = preg_match('/^([0-9]+)\\.([0-9]+)\\.x-dev$/', $version, $matches); if (!$match) { continue; } $major = $matches[1]; $minor = $matches[2]; $record = SilverStripeVersion::get()->filter('Major', $major)->filter('Minor', $minor)->first(); if (!$record) { $record = new SilverStripeVersion(); $record->Name = "{$major}.{$minor}"; $record->Major = $major; $record->Minor = $minor; $record->write(); } } }
/** * All descendants' constructors should call this parent constructor * * @param PackageInterface $aliasOf The package this package is an alias of * @param string $version The version the alias must report * @param string $prettyVersion The alias's non-normalized version */ public function __construct(PackageInterface $aliasOf, $version, $prettyVersion) { parent::__construct($aliasOf->getName()); $this->version = $version; $this->prettyVersion = $prettyVersion; $this->aliasOf = $aliasOf; $this->stability = VersionParser::parseStability($version); $this->dev = $this->stability === 'dev'; // replace self.version dependencies foreach (array('requires', 'devRequires') as $type) { $links = $aliasOf->{'get' . ucfirst($type)}(); foreach ($links as $index => $link) { // link is self.version, but must be replacing also the replaced version if ('self.version' === $link->getPrettyConstraint()) { $links[$index] = new Link($link->getSource(), $link->getTarget(), new VersionConstraint('=', $this->version), $type, $prettyVersion); } } $this->{$type} = $links; } // duplicate self.version provides foreach (array('conflicts', 'provides', 'replaces') as $type) { $links = $aliasOf->{'get' . ucfirst($type)}(); $newLinks = array(); foreach ($links as $link) { // link is self.version, but must be replacing also the replaced version if ('self.version' === $link->getPrettyConstraint()) { $newLinks[] = new Link($link->getSource(), $link->getTarget(), new VersionConstraint('=', $this->version), $type, $prettyVersion); } } $this->{$type} = array_merge($links, $newLinks); } }
public function __construct($name, $version, $prettyVersion) { parent::__construct($name); $this->version = $version; $this->prettyVersion = $prettyVersion; $this->stability = VersionParser::parseStability($version); $this->dev = $this->stability === 'dev'; }
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); }
/** * Extract vcs revision from version constraint (dev-master#abc123). * @see \Composer\Package\Loader\RootPackageLoader::extractReferences() * * @param array $requires * @param array $references * * @return array */ private function extractReferences(array $requires, array $references) { foreach ($requires as $reqName => $reqVersion) { $reqVersion = preg_replace('{^([^,\\s@]+) as .+$}', '$1', $reqVersion); if (preg_match('{^[^,\\s@]+?#([a-f0-9]+)$}', $reqVersion, $match) && VersionParser::parseStability($reqVersion) === 'dev') { $references[strtolower($reqName)] = $match[1]; } } return $references; }
/** * All descendants' constructors should call this parent constructor * * @param PackageInterface $aliasOf The package this package is an alias of * @param string $version The version the alias must report * @param string $prettyVersion The alias's non-normalized version */ public function __construct(PackageInterface $aliasOf, $version, $prettyVersion) { parent::__construct($aliasOf->getName()); $this->version = $version; $this->prettyVersion = $prettyVersion; $this->aliasOf = $aliasOf; $this->stability = VersionParser::parseStability($version); $this->dev = $this->stability === 'dev'; foreach (array('requires', 'devRequires', 'conflicts', 'provides', 'replaces') as $type) { $links = $aliasOf->{'get' . ucfirst($type)}(); $this->{$type} = $this->replaceSelfVersionDependencies($links, $type); } }
/** * Find the lowest stability. * * @param string[] $stabilities The list of stability * * @return string The lowest stability */ protected function findInlineStabilities(array $stabilities) { $lowestStability = 'stable'; foreach ($stabilities as $stability) { $stability = $this->versionParser->normalizeStability($stability); $stability = $this->versionParser->parseStability($stability); if (Package::$stabilities[$stability] > Package::$stabilities[$lowestStability]) { $lowestStability = $stability; } } return $lowestStability; }
public function whatProvides(Pool $pool, $name) { if (isset($this->providers[$name])) { return $this->providers[$name]; } // skip platform packages if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $name) || '__root__' === $name) { return array(); } if (null === $this->providerListing) { $this->loadProviderListings($this->loadRootServerFile()); } if ($this->lazyProvidersUrl && !isset($this->providerListing[$name])) { $hash = null; $url = str_replace('%package%', $name, $this->lazyProvidersUrl); $cacheKey = false; } elseif ($this->providersUrl) { // package does not exist in this repo if (!isset($this->providerListing[$name])) { return array(); } $hash = $this->providerListing[$name]['sha256']; $url = str_replace(array('%package%', '%hash%'), array($name, $hash), $this->providersUrl); $cacheKey = 'provider-' . strtr($name, '/', '$') . '.json'; } else { // BC handling for old providers-includes $url = 'p/' . $name . '.json'; // package does not exist in this repo if (!isset($this->providerListing[$url])) { return array(); } $hash = $this->providerListing[$url]['sha256']; $cacheKey = null; } if ($cacheKey && $this->cache->sha256($cacheKey) === $hash) { $packages = json_decode($this->cache->read($cacheKey), true); } else { $packages = $this->fetchFile($url, $cacheKey, $hash); } $this->providers[$name] = array(); foreach ($packages['packages'] as $versions) { foreach ($versions as $version) { // avoid loading the same objects twice if (isset($this->providersByUid[$version['uid']])) { // skip if already assigned if (!isset($this->providers[$name][$version['uid']])) { // expand alias in two packages if ($this->providersByUid[$version['uid']] instanceof AliasPackage) { $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]->getAliasOf(); $this->providers[$name][$version['uid'] . '-alias'] = $this->providersByUid[$version['uid']]; } else { $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]; } // check for root aliases if (isset($this->providersByUid[$version['uid'] . '-root'])) { $this->providers[$name][$version['uid'] . '-root'] = $this->providersByUid[$version['uid'] . '-root']; } } } else { if (isset($version['provide']) || isset($version['replace'])) { // collect names $names = array(strtolower($version['name']) => true); if (isset($version['provide'])) { foreach ($version['provide'] as $target => $constraint) { $names[strtolower($target)] = true; } } if (isset($version['replace'])) { foreach ($version['replace'] as $target => $constraint) { $names[strtolower($target)] = true; } } $names = array_keys($names); } else { $names = array(strtolower($version['name'])); } if (!$pool->isPackageAcceptable(strtolower($version['name']), VersionParser::parseStability($version['version']))) { continue; } // load acceptable packages in the providers $package = $this->createPackage($version, 'Composer\\Package\\Package'); $package->setRepository($this); if ($package instanceof AliasPackage) { $aliased = $package->getAliasOf(); $aliased->setRepository($this); $this->providers[$name][$version['uid']] = $aliased; $this->providers[$name][$version['uid'] . '-alias'] = $package; // override provider with its alias so it can be expanded in the if block above $this->providersByUid[$version['uid']] = $package; } else { $this->providers[$name][$version['uid']] = $package; $this->providersByUid[$version['uid']] = $package; } // handle root package aliases unset($rootAliasData); if (isset($this->rootAliases[$package->getName()][$package->getVersion()])) { $rootAliasData = $this->rootAliases[$package->getName()][$package->getVersion()]; } elseif ($package instanceof AliasPackage && isset($this->rootAliases[$package->getName()][$package->getAliasOf()->getVersion()])) { $rootAliasData = $this->rootAliases[$package->getName()][$package->getAliasOf()->getVersion()]; } if (isset($rootAliasData)) { $alias = $this->createAliasPackage($package, $rootAliasData['alias_normalized'], $rootAliasData['alias']); $alias->setRepository($this); $this->providers[$name][$version['uid'] . '-root'] = $alias; $this->providersByUid[$version['uid'] . '-root'] = $alias; } } } } return $this->providers[$name]; }
/** * {@inheritdoc} * * @throws \InvalidArgumentException When the target directory does not exist or symlink cannot be used */ protected function execute(InputInterface $input, OutputInterface $output) { $targetArg = rtrim($input->getArgument('target'), '/'); if (!is_dir($targetArg)) { throw new \InvalidArgumentException(sprintf('The target directory "%s" does not exist.', $input->getArgument('target'))); } $wantedVersion = $input->getOption('jquery-version'); $vParser = new VersionParser(); try { $jQueryVersionConstraint = $vParser->parseConstraints($wantedVersion); } catch (UnexpectedValueException $e) { $output->writeln('<error>Error:</error> <info>' . $wantedVersion . '</info> is not a valid version constraint.'); return; } $minimalVersionConstraint = $vParser->parseConstraints('>=' . $this->minimalSupportedVersion); if (!$minimalVersionConstraint->matches($jQueryVersionConstraint)) { $output->writeln('<error>Error:</error> <info>' . $wantedVersion . '</info> is not supported. Minimal version is: ' . $this->minimalSupportedVersion); return; } $curl = new Curl(); $curl->get('https://api.github.com' . '/repos/jquery/jquery/tags?per_page=100'); $versionToInstall = $this->minimalSupportedVersion; foreach (json_decode($curl->response) as $release) { $tag = $release->name; if ($vParser->parseStability($tag) == 'stable') { try { $constraint = $vParser->parseConstraints($tag); if ($jQueryVersionConstraint->matches($constraint)) { if (version_compare($vParser->normalize($tag), $versionToInstall) > 0) { $versionToInstall = $tag; } } else { } } catch (UnexpectedValueException $e) { } } } /** @var Filesystem $filesystem */ $filesystem = $this->getContainer()->get('filesystem'); // Create the bundles directory otherwise symlink will fail. $bundlesDir = $targetArg . '/bundles/'; $filesystem->mkdir($bundlesDir, 0777); $output->writeln('Installing JQuery assets.'); $targetDir = $bundlesDir . 'jquery-extra'; $namespaceParts = explode('\\', __NAMESPACE__); array_pop($namespaceParts); $output->writeln(sprintf('Installing assets for <comment>%s</comment> into <comment>%s</comment>', implode('\\', $namespaceParts), $targetDir)); $filesystem->remove($targetDir); $filesystem->mkdir($targetDir, 0777); $filesystem->mkdir($targetDir . '/tmp'); $zip = file_get_contents('https://github.com/jquery/jquery/archive/' . $versionToInstall . '.zip'); file_put_contents($targetDir . '/tmp/jquery.zip', $zip); $zip = new \ZipArchive(); if ($zip->open($targetDir . '/tmp/jquery.zip') === TRUE) { $zip->extractTo($targetDir . '/tmp'); $zip->close(); if (file_exists($targetDir . '/tmp/jquery-' . $versionToInstall . '/dist')) { $filesystem->mirror($targetDir . '/tmp/jquery-' . $versionToInstall . '/dist', $targetDir); } else { foreach (array('jquery.js', 'jquery.min.js', 'jquery.min.map', 'jquery-migrate.js', 'jquery-migrate.min.js') as $file) { if (file_exists($targetDir . '/tmp/jquery-' . $versionToInstall . '/' . $file)) { $filesystem->copy($targetDir . '/tmp/jquery-' . $versionToInstall . '/' . $file, $targetDir . '/' . $file); } } } $filesystem->remove($targetDir . '/tmp'); } else { throw new FileException('File Error'); } }
/** * Adds a repository and its packages to this package pool * * @param RepositoryInterface $repo A package repository * @param array $rootAliases */ public function addRepository(RepositoryInterface $repo, $rootAliases = array()) { if ($repo instanceof CompositeRepository) { $repos = $repo->getRepositories(); } else { $repos = array($repo); } foreach ($repos as $repo) { $this->repositories[] = $repo; $exempt = $repo instanceof PlatformRepository || $repo instanceof InstalledRepositoryInterface; if ($repo instanceof ComposerRepository && $repo->hasProviders()) { $this->providerRepos[] = $repo; $repo->setRootAliases($rootAliases); $repo->resetPackageIds(); } elseif ($repo instanceof StreamableRepositoryInterface) { foreach ($repo->getMinimalPackages() as $package) { $name = $package['name']; $version = $package['version']; $stability = VersionParser::parseStability($version); // collect names $names = array($name => true); if (isset($package['provide'])) { foreach ($package['provide'] as $target => $constraint) { $names[$target] = true; } } if (isset($package['replace'])) { foreach ($package['replace'] as $target => $constraint) { $names[$target] = true; } } $names = array_keys($names); if ($exempt || $this->isPackageAcceptable($names, $stability)) { $package['id'] = $this->id++; $this->packages[] = $package; foreach ($names as $provided) { $this->packageByName[$provided][$package['id']] = $this->packages[$this->id - 2]; } // handle root package aliases unset($rootAliasData); if (isset($rootAliases[$name][$version])) { $rootAliasData = $rootAliases[$name][$version]; } elseif (isset($package['alias_normalized']) && isset($rootAliases[$name][$package['alias_normalized']])) { $rootAliasData = $rootAliases[$name][$package['alias_normalized']]; } if (isset($rootAliasData)) { $alias = $package; unset($alias['raw']); $alias['version'] = $rootAliasData['alias_normalized']; $alias['alias'] = $rootAliasData['alias']; $alias['alias_of'] = $package['id']; $alias['id'] = $this->id++; $alias['root_alias'] = true; $this->packages[] = $alias; foreach ($names as $provided) { $this->packageByName[$provided][$alias['id']] = $this->packages[$this->id - 2]; } } // handle normal package aliases if (isset($package['alias'])) { $alias = $package; unset($alias['raw']); $alias['version'] = $package['alias_normalized']; $alias['alias'] = $package['alias']; $alias['alias_of'] = $package['id']; $alias['id'] = $this->id++; $this->packages[] = $alias; foreach ($names as $provided) { $this->packageByName[$provided][$alias['id']] = $this->packages[$this->id - 2]; } } } } } else { foreach ($repo->getPackages() as $package) { $names = $package->getNames(); $stability = $package->getStability(); if ($exempt || $this->isPackageAcceptable($names, $stability)) { $package->setId($this->id++); $this->packages[] = $package; foreach ($names as $provided) { $this->packageByName[$provided][] = $package; } // handle root package aliases $name = $package->getName(); if (isset($rootAliases[$name][$package->getVersion()])) { $alias = $rootAliases[$name][$package->getVersion()]; if ($package instanceof AliasPackage) { $package = $package->getAliasOf(); } $aliasPackage = new AliasPackage($package, $alias['alias_normalized'], $alias['alias']); $aliasPackage->setRootPackageAlias(true); $aliasPackage->setId($this->id++); $package->getRepository()->addPackage($aliasPackage); $this->packages[] = $aliasPackage; foreach ($aliasPackage->getNames() as $name) { $this->packageByName[$name][] = $aliasPackage; } } } } } } }
public function trim($versions, $stability) { return array_filter($versions, function ($item) use($stability) { return $stability === VersionParser::parseStability($item['version']); }); }
private function extractReferences(array $requires, array $references) { foreach ($requires as $reqName => $reqVersion) { if (preg_match('{^[^,\\s@]+?#([a-f0-9]+)$}', $reqVersion, $match) && 'dev' === ($stabilityName = VersionParser::parseStability($reqVersion))) { $name = strtolower($reqName); $references[$name] = $match[1]; } } return $references; }
/** * @param Pool $pool * @param string $name package name * @param bool $bypassFilters If set to true, this bypasses the stability filtering, and forces a recompute without cache * @return array|mixed */ public function whatProvides(Pool $pool, $name, $bypassFilters = false) { if (isset($this->providers[$name]) && !$bypassFilters) { return $this->providers[$name]; } // skip platform packages, root package and composer-plugin-api if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $name) || '__root__' === $name || 'composer-plugin-api' === $name) { return array(); } if (null === $this->providerListing) { $this->loadProviderListings($this->loadRootServerFile()); } $useLastModifiedCheck = false; if ($this->lazyProvidersUrl && !isset($this->providerListing[$name])) { $hash = null; $url = str_replace('%package%', $name, $this->lazyProvidersUrl); $cacheKey = 'provider-' . strtr($name, '/', '$') . '.json'; $useLastModifiedCheck = true; } elseif ($this->providersUrl) { // package does not exist in this repo if (!isset($this->providerListing[$name])) { return array(); } $hash = $this->providerListing[$name]['sha256']; $url = str_replace(array('%package%', '%hash%'), array($name, $hash), $this->providersUrl); $cacheKey = 'provider-' . strtr($name, '/', '$') . '.json'; } else { return array(); } $packages = null; if ($cacheKey) { if (!$useLastModifiedCheck && $hash && $this->cache->sha256($cacheKey) === $hash) { $packages = json_decode($this->cache->read($cacheKey), true); } elseif ($useLastModifiedCheck) { if ($contents = $this->cache->read($cacheKey)) { $contents = json_decode($contents, true); if (isset($contents['last-modified'])) { $response = $this->fetchFileIfLastModified($url, $cacheKey, $contents['last-modified']); if (true === $response) { $packages = $contents; } elseif ($response) { $packages = $response; } } } } } if (!$packages) { try { $packages = $this->fetchFile($url, $cacheKey, $hash, $useLastModifiedCheck); } catch (TransportException $e) { // 404s are acceptable for lazy provider repos if ($e->getStatusCode() === 404 && $this->lazyProvidersUrl) { $packages = array('packages' => array()); } else { throw $e; } } } $this->providers[$name] = array(); foreach ($packages['packages'] as $versions) { foreach ($versions as $version) { // avoid loading the same objects twice if (isset($this->providersByUid[$version['uid']])) { // skip if already assigned if (!isset($this->providers[$name][$version['uid']])) { // expand alias in two packages if ($this->providersByUid[$version['uid']] instanceof AliasPackage) { $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]->getAliasOf(); $this->providers[$name][$version['uid'] . '-alias'] = $this->providersByUid[$version['uid']]; } else { $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]; } // check for root aliases if (isset($this->providersByUid[$version['uid'] . '-root'])) { $this->providers[$name][$version['uid'] . '-root'] = $this->providersByUid[$version['uid'] . '-root']; } } } else { if (!$bypassFilters && !$pool->isPackageAcceptable(strtolower($version['name']), VersionParser::parseStability($version['version']))) { continue; } // load acceptable packages in the providers $package = $this->createPackage($version, 'Composer\\Package\\CompletePackage'); $package->setRepository($this); if ($package instanceof AliasPackage) { $aliased = $package->getAliasOf(); $aliased->setRepository($this); $this->providers[$name][$version['uid']] = $aliased; $this->providers[$name][$version['uid'] . '-alias'] = $package; // override provider with its alias so it can be expanded in the if block above $this->providersByUid[$version['uid']] = $package; } else { $this->providers[$name][$version['uid']] = $package; $this->providersByUid[$version['uid']] = $package; } // handle root package aliases unset($rootAliasData); if (isset($this->rootAliases[$package->getName()][$package->getVersion()])) { $rootAliasData = $this->rootAliases[$package->getName()][$package->getVersion()]; } elseif ($package instanceof AliasPackage && isset($this->rootAliases[$package->getName()][$package->getAliasOf()->getVersion()])) { $rootAliasData = $this->rootAliases[$package->getName()][$package->getAliasOf()->getVersion()]; } if (isset($rootAliasData)) { $alias = $this->createAliasPackage($package, $rootAliasData['alias_normalized'], $rootAliasData['alias']); $alias->setRepository($this); $this->providers[$name][$version['uid'] . '-root'] = $alias; $this->providersByUid[$version['uid'] . '-root'] = $alias; } } } } $result = $this->providers[$name]; // clean up the cache because otherwise using this puts the repo in an inconsistent state with a polluted unfiltered cache // which is likely not an issue but might cause hard to track behaviors depending on how the repo is used if ($bypassFilters) { foreach ($this->providers[$name] as $uid => $provider) { unset($this->providersByUid[$uid]); } unset($this->providers[$name]); } return $result; }
/** * {@inheritdoc} * * @SuppressWarnings(PHPMD.LongVariable) */ public function handle(\Input $input) { $packageName = $input->get('solve'); $version = base64_decode(rawurldecode($input->get('version'))); if ($input->post('mark') || $input->post('install')) { // make a backup copy(TL_ROOT . '/' . $this->configPathname, TL_ROOT . '/' . $this->configPathname . '~'); // update requires $json = new JsonFile(TL_ROOT . '/' . $this->configPathname); $config = $json->read(); if (!array_key_exists('require', $config)) { $config['require'] = array(); } $config['require'][$packageName] = $version; $json->write($config); Messages::addInfo(sprintf($GLOBALS['TL_LANG']['composer_client']['added_candidate'], $packageName, $version)); $_SESSION['COMPOSER_OUTPUT'] .= $this->io->getOutput(); if ($input->post('install')) { $this->redirect('contao/main.php?do=composer&update=packages'); } $this->redirect('contao/main.php?do=composer'); } /** @var RootPackage $rootPackage */ $rootPackage = $this->composer->getPackage(); $installedRootPackage = clone $rootPackage; $installedRootPackage->setRequires(array()); $installedRootPackage->setDevRequires(array()); $repositoryManager = $this->getRepositoryManager(); $localRepository = $repositoryManager->getLocalRepository(); $platformRepo = new PlatformRepository(); $installedRepository = new CompositeRepository(array($localRepository, new InstalledArrayRepository(array($installedRootPackage)), $platformRepo)); $versionParser = new VersionParser(); $constraint = $versionParser->parseConstraints($version); $stability = $versionParser->parseStability($version); $aliases = $this->getRootAliases($rootPackage); $this->aliasPlatformPackages($platformRepo, $aliases); $stabilityFlags = $rootPackage->getStabilityFlags(); $stabilityFlags[$packageName] = BasePackage::$stabilities[$stability]; $pool = $this->getPool($rootPackage->getMinimumStability(), $stabilityFlags); $pool->addRepository($installedRepository, $aliases); $policy = new DefaultPolicy($rootPackage->getPreferStable()); $request = new Request($pool); // add root package $rootPackageConstraint = $this->createConstraint('=', $rootPackage->getVersion()); $rootPackageConstraint->setPrettyString($rootPackage->getPrettyVersion()); $request->install($rootPackage->getName(), $rootPackageConstraint); // add requirements $links = $rootPackage->getRequires(); /** @var Link $link */ foreach ($links as $link) { if ($link->getTarget() != $packageName) { $request->install($link->getTarget(), $link->getConstraint()); } } /** @var PackageInterface $package */ foreach ($installedRepository->getPackages() as $package) { $request->install($package->getName(), $this->createConstraint('=', $package->getVersion())); } $operations = array(); try { $solver = new Solver($policy, $pool, $installedRepository); $beforeOperations = $solver->solve($request); $request->install($packageName, $constraint); $operations = $solver->solve($request); /** @var \Composer\DependencyResolver\Operation\SolverOperation $beforeOperation */ foreach ($beforeOperations as $beforeOperation) { /** @var \Composer\DependencyResolver\Operation\InstallOperation $operation */ foreach ($operations as $index => $operation) { if ($operation->getPackage()->getName() != $packageName && $beforeOperation->__toString() == $operation->__toString()) { unset($operations[$index]); } } } } catch (SolverProblemsException $e) { Messages::addError(sprintf('<span style="white-space: pre-line">%s</span>', trim($e->getMessage()))); } $template = new \BackendTemplate('be_composer_client_solve'); $template->composer = $this->composer; $template->packageName = $packageName; $template->packageVersion = $version; $template->operations = $operations; return $template->parse(); }
/** * Add a package * * @param IOInterface $io * @param $packageName * @param $packageVersion */ private static function addPackage(IOInterface $io, $packageName, $packageVersion) { $io->write(sprintf(" - Adding package <info>%s</info> (<comment>%s</comment>)", $packageName, $packageVersion)); // Create package link $link = new Link('__root__', $packageName, null, 'requires', $packageVersion); // Add package to the root package and composer.json requirements if (in_array($packageName, self::$config['require-dev'])) { unset(self::$composerDefinition['require'][$packageName]); unset(self::$composerRequires[$packageName]); self::$composerDefinition['require-dev'][$packageName] = $packageVersion; self::$composerDevRequires[$packageName] = $link; } else { unset(self::$composerDefinition['require-dev'][$packageName]); unset(self::$composerDevRequires[$packageName]); self::$composerDefinition['require'][$packageName] = $packageVersion; self::$composerRequires[$packageName] = $link; } // Set package stability if needed switch (VersionParser::parseStability($packageVersion)) { case 'dev': self::$stabilityFlags[$packageName] = BasePackage::STABILITY_DEV; break; case 'alpha': self::$stabilityFlags[$packageName] = BasePackage::STABILITY_ALPHA; break; case 'beta': self::$stabilityFlags[$packageName] = BasePackage::STABILITY_BETA; break; case 'RC': self::$stabilityFlags[$packageName] = BasePackage::STABILITY_RC; break; } }
/** * Parses version and returns its stability. * * @param string * @return string */ public function parseStability($version) { return ComposerVersionParser::parseStability($version); }
public function whatProvides(Pool $pool, $name) { // skip platform packages if ($name === 'php' || in_array(substr($name, 0, 4), array('ext-', 'lib-'), true) || $name === '__root__') { return array(); } if (isset($this->providers[$name])) { return $this->providers[$name]; } if (null === $this->providerListing) { $this->loadProviderListings($this->loadRootServerFile()); } $url = 'p/' . $name . '.json'; // package does not exist in this repo if (!isset($this->providerListing[$url])) { return array(); } if ($this->cache->sha256($url) === $this->providerListing[$url]['sha256']) { $packages = json_decode($this->cache->read($url), true); } else { $packages = $this->fetchFile($url, null, $this->providerListing[$url]['sha256']); } $this->providers[$name] = array(); foreach ($packages['packages'] as $versions) { foreach ($versions as $version) { // avoid loading the same objects twice if (isset($this->providersByUid[$version['uid']])) { // skip if already assigned if (!isset($this->providers[$name][$version['uid']])) { // expand alias in two packages if ($this->providersByUid[$version['uid']] instanceof AliasPackage) { $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]->getAliasOf(); $this->providers[$name][$version['uid'] . '-alias'] = $this->providersByUid[$version['uid']]; } else { $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]; } // check for root aliases if (isset($this->providersByUid[$version['uid'] . '-root'])) { $this->providers[$name][$version['uid'] . '-root'] = $this->providersByUid[$version['uid'] . '-root']; } } } else { if (!$pool->isPackageAcceptable(strtolower($version['name']), VersionParser::parseStability($version['version']))) { continue; } // load acceptable packages in the providers $package = $this->createPackage($version, 'Composer\\Package\\Package'); $package->setRepository($this); $this->providers[$name][$version['uid']] = $package; $this->providersByUid[$version['uid']] = $package; if ($package->getAlias()) { $alias = $this->createAliasPackage($package); $alias->setRepository($this); $this->providers[$name][$version['uid'] . '-alias'] = $alias; // override provider with its alias so it can be expanded in the if block above $this->providersByUid[$version['uid']] = $alias; } // handle root package aliases unset($rootAliasData); if (isset($this->rootAliases[$name][$package->getVersion()])) { $rootAliasData = $this->rootAliases[$name][$package->getVersion()]; } elseif (($aliasNormalized = $package->getAlias()) && isset($this->rootAliases[$name][$aliasNormalized])) { $rootAliasData = $this->rootAliases[$name][$aliasNormalized]; } if (isset($rootAliasData)) { $alias = $this->createAliasPackage($package, $rootAliasData['alias_normalized'], $rootAliasData['alias']); $alias->setRepository($this); $this->providers[$name][$version['uid'] . '-root'] = $alias; $this->providersByUid[$version['uid'] . '-root'] = $alias; } } } } return $this->providers[$name]; }
/** * Normalize the alias of branch. * * @param CompletePackageInterface $package The package instance * * @return string The alias branch name */ protected function normalizeBranchAlias(CompletePackageInterface $package) { $stability = VersionParser::parseStability($this->versionParser->normalize($this->rootPackageVersion)); $aliasNormalized = 'dev-' . $this->rootPackageVersion; if (BasePackage::STABILITY_STABLE === BasePackage::$stabilities[$stability] && null === $this->findPackage($package->getName(), $this->rootPackageVersion)) { $aliasNormalized = $this->versionParser->normalize($this->rootPackageVersion); } return $aliasNormalized; }
/** * Extract and merge stability flags from the given collection of * requires. * * @param RootPackageInterface $root * @param array $requires */ protected function mergeStabilityFlags(RootPackageInterface $root, array $requires) { $flags = $root->getStabilityFlags(); foreach ($requires as $name => $link) { $name = strtolower($name); $version = $link->getPrettyConstraint(); $stability = VersionParser::parseStability($version); $flags[$name] = BasePackage::$stabilities[$stability]; } $root->setStabilityFlags($flags); }
private function updateVersion(Addon $addon, Version $package) { $version = null; if ($addon->isInDB()) { $version = $addon->Versions()->filter('Version', $package->getVersionNormalized())->first(); } if (!$version) { $version = new AddonVersion(); } $version->Name = $package->getName(); $version->Type = str_replace('silverstripe-', '', $package->getType()); $version->Description = $package->getDescription(); $version->Released = strtotime($package->getTime()); $keywords = $package->getKeywords(); if ($keywords) { foreach ($keywords as $keyword) { $keyword = AddonKeyword::get_by_name($keyword); $addon->Keywords()->add($keyword); $version->Keywords()->add($keyword); } } $version->Version = $package->getVersionNormalized(); $version->PrettyVersion = $package->getVersion(); $stability = VersionParser::parseStability($package->getVersion()); $isDev = $stability === 'dev'; $version->Development = $isDev; $version->SourceType = $package->getSource()->getType(); $version->SourceUrl = $package->getSource()->getUrl(); $version->SourceReference = $package->getSource()->getReference(); if ($package->getDist()) { $version->DistType = $package->getDist()->getType(); $version->DistUrl = $package->getDist()->getUrl(); $version->DistReference = $package->getDist()->getReference(); $version->DistChecksum = $package->getDist()->getShasum(); } $version->Extra = $package->getExtra(); $version->Homepage = $package->getHomepage(); $version->License = $package->getLicense(); // $version->Support = $package->getSupport(); $addon->Versions()->add($version); $this->updateLinks($version, $package); $this->updateCompatibility($addon, $version, $package); $this->updateAuthors($version, $package); }
protected function installRootPackage(IOInterface $io, Config $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repositoryUrl = null, $disablePlugins = false, $noScripts = false, $keepVcs = false, $noProgress = false) { if (null === $repositoryUrl) { $sourceRepo = new CompositeRepository(Factory::createDefaultRepositories($io, $config)); } elseif ("json" === pathinfo($repositoryUrl, PATHINFO_EXTENSION) && file_exists($repositoryUrl)) { $json = new JsonFile($repositoryUrl, new RemoteFilesystem($io, $config)); $data = $json->read(); if (!empty($data['packages']) || !empty($data['includes']) || !empty($data['provider-includes'])) { $sourceRepo = new ComposerRepository(array('url' => 'file://' . strtr(realpath($repositoryUrl), '\\', '/')), $io, $config); } else { $sourceRepo = new FilesystemRepository($json); } } elseif (0 === strpos($repositoryUrl, 'http')) { $sourceRepo = new ComposerRepository(array('url' => $repositoryUrl), $io, $config); } else { throw new \InvalidArgumentException("Invalid repository url given. Has to be a .json file or an http url."); } $parser = new VersionParser(); $requirements = $parser->parseNameVersionPairs(array($packageName)); $name = strtolower($requirements[0]['name']); if (!$packageVersion && isset($requirements[0]['version'])) { $packageVersion = $requirements[0]['version']; } if (null === $stability) { if (preg_match('{^[^,\\s]*?@(' . implode('|', array_keys(BasePackage::$stabilities)) . ')$}i', $packageVersion, $match)) { $stability = $match[1]; } else { $stability = VersionParser::parseStability($packageVersion); } } $stability = VersionParser::normalizeStability($stability); if (!isset(BasePackage::$stabilities[$stability])) { throw new \InvalidArgumentException('Invalid stability provided (' . $stability . '), must be one of: ' . implode(', ', array_keys(BasePackage::$stabilities))); } $pool = new Pool($stability); $pool->addRepository($sourceRepo); // find the latest version if there are multiple $versionSelector = new VersionSelector($pool); $package = $versionSelector->findBestCandidate($name, $packageVersion); if (!$package) { throw new \InvalidArgumentException("Could not find package {$name}" . ($packageVersion ? " with version {$packageVersion}." : " with stability {$stability}.")); } if (null === $directory) { $parts = explode("/", $name, 2); $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts); } // handler Ctrl+C for unix-like systems if (function_exists('pcntl_signal')) { declare (ticks=100); pcntl_signal(SIGINT, function () use($directory) { $fs = new Filesystem(); $fs->removeDirectory($directory); exit(130); }); } $io->writeError('<info>Installing ' . $package->getName() . ' (' . VersionParser::formatVersion($package, false) . ')</info>'); if ($disablePlugins) { $io->writeError('<info>Plugins have been disabled.</info>'); } if (0 === strpos($package->getPrettyVersion(), 'dev-') && in_array($package->getSourceType(), array('git', 'hg'))) { $package->setSourceReference(substr($package->getPrettyVersion(), 4)); } $dm = $this->createDownloadManager($io, $config); $dm->setPreferSource($preferSource)->setPreferDist($preferDist)->setOutputProgress(!$noProgress); $projectInstaller = new ProjectInstaller($directory, $dm); $im = $this->createInstallationManager(); $im->addInstaller($projectInstaller); $im->install(new InstalledFilesystemRepository(new JsonFile('php://memory')), new InstallOperation($package)); $im->notifyInstalls(); $installedFromVcs = 'source' === $package->getInstallationSource(); $io->writeError('<info>Created project in ' . $directory . '</info>'); chdir($directory); $_SERVER['COMPOSER_ROOT_VERSION'] = $package->getPrettyVersion(); putenv('COMPOSER_ROOT_VERSION=' . $_SERVER['COMPOSER_ROOT_VERSION']); return $installedFromVcs; }
protected function versionCompare($v1, $v2) { // Parse the version, this gets all the numbers. $parser = new VersionParser(); $version1 = $parser->normalize($v1); $version2 = $parser->normalize($v2); // Add a point version for the stability level. $stabilities = array('dev', 'alpha', 'beta', 'RC', 'stable'); $version1 .= '.' . array_search($parser->parseStability($v1), $stabilities); $version2 .= '.' . array_search($parser->parseStability($v2), $stabilities); // Compare the versions. return version_compare($version1, $version2); }
/** * @dataProvider stabilityProvider */ public function testParseStability($expected, $version) { $this->assertSame($expected, VersionParser::parseStability($version)); }
protected function installRootPackage(IOInterface $io, $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repositoryUrl = null, $disablePlugins = false, $noScripts = false, $keepVcs = false, $noProgress = false) { if (null === $repositoryUrl) { $sourceRepo = new CompositeRepository(Factory::createDefaultRepositories($io, $config)); } elseif ("json" === pathinfo($repositoryUrl, PATHINFO_EXTENSION)) { $sourceRepo = new FilesystemRepository(new JsonFile($repositoryUrl, new RemoteFilesystem($io))); } elseif (0 === strpos($repositoryUrl, 'http')) { $sourceRepo = new ComposerRepository(array('url' => $repositoryUrl), $io, $config); } else { throw new \InvalidArgumentException("Invalid repository url given. Has to be a .json file or an http url."); } $parser = new VersionParser(); $candidates = array(); $requirements = $parser->parseNameVersionPairs(array($packageName)); $name = strtolower($requirements[0]['name']); if (!$packageVersion && isset($requirements[0]['version'])) { $packageVersion = $requirements[0]['version']; } if (null === $stability) { if (preg_match('{^[^,\\s]*?@(' . implode('|', array_keys(BasePackage::$stabilities)) . ')$}i', $packageVersion, $match)) { $stability = $match[1]; } else { $stability = VersionParser::parseStability($packageVersion); } } $stability = VersionParser::normalizeStability($stability); if (!isset(BasePackage::$stabilities[$stability])) { throw new \InvalidArgumentException('Invalid stability provided (' . $stability . '), must be one of: ' . implode(', ', array_keys(BasePackage::$stabilities))); } $pool = new Pool($stability); $pool->addRepository($sourceRepo); $constraint = $packageVersion ? $parser->parseConstraints($packageVersion) : null; $candidates = $pool->whatProvides($name, $constraint); foreach ($candidates as $key => $candidate) { if ($candidate->getName() !== $name) { unset($candidates[$key]); } } if (!$candidates) { throw new \InvalidArgumentException("Could not find package {$name}" . ($packageVersion ? " with version {$packageVersion}." : " with stability {$stability}.")); } if (null === $directory) { $parts = explode("/", $name, 2); $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts); } $package = reset($candidates); foreach ($candidates as $candidate) { if (version_compare($package->getVersion(), $candidate->getVersion(), '<')) { $package = $candidate; } } unset($candidates); $io->write('<info>Installing ' . $package->getName() . ' (' . VersionParser::formatVersion($package, false) . ')</info>'); if ($disablePlugins) { $io->write('<info>Plugins have been disabled.</info>'); } if (0 === strpos($package->getPrettyVersion(), 'dev-') && in_array($package->getSourceType(), array('git', 'hg'))) { $package->setSourceReference(substr($package->getPrettyVersion(), 4)); } $dm = $this->createDownloadManager($io, $config); $dm->setPreferSource($preferSource)->setPreferDist($preferDist)->setOutputProgress(!$noProgress); $projectInstaller = new ProjectInstaller($directory, $dm); $im = $this->createInstallationManager(); $im->addInstaller($projectInstaller); $im->install(new InstalledFilesystemRepository(new JsonFile('php://memory')), new InstallOperation($package)); $im->notifyInstalls(); $installedFromVcs = 'source' === $package->getInstallationSource(); $io->write('<info>Created project in ' . $directory . '</info>'); chdir($directory); putenv('COMPOSER_ROOT_VERSION=' . $package->getPrettyVersion()); return $installedFromVcs; }
/** * Retrieve the latest available stable version for a package * * @param string $package * @return string */ private function getLatestNonDevVersion($package) { $versionParser = new VersionParser(); foreach ($this->getPackageAvailableVersions($package) as $version) { if ($versionParser->parseStability($version) != 'dev') { return $version; } } return ''; }
protected function installRootPackage(IOInterface $io, Config $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repository = null, $disablePlugins = false, $noScripts = false, $keepVcs = false, $noProgress = false) { if (null === $repository) { $sourceRepo = new CompositeRepository(RepositoryFactory::defaultRepos($io, $config)); } else { $sourceRepo = RepositoryFactory::fromString($io, $config, $repository, true); } $parser = new VersionParser(); $requirements = $parser->parseNameVersionPairs(array($packageName)); $name = strtolower($requirements[0]['name']); if (!$packageVersion && isset($requirements[0]['version'])) { $packageVersion = $requirements[0]['version']; } if (null === $stability) { if (preg_match('{^[^,\\s]*?@(' . implode('|', array_keys(BasePackage::$stabilities)) . ')$}i', $packageVersion, $match)) { $stability = $match[1]; } else { $stability = VersionParser::parseStability($packageVersion); } } $stability = VersionParser::normalizeStability($stability); if (!isset(BasePackage::$stabilities[$stability])) { throw new \InvalidArgumentException('Invalid stability provided (' . $stability . '), must be one of: ' . implode(', ', array_keys(BasePackage::$stabilities))); } $pool = new Pool($stability); $pool->addRepository($sourceRepo); // using those 3 constants to build a version without the 'extra' bit that can contain garbage $phpVersion = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION; // find the latest version if there are multiple $versionSelector = new VersionSelector($pool); $package = $versionSelector->findBestCandidate($name, $packageVersion, $phpVersion, $stability); if (!$package) { throw new \InvalidArgumentException("Could not find package {$name}" . ($packageVersion ? " with version {$packageVersion}." : " with stability {$stability}.")); } if (null === $directory) { $parts = explode("/", $name, 2); $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts); } // handler Ctrl+C for unix-like systems if (function_exists('pcntl_signal')) { declare (ticks=100); pcntl_signal(SIGINT, function () use($directory) { $fs = new Filesystem(); $fs->removeDirectory($directory); exit(130); }); } $io->writeError('<info>Installing ' . $package->getName() . ' (' . $package->getFullPrettyVersion(false) . ')</info>'); if ($disablePlugins) { $io->writeError('<info>Plugins have been disabled.</info>'); } if (0 === strpos($package->getPrettyVersion(), 'dev-') && in_array($package->getSourceType(), array('git', 'hg'))) { $package->setSourceReference(substr($package->getPrettyVersion(), 4)); } $dm = $this->createDownloadManager($io, $config); $dm->setPreferSource($preferSource)->setPreferDist($preferDist)->setOutputProgress(!$noProgress); $projectInstaller = new ProjectInstaller($directory, $dm); $im = $this->createInstallationManager(); $im->addInstaller($projectInstaller); $im->install(new InstalledFilesystemRepository(new JsonFile('php://memory')), new InstallOperation($package)); $im->notifyInstalls($io); $installedFromVcs = 'source' === $package->getInstallationSource(); $io->writeError('<info>Created project in ' . $directory . '</info>'); chdir($directory); $_SERVER['COMPOSER_ROOT_VERSION'] = $package->getPrettyVersion(); putenv('COMPOSER_ROOT_VERSION=' . $_SERVER['COMPOSER_ROOT_VERSION']); return $installedFromVcs; }
protected function installRootPackage(IOInterface $io, Config $config, $packageName, $directory = null, $packageVersion = null, $stability = 'stable', $preferSource = false, $preferDist = false, $installDevPackages = false, $repository = null, $disablePlugins = false, $noScripts = false, $keepVcs = false, $noProgress = false, $ignorePlatformReqs = false, $secureHttp = true) { if (!$secureHttp) { $config->merge(array('config' => array('secure-http' => false))); } if (null === $repository) { $sourceRepo = new CompositeRepository(RepositoryFactory::defaultRepos($io, $config)); } else { $sourceRepo = RepositoryFactory::fromString($io, $config, $repository, true); } $parser = new VersionParser(); $requirements = $parser->parseNameVersionPairs(array($packageName)); $name = strtolower($requirements[0]['name']); if (!$packageVersion && isset($requirements[0]['version'])) { $packageVersion = $requirements[0]['version']; } if (null === $stability) { if (preg_match('{^[^,\\s]*?@(' . implode('|', array_keys(BasePackage::$stabilities)) . ')$}i', $packageVersion, $match)) { $stability = $match[1]; } else { $stability = VersionParser::parseStability($packageVersion); } } $stability = VersionParser::normalizeStability($stability); if (!isset(BasePackage::$stabilities[$stability])) { throw new \InvalidArgumentException('Invalid stability provided (' . $stability . '), must be one of: ' . implode(', ', array_keys(BasePackage::$stabilities))); } $pool = new Pool($stability); $pool->addRepository($sourceRepo); $phpVersion = null; $prettyPhpVersion = null; if (!$ignorePlatformReqs) { $platformOverrides = $config->get('platform') ?: array(); // initialize $this->repos as it is used by the parent InitCommand $platform = new PlatformRepository(array(), $platformOverrides); $phpPackage = $platform->findPackage('php', '*'); $phpVersion = $phpPackage->getVersion(); $prettyPhpVersion = $phpPackage->getPrettyVersion(); } // find the latest version if there are multiple $versionSelector = new VersionSelector($pool); $package = $versionSelector->findBestCandidate($name, $packageVersion, $phpVersion, $stability); if (!$package) { $errorMessage = "Could not find package {$name} with " . ($packageVersion ? "version {$packageVersion}" : "stability {$stability}"); if ($phpVersion && $versionSelector->findBestCandidate($name, $packageVersion, null, $stability)) { throw new \InvalidArgumentException($errorMessage . ' in a version installable using your PHP version ' . $prettyPhpVersion . '.'); } throw new \InvalidArgumentException($errorMessage . '.'); } if (null === $directory) { $parts = explode("/", $name, 2); $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts); } // handler Ctrl+C for unix-like systems if (function_exists('pcntl_signal')) { declare (ticks=100); pcntl_signal(SIGINT, function () use($directory) { $fs = new Filesystem(); $fs->removeDirectory($directory); exit(130); }); } $io->writeError('<info>Installing ' . $package->getName() . ' (' . $package->getFullPrettyVersion(false) . ')</info>'); if ($disablePlugins) { $io->writeError('<info>Plugins have been disabled.</info>'); } if (0 === strpos($package->getPrettyVersion(), 'dev-') && in_array($package->getSourceType(), array('git', 'hg'))) { $package->setSourceReference(substr($package->getPrettyVersion(), 4)); } $dm = $this->createDownloadManager($io, $config); $dm->setPreferSource($preferSource)->setPreferDist($preferDist)->setOutputProgress(!$noProgress); $projectInstaller = new ProjectInstaller($directory, $dm); $im = $this->createInstallationManager(); $im->addInstaller($projectInstaller); $im->install(new InstalledFilesystemRepository(new JsonFile('php://memory')), new InstallOperation($package)); $im->notifyInstalls($io); // collect suggestions $this->suggestedPackagesReporter->addSuggestionsFromPackage($package); $installedFromVcs = 'source' === $package->getInstallationSource(); $io->writeError('<info>Created project in ' . $directory . '</info>'); chdir($directory); $_SERVER['COMPOSER_ROOT_VERSION'] = $package->getPrettyVersion(); putenv('COMPOSER_ROOT_VERSION=' . $_SERVER['COMPOSER_ROOT_VERSION']); return $installedFromVcs; }
public function whatProvides(Pool $pool, $name) { if (isset($this->providers[$name])) { return $this->providers[$name]; } if (preg_match(PlatformRepository::PLATFORM_PACKAGE_REGEX, $name) || '__root__' === $name) { return array(); } if (null === $this->providerListing) { $this->loadProviderListings($this->loadRootServerFile()); } if ($this->lazyProvidersUrl && !isset($this->providerListing[$name])) { $hash = null; $url = str_replace('%package%', $name, $this->lazyProvidersUrl); $cacheKey = false; } elseif ($this->providersUrl) { if (!isset($this->providerListing[$name])) { return array(); } $hash = $this->providerListing[$name]['sha256']; $url = str_replace(array('%package%', '%hash%'), array($name, $hash), $this->providersUrl); $cacheKey = 'provider-' . strtr($name, '/', '$') . '.json'; } else { $url = 'p/' . $name . '.json'; if (!isset($this->providerListing[$url])) { return array(); } $hash = $this->providerListing[$url]['sha256']; $cacheKey = null; } if ($cacheKey && $this->cache->sha256($cacheKey) === $hash) { $packages = json_decode($this->cache->read($cacheKey), true); } else { $packages = $this->fetchFile($url, $cacheKey, $hash); } $this->providers[$name] = array(); foreach ($packages['packages'] as $versions) { foreach ($versions as $version) { if (isset($this->providersByUid[$version['uid']])) { if (!isset($this->providers[$name][$version['uid']])) { if ($this->providersByUid[$version['uid']] instanceof AliasPackage) { $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]->getAliasOf(); $this->providers[$name][$version['uid'] . '-alias'] = $this->providersByUid[$version['uid']]; } else { $this->providers[$name][$version['uid']] = $this->providersByUid[$version['uid']]; } if (isset($this->providersByUid[$version['uid'] . '-root'])) { $this->providers[$name][$version['uid'] . '-root'] = $this->providersByUid[$version['uid'] . '-root']; } } } else { if (!$pool->isPackageAcceptable(strtolower($version['name']), VersionParser::parseStability($version['version']))) { continue; } $package = $this->createPackage($version, 'Composer\\Package\\Package'); $package->setRepository($this); if ($package instanceof AliasPackage) { $aliased = $package->getAliasOf(); $aliased->setRepository($this); $this->providers[$name][$version['uid']] = $aliased; $this->providers[$name][$version['uid'] . '-alias'] = $package; $this->providersByUid[$version['uid']] = $package; } else { $this->providers[$name][$version['uid']] = $package; $this->providersByUid[$version['uid']] = $package; } unset($rootAliasData); if (isset($this->rootAliases[$package->getName()][$package->getVersion()])) { $rootAliasData = $this->rootAliases[$package->getName()][$package->getVersion()]; } elseif ($package instanceof AliasPackage && isset($this->rootAliases[$package->getName()][$package->getAliasOf()->getVersion()])) { $rootAliasData = $this->rootAliases[$package->getName()][$package->getAliasOf()->getVersion()]; } if (isset($rootAliasData)) { $alias = $this->createAliasPackage($package, $rootAliasData['alias_normalized'], $rootAliasData['alias']); $alias->setRepository($this); $this->providers[$name][$version['uid'] . '-root'] = $alias; $this->providersByUid[$version['uid'] . '-root'] = $alias; } } } } return $this->providers[$name]; }
/** * Get the stability of a version * * @param string $version * @return int|null Stability or null if STABLE or less than minimum */ protected function getParsedStability($version) { // Drop aliasing if used $version = preg_replace('/^([^,\\s@]+) as .+$/', '$1', $version); $stability = $this->getStabilityInt(VersionParser::parseStability($version)); if ($stability === BasePackage::STABILITY_STABLE || $this->minimumStability > $stability) { // Ignore if 'stable' or more stable than the global // minimum $stability = null; } return $stability; }
/** * Returns the stability of a version. * * @param string $version * * @return string */ public static function parseStability($version) { $stability = parent::parseStability($version); return false !== strpos($version, '-patch') ? 'dev' : $stability; }