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();
         }
     }
 }
예제 #2
0
 /**
  * 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);
     }
 }
예제 #3
0
 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';
 }
예제 #4
0
 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);
 }
예제 #5
0
 /**
  * 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;
 }
예제 #6
0
 /**
  * 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);
     }
 }
예제 #7
0
    /**
     * 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;
    }
예제 #8
0
 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');
     }
 }
예제 #10
0
 /**
  * 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;
                         }
                     }
                 }
             }
         }
     }
 }
예제 #11
0
 public function trim($versions, $stability)
 {
     return array_filter($versions, function ($item) use($stability) {
         return $stability === VersionParser::parseStability($item['version']);
     });
 }
예제 #12
0
 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;
 }
예제 #13
0
 /**
  * @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;
     }
 }
예제 #16
0
 /**
  * Parses version and returns its stability.
  *
  * @param  string
  * @return string
  */
 public function parseStability($version)
 {
     return ComposerVersionParser::parseStability($version);
 }
예제 #17
0
 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];
 }
예제 #18
0
    /**
     * 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;
    }
예제 #19
0
 /**
  * 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);
 }
예제 #21
0
 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));
 }
예제 #24
0
 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;
 }
예제 #28
0
 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];
 }
예제 #29
0
 /**
  * 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;
 }
예제 #30
0
 /**
  * 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;
 }