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

Commit

Permalink
windows: make symlinks tolerant to forward slashes
Browse files Browse the repository at this point in the history
Closes #3440
  • Loading branch information
piscisaureus committed Jun 14, 2012
1 parent 412c1ab commit 13400e3
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 20 deletions.
34 changes: 22 additions & 12 deletions lib/fs.js
Expand Up @@ -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) {
Expand Down
8 changes: 0 additions & 8 deletions test/simple/test-fs-realpath.js
Expand Up @@ -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 {
Expand Down

0 comments on commit 13400e3

Please sign in to comment.