[Fix] nvm_find_up, nvm_find_project_dir: stop at a Windows drive root instead of looping forever
With a Windows-style `$PWD` (e.g. `D:/Work`, as Git Bash inherits when launched
by a native Windows program), `${path_%/*}` stops changing at `D:`, so the walk
never ends and sourcing `nvm.sh` hangs. Stop when going up doesn't change the
path, which also covers the existing `.` case.
Fixes #3967.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RBGzjdkmgq6LSA7SFtjRsY
This commit is contained in:
1 parent
13eee46e7d
commit
ea84cb311e
3 files changed
+16
-4
No files matched your search
@@ -815,9 +815,13 @@ nvm_tree_contains_path() {
|
||||
|
||||
nvm_find_project_dir() {
|
||||
local path_
|
||||
local parent_
|
||||
path_="${PWD}"
|
||||
while [ "${path_}" != "" ] && [ "${path_}" != '.' ] && [ ! -f "${path_}/package.json" ] && [ ! -d "${path_}/node_modules" ]; do
|
||||
path_=${path_%/*}
|
||||
while [ "${path_}" != "" ] && [ ! -f "${path_}/package.json" ] && [ ! -d "${path_}/node_modules" ]; do
|
||||
parent_=${path_%/*}
|
||||
# stop when there is nowhere left to go up, e.g. `.` or a Windows drive root like `C:`
|
||||
[ "${parent_}" != "${path_}" ] || break
|
||||
path_="${parent_}"
|
||||
done
|
||||
nvm_echo "${path_}"
|
||||
}
|
||||
@@ -825,9 +829,13 @@ nvm_find_project_dir() {
|
||||
# Traverse up in directory tree to find containing folder
|
||||
nvm_find_up() {
|
||||
local path_
|
||||
local parent_
|
||||
path_="${PWD}"
|
||||
while [ "${path_}" != "" ] && [ "${path_}" != '.' ] && [ ! -f "${path_}/${1-}" ]; do
|
||||
path_=${path_%/*}
|
||||
while [ "${path_}" != "" ] && [ ! -f "${path_}/${1-}" ]; do
|
||||
parent_=${path_%/*}
|
||||
# stop when there is nowhere left to go up, e.g. `.` or a Windows drive root like `C:`
|
||||
[ "${parent_}" != "${path_}" ] || break
|
||||
path_="${parent_}"
|
||||
done
|
||||
nvm_echo "${path_}"
|
||||
}
|
||||
|
||||
@@ -35,3 +35,6 @@ ACTUAL="$(PWD=$TEST_DIR/no-nesting-pkg nvm_find_project_dir)"
|
||||
|
||||
ACTUAL="$(PWD="." nvm_find_project_dir)"
|
||||
[ "${ACTUAL}" = "." ] || die "insufficient permissions for pwd: got ${ACTUAL}"
|
||||
|
||||
ACTUAL="$(PWD="Q:/nonexistent/dir" nvm_find_project_dir)"
|
||||
[ "${ACTUAL}" = "Q:" ] || die "Windows-style drive path from pwd: got ${ACTUAL}"
|
||||
@@ -23,5 +23,6 @@ TEST_DIR="$PWD"
|
||||
[ "~$(PWD=$TEST_DIR/tmp_nvm_find_up/a/b/c nvm_find_up 'test')" = "~$TEST_DIR/tmp_nvm_find_up/a/b/c" ] || die "failed to find in current dir"
|
||||
[ "~$(PWD=$TEST_DIR/tmp_nvm_find_up/a/b/c/d nvm_find_up 'test')" = "~$TEST_DIR/tmp_nvm_find_up/a/b/c" ] || die "failed to find 1 level up from current dir"
|
||||
[ "~$(PWD="." nvm_find_up 'test')" = "~." ] || die "failed to handle '.' output from pwd"
|
||||
[ "~$(PWD="Q:/nonexistent/dir" nvm_find_up 'test')" = "~Q:" ] || die "failed to handle Windows-style drive path from pwd"
|
||||
|
||||
cleanup
|
||||
Reference in new issue
Block a user