about summary refs log tree commit diff
path: root/pkgs/build-support/fetchzip/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/build-support/fetchzip/default.nix')
-rw-r--r--pkgs/build-support/fetchzip/default.nix44
1 files changed, 44 insertions, 0 deletions
diff --git a/pkgs/build-support/fetchzip/default.nix b/pkgs/build-support/fetchzip/default.nix
new file mode 100644
index 000000000000..7c6e16a05892
--- /dev/null
+++ b/pkgs/build-support/fetchzip/default.nix
@@ -0,0 +1,44 @@
+# This function downloads and unpacks an archive file, such as a zip
+# or tar file. This is primarily useful for dynamically generated
+# archives, such as GitHub's /archive URLs, where the unpacked content
+# of the zip file doesn't change, but the zip file itself may
+# (e.g. due to minor changes in the compression algorithm, or changes
+# in timestamps).
+
+{ lib, fetchurl, unzip }:
+
+{ # Optionally move the contents of the unpacked tree up one level.
+  stripRoot ? true
+, url
+, ... } @ args:
+
+fetchurl ({
+  # Remove the extension, because otherwise unpackPhase will get
+  # confused. FIXME: fix unpackPhase.
+  name = args.name or lib.removeSuffix ".zip" (lib.removeSuffix ".tar.gz" (baseNameOf url));
+
+  recursiveHash = true;
+
+  downloadToTemp = true;
+
+  postFetch =
+    ''
+      export PATH=${unzip}/bin:$PATH
+      mkdir $out
+      cd $out
+      renamed="$TMPDIR/${baseNameOf url}"
+      mv "$downloadedFile" "$renamed"
+      unpackFile "$renamed"
+    ''
+    # FIXME: handle zip files that contain a single regular file.
+    + lib.optionalString stripRoot ''
+      shopt -s dotglob
+      if [ "$(ls -d $out/* | wc -l)" != 1 ]; then
+        echo "error: zip file must contain a single directory."
+        exit 1
+      fi
+      fn=$(cd "$out" && echo *)
+      mv $out/$fn/* "$out/"
+      rmdir "$out/$fn"
+    '';
+} // args)