diff --git a/lib/fs.js b/lib/fs.js index 1718441f2dd..a633154fe8b 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -532,25 +532,35 @@ fs.readlinkSync = function(path) { return binding.readlink(pathModule._makeLong(path)); }; +function preprocessSymlinkDestination(path, type) { + if (!isWindows) { + // No preprocessing is needed on Unix. + return path; + } else if (type === 'junction') { + // Junctions paths need to be absolute and \\?\-prefixed. + return pathModule._makeLong(path); + } else { + // Windows symlinks don't tolerate forward slashes. + return ('' + path).replace(/\//g, '\\'); + } +} + fs.symlink = function(destination, path, type_, callback) { - var type = (typeof(type_) == 'string' ? type_ : null); + var type = (typeof type_ === 'string' ? type_ : null); var callback = makeCallback(arguments[arguments.length - 1]); - if (isWindows && type === 'junction') { - destination = pathModule._makeLong(destination); - } - - binding.symlink(destination, - pathModule._makeLong(path), type, callback); + binding.symlink(preprocessSymlinkDestination(destination), + pathModule._makeLong(path), + type, + callback); }; fs.symlinkSync = function(destination, path, type) { - if (isWindows && type === 'junction') { - destination = pathModule._makeLong(destination); - } + type = (typeof type === 'string' ? type : null); - return binding.symlink(destination, - pathModule._makeLong(path), type); + return binding.symlink(preprocessSymlinkDestination(destination), + pathModule._makeLong(path), + type); }; fs.link = function(srcpath, dstpath, callback) { diff --git a/test/simple/test-fs-realpath.js b/test/simple/test-fs-realpath.js index c91c3dd7a9b..d154e4fcd9e 100644 --- a/test/simple/test-fs-realpath.js +++ b/test/simple/test-fs-realpath.js @@ -33,14 +33,6 @@ if (isWindows) { // something like "C:\\" root = process.cwd().substr(0, 3); - // Symlinks MUST use \ paths, never / paths. - fs._symlinkSync = fs.symlinkSync; - fs.symlinkSync = function(a, b, type) { - a = a.split('/').join('\\'); - b = b.split('/').join('\\'); - return fs._symlinkSync(a, b, type); - }; - // On Windows, creating symlinks requires admin privileges. // We'll only try to run symlink test if we have enough privileges. try {