about summary refs log tree commit diff
path: root/nixpkgs/pkgs/applications/networking/cluster/terraform-providers/update-all
blob: 70dfc2f825dd8674a951afd36a0c475f0e22eced (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p bash coreutils jq nix gitAndTools.hub
# vim: ft=sh sw=2 et
# shellcheck shell=bash
#
# This scripts scans the github terraform-providers repo for new releases,
# generates the corresponding nix code and finally generates an index of
# all the providers given in ./providers.txt.
set -euo pipefail

# the maximum number of attempts before giving up inside of GET and prefetch_github
readonly maxAttempts=30

get_tf_providers_org() {
  # returns all terraform providers in a given organization, and their the
  # latest tags, in the format
  # $org/$repo $rev
  local org=$1
  hub api --paginate graphql -f query="
    query(\$endCursor: String) {
      repositoryOwner(login: \"${org}\") {
        repositories(first: 100, after: \$endCursor) {
          nodes {
            nameWithOwner
            name
            refs(first: 1, refPrefix: \"refs/tags/\", orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
              nodes {
                name
              }
            }
          }
          pageInfo {
            hasNextPage
            endCursor
          }
        }
      }
  }" | \
  jq -r '.data.repositoryOwner.repositories.nodes[] | select(.name | startswith("terraform-provider-")) | select((.refs.nodes | length) > 0) | .nameWithOwner + " " + .refs.nodes[0].name'
  # filter the result with jq:
  # - repos need to start with `teraform-provider-`
  # - they need to have at least one tag
  # for each of the remaining repos, assemble a string $org/$repo $rev
}

get_latest_repo_tag() {
  # of a given repo and owner, retrieve the latest tag
  local owner=$1
  local repo=$2
  hub api --paginate "https://api.github.com/repos/$owner/$repo/git/refs/tags" | \
    jq -r '.[].ref' | \
    grep -v 'v\.' | \
    cut -d '/' -f 3- | \
    sort --version-sort | \
    tail -1
}

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
  local retry=1
  while ! nix-prefetch-url --unpack "https://github.com/$owner/$repo/archive/$rev.tar.gz"; do
    echo "The nix-prefetch-url command has failed. Attempt $retry/${maxAttempts}" >&2
    if [[ "${retry}" -eq "${maxAttempts}" ]]; then
      exit 1
    fi
    retry=$(( retry + 1 ))
    sleep 5
  done
}

echo_entry() {
  local owner=$1
  local repo=$2
  local rev=$3
  local version=${rev#v}
  local sha256=$4
  cat <<EOF
{
  owner   = "$owner";
  repo    = "$repo";
  rev     = "$rev";
  version = "$version";
  sha256  = "$sha256";
};
EOF
}

indent() { sed 's/^/    /'; }

add_provider() {
  org="${1}"
  repo="${2}"
  rev="${3}"

  echo "*** $org/$repo $rev ***"
  name=$(echo "$repo" | cut -d - -f 3-)
  sha256=$(prefetch_github "$org" "$repo" "$rev")

  {
    echo "  $name ="
    echo_entry "$org" "$repo" "$rev" "$sha256" | indent
  } >> data.nix
}

## Main ##

cd "$(dirname "$0")"

# individual repos to fetch
slugs=(
  IBM-Cloud/terraform-provider-ibm
  ajbosco/terraform-provider-segment
  camptocamp/terraform-provider-pass
  carlpett/terraform-provider-sops
  poseidon/terraform-provider-matchbox
  spaceapegames/terraform-provider-wavefront
  tweag/terraform-provider-nixos
  tweag/terraform-provider-secret
)

# a list of providers to ignore
blacklist=(
  terraform-providers/terraform-provider-azure-classic
  terraform-providers/terraform-provider-cidr
  terraform-providers/terraform-provider-circonus
  terraform-providers/terraform-provider-cloudinit
  terraform-providers/terraform-provider-quorum
  hashicorp/terraform-provider-time
  terraform-providers/terraform-provider-vmc
)

cat <<HEADER > data.nix
# Generated with ./update-all
{
HEADER

# assemble list of terraform providers
providers=$(get_tf_providers_org "terraform-providers")
providers=$(echo "$providers";get_tf_providers_org "hashicorp")

# add terraform-providers from slugs
for slug in "${slugs[@]}"; do
  # retrieve latest tag
  org=${slug%/*}
  repo=${slug#*/}
  rev=$(get_latest_repo_tag "$org" "$repo")

  # add to list
  providers=$(echo "$providers";echo "$org/$repo $rev")
done

# filter out all providers on the blacklist
for repo in "${blacklist[@]}"; do
  providers=$(echo "$providers" | grep -v "^${repo} ")
done

# sort results alphabetically by repo name
providers=$(echo "$providers" | sort -t "/" --key=2)

# render list
IFS=$'\n'
for provider in $providers; do
  org=$(echo "$provider" | cut -d " " -f 1 | cut -d "/" -f1)
  repo=$(echo "$provider" | cut -d " " -f 1 | cut -d "/" -f2)
  rev=$(echo "$provider" | cut -d " " -f 2)
  add_provider "${org}" "${repo}" "${rev}"
done

cat <<FOOTER >> data.nix
}
FOOTER

echo Done.