about summary refs log tree commit diff
path: root/pkgs/by-name/az/azure-cli/query-extension-index.sh
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/az/azure-cli/query-extension-index.sh')
-rwxr-xr-xpkgs/by-name/az/azure-cli/query-extension-index.sh163
1 files changed, 163 insertions, 0 deletions
diff --git a/pkgs/by-name/az/azure-cli/query-extension-index.sh b/pkgs/by-name/az/azure-cli/query-extension-index.sh
new file mode 100755
index 0000000000000..8dbd45ce937e6
--- /dev/null
+++ b/pkgs/by-name/az/azure-cli/query-extension-index.sh
@@ -0,0 +1,163 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+function usage() {
+    {
+        echo "${0} - query Azure CLI extension index"
+        echo
+        echo "The Azure CLI extension index contains all versions of all extensions. This"
+        echo "script queries the index for the latest version of an extensions that is"
+        echo "compatible with the specified version of the Azure CLI. Data for that extension"
+        echo "is filtered for fields relevant to package the extension in Nix."
+        echo
+        echo "Usage:"
+        echo "  --cli-version=<version>      version of azure-cli (required)"
+        echo "  --extension=<name>           name of extension to query"
+        echo "  --file=<path>                path to extension index file"
+        echo "  --download                   download extension index file"
+        echo "  --nix                        output Nix expression"
+        echo "  --requirements=<true/false>  filter for extensions with/without requirements"
+    } >&2
+}
+
+for arg in "$@"; do
+    case "$arg" in
+        --cli-version=*)
+            cliVer="${arg#*=}"
+            shift
+            ;;
+        --extension=*)
+            extName="${arg#*=}"
+            shift
+            ;;
+        --file=*)
+            extensionFile="${arg#*=}"
+            shift
+            ;;
+        --download)
+            download=true
+            shift
+            ;;
+        --nix)
+            nix=true
+            shift
+            ;;
+        --requirements=*)
+            requirements="${arg#*=}"
+            shift
+            ;;
+        --help)
+            usage
+            exit 0
+            ;;
+        *)
+            echo "Unknown argument: $arg" >&2
+            exit 1
+            ;;
+    esac
+done
+
+if [[ -z "${cliVer:-}" ]]; then
+    echo "Missing --cli-version argument" >&2
+    exit 1
+fi
+if [[ -z "${extensionFile:-}" && -z "${download:-}" ]]; then
+    echo "Either --file or --download must be specified" >&2
+    exit 1
+fi
+if [[ -n "${extName:-}" && -n "${requirements:-}" ]]; then
+    echo "--requirements can only be used when listing all extensions" >&2
+    exit 1
+fi
+
+if [[ "${download:-}" == true ]]; then
+    extensionFile="$(mktemp)"
+    echo "Downloading extensions index to ${extensionFile}" >&2
+    curl -fsSL "https://azcliextensionsync.blob.core.windows.net/index1/index.json" > "${extensionFile}"
+fi
+
+# shellcheck disable=SC2016
+jqProgram='
+    def opt(f):
+        . as $in | try f catch $in
+        ;
+
+    def version_to_array:
+        sub("\\+.*$"; "")
+        | capture("^(?<v>[^a-z-]+)(?:(?<p>.*))?") | [.v, .p // empty]
+        | map(split(".")
+        | map(opt(tonumber)))
+        | flatten
+        ;
+
+    def version_le($contstraint):
+        version_to_array as $v
+        | $contstraint | version_to_array as $c
+        | $v[0] < $c[0] or
+          ($v[0] == $c[0] and $v[1] < $c[1]) or
+          ($v[0] == $c[0] and $v[1] == $c[1] and $v[2] < $c[2]) or
+          ($v[0] == $c[0] and $v[1] == $c[1] and $v[2] == $c[2] and $v[3] <= $c[3])
+        ;
+
+    def max_constrained_version($constraint):
+        [
+            .[] | select(.metadata."azext.minCliCoreVersion" // "0.0.0" | version_le($cliVer))
+        ]
+        | sort_by(.metadata.version | version_to_array)
+        | last
+        ;
+
+    def translate_struct:
+        {
+            pname : .metadata.name,
+            description: .metadata.summary,
+            version: .metadata.version,
+            url: .downloadUrl,
+            sha256: .sha256Digest,
+            license: .metadata.license,
+            requires: .metadata.run_requires.[0].requires
+        }
+        ;
+
+    def to_nix:
+        [.].[] as $in
+        | .version as $version
+        | .description as $description
+        | .url | sub($version;"${version}") as $url
+        | $description |rtrimstr(".") as $description
+        | $in.pname + " = mkAzExtension rec {\n" +
+        "  pname = \"" + $in.pname + "\";\n" +
+        "  version = \"" + $in.version + "\";\n" +
+        "  url = \"" + $url + "\";\n" +
+        "  sha256 = \"" + $in.sha256 + "\";\n" +
+        "  description = \"" + $description + "\";\n" +
+        "};"
+        ;
+
+    def main:
+        .extensions
+        | map(max_constrained_version($cliVer))
+        | .[]
+        | translate_struct
+        | if $extName  != "" then
+            select(.pname == $extName)
+        elif $requirements == "false" then
+            select(.requires == null)
+        elif $requirements == "true" then
+            select(.requires != null)
+        end
+        | if $nix == "true" then
+            to_nix
+        end
+        ;
+
+    main
+'
+
+jq -r \
+    --arg cliVer "${cliVer}" \
+    --arg extName "${extName:-}" \
+    --arg nix "${nix:-}" \
+    --arg requirements "${requirements:-}" \
+    "$jqProgram" "${extensionFile}"