added a couple minor optimizations; polished a few things

This commit is contained in:
edwmurph 2018-05-31 11:15:49 -04:00
parent b057b5660f
commit faadbf8f6c

81
nvm.sh
View File

@ -309,7 +309,7 @@ nvm_string_contains_regexp() {
return 1 return 1
fi fi
# e.g. "nvm_string_contains_regexp abbc ^aa?b+.$" returns 0 # e.g. "nvm_string_contains_regexp abbc ^aa?b+.$" returns 0
command printf "%s" "$string" | command awk "/$regexp/{ exit 0 }{ exit 1 }" command printf '%s' "$string" | command awk "/$regexp/{ exit 0 }{ exit 1 }"
} }
# Validates that the given semver adheres to the following grammar: # Validates that the given semver adheres to the following grammar:
@ -322,7 +322,7 @@ nvm_is_valid_semver() {
} }
nvm_trim_and_reduce_whitespace_to_one_space() { nvm_trim_and_reduce_whitespace_to_one_space() {
command printf "%s" "${1-}" | command printf '%s' "${1-}" |
command tr -d '\n\r' | command tr -d '\n\r' |
command tr '\t' ' ' | command tr '\t' ' ' |
command tr -s ' ' | command tr -s ' ' |
@ -346,12 +346,12 @@ nvm_normalize_semver() {
local validated_semver local validated_semver
validated_semver=''; validated_semver='';
while [ -n "$semver" ]; do while [ -n "$semver" ]; do
comparator_set=$(command printf "%s" "$semver" | command head -n1) comparator_set=$(command printf '%s' "$semver" | command head -n1)
semver=$(command printf "%s" "$semver" | command tail -n +2) semver=$(command printf '%s' "$semver" | command tail -n +2)
[ -n "$comparator_set" ] || continue [ -n "$comparator_set" ] || continue
# convert comparators into required grammar # convert comparators into required grammar
validated_comparator_set=$(command printf " %s " "$comparator_set" | validated_comparator_set=$(command printf ' %s ' "$comparator_set" |
command sed -E " command sed -E "
# exactly 1 space is needed before and after every comparator (including the first and last comparators) # exactly 1 space is needed before and after every comparator (including the first and last comparators)
s/\011/ /g;s/ +/ /g; s/\011/ /g;s/ +/ /g;
@ -473,10 +473,10 @@ nvm_normalize_semver() {
fi fi
done done
validated_semver=$(command printf "%s" "$validated_semver" | command sed -E 's/^ \|\| //') validated_semver=$(command printf '%s' "$validated_semver" | command sed -E 's/^ \|\| //')
if nvm_is_valid_semver "$validated_semver"; then if nvm_is_valid_semver "$validated_semver"; then
command printf "%s" "$validated_semver" command printf '%s' "$validated_semver"
else else
return 1 return 1
fi fi
@ -498,7 +498,7 @@ nvm_interpret_complex_semver() {
# - Resolve the comparator_set to its newest compatible version. # - Resolve the comparator_set to its newest compatible version.
# - Add the discovered newest compatible version to highest_compatible_versions. # - Add the discovered newest compatible version to highest_compatible_versions.
# - Choose the highest version among all the versions collected in highest_compatible_versions. # - Choose the highest version among all the versions collected in highest_compatible_versions.
semver=$(command printf "%s" "$semver" | command tr '||' '\n') semver=$(command printf '%s' "$semver" | command tr '||' '\n')
local version_list_copy local version_list_copy
local current_comparator_set local current_comparator_set
local current_version local current_version
@ -509,28 +509,28 @@ nvm_interpret_complex_semver() {
highest_compatible_versions='' highest_compatible_versions=''
while [ -n "$semver" ]; do while [ -n "$semver" ]; do
version_list_copy=$(command printf "%s" "$version_list") version_list_copy=$(command printf '%s' "$version_list")
current_comparator_set=$(command printf "%s" "$semver" | command head -n1 | command sed -E 's/^ +//;s/ +$//') current_comparator_set=$(command printf '%s' "$semver" | command head -n1 | command sed -E 's/^ +//;s/ +$//')
semver=$(command printf "%s" "$semver" | command tail -n +2) semver=$(command printf '%s' "$semver" | command tail -n +2)
[ -n "$current_comparator_set" ] || continue [ -n "$current_comparator_set" ] || continue
# For each version in the version_list_copy (iterating from newest to oldest): # For each version in the version_list_copy (iterating from newest to oldest):
# - If current_version satisfies all comparators in current_comparator_set, we've found the newest version compatible with all comparators in current current_comparator_set. # - If current_version satisfies all comparators in current_comparator_set, we've found the newest version compatible with all comparators in current current_comparator_set.
# - Add discovered version to highest_compatible_versions and stop iterating through versions for current_comparator_set. # - Add discovered version to highest_compatible_versions and stop iterating through versions for current_comparator_set.
while [ -n "$version_list_copy" ]; do while [ -n "$version_list_copy" ]; do
current_version=$(command printf "%s" "$version_list_copy" | command tail -n1 | command sed -E 's/^ +//;s/ +$//' | nvm_grep -o '^[0-9]\+\.[0-9]\+\.[0-9]\+$') current_version=$(command printf '%s' "$version_list_copy" | command tail -n1 | command sed -E 's/^ +//;s/ +$//' | nvm_grep -o '^[0-9]\+\.[0-9]\+\.[0-9]\+$')
version_list_copy=$(command printf "%s" "$version_list_copy" | command sed '$d') version_list_copy=$(command printf '%s' "$version_list_copy" | command sed '$d')
[ -n "$current_version" ] || continue [ -n "$current_version" ] || continue
# For each comparator in the current_comparator_set_copy: # For each comparator in the current_comparator_set_copy:
# - If current_version is compatible with all comparators, we know current_version is the newest compatible version # - If current_version is compatible with all comparators, we know current_version is the newest compatible version
current_comparator_set_copy=$(command printf "%s" "$current_comparator_set" | command tr ' ' '\n') current_comparator_set_copy=$(command printf '%s' "$current_comparator_set" | command tr ' ' '\n')
while [ -n "$current_comparator_set_copy" ]; do while [ -n "$current_comparator_set_copy" ]; do
current_comparator=$(command printf "%s" "$current_comparator_set_copy" | command head -n1 | command sed -E 's/^ +//;s/ +$//') current_comparator=$(command printf '%s' "$current_comparator_set_copy" | command head -n1 | command sed -E 's/^ +//;s/ +$//')
current_comparator_set_copy=$(command printf "%s" "$current_comparator_set_copy" | command tail -n +2) current_comparator_set_copy=$(command printf '%s' "$current_comparator_set_copy" | command tail -n +2)
[ -n "$current_comparator" ] || continue [ -n "$current_comparator" ] || continue
stripped_version_from_comparator=$(command printf "%s" "$current_comparator" | nvm_grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+$') stripped_version_from_comparator=$(command printf '%s' "$current_comparator" | nvm_grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+$')
if [ -z "$stripped_version_from_comparator" ]; then if [ -z "$stripped_version_from_comparator" ]; then
return 1 return 1
fi fi
@ -619,10 +619,10 @@ nvm_interpret_complex_semver() {
local highest_compatible_version local highest_compatible_version
local compatible_node_version local compatible_node_version
highest_compatible_version='0.0.0' highest_compatible_version='0.0.0'
highest_compatible_versions=$(command printf "%s" "$highest_compatible_versions" | command tr ' ' '\n') highest_compatible_versions=$(command printf '%s' "$highest_compatible_versions" | command tr ' ' '\n')
while [ -n "$highest_compatible_versions" ]; do while [ -n "$highest_compatible_versions" ]; do
compatible_node_version=$(command printf "%s" "$highest_compatible_versions" | command head -n1 | command sed -E 's/^ +//;s/ +$//') compatible_node_version=$(command printf '%s' "$highest_compatible_versions" | command head -n1 | command sed -E 's/^ +//;s/ +$//')
highest_compatible_versions=$(command printf "%s" "$highest_compatible_versions" | command tail -n +2) highest_compatible_versions=$(command printf '%s' "$highest_compatible_versions" | command tail -n +2)
[ -n "$compatible_node_version" ] || continue [ -n "$compatible_node_version" ] || continue
if nvm_version_greater "$compatible_node_version" "$highest_compatible_version"; then if nvm_version_greater "$compatible_node_version" "$highest_compatible_version"; then
@ -630,7 +630,7 @@ nvm_interpret_complex_semver() {
fi fi
done done
if [ "$highest_compatible_version" != '0.0.0' ]; then if [ "$highest_compatible_version" != '0.0.0' ]; then
command printf "%s" "$highest_compatible_version" command printf '%s' "$highest_compatible_version"
else else
return 1 return 1
fi fi
@ -646,29 +646,29 @@ nvm_interpret_simple_semver() {
return 1 return 1
fi fi
local stripped_version_from_semver local stripped_version_from_semver
stripped_version_from_semver=$(command printf "%s" "$semver" | nvm_grep -o '^[0-9]\+\.[0-9]\+\.[0-9]\+$') stripped_version_from_semver=$(command printf '%s' "$semver" | nvm_grep -o '^[0-9]\+\.[0-9]\+\.[0-9]\+$')
local newest_version_from_list local newest_version_from_list
newest_version_from_list=$(command printf "%s" "$version_list" | tail -n 1 | nvm_grep -o '^[0-9]\+\.[0-9]\+\.[0-9]\+$') newest_version_from_list=$(command printf '%s' "$version_list" | tail -n 1 | nvm_grep -o '^[0-9]\+\.[0-9]\+\.[0-9]\+$')
if [ -z "$stripped_version_from_semver" ] || [ -z "$newest_version_from_list" ]; then if [ -z "$stripped_version_from_semver" ] || [ -z "$newest_version_from_list" ]; then
return 1 return 1
fi fi
local retrieved_version local retrieved_version
# if the semver is looking for an exact match, and it exists in the provided list of versions, resolve to that version # if the semver is looking for an exact match, and it exists in the provided list of versions, resolve to that version
if nvm_string_contains_regexp "$semver" '^[0-9]+\.[0-9]+\.[0-9]+$'; then if nvm_string_contains_regexp "$semver" '^[0-9]+\.[0-9]+\.[0-9]+$'; then
retrieved_version=$(command printf "%s" "$version_list" | nvm_grep "^$stripped_version_from_semver$") retrieved_version=$(command printf '%s' "$version_list" | nvm_grep "^$stripped_version_from_semver$")
if [ -n "$retrieved_version" ]; then if [ -n "$retrieved_version" ]; then
command printf "%s" "$retrieved_version" command printf '%s' "$retrieved_version"
return 0 return 0
else else
# TODO we know it's not worth doing the complex semver interpratation at this point command printf '%s' 'STOP' # we have determined no node version will be compatible with the semver
return 1 return 1
fi fi
# Semver is looking for the newest version that is <= to a sepcific version, and the version exists in the provided list of versions, resolve to that version # Semver is looking for the newest version that is <= to a sepcific version, and the version exists in the provided list of versions, resolve to that version
elif nvm_string_contains_regexp "$semver" '^<=[0-9]+\.[0-9]+\.[0-9]+$'; then elif nvm_string_contains_regexp "$semver" '^<=[0-9]+\.[0-9]+\.[0-9]+$'; then
retrieved_version=$(command printf "%s" "$version_list" | nvm_grep "^$stripped_version_from_semver$") retrieved_version=$(command printf '%s' "$version_list" | nvm_grep "^$stripped_version_from_semver$")
if [ -n "$retrieved_version" ]; then if [ -n "$retrieved_version" ]; then
command printf "%s" "$retrieved_version" command printf '%s' "$retrieved_version"
return 0 return 0
else else
return 1 # go on to try complex semver interpretation return 1 # go on to try complex semver interpretation
@ -677,7 +677,7 @@ nvm_interpret_simple_semver() {
# Semver is looking for the newest version >= a specific version, and the newest version in the provided list of versions is >= the specified version, resolve to that version. # Semver is looking for the newest version >= a specific version, and the newest version in the provided list of versions is >= the specified version, resolve to that version.
elif nvm_string_contains_regexp "$semver" '^>=[0-9]+\.[0-9]+\.[0-9]+$'; then elif nvm_string_contains_regexp "$semver" '^>=[0-9]+\.[0-9]+\.[0-9]+$'; then
if nvm_version_greater_than_or_equal_to "$newest_version_from_list" "$stripped_version_from_semver"; then if nvm_version_greater_than_or_equal_to "$newest_version_from_list" "$stripped_version_from_semver"; then
command printf "%s" "$newest_version_from_list" command printf '%s' "$newest_version_from_list"
return 0 return 0
else else
# TODO we know it's not worth doing the complex semver interpretation at this point # TODO we know it's not worth doing the complex semver interpretation at this point
@ -686,10 +686,10 @@ nvm_interpret_simple_semver() {
elif nvm_string_contains_regexp "$semver" '^>[0-9]+\.[0-9]+\.[0-9]+$'; then elif nvm_string_contains_regexp "$semver" '^>[0-9]+\.[0-9]+\.[0-9]+$'; then
if nvm_version_greater "$newest_version_from_list" "$stripped_version_from_semver"; then if nvm_version_greater "$newest_version_from_list" "$stripped_version_from_semver"; then
command printf "%s" "$newest_version_from_list" command printf '%s' "$newest_version_from_list"
return 0 return 0
else else
# TODO we know it's not worth doing the complex semver interpretation at this point command printf '%s' 'STOP' # we have determined no node version will be compatible with the semver
return 1 return 1
fi fi
@ -720,19 +720,20 @@ nvm_interpret_node_semver() {
return 1 return 1
fi fi
# TODO update nvm_interpret_simple_semver failure output to indicate if it is worth doing complex semver interpretation
# If semver is a single comparator, use quick algorithm to determine newest compatible version # If semver is a single comparator, use quick algorithm to determine newest compatible version
local resolved_version local resolved_version
resolved_version=$(nvm_interpret_simple_semver "$valid_transformed_semver" "$remote_node_versions") resolved_version=$(nvm_interpret_simple_semver "$valid_transformed_semver" "$remote_node_versions")
if [ -n "$resolved_version" ]; then if [ "$resolved_version" = 'STOP' ]; then
command printf "%s" "$resolved_version" return 1 # nvm_interpret_simple_semver determined no node version will be compatible with the semver
elif [ -n "$resolved_version" ]; then
command printf '%s' "$resolved_version"
return 0 return 0
fi fi
# If semver is a semver with > 1 comparator, iterate through each remote node version from newest to oldest until finding the newest version compatible with all comparators. # If semver is a semver with > 1 comparator, iterate through each remote node version from newest to oldest until finding the newest version compatible with all comparators.
resolved_version=$(nvm_interpret_complex_semver "$valid_transformed_semver" "$remote_node_versions") resolved_version=$(nvm_interpret_complex_semver "$valid_transformed_semver" "$remote_node_versions")
if [ -n "$resolved_version" ]; then if [ -n "$resolved_version" ]; then
command printf "%s" "$resolved_version" command printf '%s' "$resolved_version"
return 0 return 0
fi fi
@ -742,7 +743,7 @@ nvm_interpret_node_semver() {
nvm_find_package_json() { nvm_find_package_json() {
dir="$(nvm_find_up 'package.json')" dir="$(nvm_find_up 'package.json')"
if [ -e "${dir}/package.json" ]; then if [ -e "${dir}/package.json" ]; then
command printf "%s" "${dir}/package.json" command printf '%s' "${dir}/package.json"
fi fi
} }
@ -752,7 +753,7 @@ nvm_find_package_json() {
# - semantic expression must match regexp: "[|<> [:alnum:].^=~*-]\+" # - semantic expression must match regexp: "[|<> [:alnum:].^=~*-]\+"
nvm_get_node_from_pkg_json() { nvm_get_node_from_pkg_json() {
local package_json_contents local package_json_contents
package_json_contents=${1-} package_json_contents="${1-}"
local engines_node_value local engines_node_value
engines_node_value='' engines_node_value=''
local open_brackets local open_brackets
@ -768,7 +769,7 @@ nvm_get_node_from_pkg_json() {
| while read -r i; do | while read -r i; do
engines_node_value="$engines_node_value$i" engines_node_value="$engines_node_value$i"
if [ "$i" = '"' ]; then if [ "$i" = '"' ]; then
if [ "$in_quotes" = 1 ]; then if [ $in_quotes -eq 1 ]; then
in_quotes=0 in_quotes=0
else else
in_quotes=1 in_quotes=1
@ -776,7 +777,7 @@ nvm_get_node_from_pkg_json() {
# spaces are interpretted as '' here but they need to be retained # spaces are interpretted as '' here but they need to be retained
elif [ "$i" = '' ]; then elif [ "$i" = '' ]; then
engines_node_value="$engines_node_value " engines_node_value="$engines_node_value "
elif [ "$in_quotes" = 1 ]; then elif [ $in_quotes -eq 1 ]; then
if [ "$i" = '{' ]; then if [ "$i" = '{' ]; then
open_brackets=$((open_brackets+1)) open_brackets=$((open_brackets+1))
elif [ "$i" = '}' ]; then elif [ "$i" = '}' ]; then
@ -784,7 +785,7 @@ nvm_get_node_from_pkg_json() {
fi fi
fi fi
if [ "$open_brackets" -ne 0 ] && [ "$open_brackets" -eq "$closed_brackets" ]; then if [ "$open_brackets" -ne 0 ] && [ "$open_brackets" -eq "$closed_brackets" ]; then
command printf "%s" "$engines_node_value" \ command printf '%s' "$engines_node_value" \
| nvm_grep -o '"node": \?"[|<> [:alnum:].^=~*-]\+"' \ | nvm_grep -o '"node": \?"[|<> [:alnum:].^=~*-]\+"' \
| command tr -d '"' \ | command tr -d '"' \
| command awk -F: '{ print $2 }' \ | command awk -F: '{ print $2 }' \