diff --git a/src/astral.sh-uv/devcontainer-feature.json b/src/astral.sh-uv/devcontainer-feature.json index 1a1da8b..3135b58 100644 --- a/src/astral.sh-uv/devcontainer-feature.json +++ b/src/astral.sh-uv/devcontainer-feature.json @@ -1,7 +1,7 @@ { "name": "astral.sh/uv", "id": "astral.sh-uv", - "version": "1.0.1", + "version": "1.0.3", "description": "Install \"uv\" and \"uvx\" binaries", "documentationURL": "https://github.com/devcontainer-community/devcontainer-features/tree/main/src/astral.sh-uv", "options": { diff --git a/src/astral.sh-uv/install.sh b/src/astral.sh-uv/install.sh index 9b5eb09..18ed1f5 100755 --- a/src/astral.sh-uv/install.sh +++ b/src/astral.sh-uv/install.sh @@ -8,8 +8,6 @@ readonly githubRepository='astral-sh/uv' readonly binaryName='uv' readonly versionArgument='--version' readonly os="unknown-linux-musl" -readonly downloadUrlTemplate='https://github.com/${githubRepository}/releases/download/${version}/${binaryName}-${architecture}-${os}.tar.gz' -readonly downloadUrlLatestTemplate='https://github.com/${githubRepository}/releases/latest/download/${binaryName}-${architecture}-${os}.tar.gz' readonly binaryTargetFolder='/usr/local/bin' readonly name="${githubRepository##*/}" readonly AUTOCOMPLETION="${SHELLAUTOCOMPLETION:-"true"}" @@ -29,7 +27,7 @@ apt_get_cleanup() { apt-get clean rm -rf /var/lib/apt/lists/* } -check_curl_envsubst_file_untar_installed() { +check_curl_file_untar_installed() { declare -a requiredAptPackagesMissing=() if ! [ -r '/etc/ssl/certs/ca-certificates.crt' ]; then requiredAptPackagesMissing+=('ca-certificates') @@ -37,9 +35,6 @@ check_curl_envsubst_file_untar_installed() { if ! command -v curl >/dev/null 2>&1; then requiredAptPackagesMissing+=('curl') fi - if ! command -v envsubst >/dev/null 2>&1; then - requiredAptPackagesMissing+=('gettext-base') - fi if ! command -v file >/dev/null 2>&1; then requiredAptPackagesMissing+=('file') fi @@ -114,6 +109,18 @@ github_get_latest_release() { fi github_list_releases "$1" | head -n 1 } +github_get_tag_for_version() { + if [ -z "$1" ] || [ -z "$2" ]; then + echo "Usage: github_get_tag_for_version " + return 1 + fi + local repo="$1" + local version="$2" + local url="https://api.github.com/repos/$repo/releases" + local escaped_version + escaped_version="$(printf '%s' "$version" | sed 's/\./\\./g')" + curl -s "$url" | grep -Po '"tag_name": "\K.*?(?=")' | grep -E "^v?${escaped_version}$" | head -n 1 +} utils_check_version() { local version=$1 if ! [[ "${version:-}" =~ ^(latest|[0-9]+\.[0-9]+\.[0-9]+)$ ]]; then @@ -130,22 +137,26 @@ enable_autocompletion() { } install() { utils_check_version "$VERSION" - check_curl_envsubst_file_untar_installed + check_curl_file_untar_installed readonly architecture="$(debian_get_arch)" - readonly binaryTargetPathTemplate='${binaryTargetFolder}/${binaryName}' if [ "$VERSION" == 'latest' ] || [ -z "$VERSION" ]; then # Avoid GitHub API rate limits by using the latest/download URL - readonly downloadUrl="$(echo -n "$downloadUrlLatestTemplate" | envsubst)" + readonly downloadUrl="https://github.com/${githubRepository}/releases/latest/download/${binaryName}-${architecture}-${os}.tar.gz" else readonly version="${VERSION:?}" - readonly downloadUrl="$(echo -n "$downloadUrlTemplate" | envsubst)" + readonly releaseTag="$(github_get_tag_for_version "$githubRepository" "$version")" + if [ -z "$releaseTag" ]; then + printf >&2 '=== [ERROR] Could not find release tag for version "%s" in "%s"!\n' "$version" "$githubRepository" + exit 1 + fi + readonly downloadUrl="https://github.com/${githubRepository}/releases/download/${releaseTag}/${binaryName}-${architecture}-${os}.tar.gz" fi curl_check_url "$downloadUrl" # The archive contains files under a directory: uv-${architecture}-${os}/ readonly uvPathInArchive="uv-${architecture}-${os}/$binaryName" readonly uvxPathInArchive="uv-${architecture}-${os}/uvx" readonly stripComponents="$(echo -n "$uvPathInArchive" | awk -F'/' '{print NF-1}')" - readonly binaryTargetPath="$(echo -n "$binaryTargetPathTemplate" | envsubst)" + readonly binaryTargetPath="${binaryTargetFolder}/${binaryName}" readonly uvxTargetPath="${binaryTargetFolder}/uvx" # Extract uv and uvx in a single download/untar curl_download_untar "$downloadUrl" "$stripComponents" "$binaryTargetFolder" "$uvPathInArchive" "$uvxPathInArchive" diff --git a/src/atuin.sh/devcontainer-feature.json b/src/atuin.sh/devcontainer-feature.json index 037dd12..2d9b055 100644 --- a/src/atuin.sh/devcontainer-feature.json +++ b/src/atuin.sh/devcontainer-feature.json @@ -1,7 +1,7 @@ { "name": "atuin.sh", "id": "atuin.sh", - "version": "1.0.1", + "version": "1.0.2", "description": "Install \"atuin\" binary", "documentationURL": "https://github.com/devcontainer-community/devcontainer-features/tree/main/src/atuin.sh", "options": { diff --git a/src/atuin.sh/install.sh b/src/atuin.sh/install.sh index 145accc..a15b164 100755 --- a/src/atuin.sh/install.sh +++ b/src/atuin.sh/install.sh @@ -7,8 +7,6 @@ set -o allexport readonly githubRepository='atuinsh/atuin' readonly binaryName='atuin' readonly versionArgument='--version' -readonly downloadUrlTemplate='https://github.com/${githubRepository}/releases/download/${releaseTag}/${name}-${architecture}-unknown-linux-gnu.tar.gz' -readonly binaryPathInArchiveTemplate='${name}-${architecture}-unknown-linux-gnu/${binaryName}' readonly binaryTargetFolder='/usr/local/bin' readonly name="${githubRepository##*/}" apt_get_cleanup() { @@ -27,7 +25,7 @@ apt_get_checkinstall() { DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends --no-install-suggests --option 'Debug::pkgProblemResolver=true' --option 'Debug::pkgAcquire::Worker=1' "$@" fi } -check_curl_envsubst_file_tar_installed() { +check_curl_file_tar_installed() { declare -a requiredAptPackagesMissing=() if ! [ -r '/etc/ssl/certs/ca-certificates.crt' ]; then requiredAptPackagesMissing+=('ca-certificates') @@ -35,9 +33,6 @@ check_curl_envsubst_file_tar_installed() { if ! command -v curl >/dev/null 2>&1; then requiredAptPackagesMissing+=('curl') fi - if ! command -v envsubst >/dev/null 2>&1; then - requiredAptPackagesMissing+=('gettext-base') - fi if ! command -v file >/dev/null 2>&1; then requiredAptPackagesMissing+=('file') fi @@ -135,9 +130,8 @@ utils_check_version() { } install() { utils_check_version "$VERSION" - check_curl_envsubst_file_tar_installed + check_curl_file_tar_installed readonly architecture="$(debian_get_target_arch)" - readonly binaryTargetPathTemplate='${binaryTargetFolder}/${binaryName}' if [ "$VERSION" == 'latest' ] || [ -z "$VERSION" ]; then VERSION=$(github_get_latest_release "$githubRepository") fi @@ -147,11 +141,11 @@ install() { printf >&2 '=== [ERROR] Could not find release tag for version "%s" in "%s"!\n' "$version" "$githubRepository" exit 1 fi - readonly downloadUrl="$(echo -n "$downloadUrlTemplate" | envsubst)" + readonly downloadUrl="https://github.com/${githubRepository}/releases/download/${releaseTag}/${name}-${architecture}-unknown-linux-gnu.tar.gz" curl_check_url "$downloadUrl" - readonly binaryPathInArchive="$(echo -n "$binaryPathInArchiveTemplate" | envsubst)" + readonly binaryPathInArchive="${name}-${architecture}-unknown-linux-gnu/${binaryName}" readonly stripComponents="$(echo -n "$binaryPathInArchive" | awk -F'/' '{print NF-1}')" - readonly binaryTargetPath="$(echo -n "$binaryTargetPathTemplate" | envsubst)" + readonly binaryTargetPath="${binaryTargetFolder}/${binaryName}" curl_download_untar "$downloadUrl" "$stripComponents" "$binaryTargetFolder" "$binaryPathInArchive" chmod 755 "$binaryTargetPath" apt_get_cleanup diff --git a/src/btop/devcontainer-feature.json b/src/btop/devcontainer-feature.json index 6dfd3e3..15c63a2 100644 --- a/src/btop/devcontainer-feature.json +++ b/src/btop/devcontainer-feature.json @@ -1,7 +1,7 @@ { "name": "btop", "id": "btop", - "version": "1.0.1", + "version": "1.0.2", "description": "Install \"btop\" binary", "documentationURL": "https://github.com/devcontainer-community/devcontainer-features/tree/main/src/btop", "options": { diff --git a/src/btop/install.sh b/src/btop/install.sh index 57930e7..b637a4b 100755 --- a/src/btop/install.sh +++ b/src/btop/install.sh @@ -7,8 +7,6 @@ set -o allexport readonly githubRepository='aristocratos/btop' readonly binaryName='btop' readonly versionArgument='--version' -readonly downloadUrlTemplate='https://github.com/${githubRepository}/releases/download/${releaseTag}/${name}-${architecture}-linux-musl.tbz' -readonly binaryPathInArchiveTemplate='./btop/bin/${binaryName}' readonly binaryTargetFolder='/usr/local/bin' readonly name="${githubRepository##*/}" apt_get_update() { @@ -27,7 +25,7 @@ apt_get_cleanup() { apt-get clean rm -rf /var/lib/apt/lists/* } -check_curl_envsubst_file_tar_installed() { +check_curl_file_tar_installed() { declare -a requiredAptPackagesMissing=() if ! [ -r '/etc/ssl/certs/ca-certificates.crt' ]; then requiredAptPackagesMissing+=('ca-certificates') @@ -35,9 +33,6 @@ check_curl_envsubst_file_tar_installed() { if ! command -v curl >/dev/null 2>&1; then requiredAptPackagesMissing+=('curl') fi - if ! command -v envsubst >/dev/null 2>&1; then - requiredAptPackagesMissing+=('gettext-base') - fi if ! command -v file >/dev/null 2>&1; then requiredAptPackagesMissing+=('file') fi @@ -135,10 +130,9 @@ utils_check_version() { } install() { utils_check_version "$VERSION" - check_curl_envsubst_file_tar_installed + check_curl_file_tar_installed apt_get_checkinstall bzip2 readonly architecture="$(debian_get_target_arch)" - readonly binaryTargetPathTemplate='${binaryTargetFolder}/${binaryName}' if [ "$VERSION" == 'latest' ] || [ -z "$VERSION" ]; then VERSION=$(github_get_latest_release "$githubRepository") fi @@ -148,11 +142,11 @@ install() { printf >&2 '=== [ERROR] Could not find release tag for version "%s" in "%s"!\n' "$version" "$githubRepository" exit 1 fi - readonly downloadUrl="$(echo -n "$downloadUrlTemplate" | envsubst)" + readonly downloadUrl="https://github.com/${githubRepository}/releases/download/${releaseTag}/${name}-${architecture}-unknown-linux-musl.tbz" curl_check_url "$downloadUrl" - readonly binaryPathInArchive="$(echo -n "$binaryPathInArchiveTemplate" | envsubst)" + readonly binaryPathInArchive="./btop/bin/${binaryName}" readonly stripComponents="$(echo -n "$binaryPathInArchive" | awk -F'/' '{print NF-1}')" - readonly binaryTargetPath="$(echo -n "$binaryTargetPathTemplate" | envsubst)" + readonly binaryTargetPath="${binaryTargetFolder}/${binaryName}" curl_download_untarj "$downloadUrl" "$stripComponents" "$binaryTargetFolder" "$binaryPathInArchive" chmod 755 "$binaryTargetPath" apt_get_cleanup diff --git a/src/opencode.ai/devcontainer-feature.json b/src/opencode.ai/devcontainer-feature.json index 60d7804..90d517c 100644 --- a/src/opencode.ai/devcontainer-feature.json +++ b/src/opencode.ai/devcontainer-feature.json @@ -1,7 +1,7 @@ { "name": "opencode.ai", "id": "opencode.ai", - "version": "1.0.2", + "version": "1.0.3", "description": "Install \"opencode\" binary", "documentationURL": "https://github.com/devcontainer-community/devcontainer-features/tree/main/src/opencode.ai", "options": { diff --git a/src/opencode.ai/install.sh b/src/opencode.ai/install.sh index e5f3810..0b032bb 100755 --- a/src/opencode.ai/install.sh +++ b/src/opencode.ai/install.sh @@ -7,7 +7,6 @@ set -o allexport readonly githubRepository='anomalyco/opencode' readonly binaryName='opencode' readonly versionArgument='--version' -readonly downloadUrlTemplate='https://github.com/${githubRepository}/releases/download/${releaseTag}/${name}-linux-${architecture}.tar.gz' readonly binaryTargetFolder='/usr/local/bin' readonly name="${githubRepository##*/}" apt_get_update() { @@ -26,7 +25,7 @@ apt_get_cleanup() { apt-get clean rm -rf /var/lib/apt/lists/* } -check_curl_envsubst_file_unzip_installed() { +check_curl_file_unzip_installed() { declare -a requiredAptPackagesMissing=() if ! [ -r '/etc/ssl/certs/ca-certificates.crt' ]; then requiredAptPackagesMissing+=('ca-certificates') @@ -34,9 +33,6 @@ check_curl_envsubst_file_unzip_installed() { if ! command -v curl >/dev/null 2>&1; then requiredAptPackagesMissing+=('curl') fi - if ! command -v envsubst >/dev/null 2>&1; then - requiredAptPackagesMissing+=('gettext-base') - fi if ! command -v file >/dev/null 2>&1; then requiredAptPackagesMissing+=('file') fi @@ -128,9 +124,8 @@ utils_check_version() { } install() { utils_check_version "$VERSION" - check_curl_envsubst_file_unzip_installed + check_curl_file_unzip_installed readonly architecture="$(debian_get_arch)" - readonly binaryTargetPathTemplate='${binaryTargetFolder}/${binaryName}' if [ "$VERSION" == 'latest' ] || [ -z "$VERSION" ]; then VERSION=$(github_get_latest_release "$githubRepository") fi @@ -140,9 +135,9 @@ install() { printf >&2 '=== [ERROR] Could not find release tag for version "%s" in "%s"!\n' "$version" "$githubRepository" exit 1 fi - readonly downloadUrl="$(echo -n "$downloadUrlTemplate" | envsubst)" + readonly downloadUrl="https://github.com/${githubRepository}/releases/download/${releaseTag}/${name}-linux-${architecture}.tar.gz" curl_check_url "$downloadUrl" - readonly binaryTargetPath="$(echo -n "$binaryTargetPathTemplate" | envsubst)" + readonly binaryTargetPath="${binaryTargetFolder}/${binaryName}" curl_download_tarball "$downloadUrl" "$binaryTargetFolder" chmod 755 "$binaryTargetPath" }