Skip to content

Commit

Permalink
[Fix] nvm_strip_path: Preserve leading/trailing colons
Browse files Browse the repository at this point in the history
Path lists in environmental variables often give special meaning to
empty entries (e.g. in PATH or MANPATH). These are represented by
leading or trailing colons, or by doubled colons in the middle of the
list.

Adjust the awk invocation to correctly deal with trailing colons by
printing the separator before every field except the first, and then
printing the final separator that is read from the input - this will
either be a colon or the null string. This preserves leading and
trailing colons in all cases while not adding extra colons in the wrong
place.

Add test to confirm the correct behaviour.

Fixes #3144
  • Loading branch information
oliverhenshaw committed Jul 7, 2023
1 parent 9a76963 commit c937d62
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 1 deletion.
3 changes: 2 additions & 1 deletion nvm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,8 @@ nvm_strip_path() {
path = substr($0, length(NVM_DIR) + 1)
if (path ~ "^(/versions/[^/]*)?/[^/]*'"${2-}"'.*$") { next }
}
{ print }' | command paste -s -d: -
# The final RT will contain a colon if the input has a trailing colon, or a null string otherwise
{ printf "%s%s", sep, $0; sep=RS } END { printf "%s", RT }'
}

nvm_change_path() {
Expand Down
6 changes: 6 additions & 0 deletions test/fast/Unit tests/nvm_strip_path
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,9 @@ TEST_PATH="$NVM_DIR/v0.10.5/bin:/usr/bin:$NVM_DIR/v0.11.5/bin:$NVM_DIR/v0.9.5/bi
STRIPPED_PATH=`nvm_strip_path "$TEST_PATH" "/bin"`

[ "$STRIPPED_PATH" = "/usr/bin:/usr/local/bin" ] || die "Not correctly stripped: $STRIPPED_PATH "

TEST_PATH=":/a/b/bin::/c/d/bin:"

STRIPPED_PATH=`nvm_strip_path "$TEST_PATH" "/bin"`

[ "$STRIPPED_PATH" = "$TEST_PATH" ] || die "Stripping does not preserve colons: $STRIPPED_PATH "

0 comments on commit c937d62

Please sign in to comment.