InstalledVersions.php (4598B)
1 <?php 2 3 4 5 6 7 8 9 10 11 12 13 namespace Composer; 14 15 use Composer\Autoload\ClassLoader; 16 use Composer\Semver\VersionParser; 17 18 19 20 21 22 23 class InstalledVersions 24 { 25 private static $installed = array ( 26 'root' => 27 array ( 28 'pretty_version' => 'dev-master', 29 'version' => 'dev-master', 30 'aliases' => 31 array ( 32 ), 33 'reference' => 'f3434b6c77d03348913fa8fe6e654528a0bf24e3', 34 'name' => 'welbim/welbim-core', 35 ), 36 'versions' => 37 array ( 38 'welbim/welbim-core' => 39 array ( 40 'pretty_version' => 'dev-master', 41 'version' => 'dev-master', 42 'aliases' => 43 array ( 44 ), 45 'reference' => 'f3434b6c77d03348913fa8fe6e654528a0bf24e3', 46 ), 47 ), 48 ); 49 private static $canGetVendors; 50 private static $installedByVendor = array(); 51 52 53 54 55 56 57 58 public static function getInstalledPackages() 59 { 60 $packages = array(); 61 foreach (self::getInstalled() as $installed) { 62 $packages[] = array_keys($installed['versions']); 63 } 64 65 66 if (1 === \count($packages)) { 67 return $packages[0]; 68 } 69 70 return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); 71 } 72 73 74 75 76 77 78 79 80 81 public static function isInstalled($packageName) 82 { 83 foreach (self::getInstalled() as $installed) { 84 if (isset($installed['versions'][$packageName])) { 85 return true; 86 } 87 } 88 89 return false; 90 } 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 public static function satisfies(VersionParser $parser, $packageName, $constraint) 106 { 107 $constraint = $parser->parseConstraints($constraint); 108 $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); 109 110 return $provided->matches($constraint); 111 } 112 113 114 115 116 117 118 119 120 121 122 public static function getVersionRanges($packageName) 123 { 124 foreach (self::getInstalled() as $installed) { 125 if (!isset($installed['versions'][$packageName])) { 126 continue; 127 } 128 129 $ranges = array(); 130 if (isset($installed['versions'][$packageName]['pretty_version'])) { 131 $ranges[] = $installed['versions'][$packageName]['pretty_version']; 132 } 133 if (array_key_exists('aliases', $installed['versions'][$packageName])) { 134 $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); 135 } 136 if (array_key_exists('replaced', $installed['versions'][$packageName])) { 137 $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); 138 } 139 if (array_key_exists('provided', $installed['versions'][$packageName])) { 140 $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); 141 } 142 143 return implode(' || ', $ranges); 144 } 145 146 throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 147 } 148 149 150 151 152 153 public static function getVersion($packageName) 154 { 155 foreach (self::getInstalled() as $installed) { 156 if (!isset($installed['versions'][$packageName])) { 157 continue; 158 } 159 160 if (!isset($installed['versions'][$packageName]['version'])) { 161 return null; 162 } 163 164 return $installed['versions'][$packageName]['version']; 165 } 166 167 throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 168 } 169 170 171 172 173 174 public static function getPrettyVersion($packageName) 175 { 176 foreach (self::getInstalled() as $installed) { 177 if (!isset($installed['versions'][$packageName])) { 178 continue; 179 } 180 181 if (!isset($installed['versions'][$packageName]['pretty_version'])) { 182 return null; 183 } 184 185 return $installed['versions'][$packageName]['pretty_version']; 186 } 187 188 throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 189 } 190 191 192 193 194 195 public static function getReference($packageName) 196 { 197 foreach (self::getInstalled() as $installed) { 198 if (!isset($installed['versions'][$packageName])) { 199 continue; 200 } 201 202 if (!isset($installed['versions'][$packageName]['reference'])) { 203 return null; 204 } 205 206 return $installed['versions'][$packageName]['reference']; 207 } 208 209 throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); 210 } 211 212 213 214 215 216 public static function getRootPackage() 217 { 218 $installed = self::getInstalled(); 219 220 return $installed[0]['root']; 221 } 222 223 224 225 226 227 228 229 public static function getRawData() 230 { 231 return self::$installed; 232 } 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 public static function reload($data) 253 { 254 self::$installed = $data; 255 self::$installedByVendor = array(); 256 } 257 258 259 260 261 private static function getInstalled() 262 { 263 if (null === self::$canGetVendors) { 264 self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); 265 } 266 267 $installed = array(); 268 269 if (self::$canGetVendors) { 270 foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { 271 if (isset(self::$installedByVendor[$vendorDir])) { 272 $installed[] = self::$installedByVendor[$vendorDir]; 273 } elseif (is_file($vendorDir.'/composer/installed.php')) { 274 $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; 275 } 276 } 277 } 278 279 $installed[] = self::$installed; 280 281 return $installed; 282 } 283 }