-
-
Notifications
You must be signed in to change notification settings - Fork 35k
win, fs: detect if symlink target is a directory #23724
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
On Windows creating a symlink to a directory will not work unless extra 'dir' parameter is passed. This adds a check if link target is a directory, and if so automatically use 'dir' when creating symlink. Ref: #23691
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -905,16 +905,47 @@ function symlink(target, path, type_, callback_) { | |||||
| validatePath(target, 'target'); | ||||||
| validatePath(path); | ||||||
|
|
||||||
| const flags = stringToSymlinkType(type); | ||||||
| const req = new FSReqCallback(); | ||||||
| req.oncomplete = callback; | ||||||
|
|
||||||
| if (isWindows && type === null) { | ||||||
| let absoluteTarget; | ||||||
| try { | ||||||
| // Symlinks targets can be relative to the newly created path. | ||||||
| // Calculate absolute file name of the symlink target, and check | ||||||
| // if it is a directory. Ignore resolve error to keep symlink | ||||||
| // errors consistent between platforms if invalid path is | ||||||
| // provided. | ||||||
| absoluteTarget = pathModule.resolve(path, '..', target); | ||||||
| } catch (err) { } // eslint-disable-line no-unused-vars | ||||||
|
||||||
| } catch (err) { } // eslint-disable-line no-unused-vars | |
| } catch { } |
Then you don't need to disable the ESLint rule. The usual reason to avoid that catch syntax would be to simplify backporting to 8.x and 6.x but this is a semver-major so that's not an issue here.
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| } catch (err) { } // eslint-disable-line no-unused-vars | |
| } catch { } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| 'use strict'; | ||
| const common = require('../common'); | ||
|
|
||
refack marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| // Test creating a symbolic link pointing to a directory. | ||
| // Ref: https://github.com/nodejs/node/pull/23724 | ||
| // Ref: https://github.com/nodejs/node/issues/23596 | ||
|
|
||
|
|
||
refack marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| if (!common.canCreateSymLink()) | ||
| common.skip('insufficient privileges'); | ||
|
|
||
| const assert = require('assert'); | ||
| const path = require('path'); | ||
| const fs = require('fs'); | ||
|
|
||
| const tmpdir = require('../common/tmpdir'); | ||
| tmpdir.refresh(); | ||
|
|
||
refack marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| const linkTargets = [ | ||
| 'relative-target', | ||
| path.join(tmpdir.path, 'absolute-target') | ||
| ]; | ||
| const linkPaths = [ | ||
| path.relative(process.cwd(), path.join(tmpdir.path, 'relative-path')), | ||
| path.join(tmpdir.path, 'absolute-path') | ||
| ]; | ||
|
|
||
| function testSync(target, path) { | ||
| fs.symlinkSync(target, path); | ||
| fs.readdirSync(path); | ||
| } | ||
|
|
||
| function testAsync(target, path) { | ||
| fs.symlink(target, path, common.mustCall((err) => { | ||
| assert.ifError(err); | ||
| fs.readdirSync(path); | ||
| })); | ||
| } | ||
|
|
||
| for (const linkTarget of linkTargets) { | ||
| fs.mkdirSync(path.resolve(tmpdir.path, linkTarget)); | ||
| for (const linkPath of linkPaths) { | ||
| testSync(linkTarget, `${linkPath}-${path.basename(linkTarget)}-sync`); | ||
| testAsync(linkTarget, `${linkPath}-${path.basename(linkTarget)}-async`); | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.