mirror of
https://github.com/nvm-sh/nvm.git
synced 2026-10-11 00:00:13 +08:00
[Perf] nvm_npmrc_bad_news_bears: scan npmrc files without forking grep
This commit is contained in:
@@ -3329,9 +3329,28 @@ nvm_npm_global_modules() {
|
||||
|
||||
nvm_npmrc_bad_news_bears() {
|
||||
local NVM_NPMRC
|
||||
local NVM_NPMRC_LINE
|
||||
local NVM_NPMRC_KEY
|
||||
NVM_NPMRC="${1-}"
|
||||
if [ -n "${NVM_NPMRC}" ] && [ -f "${NVM_NPMRC}" ] && nvm_grep -Ee '^(prefix|globalconfig) *=' <"${NVM_NPMRC}" >/dev/null; then
|
||||
return 0
|
||||
if [ -n "${NVM_NPMRC}" ] && [ -f "${NVM_NPMRC}" ]; then
|
||||
# this is fork-free on purpose: it runs up to four times on every `nvm use`/`nvm install`
|
||||
# avoid grepping or sub-shells as much as possible here.
|
||||
while IFS= read -r NVM_NPMRC_LINE || [ -n "${NVM_NPMRC_LINE}" ]; do
|
||||
case "${NVM_NPMRC_LINE}" in
|
||||
*=*)
|
||||
NVM_NPMRC_KEY="${NVM_NPMRC_LINE%%=*}"
|
||||
;;
|
||||
*)
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
NVM_NPMRC_KEY="${NVM_NPMRC_KEY%"${NVM_NPMRC_KEY##*[! ]}"}"
|
||||
case "${NVM_NPMRC_KEY}" in
|
||||
prefix | globalconfig)
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
done < "${NVM_NPMRC}"
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
@@ -201,4 +201,55 @@ Run \`foo\` to unset it."
|
||||
[ "_$CAPTURED_EXIT_CODE" = "_10" ] || die "'nvm_die_on_prefix 0 foo' with user .npmrc that has globalconfig did not exit with 10; got '$CAPTURED_EXIT_CODE'"
|
||||
)
|
||||
|
||||
# nvm_npmrc_bad_news_bears matches `^(prefix|globalconfig) *=`
|
||||
NPMRC="${TEST_DIR}/bad-news.npmrc"
|
||||
printf 'prefix=x\n' > "${NPMRC}"
|
||||
nvm_npmrc_bad_news_bears "${NPMRC}" || die 'prefix=x should be bad news'
|
||||
printf 'prefix =x\n' > "${NPMRC}"
|
||||
nvm_npmrc_bad_news_bears "${NPMRC}" || die 'prefix =x should be bad news'
|
||||
printf 'prefix =x\n' > "${NPMRC}"
|
||||
nvm_npmrc_bad_news_bears "${NPMRC}" || die 'prefix =x should be bad news'
|
||||
printf 'prefix =\n' > "${NPMRC}"
|
||||
nvm_npmrc_bad_news_bears "${NPMRC}" || die 'prefix = should be bad news'
|
||||
printf 'foo=1\nprefix = y\n' > "${NPMRC}"
|
||||
nvm_npmrc_bad_news_bears "${NPMRC}" || die 'a matching line after a non-matching line should be bad news'
|
||||
printf 'prefix=x' > "${NPMRC}"
|
||||
nvm_npmrc_bad_news_bears "${NPMRC}" || die 'prefix=x without a trailing newline should be bad news'
|
||||
printf 'globalconfig=x\n' > "${NPMRC}"
|
||||
nvm_npmrc_bad_news_bears "${NPMRC}" || die 'globalconfig=x should be bad news'
|
||||
printf 'globalconfig = x\n' > "${NPMRC}"
|
||||
nvm_npmrc_bad_news_bears "${NPMRC}" || die 'globalconfig = x should be bad news'
|
||||
|
||||
printf 'prefixfoo=x\n' > "${NPMRC}"
|
||||
! nvm_npmrc_bad_news_bears "${NPMRC}" || die 'prefixfoo=x should not be bad news'
|
||||
printf 'globalconfigfoo=x\n' > "${NPMRC}"
|
||||
! nvm_npmrc_bad_news_bears "${NPMRC}" || die 'globalconfigfoo=x should not be bad news'
|
||||
printf 'prefix x=x\n' > "${NPMRC}"
|
||||
! nvm_npmrc_bad_news_bears "${NPMRC}" || die 'prefix x=x should not be bad news'
|
||||
printf 'prefix\t=x\n' > "${NPMRC}"
|
||||
! nvm_npmrc_bad_news_bears "${NPMRC}" || die 'a tab before = should not be bad news'
|
||||
printf ' prefix=x\n' > "${NPMRC}"
|
||||
! nvm_npmrc_bad_news_bears "${NPMRC}" || die 'a leading space should not be bad news'
|
||||
printf 'Prefix=x\n' > "${NPMRC}"
|
||||
! nvm_npmrc_bad_news_bears "${NPMRC}" || die 'an uppercase key should not be bad news'
|
||||
printf 'prefix\n' > "${NPMRC}"
|
||||
! nvm_npmrc_bad_news_bears "${NPMRC}" || die 'a bare prefix should not be bad news'
|
||||
printf 'prefix \n' > "${NPMRC}"
|
||||
! nvm_npmrc_bad_news_bears "${NPMRC}" || die 'trailing spaces without = should not be bad news'
|
||||
: > "${NPMRC}"
|
||||
! nvm_npmrc_bad_news_bears "${NPMRC}" || die 'an empty npmrc should not be bad news'
|
||||
! nvm_npmrc_bad_news_bears || die 'a missing argument should not be bad news'
|
||||
! nvm_npmrc_bad_news_bears "${TEST_DIR}/nonexistent.npmrc" || die 'a missing file should not be bad news'
|
||||
|
||||
# the npmrc scan must not fork `grep`
|
||||
(
|
||||
rm -f "${TEST_DIR}/grep-was-called"
|
||||
nvm_grep() { : > "${TEST_DIR}/grep-was-called"; return 1; }
|
||||
printf 'globalconfig = nope\n' > "${TEST_DIR}/probe.npmrc"
|
||||
NVM_PROBE_EXIT=0
|
||||
nvm_npmrc_bad_news_bears "${TEST_DIR}/probe.npmrc" || NVM_PROBE_EXIT=$?
|
||||
[ ! -e "${TEST_DIR}/grep-was-called" ] || exit 10
|
||||
[ "${NVM_PROBE_EXIT}" = 0 ] || exit 11
|
||||
) || die 'nvm_npmrc_bad_news_bears must read npmrc files without calling nvm_grep'
|
||||
|
||||
cleanup
|
||||
|
||||
Reference in New Issue
Block a user