Skip to content
This repository has been archived by the owner on Apr 22, 2023. It is now read-only.

Commit

Permalink
path: make basename and extname ignore trailing slashes
Browse files Browse the repository at this point in the history
Fixes #4536
  • Loading branch information
piscisaureus committed Jan 11, 2013
1 parent 7be2724 commit acd4c65
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 9 deletions.
13 changes: 6 additions & 7 deletions lib/path.js
Expand Up @@ -63,7 +63,7 @@ if (isWindows) {

// Regex to split the tail part of the above into [*, dir, basename, ext]
var splitTailRe =
/^([\s\S]+[\\\/](?!$)|[\\\/])?((?:\.{1,2}$|[\s\S]+?)?(\.[^.\/\\]*)?)$/;
/^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/;

// Function to split a filename into [root, dir, basename, ext]
// windows version
Expand All @@ -74,9 +74,9 @@ if (isWindows) {
tail = result[3] || '';
// Split the tail into dir, basename and extension
var result2 = splitTailRe.exec(tail),
dir = result2[1] || '',
basename = result2[2] || '',
ext = result2[3] || '';
dir = result2[1],
basename = result2[2],
ext = result2[3];
return [device, dir, basename, ext];
};

Expand Down Expand Up @@ -289,10 +289,9 @@ if (isWindows) {
// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe =
/^(\/?)([\s\S]+\/(?!$)|\/)?((?:\.{1,2}$|[\s\S]+?)?(\.[^.\/]*)?)$/;
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
var splitPath = function(filename) {
var result = splitPathRe.exec(filename);
return [result[1] || '', result[2] || '', result[3] || '', result[4] || ''];
return splitPathRe.exec(filename).slice(1);
};

// path.resolve([from ...], to)
Expand Down
45 changes: 43 additions & 2 deletions test/simple/test-path.js
Expand Up @@ -30,6 +30,29 @@ var f = __filename;

assert.equal(path.basename(f), 'test-path.js');
assert.equal(path.basename(f, '.js'), 'test-path');
assert.equal(path.basename(''), '');
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');

if (isWindows) {
// On Windows a backslash acts as a path separator.
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');

} else {
// On unix a backslash is just treated as any other character.
assert.equal(path.basename('\\dir\\basename.ext'), '\\dir\\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
Expand All @@ -46,7 +69,9 @@ assert.equal(path.dirname(f).substr(-11),
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('/'), '/');
assert.equal(path.dirname('////'), '/');

if (isWindows) {
assert.equal(path.dirname('c:\\'), 'c:\\');
Expand Down Expand Up @@ -114,18 +139,34 @@ 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');
assert.equal(path.extname('file/'), '');
assert.equal(path.extname('file//'), '');
assert.equal(path.extname('file./'), '.');
assert.equal(path.extname('file.//'), '.');

if (isWindows) {
// On windows, backspace is a path separator.
assert.equal(path.extname('.\\'), '');
assert.equal(path.extname('..\\'), '');
assert.equal(path.extname('file.ext\\'), '');
assert.equal(path.extname('file.ext\\'), '.ext');
assert.equal(path.extname('file.ext\\\\'), '.ext');
assert.equal(path.extname('file\\'), '');
assert.equal(path.extname('file\\\\'), '');
assert.equal(path.extname('file.\\'), '.');
assert.equal(path.extname('file.\\\\'), '.');

} else {
// On unix, backspace is a valid name component like any other character.
assert.equal(path.extname('.\\'), '');
assert.equal(path.extname('..\\'), '.\\');
assert.equal(path.extname('file.ext\\'), '.ext\\');
assert.equal(path.extname('file.ext\\\\'), '.ext\\\\');
assert.equal(path.extname('file\\'), '');
assert.equal(path.extname('file\\\\'), '');
assert.equal(path.extname('file.\\'), '.\\');
assert.equal(path.extname('file.\\\\'), '.\\\\');
}

// path.join tests
Expand Down

0 comments on commit acd4c65

Please sign in to comment.