InstalledVersions.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. <?php
  2. namespace Composer;
  3. use Composer\Autoload\ClassLoader;
  4. use Composer\Semver\VersionParser;
  5. class InstalledVersions
  6. {
  7. private static $installed = array (
  8. 'root' =>
  9. array (
  10. 'pretty_version' => '1.0.0+no-version-set',
  11. 'version' => '1.0.0.0',
  12. 'aliases' =>
  13. array (
  14. ),
  15. 'reference' => NULL,
  16. 'name' => 'yiisoft/yii2-app-advanced',
  17. ),
  18. 'versions' =>
  19. array (
  20. 'aliyuncs/oss-sdk-php' =>
  21. array (
  22. 'pretty_version' => 'v2.4.1',
  23. 'version' => '2.4.1.0',
  24. 'aliases' =>
  25. array (
  26. ),
  27. 'reference' => '492866331b7bafaac09506cf42f351b7e9e63766',
  28. ),
  29. 'bower-asset/inputmask' =>
  30. array (
  31. 'replaced' =>
  32. array (
  33. 0 => '*',
  34. ),
  35. ),
  36. 'bower-asset/jquery' =>
  37. array (
  38. 'replaced' =>
  39. array (
  40. 0 => '*',
  41. ),
  42. ),
  43. 'bower-asset/punycode' =>
  44. array (
  45. 'replaced' =>
  46. array (
  47. 0 => '*',
  48. ),
  49. ),
  50. 'bower-asset/yii2-pjax' =>
  51. array (
  52. 'replaced' =>
  53. array (
  54. 0 => '*',
  55. ),
  56. ),
  57. 'cebe/markdown' =>
  58. array (
  59. 'pretty_version' => '1.2.1',
  60. 'version' => '1.2.1.0',
  61. 'aliases' =>
  62. array (
  63. ),
  64. 'reference' => '9bac5e971dd391e2802dca5400bbeacbaea9eb86',
  65. ),
  66. 'doctrine/lexer' =>
  67. array (
  68. 'pretty_version' => '1.2.1',
  69. 'version' => '1.2.1.0',
  70. 'aliases' =>
  71. array (
  72. ),
  73. 'reference' => 'e864bbf5904cb8f5bb334f99209b48018522f042',
  74. ),
  75. 'egulias/email-validator' =>
  76. array (
  77. 'pretty_version' => '3.1.0',
  78. 'version' => '3.1.0.0',
  79. 'aliases' =>
  80. array (
  81. ),
  82. 'reference' => '62c3b73c581c834885acf6e120b412b76acc495a',
  83. ),
  84. 'ezyang/htmlpurifier' =>
  85. array (
  86. 'pretty_version' => 'v4.13.0',
  87. 'version' => '4.13.0.0',
  88. 'aliases' =>
  89. array (
  90. ),
  91. 'reference' => '08e27c97e4c6ed02f37c5b2b20488046c8d90d75',
  92. ),
  93. 'imagine/imagine' =>
  94. array (
  95. 'pretty_version' => '1.2.4',
  96. 'version' => '1.2.4.0',
  97. 'aliases' =>
  98. array (
  99. ),
  100. 'reference' => 'd2e18be6e930ca169e4f921ef73ebfc061bf55d8',
  101. ),
  102. 'markbaker/complex' =>
  103. array (
  104. 'pretty_version' => '1.5.0',
  105. 'version' => '1.5.0.0',
  106. 'aliases' =>
  107. array (
  108. ),
  109. 'reference' => 'c3131244e29c08d44fefb49e0dd35021e9e39dd2',
  110. ),
  111. 'markbaker/matrix' =>
  112. array (
  113. 'pretty_version' => '1.2.3',
  114. 'version' => '1.2.3.0',
  115. 'aliases' =>
  116. array (
  117. ),
  118. 'reference' => '44bb1ab01811116f01fe216ab37d921dccc6c10d',
  119. ),
  120. 'npm-asset/bootstrap' =>
  121. array (
  122. 'replaced' =>
  123. array (
  124. 0 => '*',
  125. ),
  126. ),
  127. 'phpoffice/phpspreadsheet' =>
  128. array (
  129. 'pretty_version' => '1.11.0',
  130. 'version' => '1.11.0.0',
  131. 'aliases' =>
  132. array (
  133. ),
  134. 'reference' => 'c2a205e82f9cf1cc9fab86b79e808d86dd680470',
  135. ),
  136. 'psr/event-dispatcher' =>
  137. array (
  138. 'pretty_version' => '1.0.0',
  139. 'version' => '1.0.0.0',
  140. 'aliases' =>
  141. array (
  142. ),
  143. 'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0',
  144. ),
  145. 'psr/event-dispatcher-implementation' =>
  146. array (
  147. 'provided' =>
  148. array (
  149. 0 => '1.0',
  150. ),
  151. ),
  152. 'psr/http-client' =>
  153. array (
  154. 'pretty_version' => '1.0.1',
  155. 'version' => '1.0.1.0',
  156. 'aliases' =>
  157. array (
  158. ),
  159. 'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621',
  160. ),
  161. 'psr/http-factory' =>
  162. array (
  163. 'pretty_version' => '1.0.1',
  164. 'version' => '1.0.1.0',
  165. 'aliases' =>
  166. array (
  167. ),
  168. 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
  169. ),
  170. 'psr/http-message' =>
  171. array (
  172. 'pretty_version' => '1.0.1',
  173. 'version' => '1.0.1.0',
  174. 'aliases' =>
  175. array (
  176. ),
  177. 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
  178. ),
  179. 'psr/simple-cache' =>
  180. array (
  181. 'pretty_version' => '1.0.1',
  182. 'version' => '1.0.1.0',
  183. 'aliases' =>
  184. array (
  185. ),
  186. 'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
  187. ),
  188. 'solarium/solarium' =>
  189. array (
  190. 'pretty_version' => '5.2.0',
  191. 'version' => '5.2.0.0',
  192. 'aliases' =>
  193. array (
  194. ),
  195. 'reference' => '9208b615cb2ed6f306be6e696431b6b71e4d42db',
  196. ),
  197. 'swiftmailer/swiftmailer' =>
  198. array (
  199. 'pretty_version' => 'v6.2.7',
  200. 'version' => '6.2.7.0',
  201. 'aliases' =>
  202. array (
  203. ),
  204. 'reference' => '15f7faf8508e04471f666633addacf54c0ab5933',
  205. ),
  206. 'symfony/deprecation-contracts' =>
  207. array (
  208. 'pretty_version' => 'v2.2.0',
  209. 'version' => '2.2.0.0',
  210. 'aliases' =>
  211. array (
  212. ),
  213. 'reference' => '5fa56b4074d1ae755beb55617ddafe6f5d78f665',
  214. ),
  215. 'symfony/event-dispatcher' =>
  216. array (
  217. 'pretty_version' => 'v5.2.4',
  218. 'version' => '5.2.4.0',
  219. 'aliases' =>
  220. array (
  221. ),
  222. 'reference' => 'd08d6ec121a425897951900ab692b612a61d6240',
  223. ),
  224. 'symfony/event-dispatcher-contracts' =>
  225. array (
  226. 'pretty_version' => 'v2.2.0',
  227. 'version' => '2.2.0.0',
  228. 'aliases' =>
  229. array (
  230. ),
  231. 'reference' => '0ba7d54483095a198fa51781bc608d17e84dffa2',
  232. ),
  233. 'symfony/event-dispatcher-implementation' =>
  234. array (
  235. 'provided' =>
  236. array (
  237. 0 => '2.0',
  238. ),
  239. ),
  240. 'symfony/polyfill-iconv' =>
  241. array (
  242. 'pretty_version' => 'v1.22.1',
  243. 'version' => '1.22.1.0',
  244. 'aliases' =>
  245. array (
  246. ),
  247. 'reference' => '06fb361659649bcfd6a208a0f1fcaf4e827ad342',
  248. ),
  249. 'symfony/polyfill-intl-idn' =>
  250. array (
  251. 'pretty_version' => 'v1.22.1',
  252. 'version' => '1.22.1.0',
  253. 'aliases' =>
  254. array (
  255. ),
  256. 'reference' => '2d63434d922daf7da8dd863e7907e67ee3031483',
  257. ),
  258. 'symfony/polyfill-intl-normalizer' =>
  259. array (
  260. 'pretty_version' => 'v1.22.1',
  261. 'version' => '1.22.1.0',
  262. 'aliases' =>
  263. array (
  264. ),
  265. 'reference' => '43a0283138253ed1d48d352ab6d0bdb3f809f248',
  266. ),
  267. 'symfony/polyfill-mbstring' =>
  268. array (
  269. 'pretty_version' => 'v1.22.1',
  270. 'version' => '1.22.1.0',
  271. 'aliases' =>
  272. array (
  273. ),
  274. 'reference' => '5232de97ee3b75b0360528dae24e73db49566ab1',
  275. ),
  276. 'symfony/polyfill-php72' =>
  277. array (
  278. 'pretty_version' => 'v1.22.1',
  279. 'version' => '1.22.1.0',
  280. 'aliases' =>
  281. array (
  282. ),
  283. 'reference' => 'cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9',
  284. ),
  285. 'symfony/polyfill-php80' =>
  286. array (
  287. 'pretty_version' => 'v1.22.1',
  288. 'version' => '1.22.1.0',
  289. 'aliases' =>
  290. array (
  291. ),
  292. 'reference' => 'dc3063ba22c2a1fd2f45ed856374d79114998f91',
  293. ),
  294. 'tecnickcom/tcpdf' =>
  295. array (
  296. 'pretty_version' => '6.3.5',
  297. 'version' => '6.3.5.0',
  298. 'aliases' =>
  299. array (
  300. ),
  301. 'reference' => '19a535eaa7fb1c1cac499109deeb1a7a201b4549',
  302. ),
  303. 'yiisoft/yii2' =>
  304. array (
  305. 'pretty_version' => '2.0.41.1',
  306. 'version' => '2.0.41.1',
  307. 'aliases' =>
  308. array (
  309. ),
  310. 'reference' => '2ad0894a2ccbd3912b33de4419ad1ae3df0595c4',
  311. ),
  312. 'yiisoft/yii2-app-advanced' =>
  313. array (
  314. 'pretty_version' => '1.0.0+no-version-set',
  315. 'version' => '1.0.0.0',
  316. 'aliases' =>
  317. array (
  318. ),
  319. 'reference' => NULL,
  320. ),
  321. 'yiisoft/yii2-composer' =>
  322. array (
  323. 'pretty_version' => '2.0.10',
  324. 'version' => '2.0.10.0',
  325. 'aliases' =>
  326. array (
  327. ),
  328. 'reference' => '94bb3f66e779e2774f8776d6e1bdeab402940510',
  329. ),
  330. 'yiisoft/yii2-imagine' =>
  331. array (
  332. 'pretty_version' => '2.3.0',
  333. 'version' => '2.3.0.0',
  334. 'aliases' =>
  335. array (
  336. ),
  337. 'reference' => 'b103b1b1deb786d4d5fe955898ec866dbee5c1b4',
  338. ),
  339. 'yiisoft/yii2-jquery' =>
  340. array (
  341. 'replaced' =>
  342. array (
  343. 0 => '*',
  344. ),
  345. ),
  346. 'yiisoft/yii2-mongodb' =>
  347. array (
  348. 'pretty_version' => '2.1.11',
  349. 'version' => '2.1.11.0',
  350. 'aliases' =>
  351. array (
  352. ),
  353. 'reference' => '37cfd145ef10bcb116219fbed984086a379aea55',
  354. ),
  355. 'yiisoft/yii2-redis' =>
  356. array (
  357. 'pretty_version' => '2.0.14',
  358. 'version' => '2.0.14.0',
  359. 'aliases' =>
  360. array (
  361. ),
  362. 'reference' => '1cbc7b2138ec9b6ffdc08929f8dc1f41848596aa',
  363. ),
  364. 'yiisoft/yii2-swiftmailer' =>
  365. array (
  366. 'pretty_version' => '2.1.2',
  367. 'version' => '2.1.2.0',
  368. 'aliases' =>
  369. array (
  370. ),
  371. 'reference' => '09659a55959f9e64b8178d842b64a9ffae42b994',
  372. ),
  373. ),
  374. );
  375. private static $canGetVendors;
  376. private static $installedByVendor = array();
  377. public static function getInstalledPackages()
  378. {
  379. $packages = array();
  380. foreach (self::getInstalled() as $installed) {
  381. $packages[] = array_keys($installed['versions']);
  382. }
  383. if (1 === \count($packages)) {
  384. return $packages[0];
  385. }
  386. return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
  387. }
  388. public static function isInstalled($packageName)
  389. {
  390. foreach (self::getInstalled() as $installed) {
  391. if (isset($installed['versions'][$packageName])) {
  392. return true;
  393. }
  394. }
  395. return false;
  396. }
  397. public static function satisfies(VersionParser $parser, $packageName, $constraint)
  398. {
  399. $constraint = $parser->parseConstraints($constraint);
  400. $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
  401. return $provided->matches($constraint);
  402. }
  403. public static function getVersionRanges($packageName)
  404. {
  405. foreach (self::getInstalled() as $installed) {
  406. if (!isset($installed['versions'][$packageName])) {
  407. continue;
  408. }
  409. $ranges = array();
  410. if (isset($installed['versions'][$packageName]['pretty_version'])) {
  411. $ranges[] = $installed['versions'][$packageName]['pretty_version'];
  412. }
  413. if (array_key_exists('aliases', $installed['versions'][$packageName])) {
  414. $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
  415. }
  416. if (array_key_exists('replaced', $installed['versions'][$packageName])) {
  417. $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
  418. }
  419. if (array_key_exists('provided', $installed['versions'][$packageName])) {
  420. $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
  421. }
  422. return implode(' || ', $ranges);
  423. }
  424. throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
  425. }
  426. public static function getVersion($packageName)
  427. {
  428. foreach (self::getInstalled() as $installed) {
  429. if (!isset($installed['versions'][$packageName])) {
  430. continue;
  431. }
  432. if (!isset($installed['versions'][$packageName]['version'])) {
  433. return null;
  434. }
  435. return $installed['versions'][$packageName]['version'];
  436. }
  437. throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
  438. }
  439. public static function getPrettyVersion($packageName)
  440. {
  441. foreach (self::getInstalled() as $installed) {
  442. if (!isset($installed['versions'][$packageName])) {
  443. continue;
  444. }
  445. if (!isset($installed['versions'][$packageName]['pretty_version'])) {
  446. return null;
  447. }
  448. return $installed['versions'][$packageName]['pretty_version'];
  449. }
  450. throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
  451. }
  452. public static function getReference($packageName)
  453. {
  454. foreach (self::getInstalled() as $installed) {
  455. if (!isset($installed['versions'][$packageName])) {
  456. continue;
  457. }
  458. if (!isset($installed['versions'][$packageName]['reference'])) {
  459. return null;
  460. }
  461. return $installed['versions'][$packageName]['reference'];
  462. }
  463. throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
  464. }
  465. public static function getRootPackage()
  466. {
  467. $installed = self::getInstalled();
  468. return $installed[0]['root'];
  469. }
  470. public static function getRawData()
  471. {
  472. return self::$installed;
  473. }
  474. public static function reload($data)
  475. {
  476. self::$installed = $data;
  477. self::$installedByVendor = array();
  478. }
  479. private static function getInstalled()
  480. {
  481. if (null === self::$canGetVendors) {
  482. self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
  483. }
  484. $installed = array();
  485. if (self::$canGetVendors) {
  486. foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
  487. if (isset(self::$installedByVendor[$vendorDir])) {
  488. $installed[] = self::$installedByVendor[$vendorDir];
  489. } elseif (is_file($vendorDir.'/composer/installed.php')) {
  490. $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
  491. }
  492. }
  493. }
  494. $installed[] = self::$installed;
  495. return $installed;
  496. }
  497. }