Scope composer tools with the bin plugin

Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
pull/28507/head
Christoph Wurst 3 years ago
parent 3dc7fd27f1
commit e3541da93e
No known key found for this signature in database
GPG Key ID: CC42AC2A7F0E56D8

2
.gitignore vendored

@ -159,3 +159,5 @@ clover.xml
tests/acceptance/vendor/ tests/acceptance/vendor/
composer.phar composer.phar
/lib/composer/bin
/vendor-bin/**/vendor

@ -84,6 +84,7 @@ $expectedFiles = [
'status.php', 'status.php',
'tests', 'tests',
'themes', 'themes',
'vendor-bin',
'version.php', 'version.php',
'webpack.common.js', 'webpack.common.js',
'webpack.dev.js', 'webpack.dev.js',

@ -1,9 +1,13 @@
{ {
"config" : { "config": {
"vendor-dir": "lib/composer", "vendor-dir": "lib/composer",
"optimize-autoloader": true "optimize-autoloader": true,
"sort-packages": true,
"platform": {
"php": "7.3"
}
}, },
"autoload" : { "autoload": {
"psr-4": { "psr-4": {
"": "lib/private/legacy", "": "lib/private/legacy",
"OC\\": "lib/private", "OC\\": "lib/private",
@ -21,10 +25,17 @@
"ext-zip": "*" "ext-zip": "*"
}, },
"require-dev": { "require-dev": {
"nextcloud/coding-standard": "^0.5.0", "bamarni/composer-bin-plugin": "^1.4"
"vimeo/psalm": "^4.0"
}, },
"scripts": { "scripts": {
"post-install-cmd": [
"[ $COMPOSER_DEV_MODE -eq 0 ] || composer bin all install",
"composer dump-autoload"
],
"post-update-cmd": [
"[ $COMPOSER_DEV_MODE -eq 0 ] || composer bin all update --ansi",
"composer dump-autoload"
],
"cs:fix": "php-cs-fixer fix", "cs:fix": "php-cs-fixer fix",
"cs:check": "php-cs-fixer fix --dry-run --diff", "cs:check": "php-cs-fixer fix --dry-run --diff",
"lint": "find . -name \\*.php -not -path './lib/composer/*' -not -path './build/stubs/*' -print0 | xargs -0 -n1 php -l", "lint": "find . -name \\*.php -not -path './lib/composer/*' -not -path './build/stubs/*' -print0 | xargs -0 -n1 php -l",

3021
composer.lock generated

File diff suppressed because it is too large Load Diff

@ -1,299 +1,337 @@
<?php <?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer; namespace Composer;
use Composer\Autoload\ClassLoader; use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser; use Composer\Semver\VersionParser;
/**
* This class is copied in every Composer installed project and available to all
*
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
*
* To require it's presence, you can require `composer-runtime-api ^2.0`
*/
class InstalledVersions class InstalledVersions
{ {
private static $installed = array ( private static $installed;
'root' => private static $canGetVendors;
array ( private static $installedByVendor = array();
'pretty_version' => 'dev-master',
'version' => 'dev-master', /**
'aliases' => * Returns a list of all package names which are present, either by being installed, replaced or provided
array ( *
), * @return string[]
'reference' => '619b35b480a2d348436156a2a6144895b00b1e07', * @psalm-return list<string>
'name' => '__root__', */
), public static function getInstalledPackages()
'versions' => {
array ( $packages = array();
'__root__' => foreach (self::getInstalled() as $installed) {
array ( $packages[] = array_keys($installed['versions']);
'pretty_version' => 'dev-master', }
'version' => 'dev-master',
'aliases' => if (1 === \count($packages)) {
array ( return $packages[0];
), }
'reference' => '619b35b480a2d348436156a2a6144895b00b1e07',
), return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
), }
);
private static $canGetVendors; /**
private static $installedByVendor = array(); * Returns a list of all package names with a specific type e.g. 'library'
*
* @param string $type
* @return string[]
* @psalm-return list<string>
*/
public static function getInstalledPackagesByType($type)
{
public static function getInstalledPackages() $packagesByType = array();
{
$packages = array(); foreach (self::getInstalled() as $installed) {
foreach (self::getInstalled() as $installed) { foreach ($installed['versions'] as $name => $package) {
$packages[] = array_keys($installed['versions']); if (isset($package['type']) && $package['type'] === $type) {
} $packagesByType[] = $name;
}
if (1 === \count($packages)) { }
return $packages[0]; }
}
return $packagesByType;
return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); }
}
/**
* Checks whether the given package is installed
*
* This also returns true if the package name is provided or replaced by another package
*
* @param string $packageName
* @param bool $includeDevRequirements
* @return bool
*/
public static function isInstalled($packageName) public static function isInstalled($packageName, $includeDevRequirements = true)
{ {
foreach (self::getInstalled() as $installed) { foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) { if (isset($installed['versions'][$packageName])) {
return true; return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
} }
} }
return false; return false;
} }
/**
* Checks whether the given package satisfies a version constraint
*
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
*
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
*
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
* @param string $packageName
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
* @return bool
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
public static function satisfies(VersionParser $parser, $packageName, $constraint) {
{ $constraint = $parser->parseConstraints($constraint);
$constraint = $parser->parseConstraints($constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
return $provided->matches($constraint); }
}
/**
* Returns a version constraint representing all the range(s) which are installed for a given package
*
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
* whether a given version of a package is installed, and not just whether it exists
*
* @param string $packageName
* @return string Version constraint usable with composer/semver
*/
public static function getVersionRanges($packageName)
public static function getVersionRanges($packageName) {
{ foreach (self::getInstalled() as $installed) {
foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) {
if (!isset($installed['versions'][$packageName])) { continue;
continue; }
}
$ranges = array();
$ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) {
if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version'];
$ranges[] = $installed['versions'][$packageName]['pretty_version']; }
} if (array_key_exists('aliases', $installed['versions'][$packageName])) {
if (array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); }
} if (array_key_exists('replaced', $installed['versions'][$packageName])) {
if (array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); }
} if (array_key_exists('provided', $installed['versions'][$packageName])) {
if (array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); }
}
return implode(' || ', $ranges);
return implode(' || ', $ranges); }
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); }
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
*/
public static function getVersion($packageName)
public static function getVersion($packageName) {
{ foreach (self::getInstalled() as $installed) {
foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) {
if (!isset($installed['versions'][$packageName])) { continue;
continue; }
}
if (!isset($installed['versions'][$packageName]['version'])) {
if (!isset($installed['versions'][$packageName]['version'])) { return null;
return null; }
}
return $installed['versions'][$packageName]['version'];
return $installed['versions'][$packageName]['version']; }
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); }
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
*/
public static function getPrettyVersion($packageName)
public static function getPrettyVersion($packageName) {
{ foreach (self::getInstalled() as $installed) {
foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) {
if (!isset($installed['versions'][$packageName])) { continue;
continue; }
}
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null;
return null; }
}
return $installed['versions'][$packageName]['pretty_version'];
return $installed['versions'][$packageName]['pretty_version']; }
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); }
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
*/
public static function getReference($packageName)
public static function getReference($packageName) {
{ foreach (self::getInstalled() as $installed) {
foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) {
if (!isset($installed['versions'][$packageName])) { continue;
continue; }
}
if (!isset($installed['versions'][$packageName]['reference'])) {
if (!isset($installed['versions'][$packageName]['reference'])) { return null;
return null; }
}
return $installed['versions'][$packageName]['reference'];
return $installed['versions'][$packageName]['reference']; }
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); }
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
*/
public static function getInstallPath($packageName)
public static function getRootPackage() {
{ foreach (self::getInstalled() as $installed) {
$installed = self::getInstalled(); if (!isset($installed['versions'][$packageName])) {
continue;
return $installed[0]['root']; }
}
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @return array
public static function getRawData() * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}
{ */
@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); public static function getRootPackage()
{
return self::$installed; $installed = self::getInstalled();
}
return $installed[0]['root'];
}
/**
* Returns the raw installed.php data for custom implementations
*
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
public static function getAllRawData() * @return array[]
{ * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}
return self::getInstalled(); */
} 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);
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = include __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}
return self::$installed;
}
/**
* Returns the raw data of all installed.php which are currently loaded for custom implementations
*
public static function reload($data) * @return array[]
{ * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}>
self::$installed = $data; */
self::$installedByVendor = array(); public static function getAllRawData()
} {
return self::getInstalled();
}
/**
* Lets you reload the static array from another file
private static function getInstalled() *
{ * This is only useful for complex integrations in which a project needs to use
if (null === self::$canGetVendors) { * this class but then also needs to execute another project's autoloader in process,
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); * and wants to ensure both projects have access to their version of installed.php.
} *
* A typical case would be PHPUnit, where it would need to make sure it reads all
$installed = array(); * the data it needs from this class, then call reload() with
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
if (self::$canGetVendors) { * the project in which it runs can then also use this class safely, without
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { * interference between PHPUnit's dependencies and the project's dependencies.
if (isset(self::$installedByVendor[$vendorDir])) { *
$installed[] = self::$installedByVendor[$vendorDir]; * @param array[] $data A vendor/composer/installed.php data set
} elseif (is_file($vendorDir.'/composer/installed.php')) { * @return void
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; *
} * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>} $data
} */
} public static function reload($data)
{
$installed[] = self::$installed; self::$installed = $data;
self::$installedByVendor = array();
return $installed; }
}
/**
* @return array[]
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string}>}>
*/
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';
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
}
}
}
}
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = require __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}
$installed[] = self::$installed;
return $installed;
}
} }

