78 lines
2.1 KiB
Plaintext
78 lines
2.1 KiB
Plaintext
|
#!/usr/bin/env nix-shell
|
||
|
#! nix-shell -i bash -p coreutils curl jq
|
||
|
# shellcheck shell=bash
|
||
|
#
|
||
|
# Update a terraform provider to the latest version advertised at
|
||
|
# the provider source address.
|
||
|
set -euo pipefail
|
||
|
|
||
|
USAGE=$(cat<<DOC
|
||
|
Specify the terraform provider name to update.
|
||
|
|
||
|
Example:
|
||
|
To update nixpkgs.terraform-providers.aws run:
|
||
|
./update-provider aws
|
||
|
DOC
|
||
|
)
|
||
|
|
||
|
provider_name="${1:-}"
|
||
|
if [ -z "$provider_name" ]; then
|
||
|
echo "No providers specified!"
|
||
|
echo
|
||
|
echo "$USAGE"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
provider_source_address="$(jq -r ".$provider_name.\"provider-source-address\"" providers.json)"
|
||
|
|
||
|
if [ "$provider_source_address" == "null" ]; then
|
||
|
echo "No provider source address specified with provider: $provider_name"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# The provider source address (used inside Terraform `required_providers` block) is
|
||
|
# used to compute the registry API endpoint
|
||
|
#
|
||
|
# registry.terraform.io/hashicorp/aws (provider source address)
|
||
|
# registry.terraform.io/providers/hashicorp/aws (provider URL for the website)
|
||
|
# registry.terraform.io/v1/providers/hashicorp/aws (provider URL for the JSON API)
|
||
|
registry_response=$(curl -s https://"${provider_source_address/\///v1/providers/}")
|
||
|
|
||
|
prefetch_github() {
|
||
|
# of a given owner, repo and rev, fetch the tarball and return the output of
|
||
|
# `nix-prefetch-url`
|
||
|
local owner=$1
|
||
|
local repo=$2
|
||
|
local rev=$3
|
||
|
nix-prefetch-url --unpack "https://github.com/$owner/$repo/archive/$rev.tar.gz"
|
||
|
}
|
||
|
|
||
|
provider_source_url="$(jq -r '.source' <<< "$registry_response")"
|
||
|
|
||
|
org="$(echo "$provider_source_url" | cut -d '/' -f 4)"
|
||
|
repo="$(echo "$provider_source_url" | cut -d '/' -f 5)"
|
||
|
rev="$(jq -r '.tag' <<< "$registry_response")"
|
||
|
|
||
|
sha256=$(prefetch_github "$org" "$repo" "$rev")
|
||
|
|
||
|
version="$(jq -r '.version' <<< "$registry_response")"
|
||
|
|
||
|
updated_provider="$(mktemp)"
|
||
|
cat <<EOF >> "$updated_provider"
|
||
|
{
|
||
|
"$provider_name": {
|
||
|
"owner": "$org",
|
||
|
"repo": "$repo",
|
||
|
"rev": "$rev",
|
||
|
"sha256": "$sha256",
|
||
|
"version": "$version",
|
||
|
"provider-source-address": "$provider_source_address"
|
||
|
}
|
||
|
}
|
||
|
EOF
|
||
|
|
||
|
original_provider_list="$(mktemp)"
|
||
|
cat providers.json > "$original_provider_list"
|
||
|
|
||
|
jq --sort-keys --slurp '.[0] * .[1]' "$original_provider_list" "$updated_provider" > providers.json
|