ffb456ae61
musl and darwin support UTF-8 locales without any extras. As a result unzip can unpack UTF-8 filenames there as is. But on glibc without locale archive presence files get mangled as: deps/αβ -> deps/#U03b1#U03b2 This makes `fetchzip` fixed-output derivations unstable. Tested this change to fail in `coq.src` which was generated in system that mangles UTF-8 symbols: $ nix build -f. coq.src --rebuild -L source> trying https://github.com/coq/coq/archive/V8.15.2.zip source> % Total % Received % Xferd Average Speed Time Time Time Current source> Dload Upload Total Spent Left Speed source> 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 source> 100 8945k 100 8945k 0 0 1513k 0 0:00:05 0:00:05 --:--:-- 1989k source> unpacking source archive /build/V8.15.2.zip error: hash mismatch in fixed-output derivation '/nix/store/hrnyykm7wgw8vxisgq7hc2bg5gr0y6s8-source.drv': specified: sha256-h81nFqkuvZkMR7YLHy7laTq5yOhjMW+w6rYzncxvyD4= got: sha256-DTspmwyD3Evl1CUmvUy2MonbLGUezvsHN3prmP9eK2I= Note: it means that some of existing caches for fixed output derivations become incorrect. It should not break already cached tarballs on cache.nixos.org thus the impact should not be widespread.
80 lines
2.3 KiB
Nix
80 lines
2.3 KiB
Nix
# 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, glibcLocalesUtf8 }:
|
|
|
|
{ # Optionally move the contents of the unpacked tree up one level.
|
|
stripRoot ? true
|
|
, url ? ""
|
|
, urls ? []
|
|
, extraPostFetch ? ""
|
|
, postFetch ? ""
|
|
, name ? "source"
|
|
, nativeBuildInputs ? [ ]
|
|
, # Allows to set the extension for the intermediate downloaded
|
|
# file. This can be used as a hint for the unpackCmdHooks to select
|
|
# an appropriate unpacking tool.
|
|
extension ? null
|
|
, ... } @ args:
|
|
|
|
|
|
lib.warnIf (extraPostFetch != "") "use 'postFetch' instead of 'extraPostFetch' with 'fetchzip' and 'fetchFromGitHub'."
|
|
(fetchurl (let
|
|
tmpFilename =
|
|
if extension != null
|
|
then "download.${extension}"
|
|
else baseNameOf (if url != "" then url else builtins.head urls);
|
|
in {
|
|
inherit name;
|
|
|
|
recursiveHash = true;
|
|
|
|
downloadToTemp = true;
|
|
|
|
# Have to pull in glibcLocalesUtf8 for unzip in setup-hook.sh to handle
|
|
# UTF-8 aware locale:
|
|
# https://github.com/NixOS/nixpkgs/issues/176225#issuecomment-1146617263
|
|
nativeBuildInputs = [ unzip glibcLocalesUtf8 ] ++ nativeBuildInputs;
|
|
|
|
postFetch =
|
|
''
|
|
unpackDir="$TMPDIR/unpack"
|
|
mkdir "$unpackDir"
|
|
cd "$unpackDir"
|
|
|
|
renamed="$TMPDIR/${tmpFilename}"
|
|
mv "$downloadedFile" "$renamed"
|
|
unpackFile "$renamed"
|
|
chmod -R +w "$unpackDir"
|
|
''
|
|
+ (if stripRoot then ''
|
|
if [ $(ls "$unpackDir" | wc -l) != 1 ]; then
|
|
echo "error: zip file must contain a single file or directory."
|
|
echo "hint: Pass stripRoot=false; to fetchzip to assume flat list of files."
|
|
exit 1
|
|
fi
|
|
fn=$(cd "$unpackDir" && echo *)
|
|
if [ -f "$unpackDir/$fn" ]; then
|
|
mkdir $out
|
|
fi
|
|
mv "$unpackDir/$fn" "$out"
|
|
'' else ''
|
|
mv "$unpackDir" "$out"
|
|
'')
|
|
+ ''
|
|
${postFetch}
|
|
'' + ''
|
|
${extraPostFetch}
|
|
''
|
|
|
|
# Remove non-owner write permissions
|
|
# Fixes https://github.com/NixOS/nixpkgs/issues/38649
|
|
+ ''
|
|
chmod 755 "$out"
|
|
'';
|
|
} // removeAttrs args [ "stripRoot" "extraPostFetch" "postFetch" "extension" "nativeBuildInputs" ]))
|