diff options
Diffstat (limited to 'pkgs/build-support/fetchzip')
-rw-r--r-- | pkgs/build-support/fetchzip/default.nix | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/pkgs/build-support/fetchzip/default.nix b/pkgs/build-support/fetchzip/default.nix new file mode 100644 index 00000000000..6b77b6474ef --- /dev/null +++ b/pkgs/build-support/fetchzip/default.nix @@ -0,0 +1,42 @@ +# This function downloads and unpacks a zip file. This is primarily +# useful for dynamically generated zip files, 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 +, ... } @ args: + +fetchurl (args // { + # Apply a suffix to the name. Otherwise, unpackPhase will get + # confused by the .zip extension. + nameSuffix = "-unpacked"; + + recursiveHash = true; + + downloadToTemp = true; + + postFetch = + '' + export PATH=${unzip}/bin:$PATH + mkdir $out + cd $out + renamed="$TMPDIR/''${name%-unpacked}" + 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" + ''; +}) |