#!/usr/bin/env bash # This file is a copy of the # https://github.com/exercism/configlet/blob/main/scripts/fetch-configlet file. # Please submit bugfixes/improvements to the above file to ensure that all tracks benefit from the changes. set -eo pipefail curlopts=( --silent --show-error --fail --location --retry 3 ) if [[ -n "${GITHUB_TOKEN}" ]]; then curlopts+=(--header "authorization: Bearer ${GITHUB_TOKEN}") fi get_download_url() { local os="$1" local ext="$2" local latest='https://api.github.com/repos/exercism/configlet/releases/latest' local arch case "$(uname -m)" in x86_64) arch='x86-64' ;; *686*) arch='i386' ;; *386*) arch='i386' ;; *) arch='x86-64' ;; esac local suffix="${os}_${arch}.${ext}" curl "${curlopts[@]}" --header 'Accept: application/vnd.github.v3+json' "${latest}" | grep "\"browser_download_url\": \".*/download/.*/configlet.*${suffix}\"$" | cut -d'"' -f4 } main() { local output_dir if [[ -d ./bin ]]; then output_dir="./bin" elif [[ $PWD == */bin ]]; then output_dir="$PWD" else echo "Error: no ./bin directory found. This script should be ran from a repo root." >&2 return 1 fi local os case "$(uname)" in Darwin*) os='macos' ;; Linux*) os='linux' ;; Windows*) os='windows' ;; MINGW*) os='windows' ;; MSYS_NT-*) os='windows' ;; *) os='linux' ;; esac local ext case "${os}" in windows*) ext='zip' ;; *) ext='tar.gz' ;; esac echo "Fetching configlet..." >&2 local download_url download_url="$(get_download_url "${os}" "${ext}")" local output_path="${output_dir}/latest-configlet.${ext}" curl "${curlopts[@]}" --output "${output_path}" "${download_url}" case "${ext}" in *zip) unzip "${output_path}" -d "${output_dir}" ;; *) tar xzf "${output_path}" -C "${output_dir}" ;; esac rm -f "${output_path}" local executable_ext case "${os}" in windows*) executable_ext='.exe' ;; *) executable_ext='' ;; esac local configlet_path="${output_dir}/configlet${executable_ext}" local configlet_version configlet_version="$(${configlet_path} --version)" echo "Downloaded configlet ${configlet_version} to ${configlet_path}" } main