nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
fork

Configure Feed

Select the types of activity you want to include in your feed.

at devShellTools-shell 178 lines 4.3 kB view raw
1#!/usr/bin/env nix-shell 2#! nix-shell -i bash -p coreutils curl git jq moreutils nix nurl 3# shellcheck shell=bash 4# vim: ft=sh 5# 6# Update a terraform provider to the latest version advertised at the 7# provider source address. 8# 9set -euo pipefail 10shopt -s inherit_errexit 11set -x 12 13show_usage() { 14 cat <<DOC 15Usage: ./update-provider [--force] [--no-build] [<owner>/]<provider> 16 17Update a single provider in the providers.json inventory file. 18 19For example to update 'terraform-providers.aws' run: 20 21 ./update-provider aws 22 23If the provider is not in the list already, use the form '<owner>/<provider>' 24to add the provider to the list: 25 26 ./update-provider hetznercloud/hcloud 27 28Options: 29 30 * --force: Force the update even if the version matches. 31 * --no-build: Don't build provider 32DOC 33} 34 35build=1 36force= 37provider= 38spdx=1 39 40while [[ $# -gt 0 ]]; do 41 case "$1" in 42 -h | --help) 43 show_usage 44 exit 45 ;; 46 --force) 47 force=1 48 shift 49 ;; 50 --no-build) 51 build=0 52 shift 53 ;; 54 --no-spdx) 55 spdx=0 56 shift 57 ;; 58 *) 59 if [[ -n ${provider} ]]; then 60 echo "ERROR: provider name was passed two times: '${provider}' and '$1'" 61 echo "Use --help for more info" 62 exit 1 63 fi 64 provider=$1 65 shift 66 ;; 67 esac 68done 69 70if [[ -z ${provider} ]]; then 71 echo "ERROR: No providers specified!" 72 echo 73 show_usage 74 exit 1 75fi 76 77# Usage: read_attr <key> 78read_attr() { 79 jq -r ".\"${provider}\".\"$1\"" providers.json 80} 81 82# Usage: update_attr <key> <value> 83update_attr() { 84 if [[ $2 == "null" ]]; then 85 jq -S ".\"${provider}\".\"$1\" = null" providers.json | sponge providers.json 86 else 87 jq -S ".\"${provider}\".\"$1\" = \"$2\"" providers.json | sponge providers.json 88 fi 89} 90 91repo_root=$(git rev-parse --show-toplevel) 92 93generate_hash() { 94 nurl --expr "(import ${repo_root} {}).terraform-providers.${provider}.$1" 95} 96 97echo_provider() { 98 echo "== terraform-providers.${provider}: $* ==" 99} 100 101is_stable_version() { 102 [[ $1 =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]] 103} 104 105pushd "$(dirname "$0")" >/dev/null 106 107if [[ ${provider} =~ ^[^/]+/[^/]+$ ]]; then 108 homepage="https://registry.terraform.io/providers/${provider}" 109 provider=$(basename "${provider}") 110 echo_provider "init" 111 update_attr homepage "${homepage}" 112 # create empty stings so nix-prefetch works 113 update_attr hash "" 114 update_attr vendorHash "" 115 update_attr spdx "" 116fi 117 118homepage="$(read_attr homepage)" 119 120old_rev="$(read_attr rev)" 121registry_response_unstable=$(curl -s "${homepage//providers/v1/providers}") 122 123if is_stable_version "${old_rev}"; then 124 version_stable=$(jq -r '.versions | map(select(test("^[0-9]+\\.[0-9]+\\.[0-9]+$"))) | last' <<<${registry_response_unstable}) 125 registry_response_stable=$(curl -s "${homepage//providers/v1/providers}/${version_stable}") 126 rev="$(jq -r '.tag' <<<${registry_response_stable})" 127 registry_response=$registry_response_stable 128else 129 rev="$(jq -r '.tag' <<<${registry_response_unstable})" 130 registry_response=$registry_response_unstable 131fi 132 133if [[ ${force} != 1 ]]; then 134 if [[ ${old_rev} == "${rev}" ]]; then 135 echo_provider "already at version ${rev}" 136 exit 137 fi 138 if [[ ${rev//v/} =~ [[:alpha:]] ]]; then 139 echo_provider "not updating to unstable version ${rev}" 140 exit 141 fi 142fi 143echo_provider "updating from ${old_rev} to ${rev}" 144update_attr rev "${rev}" 145 146provider_source_url="$(jq -r '.source' <<<"${registry_response}")" 147 148org="$(echo "${provider_source_url}" | cut -d '/' -f 4)" 149update_attr owner "${org}" 150repo="$(echo "${provider_source_url}" | cut -d '/' -f 5)" 151update_attr repo "${repo}" 152 153if [[ ${spdx} == 1 ]]; then 154 old_spdx="$(read_attr spdx)" 155 if [[ ${old_spdx} != null ]]; then 156 spdx="$(curl -L -s ${GITHUB_TOKEN:+-u ":${GITHUB_TOKEN}"} "https://api.github.com/repos/${org}/${repo}/license" | jq -r '.license.spdx_id')" 157 update_attr spdx "${spdx}" 158 fi 159fi 160 161echo_provider "calculating hash" 162hash=$(generate_hash src) 163update_attr hash "${hash}" 164 165old_vendor_hash="$(read_attr vendorHash)" 166if [[ ${old_vendor_hash} != null ]]; then 167 echo_provider "calculating vendorHash" 168 vendorHash=$(generate_hash goModules) 169 update_attr vendorHash "${vendorHash}" 170fi 171 172# Check that the provider builds 173if [[ ${build} == 1 ]]; then 174 echo_provider "building" 175 nix-build --no-out-link "${repo_root}" -A "terraform-providers.${provider}" 176fi 177 178popd >/dev/null