1<?php 2 3 4 5 6 7 8 9 10 11 12 13namespace Composer; 14 15use Composer\Autoload\ClassLoader; 16use Composer\Semver\VersionParser; 17 18 19 20 21 22 23class InstalledVersions 24{ 25private static $installed = array ( 26 'root' => 27 array ( 28 'pretty_version' => 'dev-master', 29 'version' => 'dev-master', 30 'aliases' => 31 array ( 32 ), 33 'reference' => 'a30be5ec00ba89ade3ec8ffa407fa7e18824943c', 34 'name' => 'splitbrain/dokuwiki', 35 ), 36 'versions' => 37 array ( 38 'aziraphale/email-address-validator' => 39 array ( 40 'pretty_version' => '2.0.1', 41 'version' => '2.0.1.0', 42 'aliases' => 43 array ( 44 ), 45 'reference' => 'fa25bc22c1c0b6491657c91473fae3e40719a650', 46 ), 47 'geshi/geshi' => 48 array ( 49 'pretty_version' => 'dev-master', 50 'version' => 'dev-master', 51 'aliases' => 52 array ( 53 0 => '1.0.x-dev', 54 1 => '9999999-dev', 55 ), 56 'reference' => '3c12a7931d509c5e3557c5ed44c9a32e9c917c7d', 57 ), 58 'kissifrot/php-ixr' => 59 array ( 60 'pretty_version' => '1.8.3', 61 'version' => '1.8.3.0', 62 'aliases' => 63 array ( 64 ), 65 'reference' => '4477cd1a67416ce5b6a2080f9a79d9eb50a965c1', 66 ), 67 'marcusschwarz/lesserphp' => 68 array ( 69 'pretty_version' => 'v0.5.5', 70 'version' => '0.5.5.0', 71 'aliases' => 72 array ( 73 ), 74 'reference' => '77ba82b5218ff228267d3b0e5ec8697be75e86a7', 75 ), 76 'openpsa/universalfeedcreator' => 77 array ( 78 'pretty_version' => 'v1.8.4', 79 'version' => '1.8.4.0', 80 'aliases' => 81 array ( 82 ), 83 'reference' => '099817dc9efef33ca2382b04daf9e191b77fed13', 84 ), 85 'phpseclib/phpseclib' => 86 array ( 87 'pretty_version' => '2.0.31', 88 'version' => '2.0.31.0', 89 'aliases' => 90 array ( 91 ), 92 'reference' => '233a920cb38636a43b18d428f9a8db1f0a1a08f4', 93 ), 94 'simplepie/simplepie' => 95 array ( 96 'pretty_version' => '1.5.6', 97 'version' => '1.5.6.0', 98 'aliases' => 99 array ( 100 ), 101 'reference' => '1c68e14ca3ac84346b6e6fe3c5eedf725d0f92c6', 102 ), 103 'splitbrain/dokuwiki' => 104 array ( 105 'pretty_version' => 'dev-master', 106 'version' => 'dev-master', 107 'aliases' => 108 array ( 109 ), 110 'reference' => 'a30be5ec00ba89ade3ec8ffa407fa7e18824943c', 111 ), 112 'splitbrain/php-archive' => 113 array ( 114 'pretty_version' => '1.2.1', 115 'version' => '1.2.1.0', 116 'aliases' => 117 array ( 118 ), 119 'reference' => '211a2198b73b233d7d2b6159462e11cd9a91348a', 120 ), 121 'splitbrain/php-cli' => 122 array ( 123 'pretty_version' => '1.1.8', 124 'version' => '1.1.8.0', 125 'aliases' => 126 array ( 127 ), 128 'reference' => '8c2c001b1b55d194402cf18aad2757049ac6d575', 129 ), 130 'splitbrain/slika' => 131 array ( 132 'pretty_version' => '1.0.5', 133 'version' => '1.0.5.0', 134 'aliases' => 135 array ( 136 ), 137 'reference' => 'be0785cb6b7def847df5d92e0e5fde57def7220f', 138 ), 139 ), 140); 141private static $canGetVendors; 142private static $installedByVendor = array(); 143 144 145 146 147 148 149 150public static function getInstalledPackages() 151{ 152$packages = array(); 153foreach (self::getInstalled() as $installed) { 154$packages[] = array_keys($installed['versions']); 155} 156 157 158if (1 === \count($packages)) { 159return $packages[0]; 160} 161 162return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); 163} 164 165 166 167 168 169 170 171 172 173public static function isInstalled($packageName) 174{ 175foreach (self::getInstalled() as $installed) { 176if (isset($installed['versions'][$packageName])) { 177return true; 178} 179} 180 181return false; 182} 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197public static function satisfies(VersionParser $parser, $packageName, $constraint) 198{ 199$constraint = $parser->parseConstraints($constraint); 200$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); 201 202return $provided->matches($constraint); 203} 204 205 206 207 208 209 210 211 212 213 214public static function getVersionRanges($packageName) 215{ 216foreach (self::getInstalled() as $installed) { 217if (!isset($installed['versions'][$packageName])) { 218continue; 219} 220 221$ranges = array(); 222if (isset($installed['versions'][$packageName]['pretty_version'])) { 223$ranges[] = $installed['versions'][$packageName]['pretty_version']; 224} 225if (array_key_exists('aliases', $installed['versions'][$packageName])) { 226$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); 227} 228if (array_key_exists('replaced', $installed['versions'][$packageName])) { 229$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); 230} 231if (array_key_exists('provided', $installed['versions'][$packageName])) { 232$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); 233} 234 235return implode(' || ', $ranges); 236} 237 238throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 239} 240 241 242 243 244 245public static function getVersion($packageName) 246{ 247foreach (self::getInstalled() as $installed) { 248if (!isset($installed['versions'][$packageName])) { 249continue; 250} 251 252if (!isset($installed['versions'][$packageName]['version'])) { 253return null; 254} 255 256return $installed['versions'][$packageName]['version']; 257} 258 259throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 260} 261 262 263 264 265 266public static function getPrettyVersion($packageName) 267{ 268foreach (self::getInstalled() as $installed) { 269if (!isset($installed['versions'][$packageName])) { 270continue; 271} 272 273if (!isset($installed['versions'][$packageName]['pretty_version'])) { 274return null; 275} 276 277return $installed['versions'][$packageName]['pretty_version']; 278} 279 280throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 281} 282 283 284 285 286 287public static function getReference($packageName) 288{ 289foreach (self::getInstalled() as $installed) { 290if (!isset($installed['versions'][$packageName])) { 291continue; 292} 293 294if (!isset($installed['versions'][$packageName]['reference'])) { 295return null; 296} 297 298return $installed['versions'][$packageName]['reference']; 299} 300 301throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 302} 303 304 305 306 307 308public static function getRootPackage() 309{ 310$installed = self::getInstalled(); 311 312return $installed[0]['root']; 313} 314 315 316 317 318 319 320 321public static function getRawData() 322{ 323return self::$installed; 324} 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344public static function reload($data) 345{ 346self::$installed = $data; 347self::$installedByVendor = array(); 348} 349 350 351 352 353private static function getInstalled() 354{ 355if (null === self::$canGetVendors) { 356self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); 357} 358 359$installed = array(); 360 361if (self::$canGetVendors) { 362foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { 363if (isset(self::$installedByVendor[$vendorDir])) { 364$installed[] = self::$installedByVendor[$vendorDir]; 365} elseif (is_file($vendorDir.'/composer/installed.php')) { 366$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; 367} 368} 369} 370 371$installed[] = self::$installed; 372 373return $installed; 374} 375} 376