From c18cbf4d25f76be38e611dbfe9f164bcdb21a5cf Mon Sep 17 00:00:00 2001 From: Matt Saladna Date: Sat, 9 Dec 2023 19:25:43 -0500 Subject: [PATCH 1/5] Allow nvm-exec to be linked into individual .nvm directories for system-wide installs with a localized Nodes. Let's say we have nvm installed in a separate mount, /.socket. NVM_DIR is $HOME/.nvm in /etc/profile.d/nvm.sh. With this setup, users can install Node versions to their home directories without each installing nvm. nvm install --lts This works fine as does nvm use --lts. When nvm exec is used though, it fails because it looks for nvm-exec in $NVM_DIR. First fix is to look for nvm-exec in $NVM_DIR. If NVM_DIR does not contain nvm-exec, check $BASH_SOURCE[0]. The second fix is to follow nvm-exec if a symbolic link to determine the proper location of nvm's home. Alternatively we could use a second environment variable, NVM_HOME in exec instead of relying on the directory name of nvm-exec. --- nvm-exec | 4 +++- nvm.sh | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/nvm-exec b/nvm-exec index 44d5ddb116..536d2aa325 100755 --- a/nvm-exec +++ b/nvm-exec @@ -1,6 +1,8 @@ #!/usr/bin/env bash -DIR="$(command cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SOURCE=${BASH_SOURCE[0]} +test -L "$SOURCE" && SOURCE=`readlink "$SOURCE"` +DIR="$(command cd "$( dirname "$SOURCE" )" && pwd )" unset NVM_CD_FLAGS diff --git a/nvm.sh b/nvm.sh index 2e4378f2d2..7261b4b7c5 100644 --- a/nvm.sh +++ b/nvm.sh @@ -3871,7 +3871,9 @@ nvm() { nvm_echo "Running node ${VERSION}$(nvm use --silent "${VERSION}" && nvm_print_npm_version)" fi fi - NODE_VERSION="${VERSION}" "${NVM_DIR}/nvm-exec" "$@" + NVM_EXEC="$NVM_DIR/nvm-exec" + test ! -f "$NVM_EXEC" && NVM_EXEC=`dirname ${BASH_SOURCE[0]-}`/nvm-exec + NODE_VERSION="$VERSION" "$NVM_EXEC" "$@" ;; "ls" | "list") local PATTERN From d956279e5a4a8a1b3cd8a983d01fce8cf33d68e0 Mon Sep 17 00:00:00 2001 From: Matt Saladna Date: Thu, 21 Jun 2018 14:38:55 -0400 Subject: [PATCH 2/5] shellcheck warnings --- nvm-exec | 2 +- nvm.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nvm-exec b/nvm-exec index 536d2aa325..8f18e98e49 100755 --- a/nvm-exec +++ b/nvm-exec @@ -1,7 +1,7 @@ #!/usr/bin/env bash SOURCE=${BASH_SOURCE[0]} -test -L "$SOURCE" && SOURCE=`readlink "$SOURCE"` +test -L "$SOURCE" && SOURCE=$(readlink "$SOURCE") DIR="$(command cd "$( dirname "$SOURCE" )" && pwd )" unset NVM_CD_FLAGS diff --git a/nvm.sh b/nvm.sh index 7261b4b7c5..95d165df95 100644 --- a/nvm.sh +++ b/nvm.sh @@ -3872,7 +3872,7 @@ nvm() { fi fi NVM_EXEC="$NVM_DIR/nvm-exec" - test ! -f "$NVM_EXEC" && NVM_EXEC=`dirname ${BASH_SOURCE[0]-}`/nvm-exec + test ! -f "$NVM_EXEC" && NVM_EXEC="$(dirname "${BASH_SOURCE[0]-}")/nvm-exec" NODE_VERSION="$VERSION" "$NVM_EXEC" "$@" ;; "ls" | "list") From ad4fa37deb9b98698bf45fc7451242428d3f2b36 Mon Sep 17 00:00:00 2001 From: Matt Saladna Date: Thu, 21 Jun 2018 16:38:15 -0400 Subject: [PATCH 3/5] Add test for NVM_DIR outside nvm.sh Fix symlink traversal --- nvm-exec | 3 ++- ...exec --lts\" when NVM_DIR differs from nvm" | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 "test/slow/nvm exec/Running \"nvm exec --lts\" when NVM_DIR differs from nvm" diff --git a/nvm-exec b/nvm-exec index 8f18e98e49..5e88766a66 100755 --- a/nvm-exec +++ b/nvm-exec @@ -1,7 +1,8 @@ #!/usr/bin/env bash SOURCE=${BASH_SOURCE[0]} -test -L "$SOURCE" && SOURCE=$(readlink "$SOURCE") +test -L "$SOURCE" && command cd "$( dirname "$SOURCE" )" && \ + SOURCE=$(readlink "$SOURCE") DIR="$(command cd "$( dirname "$SOURCE" )" && pwd )" unset NVM_CD_FLAGS diff --git "a/test/slow/nvm exec/Running \"nvm exec --lts\" when NVM_DIR differs from nvm" "b/test/slow/nvm exec/Running \"nvm exec --lts\" when NVM_DIR differs from nvm" new file mode 100644 index 0000000000..ee314be76b --- /dev/null +++ "b/test/slow/nvm exec/Running \"nvm exec --lts\" when NVM_DIR differs from nvm" @@ -0,0 +1,18 @@ +#!/bin/sh + +set -ex + +die () { echo "$@" ; exit 1; } + +INSTPATH="$(mktemp -p "$(pwd)" -d)" +trap 'test ! -z "${INSTPATH-}" && test -d "$INSTPATH" && rm -rf "$INSTPATH"' EXIT +declare -x NVM_DIR=$INSTPATH +\. ../../../nvm.sh + +nvm install --lts || die 'nvm install --lts failed' +nvm exec --lts npm --version || die "`nvm exec` failed to run" +declare -x NODE_VERSION="$(nvm exec --lts --silent node --version)" + +ln -s ../../../../nvm-exec "$INSTPATH/nvm-exec" || die "failed to create a symlink to $INSTPATH/" +"$INSTPATH/nvm-exec" npm ls > /dev/null || die "`nvm exec` failed to run using nvm-exec helper" + From 3b811237cb467b749de0b2743dfe75a9ad3020d9 Mon Sep 17 00:00:00 2001 From: Matt Saladna Date: Sat, 9 Dec 2023 19:30:19 -0500 Subject: [PATCH 4/5] Drop same-owner on extraction --- nvm.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nvm.sh b/nvm.sh index 95d165df95..c8c3c8ad12 100644 --- a/nvm.sh +++ b/nvm.sh @@ -2384,12 +2384,12 @@ nvm_extract_tarball() { if [ "${NVM_OS}" = 'openbsd' ]; then if [ "${tar_compression_flag}" = 'J' ]; then - command xzcat "${TARBALL}" | "${tar}" -xf - -C "${TMPDIR}" -s '/[^\/]*\///' || return 1 + command xzcat "${TARBALL}" | "${tar}" --no-same-owner -xf - -C "${TMPDIR}" -s '/[^\/]*\///' || return 1 else - command "${tar}" -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" -s '/[^\/]*\///' || return 1 + command "${tar}" --no-same-owner -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" -s '/[^\/]*\///' || return 1 fi else - command "${tar}" -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 || return 1 + command "${tar}" --no-same-owner -x${tar_compression_flag}f "${TARBALL}" -C "${TMPDIR}" --strip-components 1 || return 1 fi } From b4ee18be6a1ba1dca0a85fdd796bc33b4984ced6 Mon Sep 17 00:00:00 2001 From: Matt Saladna Date: Sat, 16 Mar 2024 12:26:55 -0400 Subject: [PATCH 5/5] Partial reversion of nvm-sh/nvm#1517. Each alias lookup adds 8 to the pids.current bean counter resulting in 64+ concurrent tids (tasks, w/ threads) thus making it susceptible to hit pids.max. Once reached, subshell behavior is unexpected yielding "retry: Resource temporarily unavailable" errors until cgroup capacity is restored. --- nvm.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/nvm.sh b/nvm.sh index c8c3c8ad12..1d515b1847 100644 --- a/nvm.sh +++ b/nvm.sh @@ -1122,10 +1122,9 @@ nvm_list_aliases() { if [ -n "${LTS_ALIAS}" ]; then nvm_echo "${LTS_ALIAS}" fi - } & + } done - wait - ) | command sort + ) return }