mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-07-19 05:18:22 +08:00
The cycle scenarios all pass with the old grep-based detection too; the bug the `case`-based detection actually fixes is resolved names interpolated into the grep pattern as regexes, where resolving axb -> a.b falsely reported ∞ because the pattern `a.b` matches the seen name `axb`. Pin both directions: the fixed false positive, and a genuine cycle through a metachar name. Also correct the space-name scenario comment (the old anchored grep passed that scenario; only token-delimited seen-storage would not), and register every new fixture name in the suite teardown, so a mid-test failure can not leak aliases into later tests.
75 lines
2.5 KiB
Bash
Executable File
75 lines
2.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
die () { echo "$@" ; exit 1; }
|
|
|
|
export NVM_DIR="$(cd ../../.. && pwd)"
|
|
|
|
: nvm.sh
|
|
\. "${NVM_DIR}/nvm.sh"
|
|
|
|
# 1-hop self-reference: alias points to itself
|
|
echo 'self' > '../../../alias/self'
|
|
|
|
ACTUAL="$(nvm_resolve_alias self)"
|
|
EXPECTED='∞'
|
|
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}< for self-reference, got >${ACTUAL}<"
|
|
|
|
rm -f '../../../alias/self'
|
|
|
|
# Multi-hop loop: link1 -> link2 -> link3 -> link1
|
|
echo 'link2' > '../../../alias/link1'
|
|
echo 'link3' > '../../../alias/link2'
|
|
echo 'link1' > '../../../alias/link3'
|
|
|
|
ACTUAL="$(nvm_resolve_alias link1)"
|
|
EXPECTED='∞'
|
|
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}< for 3-hop cycle, got >${ACTUAL}<"
|
|
|
|
rm -f '../../../alias/link1' '../../../alias/link2' '../../../alias/link3'
|
|
|
|
# Cycle through an alias name containing a space
|
|
echo 'midway' > '../../../alias/foo bar'
|
|
echo 'foo bar' > '../../../alias/midway'
|
|
|
|
ACTUAL="$(nvm_resolve_alias 'foo bar')"
|
|
EXPECTED='∞'
|
|
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}< for space-name cycle, got >${ACTUAL}<"
|
|
|
|
rm -f '../../../alias/foo bar' '../../../alias/midway'
|
|
|
|
# Non-cycle through an alias name containing a space.
|
|
# Guards the newline-delimited SEEN_ALIASES storage: with space- or
|
|
# token-delimited storage, seen name 'foo bar' would falsely match 'bar'.
|
|
# Resolves: 'foo bar' -> 'midway' -> 'bar' -> 0.0.99
|
|
echo 'midway' > '../../../alias/foo bar'
|
|
echo 'bar' > '../../../alias/midway'
|
|
echo '0.0.99' > '../../../alias/bar'
|
|
|
|
ACTUAL="$(nvm_resolve_alias 'foo bar')"
|
|
EXPECTED='v0.0.99'
|
|
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}< for space-name chain, got >${ACTUAL}<"
|
|
|
|
rm -f '../../../alias/foo bar' '../../../alias/midway' '../../../alias/bar'
|
|
|
|
# Non-cycle through an alias name containing a regex metacharacter.
|
|
# Guards the literal `case` matching: the previous grep-based detection
|
|
# interpolated the resolved name into an anchored regex, so resolving 'axb'
|
|
# matched the seen name 'axb' against the pattern 'a.b' and falsely
|
|
# reported a cycle.
|
|
# Resolves: 'axb' -> 'a.b' -> 0.0.99
|
|
echo 'a.b' > '../../../alias/axb'
|
|
echo '0.0.99' > '../../../alias/a.b'
|
|
|
|
ACTUAL="$(nvm_resolve_alias axb)"
|
|
EXPECTED='v0.0.99'
|
|
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}< for metachar-name chain, got >${ACTUAL}<"
|
|
|
|
# ... while a genuine cycle through a metachar name is still detected
|
|
echo 'axb' > '../../../alias/a.b'
|
|
|
|
ACTUAL="$(nvm_resolve_alias axb)"
|
|
EXPECTED='∞'
|
|
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}< for metachar-name cycle, got >${ACTUAL}<"
|
|
|
|
rm -f '../../../alias/axb' '../../../alias/a.b'
|