/** * Returns a list of Contao paths. * Multiple paths mean there's likely a problem with the installation (e.g. Contao in root and vendor folder). * * @param RootPackageInterface $package The package to check if a root has been specified in the extra section. * * @return array * * @throws RuntimeException When the current working directory could not be determined. */ public static function findContaoRoots(RootPackageInterface $package = null) { $roots = array(); $cwd = getcwd(); if (!$cwd) { throw new RuntimeException('Could not determine current working directory.'); } // Check if we have a Contao installation in the current working dir. See #15. if (static::isContao($cwd)) { $roots['root'] = $cwd; } if (static::isContao(dirname($cwd))) { $roots['parent'] = dirname($cwd); } if (null !== $package) { $extra = $package->getExtra(); if (!empty($extra['contao']['root']) && static::isContao($cwd . DIRECTORY_SEPARATOR . $extra['contao']['root'])) { $roots['extra'] = $cwd . DIRECTORY_SEPARATOR . $extra['contao']['root']; } } // test, do we have the core within vendor/contao/core. $vendorRoot = $cwd . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'contao' . DIRECTORY_SEPARATOR . 'core'; if (static::isContao($vendorRoot)) { $roots['vendor'] = $vendorRoot; } return $roots; }
private function getFetchesInExtra(RootPackageInterface $package, $key) { $extra = $package->getExtra(); if (empty($extra[$key])) { return array(); } return $extra[$key]; }
/** * Check if the filter must be skipped the version by pattern or not. * * @return string|false Return the pattern or FALSE for disable the feature */ protected function skipByPattern() { $extra = $this->package->getExtra(); if (!array_key_exists('asset-pattern-skip-version', $extra)) { $extra['asset-pattern-skip-version'] = '(-patch)'; } if (is_string($extra['asset-pattern-skip-version'])) { return trim($extra['asset-pattern-skip-version'], '/'); } return false; }
/** * Get extra config. * * @param \Composer\Package\RootPackageInterface $root * @param \Arcanedev\Composer\Entities\PluginState $state * @param array $extra * * @return array */ private function getExtra(RootPackageInterface $root, PluginState $state, $extra) { $rootExtra = $root->getExtra(); if ($state->replaceDuplicateLinks()) { return self::mergeExtraArray($state->shouldMergeExtraDeep(), $rootExtra, $extra); } if (!$state->shouldMergeExtraDeep()) { foreach (array_intersect(array_keys($extra), array_keys($rootExtra)) as $key) { $this->getLogger()->info("Ignoring duplicate <comment>{$key}</comment> in " . "<comment>{$this->getPath()}</comment> extra config."); } } return static::mergeExtraArray($state->shouldMergeExtraDeep(), $extra, $rootExtra); }
/** * Check if a package is locked. * * @param string $packageName The name of the package to test. * * @return bool * * @see ComposerJson::isLocked() */ private function isLocked($packageName) { $extra = $this->rootPackage->getExtra(); return isset($extra['tenside']['version-locks'][$packageName]); }
/** * 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(self::mergeExtraArray($state->shouldMergeExtraDeep(), $rootExtra, $extra)); } else { if (!$state->shouldMergeExtraDeep()) { 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(self::mergeExtraArray($state->shouldMergeExtraDeep(), $extra, $rootExtra)); } }
/** * Check the extra option. * * @param RootPackageInterface $package The root package * @param string $name The extra option name * * @return bool */ public static function checkExtraOption(RootPackageInterface $package, $name) { $extra = $package->getExtra(); return !array_key_exists($name, $extra) || true === $extra[$name]; }
/** * @param RootPackageInterface $package * @return array */ protected function readConfig(RootPackageInterface $package) { $config = array('include' => array()); $extra = $package->getExtra(); if (isset($extra['merge-plugin'])) { $config = array_merge($config, $extra['merge-plugin']); if (!is_array($config['include'])) { $config['include'] = array($config['include']); } } return $config; }
/** * 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; }
/** * Rewrites the class map to have lowercased keys to be able to load classes with wrong casing * Defaults to case sensitivity (composer loader default) * * @param RootPackageInterface $mainPackage * @param string $targetDir * @return bool */ protected static function caseSensitiveClassLoading(RootPackageInterface $mainPackage, $targetDir) { $extra = $mainPackage->getExtra(); $caseSensitiveClassLoading = true; if (isset($extra['autoload-case-sensitivity'])) { $caseSensitiveClassLoading = (bool) $extra['autoload-case-sensitivity']; } if (!$caseSensitiveClassLoading) { $classMapContents = file_get_contents($targetDir . '/autoload_classmap.php'); $classMapContents = preg_replace_callback('/ \'[^\']*\' => /', function ($match) { return strtolower($match[0]); }, $classMapContents); file_put_contents($targetDir . '/autoload_classmap.php', $classMapContents); } return $caseSensitiveClassLoading; }