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