asdf

Форк
0
/
installs.bash 
255 строк · 7.2 Кб
1
handle_failure() {
2
  local install_path="$1"
3
  rm -rf "$install_path"
4
  exit 1
5
}
6

7
handle_cancel() {
8
  local install_path="$1"
9
  printf "\nreceived sigint, cleaning up"
10
  handle_failure "$install_path"
11
}
12

13
install_command() {
14
  local plugin_name=$1
15
  local full_version=$2
16
  local extra_args="${*:3}"
17

18
  if [ "$plugin_name" = "" ] && [ "$full_version" = "" ]; then
19
    install_local_tool_versions "$extra_args"
20
  elif [[ $# -eq 1 ]]; then
21
    install_one_local_tool "$plugin_name"
22
  else
23
    install_tool_version "$plugin_name" "$full_version" "$extra_args"
24
  fi
25
}
26

27
get_concurrency() {
28
  local asdf_concurrency=
29

30
  if [ -n "$ASDF_CONCURRENCY" ]; then
31
    asdf_concurrency="$ASDF_CONCURRENCY"
32
  else
33
    asdf_concurrency=$(get_asdf_config_value 'concurrency')
34
  fi
35

36
  if [ "$asdf_concurrency" = 'auto' ]; then
37
    if command -v nproc &>/dev/null; then
38
      asdf_concurrency=$(nproc)
39
    elif command -v sysctl &>/dev/null && sysctl hw.ncpu &>/dev/null; then
40
      asdf_concurrency=$(sysctl -n hw.ncpu)
41
    elif [ -f /proc/cpuinfo ]; then
42
      asdf_concurrency=$(grep -c processor /proc/cpuinfo)
43
    else
44
      asdf_concurrency="1"
45
    fi
46
  fi
47

48
  printf "%s\n" "$asdf_concurrency"
49
}
50

51
install_one_local_tool() {
52
  local plugin_name=$1
53
  local search_path
54
  search_path=$PWD
55

56
  local plugin_versions
57

58
  local plugin_version
59

60
  local plugin_version_and_path
61
  plugin_version_and_path="$(find_versions "$plugin_name" "$search_path")"
62

63
  if [ -n "$plugin_version_and_path" ]; then
64
    local plugin_version
65
    plugin_versions=$(cut -d '|' -f 1 <<<"$plugin_version_and_path")
66
    for plugin_version in $plugin_versions; do
67
      install_tool_version "$plugin_name" "$plugin_version"
68
    done
69
  else
70
    printf "No versions specified for %s in config files or environment\n" "$plugin_name"
71
    exit 1
72
  fi
73
}
74

75
install_local_tool_versions() {
76
  local plugins_path
77
  plugins_path=$(get_plugin_path)
78

79
  local search_path
80
  search_path=$PWD
81

82
  local some_tools_installed
83
  local some_plugin_not_installed
84

85
  local tool_versions_path
86
  tool_versions_path=$(find_tool_versions)
87

88
  # Locate all the plugins installed in the system
89
  local plugins_installed
90
  if find "$plugins_path" -mindepth 1 -type d &>/dev/null; then
91
    for plugin_path in "$plugins_path"/*/; do
92
      local plugin_name
93
      plugin_name=$(basename "$plugin_path")
94
      plugins_installed="$plugins_installed $plugin_name"
95
    done
96
    plugins_installed=$(printf "%s" "$plugins_installed" | tr " " "\n")
97
  fi
98

99
  if [ -z "$plugins_installed" ]; then
100
    printf "Install plugins first to be able to install tools\n"
101
    exit 1
102
  fi
103

104
  # Locate all the plugins defined in the versions file.
105
  local tools_file
106
  if [ -f "$tool_versions_path" ]; then
107
    tools_file=$(strip_tool_version_comments "$tool_versions_path" | cut -d ' ' -f 1)
108
    for plugin_name in $tools_file; do
109
      if ! printf '%s\n' "${plugins_installed[@]}" | grep -q "^$plugin_name\$"; then
110
        printf "%s plugin is not installed\n" "$plugin_name"
111
        some_plugin_not_installed='yes'
112
      fi
113
    done
114
  fi
115

116
  if [ -n "$some_plugin_not_installed" ]; then
117
    exit 1
118
  fi
119

120
  if [ -n "$plugins_installed" ]; then
121
    for plugin_name in $plugins_installed; do
122
      local plugin_version_and_path
123
      plugin_version_and_path="$(find_versions "$plugin_name" "$search_path")"
124

125
      if [ -n "$plugin_version_and_path" ]; then
126
        local plugin_version
127
        some_tools_installed='yes'
128
        plugin_versions=$(cut -d '|' -f 1 <<<"$plugin_version_and_path")
129
        for plugin_version in $plugin_versions; do
130
          install_tool_version "$plugin_name" "$plugin_version"
131
        done
132
      fi
133
    done
134
  fi
135

136
  if [ -z "$some_tools_installed" ]; then
137
    printf "Either specify a tool & version in the command\n"
138
    printf "OR add .tool-versions file in this directory\n"
139
    printf "or in a parent directory\n"
140
    exit 1
141
  fi
142
}
143

144
install_tool_version() {
145
  local plugin_name=$1
146
  local full_version=$2
147
  local flags=$3
148
  local keep_download
149
  local plugin_path
150

151
  plugin_path=$(get_plugin_path "$plugin_name")
152
  check_if_plugin_exists "$plugin_name"
153

154
  for flag in $flags; do
155
    case "$flag" in
156
    "--keep-download")
157
      keep_download=true
158
      shift
159
      ;;
160
    *)
161
      shift
162
      ;;
163
    esac
164
  done
165

166
  if [ "$full_version" = "system" ]; then
167
    return
168
  fi
169

170
  IFS=':' read -r -a version_info <<<"$full_version"
171
  if [ "${version_info[0]}" = "ref" ]; then
172
    local install_type="${version_info[0]}"
173
    local version="${version_info[1]}"
174
  else
175
    local install_type="version"
176

177
    if [ "${version_info[0]}" = "latest" ]; then
178
      local version
179
      version=$(latest_command "$plugin_name" "${version_info[1]}")
180
      full_version=$version
181
    else
182
      local version="${version_info[0]}"
183
    fi
184
  fi
185

186
  local install_path
187
  install_path=$(get_install_path "$plugin_name" "$install_type" "$version")
188
  local download_path
189
  download_path=$(get_download_path "$plugin_name" "$install_type" "$version")
190
  local concurrency
191
  concurrency=$(get_concurrency)
192
  trap 'handle_cancel $install_path' INT
193

194
  if [ -d "$install_path" ]; then
195
    printf "%s %s is already installed\n" "$plugin_name" "$full_version"
196
  else
197

198
    if [ -f "${plugin_path}/bin/download" ]; then
199
      # Not a legacy plugin
200
      # Run the download script
201
      (
202
        # shellcheck disable=SC2030
203
        export ASDF_INSTALL_TYPE=$install_type
204
        # shellcheck disable=SC2030
205
        export ASDF_INSTALL_VERSION=$version
206
        # shellcheck disable=SC2030
207
        export ASDF_INSTALL_PATH=$install_path
208
        # shellcheck disable=SC2030
209
        export ASDF_DOWNLOAD_PATH=$download_path
210
        mkdir -p "$download_path"
211
        asdf_run_hook "pre_asdf_download_${plugin_name}" "$full_version"
212
        "${plugin_path}"/bin/download
213
      )
214
    fi
215

216
    local download_exit_code=$?
217
    if [ $download_exit_code -eq 0 ]; then
218
      (
219
        # shellcheck disable=SC2031
220
        export ASDF_INSTALL_TYPE=$install_type
221
        # shellcheck disable=SC2031
222
        export ASDF_INSTALL_VERSION=$version
223
        # shellcheck disable=SC2031
224
        export ASDF_INSTALL_PATH=$install_path
225
        # shellcheck disable=SC2031
226
        export ASDF_DOWNLOAD_PATH=$download_path
227
        # shellcheck disable=SC2031
228
        export ASDF_CONCURRENCY=$concurrency
229
        mkdir "$install_path"
230
        asdf_run_hook "pre_asdf_install_${plugin_name}" "$full_version"
231
        "${plugin_path}"/bin/install
232
      )
233
    fi
234

235
    local install_exit_code=$?
236
    if [ $install_exit_code -eq 0 ] && [ $download_exit_code -eq 0 ]; then
237
      # Remove download directory if --keep-download flag or always_keep_download config setting are not set
238
      always_keep_download=$(get_asdf_config_value "always_keep_download")
239
      if [ ! "$keep_download" = "true" ] && [ ! "$always_keep_download" = "yes" ]; then
240
        if [ -d "$download_path" ]; then
241
          rm -r "$download_path"
242
        else
243
          printf '%s\n' "asdf: Warn: You have configured asdf to preserve downloaded files (with always_keep_download=yes or --keep-download). But" >&2
244
          printf '%s\n' "asdf: Warn: the current plugin ($plugin_name) does not support that. Downloaded files will not be preserved." >&2
245
        fi
246
      fi
247

248
      reshim_command "$plugin_name" "$full_version"
249

250
      asdf_run_hook "post_asdf_install_${plugin_name}" "$full_version"
251
    else
252
      handle_failure "$install_path"
253
    fi
254
  fi
255
}
256

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.