From 1b6838f8167238d80ebe0318ea8fc9512fe372c0 Mon Sep 17 00:00:00 2001 From: Sakthipriyan Vairamani Date: Sun, 5 Jul 2015 15:08:16 +0000 Subject: [PATCH 1/2] doc: Adding note about empty strings in path module The path module's `join, normalize, isAbsolute, relative and resolve` functions return/use the current directory if they are passed zero length strings. > process.version 'v2.3.4-pre' > path.win32.join('') '.' > path.posix.join('') '.' > path.win32.normalize('') '.' > path.posix.normalize('') '.' > path.win32.isAbsolute('') false > path.posix.isAbsolute('') false > path.win32.relative('', '') '' > path.posix.relative('', '') '' > path.win32relative('.', '') '' > path.posix.relative('.', '') '' > path.posix.resolve('') '/home/thefourtheye/Desktop' > path.win32.resolve('') '\\home\\thefourtheye\\Desktop' Since empty paths are not valid in any of the operating systems people normally use, this behaviour might be a surprise to the users. This commit introduces "Notes" about this, wherever applicable in `path`'s documentation. --- doc/api/path.markdown | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/doc/api/path.markdown b/doc/api/path.markdown index 08495a79e5399c..7177ab4d2d0b99 100644 --- a/doc/api/path.markdown +++ b/doc/api/path.markdown @@ -22,6 +22,9 @@ Example: // returns '/foo/bar/baz/asdf' +*Note:* If the path string passed as argument is a zero-length string then `'.'` + will be returned, which represents the current working directory. + ## path.join([path1][, path2][, ...]) Join all arguments together and normalize the resulting path. @@ -39,6 +42,11 @@ Example: // throws exception TypeError: Arguments to path.join must be strings +*Note:* If the arguments to `join` have zero-length strings, unlike other path + module functions, they will be ignored. If the joined path string is a + zero-length string then `'.'` will be returned, which represents the + current working directory. + ## path.resolve([from ...], to) Resolves `to` to an absolute path. @@ -78,6 +86,9 @@ Examples: // if currently in /home/myself/iojs, it returns '/home/myself/iojs/wwwroot/static_files/gif/image.gif' +*Note:* If the arguments to `resolve` have zero-length strings then the current + working directory will be used instead of them. + ## path.isAbsolute(path) Determines whether `path` is an absolute path. An absolute path will always @@ -94,9 +105,13 @@ Windows examples: path.isAbsolute('//server') // true path.isAbsolute('C:/foo/..') // true - path.isAbsolute('bar\\baz') // false + path.isAbsolute('bar\\baz') // false path.isAbsolute('.') // false +*Note:* If the path string passed as parameter is a zero-length string, unlike + other path module functions, it will be used as-is and `false` will be + returned. + ## path.relative(from, to) Solve the relative path from `from` to `to`. @@ -117,6 +132,10 @@ Examples: // returns '../../impl/bbb' +*Note:* If the arguments to `relative` have zero-length strings then the current + working directory will be used instead of the zero-length strings. If + both the paths are the same then a zero-length string will be returned. + ## path.dirname(p) Return the directory name of a path. Similar to the Unix `dirname` command. From a65d5fd881773d51bad9ecccb79ff7451e1412ad Mon Sep 17 00:00:00 2001 From: Sakthipriyan Vairamani Date: Wed, 8 Jul 2015 01:28:38 +0530 Subject: [PATCH 2/2] test: zero-length strings with path module functions These testcases are specific to one uncommon behaviour in path module. Few of the functions in path module, treat '' strings as current working directory. This test makes sure that the behaviour is intact between commits. See: https://github.com/nodejs/io.js/pull/2106 --- .../parallel/test-path-zero-length-strings.js | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 test/parallel/test-path-zero-length-strings.js diff --git a/test/parallel/test-path-zero-length-strings.js b/test/parallel/test-path-zero-length-strings.js new file mode 100644 index 00000000000000..09d5e947e4a9df --- /dev/null +++ b/test/parallel/test-path-zero-length-strings.js @@ -0,0 +1,35 @@ +'use strict'; + +// These testcases are specific to one uncommon behaviour in path module. Few +// of the functions in path module, treat '' strings as current working +// directory. This test makes sure that the behaviour is intact between commits. +// See: https://github.com/nodejs/io.js/pull/2106 + +const common = require('../common'); +const assert = require('assert'); +const path = require('path'); +const pwd = process.cwd(); + +// join will internally ignore all the zero-length strings and it will return +// '.' if the joined string is a zero-length string. +assert.equal(path.join(''), '.'); +assert.equal(path.join('', ''), '.'); +assert.equal(path.join(pwd), pwd); +assert.equal(path.join(pwd, ''), pwd); + +// normalize will return '.' if the input is a zero-length string +assert.equal(path.normalize(''), '.'); +assert.equal(path.normalize(pwd), pwd); + +// Since '' is not a valid path in any of the common environments, return false +assert.equal(path.isAbsolute(''), false); + +// resolve, internally ignores all the zero-length strings and returns the +// current working directory +assert.equal(path.resolve(''), pwd); +assert.equal(path.resolve('', ''), pwd); + +// relative, internally calls resolve. So, '' is actually the current directory +assert.equal(path.relative('', pwd), ''); +assert.equal(path.relative(pwd, ''), ''); +assert.equal(path.relative(pwd, pwd), '');