diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-05-08 14:57:20 +0200 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-05-08 15:30:17 +0200 |
commit | c8df88885891bdb6d1f207cf203e4b0af48d5486 (patch) | |
tree | 1578f69f8f46789733fa03c21050eae7b6091b19 /pkgs/build-support/fetchzip | |
parent | 2a43a4163a237b963bd68629735b7303e077ec94 (diff) | |
download | nixpkgs-c8df88885891bdb6d1f207cf203e4b0af48d5486.tar nixpkgs-c8df88885891bdb6d1f207cf203e4b0af48d5486.tar.gz nixpkgs-c8df88885891bdb6d1f207cf203e4b0af48d5486.tar.bz2 nixpkgs-c8df88885891bdb6d1f207cf203e4b0af48d5486.tar.lz nixpkgs-c8df88885891bdb6d1f207cf203e4b0af48d5486.tar.xz nixpkgs-c8df88885891bdb6d1f207cf203e4b0af48d5486.tar.zst nixpkgs-c8df88885891bdb6d1f207cf203e4b0af48d5486.zip |
Add a function "fetchzip"
This function downloads and unpacks a file in one fixed-output derivation. 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). Fetchzip is implemented by extending fetchurl with a "postFetch" hook that is executed after the file has been downloaded. This hook can thus perform arbitrary checks or transformations on the downloaded file.
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" + ''; +}) |