fork
Configure Feed
Select the types of activity you want to include in your feed.
nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
fork
Configure Feed
Select the types of activity you want to include in your feed.
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