path: fix bugs related to paths with trailing slashes
authorAndreas Madsen <amwebdk@gmail.com>
Tue, 8 Jan 2013 17:22:04 +0000 (18:22 +0100)
committerisaacs <i@izs.me>
Fri, 11 Jan 2013 01:58:37 +0000 (17:58 -0800)
lib/path.js
test/simple/test-path.js

index 0b24de2..980348e 100644 (file)
@@ -290,7 +290,17 @@ if (isWindows) {
   // 'root' is just a slash, or nothing.
   var splitPathRe =
       /^(\/?)([\s\S]+\/(?!$)|\/)?((?:\.{1,2}$|[\s\S]+?)?(\.[^.\/]*)?)$/;
+  var trailingSlash = /\/+$/;
   var splitPath = function(filename) {
+
+    // removes trailing slashes before spliting the path
+    var tail = trailingSlash.exec(filename);
+    if (tail) {
+      if (tail.index === 0) return ['/', '', '', ''];
+
+      filename = filename.slice(0, tail.index);
+    }
+
     var result = splitPathRe.exec(filename);
     return [result[1] || '', result[2] || '', result[3] || '', result[4] || ''];
   };
index 1c03887..e2ded95 100644 (file)
@@ -30,6 +30,11 @@ var f = __filename;
 
 assert.equal(path.basename(f), 'test-path.js');
 assert.equal(path.basename(f, '.js'), 'test-path');
+assert.equal(path.basename('/dir/basename.ext'), 'basename.ext');
+assert.equal(path.basename('/basename.ext'), 'basename.ext');
+assert.equal(path.basename('basename.ext'), 'basename.ext');
+assert.equal(path.basename('basename.ext/'), 'basename.ext');
+assert.equal(path.basename('basename.ext//'), 'basename.ext');
 
 // POSIX filenames may include control characters
 // c.f. http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html
@@ -47,6 +52,7 @@ assert.equal(path.dirname('/a/b/'), '/a');
 assert.equal(path.dirname('/a/b'), '/a');
 assert.equal(path.dirname('/a'), '/');
 assert.equal(path.dirname('/'), '/');
+assert.equal(path.dirname('////'), '/');
 
 if (isWindows) {
   assert.equal(path.dirname('c:\\'), 'c:\\');
@@ -114,7 +120,8 @@ assert.equal(path.extname('..file..'), '.');
 assert.equal(path.extname('...'), '.');
 assert.equal(path.extname('...ext'), '.ext');
 assert.equal(path.extname('....'), '.');
-assert.equal(path.extname('file.ext/'), '');
+assert.equal(path.extname('file.ext/'), '.ext');
+assert.equal(path.extname('file.ext//'), '.ext');
 
 if (isWindows) {
   // On windows, backspace is a path separator.