Browse Source

Fixed the Filesystem methods for a directory with a name that is a substring of a another directory

Martin Hasoň 11 years ago
parent
commit
81e41bac4b
2 changed files with 6 additions and 2 deletions
  1. 2 2
      src/Composer/Util/Filesystem.php
  2. 4 0
      tests/Composer/Test/Util/FilesystemTest.php

+ 2 - 2
src/Composer/Util/Filesystem.php

@@ -213,7 +213,7 @@ class Filesystem
             return './'.basename($to);
         }
 
-        $commonPath = $to;
+        $commonPath = $to.'/';
         while (strpos($from, $commonPath) !== 0 && '/' !== $commonPath && !preg_match('{^[a-z]:/?$}i', $commonPath) && '.' !== $commonPath) {
             $commonPath = strtr(dirname($commonPath), '\\', '/');
         }
@@ -250,7 +250,7 @@ class Filesystem
             return $directories ? '__DIR__' : '__FILE__';
         }
 
-        $commonPath = $to;
+        $commonPath = $to.'/';
         while (strpos($from, $commonPath) !== 0 && '/' !== $commonPath && !preg_match('{^[a-z]:/?$}i', $commonPath) && '.' !== $commonPath) {
             $commonPath = strtr(dirname($commonPath), '\\', '/');
         }

+ 4 - 0
tests/Composer/Test/Util/FilesystemTest.php

@@ -58,6 +58,8 @@ class FilesystemTest extends TestCase
             array('/tmp/test/.././vendor', '/tmp/test', true, "dirname(__DIR__).'/test'"),
             array('C:/Temp', 'c:\Temp\..\..\test', true, "dirname(__DIR__).'/test'"),
             array('C:/Temp/../..', 'd:\Temp\..\..\test', true, "'d:/test'"),
+            array('/foo/bar', '/foo/bar_vendor', true, "dirname(__DIR__).'/bar_vendor'"),
+            array('/foo/bar_vendor', '/foo/bar', true, "dirname(__DIR__).'/bar'"),
         );
     }
 
@@ -103,6 +105,8 @@ class FilesystemTest extends TestCase
             array('C:/Temp', 'c:\Temp\..\..\test', "../test", true),
             array('C:/Temp/../..', 'c:\Temp\..\..\test', "./test", true),
             array('/tmp', '/tmp/../../test', '/test', true),
+            array('/foo/bar', '/foo/bar_vendor', '../bar_vendor', true),
+            array('/foo/bar_vendor', '/foo/bar', '../bar', true),
         );
     }