From 44f02a5c8614d9bb4f43f26b287d3fde29633c2b Mon Sep 17 00:00:00 2001 From: Sam L Date: Mon, 8 Jan 2024 09:10:49 -0500 Subject: [PATCH] Add COMPOSER_FUND=0 env var to disable calls for funding (#11779) --- doc/03-cli.md | 4 ++ src/Composer/Installer.php | 38 +++++++----- .../installer/install-funding-notice-env.test | 62 +++++++++++++++++++ ...tall-funding-notice-not-displayed-env.test | 60 ++++++++++++++++++ tests/Composer/Test/InstallerTest.php | 1 + 5 files changed, 150 insertions(+), 15 deletions(-) create mode 100644 tests/Composer/Test/Fixtures/installer/install-funding-notice-env.test create mode 100644 tests/Composer/Test/Fixtures/installer/install-funding-notice-not-displayed-env.test diff --git a/doc/03-cli.md b/doc/03-cli.md index 8d4d88466..cfdcd5c99 100644 --- a/doc/03-cli.md +++ b/doc/03-cli.md @@ -1145,6 +1145,10 @@ If set to 1, this env suppresses a warning when Composer is running with the Xde This env var controls the [`discard-changes`](06-config.md#discard-changes) config option. +### COMPOSER_FUND + +If set to 0, this env suppresses funding notices when installing. + ### COMPOSER_HOME The `COMPOSER_HOME` var allows you to change the Composer home directory. This diff --git a/src/Composer/Installer.php b/src/Composer/Installer.php index b4361a102..fe50c8fde 100644 --- a/src/Composer/Installer.php +++ b/src/Composer/Installer.php @@ -372,22 +372,30 @@ class Installer } } - $fundingCount = 0; - foreach ($localRepo->getPackages() as $package) { - if ($package instanceof CompletePackageInterface && !$package instanceof AliasPackage && $package->getFunding()) { - $fundingCount++; - } + $fundEnv = Platform::getEnv('COMPOSER_FUND'); + $showFunding = true; + if (is_numeric($fundEnv)) { + $showFunding = intval($fundEnv) !== 0; } - if ($fundingCount > 0) { - $this->io->writeError([ - sprintf( - "%d package%s you are using %s looking for funding.", - $fundingCount, - 1 === $fundingCount ? '' : 's', - 1 === $fundingCount ? 'is' : 'are' - ), - 'Use the `composer fund` command to find out more!', - ]); + + if ($showFunding) { + $fundingCount = 0; + foreach ($localRepo->getPackages() as $package) { + if ($package instanceof CompletePackageInterface && !$package instanceof AliasPackage && $package->getFunding()) { + $fundingCount++; + } + } + if ($fundingCount > 0) { + $this->io->writeError([ + sprintf( + "%d package%s you are using %s looking for funding.", + $fundingCount, + 1 === $fundingCount ? '' : 's', + 1 === $fundingCount ? 'is' : 'are' + ), + 'Use the `composer fund` command to find out more!', + ]); + } } if ($this->runScripts) { diff --git a/tests/Composer/Test/Fixtures/installer/install-funding-notice-env.test b/tests/Composer/Test/Fixtures/installer/install-funding-notice-env.test new file mode 100644 index 000000000..c6f737f60 --- /dev/null +++ b/tests/Composer/Test/Fixtures/installer/install-funding-notice-env.test @@ -0,0 +1,62 @@ +--TEST-- +Installs a simple package with exact match requirement +--CONDITION-- +putenv('COMPOSER_FUND=1') +--COMPOSER-- +{ + "repositories": [ + { + "type": "package", + "package": [ + { + "name": "a/a", + "version": "1.0.0", + "funding": [{ "type": "example", "url": "http://example.org/fund" }], + "require": { + "d/d": "^1.0" + } + }, + { + "name": "b/b", + "version": "1.0.0", + "funding": [{ "type": "example", "url": "http://example.org/fund" }] + }, + { + "name": "c/c", + "version": "1.0.0", + "funding": [{ "type": "example", "url": "http://example.org/fund" }] + }, + { + "name": "d/d", + "version": "1.0.0", + "require": { + "b/b": "^1.0" + } + } + ] + } + ], + "require": { + "a/a": "1.0.0" + } +} +--RUN-- +install +--EXPECT-OUTPUT-- +No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information. +Loading composer repositories with package information +Updating dependencies +Lock file operations: 3 installs, 0 updates, 0 removals + - Locking a/a (1.0.0) + - Locking b/b (1.0.0) + - Locking d/d (1.0.0) +Writing lock file +Installing dependencies from lock file (including require-dev) +Package operations: 3 installs, 0 updates, 0 removals +Generating autoload files +2 packages you are using are looking for funding. +Use the `composer fund` command to find out more! +--EXPECT-- +Installing b/b (1.0.0) +Installing d/d (1.0.0) +Installing a/a (1.0.0) diff --git a/tests/Composer/Test/Fixtures/installer/install-funding-notice-not-displayed-env.test b/tests/Composer/Test/Fixtures/installer/install-funding-notice-not-displayed-env.test new file mode 100644 index 000000000..1f4ef8035 --- /dev/null +++ b/tests/Composer/Test/Fixtures/installer/install-funding-notice-not-displayed-env.test @@ -0,0 +1,60 @@ +--TEST-- +Installs a simple package with exact match requirement +--CONDITION-- +putenv('COMPOSER_FUND=0') +--COMPOSER-- +{ + "repositories": [ + { + "type": "package", + "package": [ + { + "name": "a/a", + "version": "1.0.0", + "funding": [{ "type": "example", "url": "http://example.org/fund" }], + "require": { + "d/d": "^1.0" + } + }, + { + "name": "b/b", + "version": "1.0.0", + "funding": [{ "type": "example", "url": "http://example.org/fund" }] + }, + { + "name": "c/c", + "version": "1.0.0", + "funding": [{ "type": "example", "url": "http://example.org/fund" }] + }, + { + "name": "d/d", + "version": "1.0.0", + "require": { + "b/b": "^1.0" + } + } + ] + } + ], + "require": { + "a/a": "1.0.0" + } +} +--RUN-- +install +--EXPECT-OUTPUT-- +No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information. +Loading composer repositories with package information +Updating dependencies +Lock file operations: 3 installs, 0 updates, 0 removals + - Locking a/a (1.0.0) + - Locking b/b (1.0.0) + - Locking d/d (1.0.0) +Writing lock file +Installing dependencies from lock file (including require-dev) +Package operations: 3 installs, 0 updates, 0 removals +Generating autoload files +--EXPECT-- +Installing b/b (1.0.0) +Installing d/d (1.0.0) +Installing a/a (1.0.0) diff --git a/tests/Composer/Test/InstallerTest.php b/tests/Composer/Test/InstallerTest.php index 511d649a8..858d88e7c 100644 --- a/tests/Composer/Test/InstallerTest.php +++ b/tests/Composer/Test/InstallerTest.php @@ -59,6 +59,7 @@ class InstallerTest extends TestCase { parent::tearDown(); Platform::clearEnv('COMPOSER_POOL_OPTIMIZER'); + Platform::clearEnv('COMPOSER_FUND'); chdir($this->prevCwd); if (isset($this->tempComposerHome) && is_dir($this->tempComposerHome)) {