Эх сурвалжийг харах

Abandoned packages support

Added warning to the installer process.
If any installed packages are flagged, the user will get a warning at the end
of the install/update process.
Rafael Dohms 10 жил өмнө
parent
commit
f9f2bbac59

+ 20 - 0
src/Composer/Installer.php

@@ -31,6 +31,7 @@ use Composer\Installer\NoopInstaller;
 use Composer\IO\IOInterface;
 use Composer\Json\JsonFile;
 use Composer\Package\AliasPackage;
+use Composer\Package\CompletePackage;
 use Composer\Package\Link;
 use Composer\Package\LinkConstraint\VersionConstraint;
 use Composer\Package\Locker;
@@ -239,6 +240,25 @@ class Installer
             }
         }
 
+        # Find abandoned packages and warn user
+        foreach ($localRepo->getPackages() as $package) {
+            if (!$package instanceof CompletePackage || !$package->isAbandoned()) {
+                continue;
+            }
+
+            $replacement = (is_string($package->getReplacementPackage()))
+                ? 'Use ' . $package->getReplacementPackage() . ' instead'
+                : 'No replacement was suggested';
+
+            $this->io->write(
+                sprintf(
+                    "<error>Package %s is abandoned, you should avoid using it. %s.</error>",
+                    $package->getPrettyName(),
+                    $replacement
+                )
+            );
+        }
+
         if (!$this->dryRun) {
             // write lock
             if ($this->update || !$this->locker->isLocked()) {

+ 36 - 0
tests/Composer/Test/Fixtures/installer/abandoned-listed.test

@@ -0,0 +1,36 @@
+--TEST--
+Abandoned packages are flagged
+--COMPOSER--
+{
+    "repositories": [
+        {
+            "type": "package",
+            "package": [
+                { "name": "a/a", "version": "1.0.0", "abandoned": true }
+            ]
+        },
+        {
+            "type": "package",
+            "package": [
+                { "name": "c/c", "version": "1.0.0", "abandoned": "b/b" }
+            ]
+        }
+    ],
+    "require": {
+        "a/a": "1.0.0",
+        "c/c": "1.0.0"
+    }
+}
+--RUN--
+install
+--EXPECT-OUTPUT--
+<info>Loading composer repositories with package information</info>
+<info>Installing dependencies (including require-dev)</info>
+<error>Package a/a is abandoned, you should avoid using it. No replacement was suggested.</error>
+<error>Package c/c is abandoned, you should avoid using it. Use b/b instead.</error>
+<info>Writing lock file</info>
+<info>Generating autoload files</info>
+
+--EXPECT--
+Installing a/a (1.0.0)
+Installing c/c (1.0.0)

+ 2 - 1
tests/Composer/Test/Fixtures/installer/install-dev-using-dist.test

@@ -38,7 +38,8 @@ install --prefer-dist
                 "reference": "459720ff3b74ee0c0d159277c6f2f5df89d8a4f6",
                 "shasum": null
             },
-            "type": "library"
+            "type": "library",
+            "abandoned": false
         }
     ],
     "packages-dev": [],

+ 3 - 3
tests/Composer/Test/Fixtures/installer/partial-update-downgrades-non-whitelisted-unstable.test

@@ -50,9 +50,9 @@ update c/uptodate
 --EXPECT-LOCK--
 {
     "packages": [
-        { "name": "a/old", "version": "1.0.0", "type": "library" },
-        { "name": "b/unstable", "version": "1.0.0", "type": "library" },
-        { "name": "c/uptodate", "version": "2.0.0", "type": "library" }
+        { "name": "a/old", "version": "1.0.0", "type": "library", "abandoned": false },
+        { "name": "b/unstable", "version": "1.0.0", "type": "library", "abandoned": false },
+        { "name": "c/uptodate", "version": "2.0.0", "type": "library", "abandoned": false }
     ],
     "packages-dev": [],
     "aliases": [],

+ 3 - 3
tests/Composer/Test/Fixtures/installer/partial-update-from-lock.test

@@ -50,9 +50,9 @@ update b/unstable
 --EXPECT-LOCK--
 {
     "packages": [
-        { "name": "a/old", "version": "1.0.0", "type": "library" },
-        { "name": "b/unstable", "version": "1.0.0", "type": "library" },
-        { "name": "c/uptodate", "version": "1.0.0", "type": "library" }
+        { "name": "a/old", "version": "1.0.0", "type": "library", "abandoned": false },
+        { "name": "b/unstable", "version": "1.0.0", "type": "library", "abandoned": false },
+        { "name": "c/uptodate", "version": "1.0.0", "type": "library", "abandoned": false }
     ],
     "packages-dev": [],
     "aliases": [],

+ 4 - 4
tests/Composer/Test/Fixtures/installer/partial-update-without-lock.test

@@ -33,10 +33,10 @@ update b/unstable
 --EXPECT-LOCK--
 {
     "packages": [
-        { "name": "a/old", "version": "1.0.0", "type": "library" },
-        { "name": "b/unstable", "version": "1.0.0", "type": "library" },
-        { "name": "c/uptodate", "version": "1.0.0", "type": "library" },
-        { "name": "d/removed", "version": "1.0.0", "type": "library" }
+        { "name": "a/old", "version": "1.0.0", "type": "library", "abandoned": false },
+        { "name": "b/unstable", "version": "1.0.0", "type": "library", "abandoned": false },
+        { "name": "c/uptodate", "version": "1.0.0", "type": "library", "abandoned": false },
+        { "name": "d/removed", "version": "1.0.0", "type": "library", "abandoned": false }
     ],
     "packages-dev": [],
     "aliases": [],

+ 3 - 2
tests/Composer/Test/Fixtures/installer/update-alias-lock.test

@@ -58,7 +58,8 @@ update
             "name": "a/a", "version": "dev-master",
             "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } },
             "source": { "reference": "master", "type": "git", "url": "" },
-            "type": "library"
+            "type": "library",
+            "abandoned": false
         }
     ],
     "packages-dev": [],
@@ -70,4 +71,4 @@ update
     "platform-dev": []
 }
 --EXPECT--
-Updating a/a (dev-master 1234) to a/a (dev-master master)
+Updating a/a (dev-master 1234) to a/a (dev-master master)

+ 2 - 1
tests/Composer/Test/Fixtures/installer/updating-dev-updates-url-and-reference.test

@@ -51,7 +51,8 @@ update
             "name": "a/a", "version": "dev-master",
             "type": "library",
             "source": { "reference": "newref", "url": "newurl", "type": "git" },
-            "dist": { "reference": "newref", "url": "newurl", "type": "zip", "shasum": "" }
+            "dist": { "reference": "newref", "url": "newurl", "type": "zip", "shasum": "" },
+            "abandoned": false
         }
     ],
     "packages-dev": [],

+ 1 - 1
tests/Composer/Test/InstallerTest.php

@@ -304,7 +304,7 @@ class InstallerTest extends TestCase
                 die(sprintf('Test "%s" is not valid, did not match the expected format.', str_replace($fixturesDir.'/', '', $file)));
             }
 
-            $tests[] = array(str_replace($fixturesDir.'/', '', $file), $message, $condition, $composer, $lock, $installed, $run, $expectLock, $expectOutput, $expect, $expectExitCode);
+            $tests[basename($file)] = array(str_replace($fixturesDir.'/', '', $file), $message, $condition, $composer, $lock, $installed, $run, $expectLock, $expectOutput, $expect, $expectExitCode);
         }
 
         return $tests;