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.
11 lines
462 B
Bash
11 lines
462 B
Bash
unpackCmdHooks+=(_tryUnzip)
|
|
_tryUnzip() {
|
|
if ! [[ "$curSrc" =~ \.zip$ ]]; then return 1; fi
|
|
|
|
# UTF-8 locale is needed for unzip on glibc to handle UTF-8 symbols:
|
|
# https://github.com/NixOS/nixpkgs/issues/176225#issuecomment-1146617263
|
|
# Otherwise unzip unpacks escaped file names as if '-U' options was in effect.
|
|
#
|
|
# Pick en_US.UTF-8 as most possible to be present on glibc, musl and darwin.
|
|
LANG=en_US.UTF-8 unzip -qq "$curSrc"
|
|
}
|