forked from asdf-vm/asdf-nodejs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.sh
165 lines (133 loc) · 4.28 KB
/
utils.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# Helper functions
# When in China, set $NODEJS_ORG_MIRROR:
# export NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node/
NODEJS_ORG_MIRROR="${NODEJS_ORG_MIRROR:-https://nodejs.org/dist/}"
if [ ${NODEJS_ORG_MIRROR: -1} != / ]; then
NODEJS_ORG_MIRROR=$NODEJS_ORG_MIRROR/
fi
export ASDF_NODEJS_PLUGIN_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
# TODO: Replace with an asdf variable once asdf starts providing the plugin name
# as a variable
export ASDF_NODEJS_PLUGIN_NAME=$(basename "$ASDF_NODEJS_PLUGIN_DIR")
plugin_name() {
printf "%s\n" "$ASDF_NODEJS_PLUGIN_NAME"
}
asdf_data_dir() {
local data_dir
if [ "${ASDF_DATA_DIR-}" ]; then
data_dir="${ASDF_DATA_DIR}"
elif [ "${ASDF_DIR-}" ]; then
data_dir="$ASDF_DIR"
else
data_dir="$HOME/.asdf"
fi
printf "%s\n" "$data_dir"
}
export ASDF_NODEJS_CACHE_DIR="$(asdf_data_dir)/tmp/$ASDF_NODEJS_PLUGIN_NAME/cache"
# Colors
colored() {
local color="$1" text="$2"
printf "\033[%sm%s\033[39;49m\n" "$color" "$text"
}
export RED=31 GREEN=32 YELLOW=33 BLUE=34 MAGENTA=35 CYAN=36
nodebuild_wrapped() {
"$ASDF_NODEJS_PLUGIN_DIR/lib/commands/command-nodebuild" "$@"
}
try_to_update_nodebuild() {
if [ "${ASDF_NODEJS_SKIP_NODEBUILD_UPDATE-}" ]; then
return
fi
local exit_code=0
"$ASDF_NODEJS_PLUGIN_DIR/lib/commands/command-update-nodebuild" 2>/dev/null || exit_code=$?
if [ "$exit_code" != 0 ]; then
printf "
$(colored $YELLOW WARNING): Updating node-build failed with exit code %s. The installation will
try to continue with already installed local defintions. To debug what went
wrong, try to manually update node-build by running: \`asdf %s update nodebuild\`
\n" "$exit_code" "$ASDF_NODEJS_PLUGIN_NAME"
fi
}
# Adapted from asdf-core https://github.com/asdf-vm/asdf/blob/684f4f058f24cc418f77825a59a22bacd16a9bee/lib/utils.bash#L95-L109
list_installed_versions() {
local plugin_name=$1
local plugin_installs_path
plugin_installs_path="$(asdf_data_dir)/installs/${plugin_name}"
if [ -d "$plugin_installs_path" ]; then
for install in "${plugin_installs_path}"/*/; do
[[ -e "$install" ]] || break
basename "$install" | sed 's/^ref-/ref:/'
done
fi
}
# stolen from https://github.com/rbenv/ruby-build/pull/631/files#diff-fdcfb8a18714b33b07529b7d02b54f1dR942
sort_versions() {
sed 'h; s/[+-]/./g; s/.p\([[:digit:]]\)/.z\1/; s/$/.z/; G; s/\n/ /' |
LC_ALL=C sort -t. -k 1,1 -k 2,2n -k 3,3n -k 4,4n -k 5,5n | awk '{print $2}'
}
resolve_legacy_version() {
local strategy="$1" query="$2"
local resolved=
case "$strategy" in
latest_installed)
_list() {
ASDF_NODEJS_SKIP_NODEBUILD_UPDATE=1 list_installed_versions nodejs | sort_versions
}
;;
latest_available)
_list() {
ASDF_NODEJS_SKIP_NODEBUILD_UPDATE=1 "$ASDF_NODEJS_PLUGIN_DIR/bin/list-all" "$query" | tr ' ' '\n'
}
;;
*)
# Just return the original query
printf "%s\n" "$query"
return
esac
resolved=$(_list | grep "^$query" | tail -n1)
if [ "$resolved" ]; then
printf "%s\n" "$resolved"
elif [ "$strategy" != latest_available ]; then
# If no version is installed, fallback to latest_available, so `asdf install nodejs` works
resolve_legacy_version latest_available "$query"
else
# Give up and pretty the query itself
printf "%s\n" "$query"
fi
}
resolve_version() {
local query=
query=$(tr '[:upper:]' '[:lower:]' <<<"${1#v}")
if [[ $query = lts-* ]]; then
query=$(tr - / <<<"$query")
fi
local nodejs_codenames=(
argon:4
boron:6
carbon:8
dubnium:10
erbium:12
fermium:14
gallium:16
hydrogen:18
iron:20
jod:22
)
for cod_version in "${nodejs_codenames[@]}"; do
local codename="${cod_version%:*}"
local version_number="${cod_version#*:}"
if [ "${query#lts/}" = "$codename" ]; then
query="$version_number"
break
fi
done
if [ "$query" = lts ] || [ "$query" = "lts/*" ]; then
query="${nodejs_codenames[${#nodejs_codenames[@]} - 1]#*:}"
local all_versions
all_versions=$("$ASDF_NODEJS_PLUGIN_DIR/bin/list-all" 2>/dev/null | tr ' ' '\n')
query=$(echo "$all_versions" | grep "^$query\." | tail -n1)
fi
if [ "${ASDF_NODEJS_LEGACY_FILE_DYNAMIC_STRATEGY-}" ]; then
query=$(resolve_legacy_version "$ASDF_NODEJS_LEGACY_FILE_DYNAMIC_STRATEGY" "$query")
fi
printf "%s\n" "$query"
}