Permalink
Browse files

windows: make symlinks tolerant to forward slashes

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