windows: make symlinks tolerant to forward slashes

Closes #3440
pull/24503/head
Bert Belder 2012-06-15 01:37:24 +02:00
parent 412c1ab5bc
commit 13400e3e58
2 changed files with 22 additions and 20 deletions

View File

@ -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) {

View File

@ -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 {