Ver Fonte

Fix case insensitivity of ‘require’ command

When currently executing the `require` command for a package that is already listed in `require(-dev)`, one must use the exact same, case matching package name as written in `composer.json`. That is, if one changes the case of a character in the package name, the `require` command will add a new entry to `require(-dev)`, instead of updating the existing one.

This commit fixes the described behaviour to make it consistent with other commands like `update` that are already case insensitive.
Sven Münnich há 7 anos atrás
pai
commit
d51ef83a43

+ 8 - 4
src/Composer/Json/JsonManipulator.php

@@ -69,11 +69,15 @@ class JsonManipulator
 
         $links = $matches['value'];
 
-        if (isset($decoded[$type][$package])) {
+        // try to find existing link
+        $packageRegex = str_replace('/', '\\\\?/', preg_quote($package));
+        $regex = '{'.self::$DEFINES.'"(?P<package>'.$packageRegex.')"(\s*:\s*)(?&string)}ix';
+        if ($this->pregMatch($regex, $links, $packageMatches)) {
             // update existing link
-            $packageRegex = str_replace('/', '\\\\?/', preg_quote($package));
-            $links = preg_replace_callback('{'.self::$DEFINES.'"'.$packageRegex.'"(?P<separator>\s*:\s*)(?&string)}ix', function ($m) use ($package, $constraint) {
-                return JsonFile::encode($package) . $m['separator'] . '"' . $constraint . '"';
+            $existingPackage = $packageMatches['package'];
+            $packageRegex = str_replace('/', '\\\\?/', preg_quote($existingPackage));
+            $links = preg_replace_callback('{'.self::$DEFINES.'"'.$packageRegex.'"(?P<separator>\s*:\s*)(?&string)}ix', function ($m) use ($existingPackage, $constraint) {
+                return JsonFile::encode(str_replace('\\/', '/', $existingPackage)) . $m['separator'] . '"' . $constraint . '"';
             }, $links);
         } else {
             if ($this->pregMatch('#^\s*\{\s*\S+.*?(\s*\}\s*)$#s', $links, $match)) {

+ 42 - 0
tests/Composer/Test/Json/JsonManipulatorTest.php

@@ -107,6 +107,28 @@ class JsonManipulatorTest extends \PHPUnit_Framework_TestCase
         "vendor/baz": "qux"
     }
 }
+',
+            ),
+
+
+            array(
+                '{
+    "require":
+    {
+        "foo": "bar",
+        "vendor/baz": "baz"
+    }
+}',
+                'require',
+                'vEnDoR/bAz',
+                'qux',
+                '{
+    "require":
+    {
+        "foo": "bar",
+        "vendor/baz": "qux"
+    }
+}
 ',
             ),
             array(
@@ -127,6 +149,26 @@ class JsonManipulatorTest extends \PHPUnit_Framework_TestCase
         "vendor/baz": "qux"
     }
 }
+',
+            ),
+            array(
+                '{
+    "require":
+    {
+        "foo": "bar",
+        "vendor\/baz": "baz"
+    }
+}',
+                'require',
+                'vEnDoR/bAz',
+                'qux',
+                '{
+    "require":
+    {
+        "foo": "bar",
+        "vendor/baz": "qux"
+    }
+}
 ',
             ),
             array(