@ -1,24 +1,23 @@
<?php return array ( <?php return array(
'root' => 'root' => array(
array (
'pretty_version' => 'dev-master', 'pretty_version' => 'dev-master',
'version' => 'dev-master', 'version' => 'dev-master',
'aliases' => 'type' => 'library',
array ( 'install_path' => __DIR__ . '/../../../',
), 'aliases' => array(),
'reference' => '619b35b480a2d348436156a2a6144895b00b1e07', 'reference' => '66144c300395458ff38b86e50cd92174443cd85e',
'name' => '__root__', 'name' => '__root__',
'dev' => false,
), ),
'versions' => 'versions' => array(
array ( '__root__' => array(
'__root__' =>
array (
'pretty_version' => 'dev-master', 'pretty_version' => 'dev-master',
'version' => 'dev-master', 'version' => 'dev-master',
'aliases' => 'type' => 'library',
array ( 'install_path' => __DIR__ . '/../../../',
), 'aliases' => array(),
'reference' => '619b35b480a2d348436156a2a6144895b00b1e07', 'reference' => '66144c300395458ff38b86e50cd92174443cd85e',
'dev_requirement' => false,
), ),
), ),
); );

@ -0,0 +1,11 @@
{
"config": {
"platform": {
"php": "7.3"
}
},
"require": {
"friendsofphp/php-cs-fixer": "2.19.1",
"nextcloud/coding-standard": "^0.5.0"
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,10 @@
{
"config": {
"platform": {
"php": "7.3"
}
},
"require": {
"vimeo/psalm": "4.8.1"
}
}

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save