texlive: allow using pkgs.nix with empty hashes

... to enable saving space in git history.
This commit is contained in:
Vladimír Čunát 2016-09-04 18:11:18 +02:00
parent c6376a3e9a
commit 8481eca63c

View File

@ -21,7 +21,8 @@ let
# map: name -> fixed-output hash # map: name -> fixed-output hash
# sha1 in base32 was chosen as a compromise between security and length # sha1 in base32 was chosen as a compromise between security and length
# warning: the following generator command takes lots of resources # warning: the following generator command takes lots of resources
# nix-build ../../../../.. -Q -A texlive.scheme-full.pkgs | ./fixHashes.sh > ./fixedHashes.nix # nix-build ../../../../.. -Q -A texlive.scheme-full.pkgs | ./fixHashes.sh > ./fixedHashes-new.nix
# mv ./fixedHashes{-new,}.nix
fixedHashes = lib.optionalAttrs useFixedHashes (import ./fixedHashes.nix); fixedHashes = lib.optionalAttrs useFixedHashes (import ./fixedHashes.nix);
# function for creating a working environment from a set of TL packages # function for creating a working environment from a set of TL packages
@ -82,10 +83,7 @@ let
sha512 = attrs.sha512.${tlType}; sha512 = attrs.sha512.${tlType};
inherit pname tlType version; inherit pname tlType version;
}; };
in mkPkgs { in mkPkg pkg;
inherit (pkg) pname tlType version;
pkgList = [ pkg ];
};
in { in {
# TL pkg contains lists of packages: runtime files, docs, sources, binaries # TL pkg contains lists of packages: runtime files, docs, sources, binaries
pkgs = pkgs =
@ -101,50 +99,49 @@ let
++ combinePkgs (attrs.deps or {}); ++ combinePkgs (attrs.deps or {});
}; };
# the basename used by upstream (without ".tar.xz" suffix) # create a derivation that contains an unpacked upstream TL package
mkUrlName = { pname, tlType, ... }: mkPkg = { pname, tlType, version, sha512, postUnpack ? "", stripPrefix ? 1, ... }@args:
pname + lib.optionalString (tlType != "run") ".${tlType}"; let
# the basename used by upstream (without ".tar.xz" suffix)
urlName = pname + lib.optionalString (tlType != "run") ".${tlType}";
tlName = urlName + "-${version}";
fixedHash = fixedHashes.${tlName} or null; # be graceful about missing hashes
# command to unpack a single TL package url = args.url or "${urlPrefix}/${urlName}.tar.xz";
unpackPkg =
{ # url ? null, urlPrefix ? null
sha512, pname, tlType, postUnpack ? "", stripPrefix ? 1, ...
}@args: let
url = args.url or "${urlPrefix}/${mkUrlName args}.tar.xz";
urlPrefix = args.urlPrefix or urlPrefix = args.urlPrefix or
http://lipa.ms.mff.cuni.cz/~cunav5am/nix/texlive-2016;
# XXX XXX XXX FIXME: mirror the snapshot XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX # XXX XXX XXX FIXME: mirror the snapshot XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX
# ("${mirror}/pub/tex/historic/systems/texlive/${bin.texliveYear}/tlnet-final/archive"); # ("${mirror}/pub/tex/historic/systems/texlive/${bin.texliveYear}/tlnet-final/archive");
# http://mirror.ctan.org/tex-archive/systems/texlive/tlnet/archive; #mirror = "http://ftp.math.utah.edu";
http://lipa.ms.mff.cuni.cz/~cunav5am/nix/texlive-2016; src = fetchurl { inherit url sha512; };
# beware: standard mirrors http://mirror.ctan.org/ don't have releases
#mirror = "http://ftp.math.utah.edu"; # ftp://tug.ctan.org no longer works, although same IP
in
rec {
src = fetchurl { inherit url sha512; };
unpackCmd = ''
tar -xf '${src}' \
'--strip-components=${toString stripPrefix}' \
-C "$out" --anchored --exclude=tlpkg --keep-old-files
'' + postUnpack;
};
# create a derivation that contains unpacked upstream TL packages passthru = {
mkPkgs = { pname, tlType, version, pkgList }@args: inherit pname tlType version;
/* TODOs: } // lib.optionalAttrs (sha512 != "") { inherit src; };
- "historic" isn't mirrored; posted a question at #287 unpackCmd = file: ''
- maybe cache (some) collections? (they don't overlap) tar -xf ${file} \
*/ '--strip-components=${toString stripPrefix}' \
let -C "$out" --anchored --exclude=tlpkg --keep-old-files
tlName = "${mkUrlName args}-${version}"; '' + postUnpack;
fixedHash = fixedHashes.${tlName} or null; # be graceful about missing hashes
pkgs = map unpackPkg (fastUnique (a: b: a.sha512 < b.sha512) pkgList); in if sha512 == "" then
in runCommand "texlive-${tlName}" # hash stripped from pkgs.nix to save space -> fetch&unpack in a single step
fetchurl {
inherit url;
sha1 = if fixedHash == null then throw "TeX Live package ${tlName} is missing hash!"
else fixedHash;
name = tlName;
recursiveHash = true;
downloadToTemp = true;
postFetch = ''mkdir "$out";'' + unpackCmd "$downloadedFile";
# TODO: perhaps override preferHashedMirrors and allowSubstitutes
}
// passthru
else runCommand "texlive-${tlName}"
( { # lots of derivations, not meant to be cached ( { # lots of derivations, not meant to be cached
preferLocalBuild = true; allowSubstitutes = false; preferLocalBuild = true; allowSubstitutes = false;
passthru = { inherit passthru;
inherit pname tlType version;
srcs = map (pkg: pkg.src) pkgs;
};
} // lib.optionalAttrs (fixedHash != null) { } // lib.optionalAttrs (fixedHash != null) {
outputHash = fixedHash; outputHash = fixedHash;
outputHashAlgo = "sha1"; outputHashAlgo = "sha1";
@ -153,7 +150,7 @@ let
) )
( '' ( ''
mkdir "$out" mkdir "$out"
'' + lib.concatMapStrings (pkg: pkg.unpackCmd) pkgs '' + unpackCmd "'${src}'"
); );
# combine a set of TL packages into a single TL meta-package # combine a set of TL packages into a single TL meta-package