FIX path.dirname('/tmp') => '/'.
authorrentzsch <jwr.git@redshed.net>
Sun, 16 May 2010 19:29:29 +0000 (14:29 -0500)
committerRyan Dahl <ry@tinyclouds.org>
Thu, 20 May 2010 17:16:09 +0000 (10:16 -0700)
Previously path.dirname('/tmp') incorrectly returned '.'.

Unfortunately module.js incorrectly thinks dirname('/a/b/') should
yield '/a/b', so I can't strip trailing slashes yet. Once module.js
is fixed, then the commented-out code should be activated and a test
written for it.

lib/path.js
test/simple/test-path.js

index c7bfa7e..ce21469 100644 (file)
@@ -38,7 +38,20 @@ exports.normalize = function (path, keepBlanks) {
 };
 
 exports.dirname = function (path) {
-  return path && path.substr(0, path.lastIndexOf("/")) || ".";
+  // Can't strip trailing slashes since module.js incorrectly thinks
+  // dirname('/a/b/') should yield '/a/b' instead of '/a'.
+  // if (path.length > 1 && '/' === path[path.length-1]) {
+  //  path = path.replace(/\/+$/, '');
+  // }
+  var lastSlash = path.lastIndexOf('/');
+  switch (lastSlash) {
+    case -1:
+      return '.';
+    case 0:
+      return '/';
+    default:
+      return path.substring(0, lastSlash);
+  }
 };
 
 exports.filename = function () {
index 4e5a703..e64ab7c 100644 (file)
@@ -7,6 +7,9 @@ assert.equal(path.basename(f), "test-path.js");
 assert.equal(path.basename(f, ".js"), "test-path");
 assert.equal(path.extname(f), ".js");
 assert.equal(path.dirname(f).substr(-11), "test/simple");
+assert.equal(path.dirname("/a/b"), "/a");
+assert.equal(path.dirname("/a"), "/");
+assert.equal(path.dirname("/"), "/");
 path.exists(f, function (y) { assert.equal(y, true) });
 
 assert.equal(path.join(".", "fixtures/b", "..", "/b/c.js"), "fixtures/b/c.js");