win, fs: detect if symlink target is a directory by bzoz · Pull Request #23724 · nodejs/node (original) (raw)
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 andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Conversation45 Commits2 Checks0 Files changed
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
[ Show hidden characters]({{ revealButtonHref }})
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 the symlink.
Ref: #23691
Checklist
make -j4 test
(UNIX), orvcbuild test
(Windows) passes- tests and/or benchmarks are included
- commit message follows commit guidelines
Issues and PRs related to the fs subsystem / file system.
Issues and PRs related to the Windows platform.
PRs that contain breaking changes and should be released in the next major version.
labels
refack previously requested changes Oct 18, 2018
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good, but I left some comments
P.S. I'm not sure this is semver-major
if we only change a case that failed into a case that works.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All changes LGTM.
But I forget to mentions that async calls need common.mustCall
} |
---|
function async(target, path) { |
fs.symlink(target, path, (err) => { |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fs.symlink(target, path, (err) => { |
---|
fs.symlink(target, path, common.mustCall((err) => { |
lint:
05:47:27 not ok 15 - /usr/home/iojs/build/workspace/node-test-linter/test/parallel/test-fs-symlink-dir.js
05:47:27 ---
05:47:27 message: '''linkTarget'' is never reassigned. Use ''const'' instead.'
05:47:27 severity: error
05:47:27 data:
05:47:27 line: 37
05:47:27 column: 10
05:47:27 ruleId: prefer-const
05:47:27 messages:
05:47:27 - message: '''linkPath'' is never reassigned. Use ''const'' instead.'
05:47:27 severity: error
05:47:27 data:
05:47:27 line: 39
05:47:27 column: 12
05:47:27 ruleId: prefer-const
05:47:27 ...
Also test fails when run in worker.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM with lint removed
/CC @nodejs/release is this semver-major or minor?
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also a good solution
refack added author ready
PRs that have at least one approval, no pending requests for changes, and a CI started.
and removed author ready
PRs that have at least one approval, no pending requests for changes, and a CI started.
labels
@refack: If a user creates a symlink to a folder, removes the folder and creates a file with the same name as the folder, currently the symlink will work, and the user will be able to access the file. With this change, the symlink will be broken. It's an obscure corner case, but still, this is why I think its semver-major.
@nodejs/TSC PTAL (bug fix with some semver-major edge cases)
The git node
thingy complains that I need 2 TSC approvals for semver-major change.. so, ping?
OK, so a few questions:
- What happens if you supply
type
='file'
for a directory and vice versa on Windows? (background I don't understand) - With this change, what's the point of the
type
argument now? Is that just useful forjunction
? Or does the answer to the question above suggest other novel uses? - Should the docs be updated to reflect this new behaviour? They currently say the default is
'file'
which it clearly isn't after this change and may not even be before this change (although again, I'm missing background on how Windows does symlinks).
type='file'
for a target that is a directory:fs.readdir
orcd
/dir
in the shell will not work- if there is a subfolder in the driectory both
fs.readdir('link/subdir')
andcd link\subdir
/dir link/subdir
in the shell will worktype='dir'
to a target that is a file: nothing works
junction
and to override the detection. If the target does not exists,'file'
will be used by default, if one knows that the link will point to a directory, thetype
argument can be used- Yeah, it should. I'm on it.
OK, that blows my mind a little bit. But I think the take-away is that the flexibility might be handy for obscure cases but doing best-guess for the user is going to be optimal. Sounds good then.
Updated with doc update, PTAL
will automatically be normalized to absolute path. |
---|
to the completion callback. The `type` argument is only available on Windows |
and ignored on other platforms. It can be set to `'dir'`, `'file'`, or |
`'junction'`. If the `type` argument is not set Node will autodetect `target` |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
comma between "set" and "Node"
to the completion callback. The `type` argument is only available on Windows |
---|
and ignored on other platforms. It can be set to `'dir'`, `'file'`, or |
`'junction'`. If the `type` argument is not set Node will autodetect `target` |
type and use `'file'` or `'dir'`. If the `target` does not exits, `'file'` will |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"exits" -> "exist"
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM with a a passing CITGM
fs.readdirSync(path); |
---|
} |
function async(target, path) { |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: I would prefer this function not to be named as language keyword.
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: nodejs#23691
// errors consistent between platforms if invalid path is |
---|
// provided. |
absoluteTarget = pathModule.resolve(path, '..', target); |
} catch (err) { } // eslint-disable-line no-unused-vars |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Any reason not to use this instead?:
} 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.
if (statSync(absoluteTarget).isDirectory()) { |
---|
type = 'dir'; |
} |
} catch (err) { } // eslint-disable-line no-unused-vars |
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 { } |
Trott pushed a commit to Trott/io.js that referenced this pull request
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.
PR-URL: nodejs#23724 Refs: nodejs#23691 Reviewed-By: Refael Ackermann refack@gmail.com Reviewed-By: James M Snell jasnell@gmail.com Reviewed-By: Rod Vagg rod@vagg.org Reviewed-By: Matteo Collina matteo.collina@gmail.com
refack pushed a commit to refack/node that referenced this pull request
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.
PR-URL: nodejs#23724 Refs: nodejs#23691 Reviewed-By: Refael Ackermann refack@gmail.com Reviewed-By: James M Snell jasnell@gmail.com Reviewed-By: Rod Vagg rod@vagg.org Reviewed-By: Matteo Collina matteo.collina@gmail.com
BethGriggs added a commit that referenced this pull request
Notable changes:
- assert:
- async_hooks:
- bootstrap
- make Buffer and process non-enumerable (Ruben Bridgewater) #24874
- buffer:
- child_process:
- console:
- don't use ANSI escape codes when TERM=dumb (Vladislav Kaminsky) #26261
- crypto:
- deps:
- silence irrelevant V8 warning (Michaël Zasso) #26685
- update postmortem metadata generation script (cjihrig) #26685
- V8: un-cherry-pick bd019bd (Refael Ackermann) #26685
- V8: cherry-pick 6 commits (Michaël Zasso) #26685
- V8: cherry-pick d82c9af (Anna Henningsen) #26685
- V8: cherry-pick e5f01ba (Anna Henningsen) #26685
- V8: cherry-pick d5f08e4 (Anna Henningsen) #26685
- V8: cherry-pick 6b09d21 (Anna Henningsen) #26685
- V8: cherry-pick f0bb5d2 (Anna Henningsen) #26685
- V8: cherry-pick 5b0510d (Anna Henningsen) #26685
- V8: cherry-pick 91f0cd0 (Anna Henningsen) #26685
- V8: cherry-pick 392316d (Anna Henningsen) #26685
- V8: cherry-pick 2f79d68 (Anna Henningsen) #26685
- sync V8 gypfiles with 7.4 (Ujjwal Sharma) #26685
- update V8 to 7.4.288.13 (Ujjwal Sharma) #26685
- bump minimum icu version to 63 (Ujjwal Sharma) #25852
- silence irrelevant V8 warnings (Michaël Zasso) #25852
- V8: cherry-pick 7803fa6 (Jon Kunkee) #25852
- V8: cherry-pick 58cefed (Jon Kunkee) #25852
- V8: cherry-pick d3308d0 (Michaël Zasso) #25852
- V8: cherry-pick 74571c8 (Michaël Zasso) #25852
- cherry-pick fc0ddf5 from upstream V8 (Anna Henningsen) #25852
- sync V8 gypfiles with 7.3 (Ujjwal Sharma) #25852
- sync V8 gypfiles with 7.2 (Michaël Zasso) #25852
- update V8 to 7.3.492.25 (Michaël Zasso) #25852
- add s390 asm rules for OpenSSL-1.1.1 (Shigeki Ohtsu) #19794
- sync V8 gypfiles with 7.1 (Refael Ackermann) #23423
- update V8 to 7.1.302.28 (Michaël Zasso) #23423
- doc:
- errors:
- update error name (Ruben Bridgewater) #26738
- fs:
- http:
- lib:
- move DEP0021 to end of life (cjihrig) #27127
- remove Atomics.wake (Gus Caplan) #27033
- validate Error.captureStackTrace() calls (Ruben Bridgewater) #26738
- refactor Error.captureStackTrace() usage (Ruben Bridgewater) #26738
- move DTRACE_* probes out of global scope (James M Snell) #26541
- deprecate _stream_wrap (Sam Roberts) [#26245] (#26245)
- don't use
util.inspect()
internals (Ruben Bridgewater) #24971 - improve error message for MODULE_NOT_FOUND (Ali Ijaz Sheikh) #25690
- requireStack property for MODULE_NOT_FOUND (Ali Ijaz Sheikh) #25690
- move DEP0029 to end of life (cjihrig) #25377
- move DEP0028 to end of life (cjihrig) #25377
- move DEP0027 to end of life (cjihrig) #25377
- move DEP0026 to end of life (cjihrig) #25377
- move DEP0023 to end of life (cjihrig) #25280
- move DEP0006 to end of life (cjihrig) #25279
- remove unintended access to deps/ (Anna Henningsen) #25138
- move DEP0120 to end of life (cjihrig) #24862
- use ES6 class inheritance style (Ruben Bridgewater) #24755
- remove
inherits()
usage (Ruben Bridgewater) #24755
- module:
- n-api:
- remove code from error name (Ruben Bridgewater) #26738
- net:
- net,http2:
- merge setTimeout code (ZYSzys) #25084
- os:
- implement os.type() using uv_os_uname() (cjihrig) #25659
- process:
- readline:
- support TERM=dumb (Vladislav Kaminsky) #26261
- repl:
- src:
- remove unused INT_MAX constant (Sam Roberts) #27078
- update NODE_MODULE_VERSION to 72 (Ujjwal Sharma) #26685
- remove
AddPromiseHook()
(Anna Henningsen) #26574 - update NODE_MODULE_VERSION to 71 (Michaël Zasso) #25852
- clean up MultiIsolatePlatform interface (Anna Henningsen) #26384
- properly configure default heap limits (Ali Ijaz Sheikh) #25576
- remove icuDataDir from node config (GauthamBanasandra) #24780
- explicitly allow JS in ReadHostObject (Yang Guo) #23423
- update postmortem constant (cjihrig) #23423
- update NODE_MODULE_VERSION to 68 (Michaël Zasso) #23423
- tls:
- support TLSv1.3 (Sam Roberts) #26209
- return correct version from getCipher() (Sam Roberts) #26625
- check arg types of renegotiate() (Sam Roberts) #25876
- add code for ERR_TLS_INVALID_PROTOCOL_METHOD (Sam Roberts) #24729
- emit a warning when servername is an IP address (Rodger Combs) #23329
- disable TLS v1.0 and v1.1 by default (Ben Noordhuis) #23814
- remove unused arg to createSecureContext() (Sam Roberts) #24241
- deprecate Server.prototype.setOptions() (cjihrig) #23820
- load NODE_EXTRA_CA_CERTS at startup (Ouyang Yadong) #23354
- util:
- change inspect compact and breakLength default (Ruben Bridgewater) #27109
- improve inspect edge cases (Ruben Bridgewater) #27109
- only the first line of the error message (Simon Zünd) #26685
- don't set the prototype of callbackified functions (Ruben Bridgewater) #26893
- rename callbackified function (Ruben Bridgewater) #26893
- increase function length when using
callbackify()
(Ruben Bridgewater) #26893 - prevent tampering with internals in
inspect()
(Ruben Bridgewater) #26577 - fix proxy inspection (Ruben Bridgewater) #26241
- prevent leaking internal properties (Ruben Bridgewater) #24971
- protect against monkeypatched Object prototype for inspect() (Rich Trott) #25953
- treat format arguments equally (Roman Reiss) #23162
- win, fs:
- detect if symlink target is a directory (Bartosz Sosnowski) #23724
- zlib:
PR-URL: #26930
BethGriggs added a commit that referenced this pull request
Notable changes:
- assert:
- async_hooks:
- bootstrap: make Buffer and process non-enumerable (Ruben Bridgewater) #24874
- buffer:
- child_process:
- console:
- don't use ANSI escape codes when
TERM=dumb
(Vladislav Kaminsky) #26261
- don't use ANSI escape codes when
- crypto:
- remove legacy native handles (Tobias Nießen) #27011
- decode missing passphrase errors (Tobias Nießen) #25208
- remove
Cipher.setAuthTag()
andDecipher.getAuthTag()
(Tobias Nießen) #26249 - remove deprecated
crypto._toBuf()
(Tobias Nießen) #25338 - set
DEFAULT\_ENCODING
property to non-enumerable (Antoine du Hamel) #23222
- deps:
- errors:
- update error name (Ruben Bridgewater) #26738
- fs:
- http:
- lib:
- module:
- remove unintended access to deps/ (Anna Henningsen) #25138
- improve error message for MODULE_NOT_FOUND (Ali Ijaz Sheikh) #25690
- requireStack property for MODULE_NOT_FOUND (Ali Ijaz Sheikh) #25690
- remove dead code (Ruben Bridgewater) #26983
- make
require('.')
never resolve outside the current directory (Ruben Bridgewater) #26973 - throw an error for invalid package.json main entries (Ruben Bridgewater) #26823
- don't search in
require.resolve.paths
(cjihrig) #23683
- net:
- os:
- process:
- readline:
- support TERM=dumb (Vladislav Kaminsky) #26261
- repl:
- src:
- remove unused
INT_MAX
constant (Sam Roberts) #27078 - update
NODE_MODULE_VERSION
to 72 (Ujjwal Sharma) #26685 - remove
AddPromiseHook()
(Anna Henningsen) #26574 - clean up
MultiIsolatePlatform
interface (Anna Henningsen) #26384 - properly configure default heap limits (Ali Ijaz Sheikh) #25576
- remove
icuDataDir
from node config (GauthamBanasandra) #24780
- remove unused
- tls:
- support TLSv1.3 (Sam Roberts) #26209
- return correct version from
getCipher()
(Sam Roberts) #26625 - check arg types of renegotiate() (Sam Roberts) #25876
- add code for
ERR_TLS_INVALID_PROTOCOL_METHOD
(Sam Roberts) #24729 - emit a warning when servername is an IP address (Rodger Combs) #23329
- disable TLS v1.0 and v1.1 by default (Ben Noordhuis) #23814
- remove unused arg to createSecureContext() (Sam Roberts) #24241
- deprecate
Server.prototype.setOptions()
(cjihrig) #23820 - load
NODE_EXTRA_CA_CERTS
at startup (Ouyang Yadong) #23354
- util:
- remove
util.print()
,util.puts()
,util.debug()
andutil.error()
(cjihrig) #25377 - change inspect compact and breakLength default (Ruben Bridgewater) #27109
- improve inspect edge cases (Ruben Bridgewater) #27109
- only the first line of the error message (Simon Zünd) #26685
- don't set the prototype of callbackified functions (Ruben Bridgewater) #26893
- rename callbackified function (Ruben Bridgewater) #26893
- increase function length when using
callbackify()
(Ruben Bridgewater) #26893 - prevent tampering with internals in
inspect()
(Ruben Bridgewater) #26577 - prevent Proxy traps being triggered by
.inspect()
(Ruben Bridgewater) #26241 - prevent leaking internal properties (Ruben Bridgewater) #24971
- protect against monkeypatched Object prototype for inspect() (Rich Trott) #25953
- treat format arguments equally (Roman Reiss) #23162
- remove
- win, fs:
- detect if symlink target is a directory (Bartosz Sosnowski) #23724
- zlib:
PR-URL: #26930
BethGriggs added a commit that referenced this pull request
Notable changes:
- assert:
- async_hooks:
- bootstrap: make Buffer and process non-enumerable (Ruben Bridgewater) #24874
- buffer:
- child_process:
- console:
- don't use ANSI escape codes when
TERM=dumb
(Vladislav Kaminsky) #26261
- don't use ANSI escape codes when
- crypto:
- remove legacy native handles (Tobias Nießen) #27011
- decode missing passphrase errors (Tobias Nießen) #25208
- remove
Cipher.setAuthTag()
andDecipher.getAuthTag()
(Tobias Nießen) #26249 - remove deprecated
crypto._toBuf()
(Tobias Nießen) #25338 - set
DEFAULT\_ENCODING
property to non-enumerable (Antoine du Hamel) #23222
- deps:
- errors:
- update error name (Ruben Bridgewater) #26738
- fs:
- http:
- lib:
- module:
- remove unintended access to deps/ (Anna Henningsen) #25138
- improve error message for MODULE_NOT_FOUND (Ali Ijaz Sheikh) #25690
- requireStack property for MODULE_NOT_FOUND (Ali Ijaz Sheikh) #25690
- remove dead code (Ruben Bridgewater) #26983
- make
require('.')
never resolve outside the current directory (Ruben Bridgewater) #26973 - throw an error for invalid package.json main entries (Ruben Bridgewater) #26823
- don't search in
require.resolve.paths
(cjihrig) #23683
- net:
- os:
- process:
- readline:
- support TERM=dumb (Vladislav Kaminsky) #26261
- repl:
- src:
- remove unused
INT_MAX
constant (Sam Roberts) #27078 - update
NODE_MODULE_VERSION
to 72 (Ujjwal Sharma) #26685 - remove
AddPromiseHook()
(Anna Henningsen) #26574 - clean up
MultiIsolatePlatform
interface (Anna Henningsen) #26384 - properly configure default heap limits (Ali Ijaz Sheikh) #25576
- remove
icuDataDir
from node config (GauthamBanasandra) #24780
- remove unused
- tls:
- support TLSv1.3 (Sam Roberts) #26209
- return correct version from
getCipher()
(Sam Roberts) #26625 - check arg types of renegotiate() (Sam Roberts) #25876
- add code for
ERR_TLS_INVALID_PROTOCOL_METHOD
(Sam Roberts) #24729 - emit a warning when servername is an IP address (Rodger Combs) #23329
- disable TLS v1.0 and v1.1 by default (Ben Noordhuis) #23814
- remove unused arg to createSecureContext() (Sam Roberts) #24241
- deprecate
Server.prototype.setOptions()
(cjihrig) #23820 - load
NODE_EXTRA_CA_CERTS
at startup (Ouyang Yadong) #23354
- util:
- remove
util.print()
,util.puts()
,util.debug()
andutil.error()
(cjihrig) #25377 - change inspect compact and breakLength default (Ruben Bridgewater) #27109
- improve inspect edge cases (Ruben Bridgewater) #27109
- only the first line of the error message (Simon Zünd) #26685
- don't set the prototype of callbackified functions (Ruben Bridgewater) #26893
- rename callbackified function (Ruben Bridgewater) #26893
- increase function length when using
callbackify()
(Ruben Bridgewater) #26893 - prevent tampering with internals in
inspect()
(Ruben Bridgewater) #26577 - prevent Proxy traps being triggered by
.inspect()
(Ruben Bridgewater) #26241 - prevent leaking internal properties (Ruben Bridgewater) #24971
- protect against monkeypatched Object prototype for inspect() (Rich Trott) #25953
- treat format arguments equally (Roman Reiss) #23162
- remove
- win, fs:
- detect if symlink target is a directory (Bartosz Sosnowski) #23724
- zlib:
PR-URL: #26930
This was referenced
Apr 23, 2019
Reviewers
Trott Trott left review comments
mcollina mcollina approved these changes
refack refack approved these changes
jasnell jasnell approved these changes
rvagg rvagg approved these changes
Labels
Issues and PRs related to the fs subsystem / file system.
PRs that contain breaking changes and should be released in the next major version.
Issues and PRs related to the Windows platform.