2021-06-19 08:12:48 +00:00
< ? php
namespace Composer ;
use Composer\Autoload\ClassLoader ;
use Composer\Semver\VersionParser ;
class InstalledVersions
{
private static $installed = array (
'root' =>
array (
'pretty_version' => 'dev-main' ,
'version' => 'dev-main' ,
'aliases' =>
array (
),
2021-06-19 09:19:26 +00:00
'reference' => '4b5a19179745291bd3db18b1fc4fbbe52a772976' ,
2021-06-19 08:12:48 +00:00
'name' => '__root__' ,
),
'versions' =>
array (
'__root__' =>
array (
'pretty_version' => 'dev-main' ,
'version' => 'dev-main' ,
'aliases' =>
array (
),
2021-06-19 09:19:26 +00:00
'reference' => '4b5a19179745291bd3db18b1fc4fbbe52a772976' ,
2021-06-19 08:12:48 +00:00
),
'phpmailer/phpmailer' =>
array (
'pretty_version' => 'v6.5.0' ,
'version' => '6.5.0.0' ,
'aliases' =>
array (
),
'reference' => 'a5b5c43e50b7fba655f793ad27303cd74c57363c' ,
),
),
);
private static $canGetVendors ;
private static $installedByVendor = array ();
public static function getInstalledPackages ()
{
$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 )));
}
public static function isInstalled ( $packageName )
{
foreach ( self :: getInstalled () as $installed ) {
if ( isset ( $installed [ 'versions' ][ $packageName ])) {
return true ;
}
}
return false ;
}
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 )
{
foreach ( self :: getInstalled () as $installed ) {
if ( ! isset ( $installed [ 'versions' ][ $packageName ])) {
continue ;
}
$ranges = array ();
if ( isset ( $installed [ 'versions' ][ $packageName ][ 'pretty_version' ])) {
$ranges [] = $installed [ 'versions' ][ $packageName ][ 'pretty_version' ];
}
if ( array_key_exists ( 'aliases' , $installed [ 'versions' ][ $packageName ])) {
$ranges = array_merge ( $ranges , $installed [ 'versions' ][ $packageName ][ 'aliases' ]);
}
if ( array_key_exists ( 'replaced' , $installed [ 'versions' ][ $packageName ])) {
$ranges = array_merge ( $ranges , $installed [ 'versions' ][ $packageName ][ 'replaced' ]);
}
if ( array_key_exists ( 'provided' , $installed [ 'versions' ][ $packageName ])) {
$ranges = array_merge ( $ranges , $installed [ 'versions' ][ $packageName ][ 'provided' ]);
}
return implode ( ' || ' , $ranges );
}
throw new \OutOfBoundsException ( 'Package "' . $packageName . '" is not installed' );
}
public static function getVersion ( $packageName )
{
foreach ( self :: getInstalled () as $installed ) {
if ( ! isset ( $installed [ 'versions' ][ $packageName ])) {
continue ;
}
if ( ! isset ( $installed [ 'versions' ][ $packageName ][ 'version' ])) {
return null ;
}
return $installed [ 'versions' ][ $packageName ][ 'version' ];
}
throw new \OutOfBoundsException ( 'Package "' . $packageName . '" is not installed' );
}
public static function getPrettyVersion ( $packageName )
{
foreach ( self :: getInstalled () as $installed ) {
if ( ! isset ( $installed [ 'versions' ][ $packageName ])) {
continue ;
}
if ( ! isset ( $installed [ 'versions' ][ $packageName ][ 'pretty_version' ])) {
return null ;
}
return $installed [ 'versions' ][ $packageName ][ 'pretty_version' ];
}
throw new \OutOfBoundsException ( 'Package "' . $packageName . '" is not installed' );
}
public static function getReference ( $packageName )
{
foreach ( self :: getInstalled () as $installed ) {
if ( ! isset ( $installed [ 'versions' ][ $packageName ])) {
continue ;
}
if ( ! isset ( $installed [ 'versions' ][ $packageName ][ 'reference' ])) {
return null ;
}
return $installed [ 'versions' ][ $packageName ][ 'reference' ];
}
throw new \OutOfBoundsException ( 'Package "' . $packageName . '" is not installed' );
}
public static function getRootPackage ()
{
$installed = self :: getInstalled ();
return $installed [ 0 ][ 'root' ];
}
public static function getRawData ()
{
@ 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 );
return self :: $installed ;
}
public static function getAllRawData ()
{
return self :: getInstalled ();
}
public static function reload ( $data )
{
self :: $installed = $data ;
self :: $installedByVendor = array ();
}
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 ;
}
}