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)) {