Source of file ComposerLoaderExtension.php
Size: 3,915 Bytes - Last Modified: 2021-12-24T06:34:22+00:00
/var/www/docs.ssmods.com/process/src/src/Extensions/ComposerLoaderExtension.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | <?php namespace BringYourOwnIdeas\UpdateChecker\Extensions; use Composer\Composer; use Composer\Factory; use Composer\IO\NullIO; use Composer\Package\Link; use Composer\Repository\ArrayRepository; use Composer\Repository\BaseRepository; use Composer\Repository\CompositeRepository; use Composer\Repository\RepositoryInterface; use SilverStripe\Core\Environment; use SilverStripe\Core\Extension; class ComposerLoaderExtension extends Extension { /** * @var Composer */ protected $composer; /** * @param Composer $composer * @return $this */ public function setComposer(Composer $composer) { $this->composer = $composer; return $this; } /** * @return Composer */ public function getComposer() { return $this->composer; } /** * Retrieve an array of primary composer dependencies from composer.json. * * Packages are filtered by allowed type. * * @param array|null $allowedTypes An array of "allowed" package types. Dependencies in composer.json that do not * match any of the given types are not returned. * @return array[] */ public function getPackages(array $allowedTypes = null) { $packages = []; $repository = $this->getRepository(); foreach ($repository->getPackages() as $package) { // Filter out packages that are not "allowed types" if (is_array($allowedTypes) && !in_array($package->getType(), $allowedTypes)) { continue; } // Find the constraint used for installation $constraint = $this->getInstalledConstraint($repository, $package->getName()); $packages[$package->getName()] = [ 'constraint' => $constraint, 'package' => $package, ]; } return $packages; } /** * Provides access to the Composer repository * * @return RepositoryInterface */ protected function getRepository() { /** @var Composer $composer */ $composer = $this->getComposer(); /** @var BaseRepository $repository */ return new CompositeRepository([ new ArrayRepository([$composer->getPackage()]), $composer->getRepositoryManager()->getLocalRepository(), ]); } /** * Find all dependency constraints for the given package in the current repository and return the strictest one * * @param BaseRepository $repository * @param string $packageName * @return string */ protected function getInstalledConstraint(BaseRepository $repository, $packageName) { $constraints = []; foreach ($repository->getDependents($packageName) as $dependent) { /** @var Link $link */ list (, $link) = $dependent; $constraints[] = $link->getPrettyConstraint(); } usort($constraints, 'version_compare'); return array_pop($constraints); } /** * Builds an instance of Composer */ public function onAfterBuild() { // Mock COMPOSER_HOME if it's not defined already. Composer requires one of the two to be set. if (!Environment::getEnv('COMPOSER_HOME')) { $home = Environment::getEnv('HOME'); if (!$home || !is_dir($home) || !is_writable($home)) { // Set our own directory putenv('COMPOSER_HOME=' . sys_get_temp_dir()); } } $originalDir = getcwd(); if ($originalDir !== BASE_PATH) { chdir(BASE_PATH); } /** @var Composer $composer */ $composer = Factory::create(new NullIO()); $this->setComposer($composer); if ($originalDir !== BASE_PATH) { chdir($originalDir); } } } |