1*37748cd8SNickeau<?php 2*37748cd8SNickeau 3*37748cd8SNickeau 4*37748cd8SNickeau 5*37748cd8SNickeau 6*37748cd8SNickeau 7*37748cd8SNickeau 8*37748cd8SNickeau 9*37748cd8SNickeau 10*37748cd8SNickeau 11*37748cd8SNickeau 12*37748cd8SNickeau 13*37748cd8SNickeaunamespace Composer; 14*37748cd8SNickeau 15*37748cd8SNickeauuse Composer\Autoload\ClassLoader; 16*37748cd8SNickeauuse Composer\Semver\VersionParser; 17*37748cd8SNickeau 18*37748cd8SNickeau 19*37748cd8SNickeau 20*37748cd8SNickeau 21*37748cd8SNickeau 22*37748cd8SNickeau 23*37748cd8SNickeau 24*37748cd8SNickeau 25*37748cd8SNickeauclass InstalledVersions 26*37748cd8SNickeau{ 27*37748cd8SNickeauprivate static $installed = array ( 28*37748cd8SNickeau 'root' => 29*37748cd8SNickeau array ( 30*37748cd8SNickeau 'pretty_version' => '1.20.x-dev', 31*37748cd8SNickeau 'version' => '1.20.9999999.9999999-dev', 32*37748cd8SNickeau 'aliases' => 33*37748cd8SNickeau array ( 34*37748cd8SNickeau ), 35*37748cd8SNickeau 'reference' => 'e00360b6decd41771547ddf57a5535bfc4e32e34', 36*37748cd8SNickeau 'name' => 'combostrap/combo', 37*37748cd8SNickeau ), 38*37748cd8SNickeau 'versions' => 39*37748cd8SNickeau array ( 40*37748cd8SNickeau 'antlr/antlr4-php-runtime' => 41*37748cd8SNickeau array ( 42*37748cd8SNickeau 'pretty_version' => '0.5.0', 43*37748cd8SNickeau 'version' => '0.5.0.0', 44*37748cd8SNickeau 'aliases' => 45*37748cd8SNickeau array ( 46*37748cd8SNickeau ), 47*37748cd8SNickeau 'reference' => '0cb16628b575b50bd087a81d11bd961ac3b8e9e9', 48*37748cd8SNickeau ), 49*37748cd8SNickeau 'combostrap/combo' => 50*37748cd8SNickeau array ( 51*37748cd8SNickeau 'pretty_version' => '1.20.x-dev', 52*37748cd8SNickeau 'version' => '1.20.9999999.9999999-dev', 53*37748cd8SNickeau 'aliases' => 54*37748cd8SNickeau array ( 55*37748cd8SNickeau ), 56*37748cd8SNickeau 'reference' => 'e00360b6decd41771547ddf57a5535bfc4e32e34', 57*37748cd8SNickeau ), 58*37748cd8SNickeau 'dragonmantank/cron-expression' => 59*37748cd8SNickeau array ( 60*37748cd8SNickeau 'pretty_version' => 'v1.2.1', 61*37748cd8SNickeau 'version' => '1.2.1.0', 62*37748cd8SNickeau 'aliases' => 63*37748cd8SNickeau array ( 64*37748cd8SNickeau ), 65*37748cd8SNickeau 'reference' => '9504fa9ea681b586028adaaa0877db4aecf32bad', 66*37748cd8SNickeau ), 67*37748cd8SNickeau ), 68*37748cd8SNickeau); 69*37748cd8SNickeauprivate static $canGetVendors; 70*37748cd8SNickeauprivate static $installedByVendor = array(); 71*37748cd8SNickeau 72*37748cd8SNickeau 73*37748cd8SNickeau 74*37748cd8SNickeau 75*37748cd8SNickeau 76*37748cd8SNickeau 77*37748cd8SNickeau 78*37748cd8SNickeaupublic static function getInstalledPackages() 79*37748cd8SNickeau{ 80*37748cd8SNickeau$packages = array(); 81*37748cd8SNickeauforeach (self::getInstalled() as $installed) { 82*37748cd8SNickeau$packages[] = array_keys($installed['versions']); 83*37748cd8SNickeau} 84*37748cd8SNickeau 85*37748cd8SNickeauif (1 === \count($packages)) { 86*37748cd8SNickeaureturn $packages[0]; 87*37748cd8SNickeau} 88*37748cd8SNickeau 89*37748cd8SNickeaureturn array_keys(array_flip(\call_user_func_array('array_merge', $packages))); 90*37748cd8SNickeau} 91*37748cd8SNickeau 92*37748cd8SNickeau 93*37748cd8SNickeau 94*37748cd8SNickeau 95*37748cd8SNickeau 96*37748cd8SNickeau 97*37748cd8SNickeau 98*37748cd8SNickeau 99*37748cd8SNickeau 100*37748cd8SNickeaupublic static function isInstalled($packageName) 101*37748cd8SNickeau{ 102*37748cd8SNickeauforeach (self::getInstalled() as $installed) { 103*37748cd8SNickeauif (isset($installed['versions'][$packageName])) { 104*37748cd8SNickeaureturn true; 105*37748cd8SNickeau} 106*37748cd8SNickeau} 107*37748cd8SNickeau 108*37748cd8SNickeaureturn false; 109*37748cd8SNickeau} 110*37748cd8SNickeau 111*37748cd8SNickeau 112*37748cd8SNickeau 113*37748cd8SNickeau 114*37748cd8SNickeau 115*37748cd8SNickeau 116*37748cd8SNickeau 117*37748cd8SNickeau 118*37748cd8SNickeau 119*37748cd8SNickeau 120*37748cd8SNickeau 121*37748cd8SNickeau 122*37748cd8SNickeau 123*37748cd8SNickeau 124*37748cd8SNickeaupublic static function satisfies(VersionParser $parser, $packageName, $constraint) 125*37748cd8SNickeau{ 126*37748cd8SNickeau$constraint = $parser->parseConstraints($constraint); 127*37748cd8SNickeau$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); 128*37748cd8SNickeau 129*37748cd8SNickeaureturn $provided->matches($constraint); 130*37748cd8SNickeau} 131*37748cd8SNickeau 132*37748cd8SNickeau 133*37748cd8SNickeau 134*37748cd8SNickeau 135*37748cd8SNickeau 136*37748cd8SNickeau 137*37748cd8SNickeau 138*37748cd8SNickeau 139*37748cd8SNickeau 140*37748cd8SNickeau 141*37748cd8SNickeaupublic static function getVersionRanges($packageName) 142*37748cd8SNickeau{ 143*37748cd8SNickeauforeach (self::getInstalled() as $installed) { 144*37748cd8SNickeauif (!isset($installed['versions'][$packageName])) { 145*37748cd8SNickeaucontinue; 146*37748cd8SNickeau} 147*37748cd8SNickeau 148*37748cd8SNickeau$ranges = array(); 149*37748cd8SNickeauif (isset($installed['versions'][$packageName]['pretty_version'])) { 150*37748cd8SNickeau$ranges[] = $installed['versions'][$packageName]['pretty_version']; 151*37748cd8SNickeau} 152*37748cd8SNickeauif (array_key_exists('aliases', $installed['versions'][$packageName])) { 153*37748cd8SNickeau$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); 154*37748cd8SNickeau} 155*37748cd8SNickeauif (array_key_exists('replaced', $installed['versions'][$packageName])) { 156*37748cd8SNickeau$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); 157*37748cd8SNickeau} 158*37748cd8SNickeauif (array_key_exists('provided', $installed['versions'][$packageName])) { 159*37748cd8SNickeau$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); 160*37748cd8SNickeau} 161*37748cd8SNickeau 162*37748cd8SNickeaureturn implode(' || ', $ranges); 163*37748cd8SNickeau} 164*37748cd8SNickeau 165*37748cd8SNickeauthrow new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 166*37748cd8SNickeau} 167*37748cd8SNickeau 168*37748cd8SNickeau 169*37748cd8SNickeau 170*37748cd8SNickeau 171*37748cd8SNickeau 172*37748cd8SNickeaupublic static function getVersion($packageName) 173*37748cd8SNickeau{ 174*37748cd8SNickeauforeach (self::getInstalled() as $installed) { 175*37748cd8SNickeauif (!isset($installed['versions'][$packageName])) { 176*37748cd8SNickeaucontinue; 177*37748cd8SNickeau} 178*37748cd8SNickeau 179*37748cd8SNickeauif (!isset($installed['versions'][$packageName]['version'])) { 180*37748cd8SNickeaureturn null; 181*37748cd8SNickeau} 182*37748cd8SNickeau 183*37748cd8SNickeaureturn $installed['versions'][$packageName]['version']; 184*37748cd8SNickeau} 185*37748cd8SNickeau 186*37748cd8SNickeauthrow new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 187*37748cd8SNickeau} 188*37748cd8SNickeau 189*37748cd8SNickeau 190*37748cd8SNickeau 191*37748cd8SNickeau 192*37748cd8SNickeau 193*37748cd8SNickeaupublic static function getPrettyVersion($packageName) 194*37748cd8SNickeau{ 195*37748cd8SNickeauforeach (self::getInstalled() as $installed) { 196*37748cd8SNickeauif (!isset($installed['versions'][$packageName])) { 197*37748cd8SNickeaucontinue; 198*37748cd8SNickeau} 199*37748cd8SNickeau 200*37748cd8SNickeauif (!isset($installed['versions'][$packageName]['pretty_version'])) { 201*37748cd8SNickeaureturn null; 202*37748cd8SNickeau} 203*37748cd8SNickeau 204*37748cd8SNickeaureturn $installed['versions'][$packageName]['pretty_version']; 205*37748cd8SNickeau} 206*37748cd8SNickeau 207*37748cd8SNickeauthrow new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 208*37748cd8SNickeau} 209*37748cd8SNickeau 210*37748cd8SNickeau 211*37748cd8SNickeau 212*37748cd8SNickeau 213*37748cd8SNickeau 214*37748cd8SNickeaupublic static function getReference($packageName) 215*37748cd8SNickeau{ 216*37748cd8SNickeauforeach (self::getInstalled() as $installed) { 217*37748cd8SNickeauif (!isset($installed['versions'][$packageName])) { 218*37748cd8SNickeaucontinue; 219*37748cd8SNickeau} 220*37748cd8SNickeau 221*37748cd8SNickeauif (!isset($installed['versions'][$packageName]['reference'])) { 222*37748cd8SNickeaureturn null; 223*37748cd8SNickeau} 224*37748cd8SNickeau 225*37748cd8SNickeaureturn $installed['versions'][$packageName]['reference']; 226*37748cd8SNickeau} 227*37748cd8SNickeau 228*37748cd8SNickeauthrow new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 229*37748cd8SNickeau} 230*37748cd8SNickeau 231*37748cd8SNickeau 232*37748cd8SNickeau 233*37748cd8SNickeau 234*37748cd8SNickeau 235*37748cd8SNickeaupublic static function getRootPackage() 236*37748cd8SNickeau{ 237*37748cd8SNickeau$installed = self::getInstalled(); 238*37748cd8SNickeau 239*37748cd8SNickeaureturn $installed[0]['root']; 240*37748cd8SNickeau} 241*37748cd8SNickeau 242*37748cd8SNickeau 243*37748cd8SNickeau 244*37748cd8SNickeau 245*37748cd8SNickeau 246*37748cd8SNickeau 247*37748cd8SNickeau 248*37748cd8SNickeau 249*37748cd8SNickeaupublic static function getRawData() 250*37748cd8SNickeau{ 251*37748cd8SNickeau@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); 252*37748cd8SNickeau 253*37748cd8SNickeaureturn self::$installed; 254*37748cd8SNickeau} 255*37748cd8SNickeau 256*37748cd8SNickeau 257*37748cd8SNickeau 258*37748cd8SNickeau 259*37748cd8SNickeau 260*37748cd8SNickeau 261*37748cd8SNickeau 262*37748cd8SNickeaupublic static function getAllRawData() 263*37748cd8SNickeau{ 264*37748cd8SNickeaureturn self::getInstalled(); 265*37748cd8SNickeau} 266*37748cd8SNickeau 267*37748cd8SNickeau 268*37748cd8SNickeau 269*37748cd8SNickeau 270*37748cd8SNickeau 271*37748cd8SNickeau 272*37748cd8SNickeau 273*37748cd8SNickeau 274*37748cd8SNickeau 275*37748cd8SNickeau 276*37748cd8SNickeau 277*37748cd8SNickeau 278*37748cd8SNickeau 279*37748cd8SNickeau 280*37748cd8SNickeau 281*37748cd8SNickeau 282*37748cd8SNickeau 283*37748cd8SNickeau 284*37748cd8SNickeau 285*37748cd8SNickeaupublic static function reload($data) 286*37748cd8SNickeau{ 287*37748cd8SNickeauself::$installed = $data; 288*37748cd8SNickeauself::$installedByVendor = array(); 289*37748cd8SNickeau} 290*37748cd8SNickeau 291*37748cd8SNickeau 292*37748cd8SNickeau 293*37748cd8SNickeau 294*37748cd8SNickeau 295*37748cd8SNickeauprivate static function getInstalled() 296*37748cd8SNickeau{ 297*37748cd8SNickeauif (null === self::$canGetVendors) { 298*37748cd8SNickeauself::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); 299*37748cd8SNickeau} 300*37748cd8SNickeau 301*37748cd8SNickeau$installed = array(); 302*37748cd8SNickeau 303*37748cd8SNickeauif (self::$canGetVendors) { 304*37748cd8SNickeauforeach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { 305*37748cd8SNickeauif (isset(self::$installedByVendor[$vendorDir])) { 306*37748cd8SNickeau$installed[] = self::$installedByVendor[$vendorDir]; 307*37748cd8SNickeau} elseif (is_file($vendorDir.'/composer/installed.php')) { 308*37748cd8SNickeau$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; 309*37748cd8SNickeau} 310*37748cd8SNickeau} 311*37748cd8SNickeau} 312*37748cd8SNickeau 313*37748cd8SNickeau$installed[] = self::$installed; 314*37748cd8SNickeau 315*37748cd8SNickeaureturn $installed; 316*37748cd8SNickeau} 317*37748cd8SNickeau} 318