2021-01-04 18:11:04 +08:00
< ? php
namespace Composer ;
2021-03-01 17:21:26 +08:00
use Composer\Autoload\ClassLoader ;
2021-01-04 18:11:04 +08:00
use Composer\Semver\VersionParser ;
2021-05-23 19:20:53 +08:00
2021-01-04 18:11:04 +08:00
class InstalledVersions
{
private static $installed = array (
'root' =>
array (
'pretty_version' => '1.0.0+no-version-set' ,
'version' => '1.0.0.0' ,
'aliases' =>
array (
),
'reference' => NULL ,
'name' => '__root__' ,
),
'versions' =>
array (
'__root__' =>
array (
'pretty_version' => '1.0.0+no-version-set' ,
'version' => '1.0.0.0' ,
'aliases' =>
array (
),
'reference' => NULL ,
),
'bshaffer/oauth2-server-php' =>
array (
'pretty_version' => 'v1.11.1' ,
'version' => '1.11.1.0' ,
'aliases' =>
array (
),
'reference' => '5a0c8000d4763b276919e2106f54eddda6bc50fa' ,
),
'ddeboer/imap' =>
array (
2021-05-05 02:46:05 +08:00
'pretty_version' => '1.12.1' ,
'version' => '1.12.1.0' ,
2021-01-04 18:11:04 +08:00
'aliases' =>
array (
),
2021-05-05 02:46:05 +08:00
'reference' => 'dbed05ca67b93509345a820b2859de10c48948fb' ,
2021-04-14 03:34:47 +08:00
),
'directorytree/ldaprecord' =>
array (
2021-06-23 14:05:09 +08:00
'pretty_version' => 'v2.5.0' ,
'version' => '2.5.0.0' ,
2021-04-14 03:34:47 +08:00
'aliases' =>
array (
),
2021-06-23 14:05:09 +08:00
'reference' => 'ff7a92615fdc3f8b7f3d347c2847ce7ce06db287' ,
2021-01-04 18:11:04 +08:00
),
'exorus/php-mime-mail-parser' =>
array (
'replaced' =>
array (
0 => '*' ,
),
),
2021-04-14 03:34:47 +08:00
'illuminate/contracts' =>
array (
2021-06-23 14:05:09 +08:00
'pretty_version' => 'v8.48.0' ,
'version' => '8.48.0.0' ,
2021-04-14 03:34:47 +08:00
'aliases' =>
array (
),
2021-06-23 14:05:09 +08:00
'reference' => '199fcedc161ba4a0b83feaddc4629f395dbf1641' ,
2021-04-14 03:34:47 +08:00
),
2021-01-04 18:11:04 +08:00
'matthiasmullie/minify' =>
array (
2021-03-01 17:21:26 +08:00
'pretty_version' => '1.3.66' ,
'version' => '1.3.66.0' ,
2021-01-04 18:11:04 +08:00
'aliases' =>
array (
),
2021-03-01 17:21:26 +08:00
'reference' => '45fd3b0f1dfa2c965857c6d4a470bea52adc31a6' ,
2021-01-04 18:11:04 +08:00
),
'matthiasmullie/path-converter' =>
array (
'pretty_version' => '1.1.3' ,
'version' => '1.1.3.0' ,
'aliases' =>
array (
),
'reference' => 'e7d13b2c7e2f2268e1424aaed02085518afa02d9' ,
),
'messaged/php-mime-mail-parser' =>
array (
'replaced' =>
array (
0 => '*' ,
),
),
'mustangostang/spyc' =>
array (
'pretty_version' => '0.6.3' ,
'version' => '0.6.3.0' ,
'aliases' =>
array (
),
'reference' => '4627c838b16550b666d15aeae1e5289dd5b77da0' ,
),
2021-04-14 03:34:47 +08:00
'nesbot/carbon' =>
array (
2021-06-23 14:05:09 +08:00
'pretty_version' => '2.49.0' ,
'version' => '2.49.0.0' ,
2021-04-14 03:34:47 +08:00
'aliases' =>
array (
),
2021-06-23 14:05:09 +08:00
'reference' => '93d9db91c0235c486875d22f1e08b50bdf3e6eee' ,
2021-04-14 03:34:47 +08:00
),
2021-01-04 18:11:04 +08:00
'paragonie/random_compat' =>
array (
'pretty_version' => 'v9.99.100' ,
'version' => '9.99.100.0' ,
'aliases' =>
array (
),
'reference' => '996434e5492cb4c3edcb9168db6fbb1359ef965a' ,
),
'php-mime-mail-parser/php-mime-mail-parser' =>
array (
'pretty_version' => '5.0.5' ,
'version' => '5.0.5.0' ,
'aliases' =>
array (
),
'reference' => '27983433aabeccee832573c3c56e6a4855e57745' ,
),
'phpmailer/phpmailer' =>
array (
2021-06-23 14:05:09 +08:00
'pretty_version' => 'v6.5.0' ,
'version' => '6.5.0.0' ,
2021-04-14 03:34:47 +08:00
'aliases' =>
array (
),
2021-06-23 14:05:09 +08:00
'reference' => 'a5b5c43e50b7fba655f793ad27303cd74c57363c' ,
2021-04-14 03:34:47 +08:00
),
'psr/container' =>
array (
'pretty_version' => '1.1.1' ,
'version' => '1.1.1.0' ,
2021-01-04 18:11:04 +08:00
'aliases' =>
array (
),
2021-04-14 03:34:47 +08:00
'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf' ,
),
'psr/log' =>
array (
2021-05-05 02:46:05 +08:00
'pretty_version' => '1.1.4' ,
'version' => '1.1.4.0' ,
2021-04-14 03:34:47 +08:00
'aliases' =>
array (
),
2021-05-05 02:46:05 +08:00
'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11' ,
2021-04-14 03:34:47 +08:00
),
'psr/simple-cache' =>
array (
'pretty_version' => '1.0.1' ,
'version' => '1.0.1.0' ,
'aliases' =>
array (
),
'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b' ,
2021-01-04 18:11:04 +08:00
),
'robthree/twofactorauth' =>
array (
2021-04-14 03:34:47 +08:00
'pretty_version' => '1.8.0' ,
'version' => '1.8.0.0' ,
2021-01-04 18:11:04 +08:00
'aliases' =>
array (
),
2021-04-14 03:34:47 +08:00
'reference' => '30a38627ae1e7c9399dae67e265063cd6ec5276c' ,
2021-01-04 18:11:04 +08:00
),
'soundasleep/html2text' =>
array (
'pretty_version' => '0.5.0' ,
'version' => '0.5.0.0' ,
'aliases' =>
array (
),
'reference' => 'cdb89f6ffa2c4cc78f8ed9ea6ee0594a9133ccad' ,
),
2021-06-23 14:05:09 +08:00
'symfony/deprecation-contracts' =>
array (
'pretty_version' => 'v2.4.0' ,
'version' => '2.4.0.0' ,
'aliases' =>
array (
),
'reference' => '5f38c8804a9e97d23e0c8d63341088cd8a22d627' ,
),
2021-04-14 03:34:47 +08:00
'symfony/polyfill-mbstring' =>
array (
2021-06-23 14:05:09 +08:00
'pretty_version' => 'v1.23.0' ,
'version' => '1.23.0.0' ,
2021-04-14 03:34:47 +08:00
'aliases' =>
array (
),
2021-06-23 14:05:09 +08:00
'reference' => '2df51500adbaebdc4c38dea4c89a2e131c45c8a1' ,
2021-04-14 03:34:47 +08:00
),
'symfony/polyfill-php80' =>
array (
2021-06-23 14:05:09 +08:00
'pretty_version' => 'v1.23.0' ,
'version' => '1.23.0.0' ,
2021-04-14 03:34:47 +08:00
'aliases' =>
array (
),
2021-06-23 14:05:09 +08:00
'reference' => 'eca0bf41ed421bed1b57c4958bab16aa86b757d0' ,
2021-04-14 03:34:47 +08:00
),
'symfony/translation' =>
array (
2021-06-23 14:05:09 +08:00
'pretty_version' => 'v5.3.2' ,
'version' => '5.3.2.0' ,
2021-04-14 03:34:47 +08:00
'aliases' =>
array (
),
2021-06-23 14:05:09 +08:00
'reference' => '7e2603bcc598e14804c4d2359d8dc4ee3c40391b' ,
2021-04-14 03:34:47 +08:00
),
'symfony/translation-contracts' =>
array (
2021-05-05 02:46:05 +08:00
'pretty_version' => 'v2.4.0' ,
'version' => '2.4.0.0' ,
2021-04-14 03:34:47 +08:00
'aliases' =>
array (
),
2021-05-05 02:46:05 +08:00
'reference' => '95c812666f3e91db75385749fe219c5e494c7f95' ,
2021-04-14 03:34:47 +08:00
),
'symfony/translation-implementation' =>
array (
'provided' =>
array (
0 => '2.3' ,
),
),
'symfony/var-dumper' =>
array (
2021-06-23 14:05:09 +08:00
'pretty_version' => 'v5.3.2' ,
'version' => '5.3.2.0' ,
2021-04-14 03:34:47 +08:00
'aliases' =>
array (
),
2021-06-23 14:05:09 +08:00
'reference' => '905a22c68b292ffb6f20d7636c36b220d1fba5ae' ,
2021-04-14 03:34:47 +08:00
),
'tightenco/collect' =>
array (
'pretty_version' => 'v8.34.0' ,
'version' => '8.34.0.0' ,
'aliases' =>
array (
),
'reference' => 'b069783ab0c547bb894ebcf8e7f6024bb401f9d2' ,
),
2021-01-04 18:11:04 +08:00
'yubico/u2flib-server' =>
array (
'pretty_version' => '1.0.2' ,
'version' => '1.0.2.0' ,
'aliases' =>
array (
),
'reference' => '55d813acf68212ad2cadecde07551600d6971939' ,
),
),
);
2021-03-01 17:21:26 +08:00
private static $canGetVendors ;
private static $installedByVendor = array ();
2021-01-04 18:11:04 +08:00
public static function getInstalledPackages ()
{
2021-03-01 17:21:26 +08:00
$packages = array ();
foreach ( self :: getInstalled () as $installed ) {
$packages [] = array_keys ( $installed [ 'versions' ]);
}
if ( 1 === \count ( $packages )) {
return $packages [ 0 ];
}
return array_keys ( array_flip ( \call_user_func_array ( 'array_merge' , $packages )));
2021-01-04 18:11:04 +08:00
}
public static function isInstalled ( $packageName )
{
2021-03-01 17:21:26 +08:00
foreach ( self :: getInstalled () as $installed ) {
if ( isset ( $installed [ 'versions' ][ $packageName ])) {
return true ;
}
}
return false ;
2021-01-04 18:11:04 +08:00
}
public static function satisfies ( VersionParser $parser , $packageName , $constraint )
{
$constraint = $parser -> parseConstraints ( $constraint );
$provided = $parser -> parseConstraints ( self :: getVersionRanges ( $packageName ));
return $provided -> matches ( $constraint );
}
public static function getVersionRanges ( $packageName )
{
2021-03-01 17:21:26 +08:00
foreach ( self :: getInstalled () as $installed ) {
if ( ! isset ( $installed [ 'versions' ][ $packageName ])) {
continue ;
2021-01-04 18:11:04 +08:00
}
$ranges = array ();
2021-03-01 17:21:26 +08:00
if ( isset ( $installed [ 'versions' ][ $packageName ][ 'pretty_version' ])) {
$ranges [] = $installed [ 'versions' ][ $packageName ][ 'pretty_version' ];
2021-01-04 18:11:04 +08:00
}
2021-03-01 17:21:26 +08:00
if ( array_key_exists ( 'aliases' , $installed [ 'versions' ][ $packageName ])) {
$ranges = array_merge ( $ranges , $installed [ 'versions' ][ $packageName ][ 'aliases' ]);
2021-01-04 18:11:04 +08:00
}
2021-03-01 17:21:26 +08:00
if ( array_key_exists ( 'replaced' , $installed [ 'versions' ][ $packageName ])) {
$ranges = array_merge ( $ranges , $installed [ 'versions' ][ $packageName ][ 'replaced' ]);
2021-01-04 18:11:04 +08:00
}
2021-03-01 17:21:26 +08:00
if ( array_key_exists ( 'provided' , $installed [ 'versions' ][ $packageName ])) {
$ranges = array_merge ( $ranges , $installed [ 'versions' ][ $packageName ][ 'provided' ]);
2021-01-04 18:11:04 +08:00
}
return implode ( ' || ' , $ranges );
}
2021-03-01 17:21:26 +08:00
throw new \OutOfBoundsException ( 'Package "' . $packageName . '" is not installed' );
}
2021-01-04 18:11:04 +08:00
public static function getVersion ( $packageName )
{
2021-03-01 17:21:26 +08:00
foreach ( self :: getInstalled () as $installed ) {
if ( ! isset ( $installed [ 'versions' ][ $packageName ])) {
continue ;
2021-01-04 18:11:04 +08:00
}
2021-03-01 17:21:26 +08:00
if ( ! isset ( $installed [ 'versions' ][ $packageName ][ 'version' ])) {
2021-01-04 18:11:04 +08:00
return null ;
}
2021-03-01 17:21:26 +08:00
return $installed [ 'versions' ][ $packageName ][ 'version' ];
}
throw new \OutOfBoundsException ( 'Package "' . $packageName . '" is not installed' );
2021-01-04 18:11:04 +08:00
}
public static function getPrettyVersion ( $packageName )
{
2021-03-01 17:21:26 +08:00
foreach ( self :: getInstalled () as $installed ) {
if ( ! isset ( $installed [ 'versions' ][ $packageName ])) {
continue ;
2021-01-04 18:11:04 +08:00
}
2021-03-01 17:21:26 +08:00
if ( ! isset ( $installed [ 'versions' ][ $packageName ][ 'pretty_version' ])) {
2021-01-04 18:11:04 +08:00
return null ;
}
2021-03-01 17:21:26 +08:00
return $installed [ 'versions' ][ $packageName ][ 'pretty_version' ];
}
throw new \OutOfBoundsException ( 'Package "' . $packageName . '" is not installed' );
2021-01-04 18:11:04 +08:00
}
public static function getReference ( $packageName )
{
2021-03-01 17:21:26 +08:00
foreach ( self :: getInstalled () as $installed ) {
if ( ! isset ( $installed [ 'versions' ][ $packageName ])) {
continue ;
2021-01-04 18:11:04 +08:00
}
2021-03-01 17:21:26 +08:00
if ( ! isset ( $installed [ 'versions' ][ $packageName ][ 'reference' ])) {
2021-01-04 18:11:04 +08:00
return null ;
}
2021-03-01 17:21:26 +08:00
return $installed [ 'versions' ][ $packageName ][ 'reference' ];
}
throw new \OutOfBoundsException ( 'Package "' . $packageName . '" is not installed' );
2021-01-04 18:11:04 +08:00
}
public static function getRootPackage ()
{
2021-03-01 17:21:26 +08:00
$installed = self :: getInstalled ();
return $installed [ 0 ][ 'root' ];
2021-01-04 18:11:04 +08:00
}
2021-06-23 14:05:09 +08:00
2021-01-04 18:11:04 +08:00
public static function getRawData ()
{
2021-06-23 14:05:09 +08:00
@ 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 );
2021-01-04 18:11:04 +08:00
return self :: $installed ;
}
2021-06-23 14:05:09 +08:00
public static function getAllRawData ()
{
return self :: getInstalled ();
}
2021-01-04 18:11:04 +08:00
public static function reload ( $data )
{
self :: $installed = $data ;
2021-03-01 17:21:26 +08:00
self :: $installedByVendor = array ();
}
2021-05-23 19:20:53 +08:00
2021-03-01 17:21:26 +08:00
private static function getInstalled ()
{
if ( null === self :: $canGetVendors ) {
self :: $canGetVendors = method_exists ( 'Composer\Autoload\ClassLoader' , 'getRegisteredLoaders' );
}
$installed = array ();
if ( self :: $canGetVendors ) {
foreach ( ClassLoader :: getRegisteredLoaders () as $vendorDir => $loader ) {
if ( isset ( self :: $installedByVendor [ $vendorDir ])) {
$installed [] = self :: $installedByVendor [ $vendorDir ];
} elseif ( is_file ( $vendorDir . '/composer/installed.php' )) {
$installed [] = self :: $installedByVendor [ $vendorDir ] = require $vendorDir . '/composer/installed.php' ;
}
}
}
$installed [] = self :: $installed ;
return $installed ;
2021-01-04 18:11:04 +08:00
}
}