diff --git a/nvm.sh b/nvm.sh index 899b6da..cc8beee 100644 --- a/nvm.sh +++ b/nvm.sh @@ -278,8 +278,35 @@ nvm_resolve_alias() { local PATTERN PATTERN="$1" - if [ -f "$NVM_DIR/alias/$PATTERN" ]; then - nvm_version "$(nvm_alias "$PATTERN" 2> /dev/null)" + local ALIAS + ALIAS="$PATTERN" + local ALIAS_TEMP + + local SEEN_ALIASES + SEEN_ALIASES="$ALIAS" + while true; do + ALIAS_TEMP="$(nvm_alias "$ALIAS" 2> /dev/null)" + + if [ -z "$ALIAS_TEMP" ]; then + break + fi + + if [ -n "$ALIAS_TEMP" ] \ + && printf "$SEEN_ALIASES" | \grep -e "^$ALIAS_TEMP$" > /dev/null; then + ALIAS="∞" + break + fi + + SEEN_ALIASES="$SEEN_ALIASES\n$ALIAS_TEMP" + ALIAS="$ALIAS_TEMP" + done + + if [ -n "$ALIAS" ] && [ "_$ALIAS" != "_$PATTERN" ]; then + if [ "_$ALIAS" = "_∞" ]; then + echo "$ALIAS" + else + nvm_version "$ALIAS" + fi return 0 fi diff --git a/test/fast/Aliases/circular/nvm_resolve_alias b/test/fast/Aliases/circular/nvm_resolve_alias new file mode 100755 index 0000000..4b5dab9 --- /dev/null +++ b/test/fast/Aliases/circular/nvm_resolve_alias @@ -0,0 +1,36 @@ +#!/bin/sh + +die () { echo $@ ; exit 1; } + +. ../../../../nvm.sh + +ALIAS="$(nvm_resolve_alias loopback)" +[ "_$ALIAS" = "_∞" ] || die "nvm_resolve_alias loopback was not ∞; got $ALIAS" +OUTPUT="$(nvm alias loopback)" +EXPECTED_OUTPUT="loopback -> loopback (-> ∞)" +[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm alias loopback was not $EXPECTED_OUTPUT; got $OUTPUT" + +ALIAS="$(nvm_resolve_alias one)" +[ "_$ALIAS" = "_∞" ] || die "nvm_resolve_alias one was not ∞; got $ALIAS" +OUTPUT="$(nvm alias one)" +EXPECTED_OUTPUT="one -> two (-> ∞)" +[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm alias one was not $EXPECTED_OUTPUT; got $OUTPUT" + +ALIAS="$(nvm_resolve_alias two)" +[ "_$ALIAS" = "_∞" ] || die "nvm_resolve_alias two was not ∞; got $ALIAS" +OUTPUT="$(nvm alias two)" +EXPECTED_OUTPUT="two -> three (-> ∞)" +[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm alias two was not $EXPECTED_OUTPUT; got $OUTPUT" + +ALIAS="$(nvm_resolve_alias three)" +[ "_$ALIAS" = "_∞" ] || die "nvm_resolve_alias three was not ∞; got $ALIAS" +OUTPUT="$(nvm alias three)" +EXPECTED_OUTPUT="three -> one (-> ∞)" +[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm alias three was not $EXPECTED_OUTPUT; got $OUTPUT" + +ALIAS="$(nvm_resolve_alias four)" +[ "_$ALIAS" = "_∞" ] || die "nvm_resolve_alias four was not ∞; got $ALIAS" +OUTPUT="$(nvm alias four)" +EXPECTED_OUTPUT="four -> two (-> ∞)" +[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm alias four was not $EXPECTED_OUTPUT; got $OUTPUT" + diff --git a/test/fast/Aliases/circular/setup b/test/fast/Aliases/circular/setup new file mode 100755 index 0000000..8f2b142 --- /dev/null +++ b/test/fast/Aliases/circular/setup @@ -0,0 +1,10 @@ +#!/bin/sh + +echo loopback > ../../../../alias/loopback + +echo two > ../../../../alias/one +echo three > ../../../../alias/two +echo one > ../../../../alias/three + +echo two > ../../../../alias/four + diff --git a/test/fast/Aliases/circular/teardown b/test/fast/Aliases/circular/teardown new file mode 100755 index 0000000..9b6c79c --- /dev/null +++ b/test/fast/Aliases/circular/teardown @@ -0,0 +1,10 @@ +#!/bin/sh + +rm -f ../../../../alias/loopback + +rm -f ../../../../alias/one +rm -f ../../../../alias/two +rm -f ../../../../alias/three + +rm -f ../../../../alias/four + diff --git a/test/fast/Aliases/setup_dir b/test/fast/Aliases/setup similarity index 100% rename from test/fast/Aliases/setup_dir rename to test/fast/Aliases/setup diff --git a/test/fast/Aliases/teardown_dir b/test/fast/Aliases/teardown similarity index 100% rename from test/fast/Aliases/teardown_dir rename to test/fast/Aliases/teardown