Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

windows: make symlinks tolerant to forward slashes

Closes #3440
  • Loading branch information...
piscisaureus committed Jun 14, 2012
1 parent 412c1ab commit 13400e3e5851d81d4c79f1f4ac0e7aef85b64cb9
Showing with 22 additions and 20 deletions.
  1. +22 −12 lib/fs.js
  2. +0 −8 test/simple/test-fs-realpath.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) {
@@ -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 {

0 comments on commit 13400e3

Please sign in to comment.
You can’t perform that action at this time.