#!/bin/sh die () { echo "$@" ; cleanup ; exit 1; } cleanup() { unset -f install_nvm_from_git install_nvm_as_script nvm_detect_profile nvm_has nvm_install_dir unset -f nvm_check_global_modules nvm_install_node unset -f setup cleanup die unset NVM_ENV METHOD PROFILE rm -rf "${TMPDIR_FOR_TEST-}" 2>/dev/null } setup() { NVM_ENV=testing \. ../../install.sh # Mock installation functions to do nothing install_nvm_from_git() { :; } install_nvm_as_script() { :; } nvm_check_global_modules() { :; } nvm_install_node() { :; } # Mock nvm_has to return true for git nvm_has() { case "$1" in git) return 0 ;; xcode-select) return 1 ;; *) return 1 ;; esac } } setup # # Test: printf calls in nvm_do_install should not interpret % in paths # When NVM_DIR contains printf format specifiers like %s or %d, # the output should contain them literally, not interpret them. # TMPDIR_FOR_TEST="$(mktemp -d)" PERCENT_DIR="${TMPDIR_FOR_TEST}/nvm_%s_test" mkdir -p "${PERCENT_DIR}" # Copy nvm.sh to the temp dir so sourcing succeeds cp ../../nvm.sh "${PERCENT_DIR}/nvm.sh" # Mock nvm_install_dir to return our percent-containing path nvm_install_dir() { nvm_echo "${PERCENT_DIR}" } # Mock nvm_detect_profile to return empty so we hit the "Profile not found" branch # which calls: command printf '%b' "${SOURCE_STR}" nvm_detect_profile() { echo "" } OUTPUT="$(PROFILE='' METHOD='' NVM_DIR="${PERCENT_DIR}" nvm_do_install 2>&1)" # The SOURCE_STR should contain the %s from the path literally if ! echo "${OUTPUT}" | grep -q '%s'; then die "printf should not have consumed the %s in the path. Output: ${OUTPUT}" fi # Also verify via the "Profile not found" branch that SOURCE_STR was printed correctly if ! echo "${OUTPUT}" | grep -q 'nvm_%s_test'; then die "Expected nvm_%s_test in output but got: ${OUTPUT}" fi cleanup