about summary refs log tree commit diff
path: root/pkgs/development/tools/gauge/plugins/make-gauge-plugin.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/tools/gauge/plugins/make-gauge-plugin.nix')
-rw-r--r--pkgs/development/tools/gauge/plugins/make-gauge-plugin.nix94
1 files changed, 94 insertions, 0 deletions
diff --git a/pkgs/development/tools/gauge/plugins/make-gauge-plugin.nix b/pkgs/development/tools/gauge/plugins/make-gauge-plugin.nix
new file mode 100644
index 0000000000000..116effa45b14f
--- /dev/null
+++ b/pkgs/development/tools/gauge/plugins/make-gauge-plugin.nix
@@ -0,0 +1,94 @@
+{ stdenvNoCC
+, fetchzip
+, lib
+, writeScript
+}:
+
+{ pname
+, data
+, repo
+, releasePrefix
+, isCrossArch ? false
+, meta
+, ...
+} @ args:
+let
+  otherArgs = lib.attrsets.removeAttrs args [ "pname" "data" "repo" "releasePrefix" "isMultiArch" ];
+  inherit (stdenvNoCC.hostPlatform) system;
+  inherit (if isCrossArch then data else data.${system}) url hash;
+  # Upstream uses a different naming scheme for platforms
+  systemMap = {
+    "x86_64-darwin" = "darwin.x86_64";
+    "aarch64-darwin" = "darwin.arm64";
+    "aarch64-linux" = "linux.arm64";
+    "x86_64-linux" = "linux.x86_64";
+  };
+in
+stdenvNoCC.mkDerivation (finalAttrs: (lib.recursiveUpdate {
+  pname = "gauge-plugin-${pname}";
+  inherit (data) version;
+
+  src = fetchzip {
+    inherit url hash;
+    stripRoot = false;
+  };
+
+  installPhase = ''
+    mkdir -p "$out/share/gauge-plugins/${pname}/${finalAttrs.version}"
+    cp -r . "$out/share/gauge-plugins/${pname}/${finalAttrs.version}"
+  '';
+
+  passthru.updateScript = writeScript "update-${finalAttrs.pname}" ''
+    #!/usr/bin/env nix-shell
+    #!nix-shell -i bash -p curl nix-prefetch yq-go
+
+    set -e
+
+    dirname="pkgs/development/tools/gauge/plugins/${pname}"
+
+    currentVersion=$(nix eval --raw -f default.nix gaugePlugins.${pname}.version)
+
+    latestTag=$(curl -s ''${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} https://api.github.com/repos/${repo}/releases/latest | yq ".tag_name")
+    latestVersion="$(expr $latestTag : 'v\(.*\)')"
+
+    tempfile=$(mktemp)
+
+    if [[ "$FORCE_UPDATE" != "true" && "$currentVersion" == "$latestVersion" ]]; then
+        echo "gauge-${pname} is up-to-date: ''${currentVersion}"
+        exit 0
+    fi
+
+    yq -iPoj "{ \"version\": \"$latestVersion\" }" "$tempfile"
+
+    updateSystem() {
+        system=$1
+        url=$2
+
+        echo "Fetching hash for $system"
+        hash=$(nix-prefetch-url --type sha256 $url --unpack)
+        sriHash="$(nix hash to-sri --type sha256 $hash)"
+
+        yq -iPoj '. + { "$system": { "url": "$url", "hash": "$sriHash" } }' "$tempfile"
+    }
+
+    updateSingle() {
+        url=$1
+
+        echo "Fetching hash"
+        hash=$(nix-prefetch-url --type sha256 $url --unpack)
+        sriHash="$(nix hash to-sri --type sha256 $hash)"
+
+        yq -iPoj '. + { "url": "$url", "hash": "$sriHash" }' "$tempfile"
+    }
+
+    baseUrl="https://github.com/${repo}/releases/download/$latestTag/${releasePrefix}$latestVersion"
+
+    ${if isCrossArch then
+        "updateSingle \${baseUrl}.zip"
+      else
+        lib.concatStringsSep "\n" (map (platform: ''updateSystem "${platform}" "''${baseUrl}-${systemMap.${platform}}.zip"'') meta.platforms)
+    }
+
+    mv "$tempfile" "$dirname/data.json"
+  '';
+} otherArgs))