1{ 2 nixpkgs, 3 officialRelease, 4 pkgs ? import nixpkgs.outPath { }, 5 nix ? pkgs.nix, 6 lib-tests ? import ../../lib/tests/release.nix { inherit pkgs; }, 7}: 8 9pkgs.releaseTools.sourceTarball { 10 name = "nixpkgs-tarball"; 11 src = nixpkgs; 12 13 inherit officialRelease; 14 version = pkgs.lib.fileContents ../../.version; 15 versionSuffix = "pre${ 16 if nixpkgs ? lastModified then 17 builtins.substring 0 8 (nixpkgs.lastModifiedDate or nixpkgs.lastModified) 18 else 19 toString (nixpkgs.revCount or 0) 20 }.${nixpkgs.shortRev or "dirty"}"; 21 22 buildInputs = with pkgs; [ 23 nix.out 24 jq 25 lib-tests 26 brotli 27 ]; 28 29 configurePhase = '' 30 eval "$preConfigure" 31 releaseName=nixpkgs-$VERSION$VERSION_SUFFIX 32 echo -n $VERSION_SUFFIX > .version-suffix 33 echo -n ${nixpkgs.rev or nixpkgs.shortRev or "dirty"} > .git-revision 34 echo "release name is $releaseName" 35 echo "git-revision is $(cat .git-revision)" 36 ''; 37 38 dontUnpack = true; 39 40 dontBuild = false; 41 42 doCheck = true; 43 44 checkPhase = '' 45 echo "generating packages.json" 46 47 ( 48 echo -n '{"version":2,"packages":' 49 NIX_STATE_DIR=$TMPDIR NIX_PATH= nix-env -f $src -qa --meta --json --show-trace --arg config 'import ${./packages-config.nix}' 50 echo -n '}' 51 ) | sed "s|$src/||g" | jq -c > packages.json 52 53 # Arbitrary number. The index has ~115k packages as of April 2024. 54 if [ $(jq -r '.packages | length' < packages.json) -lt 100000 ]; then 55 echo "ERROR: not enough packages in the search index, bailing out!" 56 exit 1 57 fi 58 59 packages=$out/packages.json.br 60 61 mkdir -p $out/nix-support 62 brotli -9 < packages.json > $packages 63 echo "file json-br $packages" >> $out/nix-support/hydra-build-products 64 ''; 65 66 # --hard-dereference: reproducibility for src if auto-optimise-store = true 67 # Some context: https://github.com/NixOS/infra/issues/438 68 distPhase = '' 69 mkdir -p $out/tarballs 70 XZ_OPT="-T0" tar \ 71 --create \ 72 --xz \ 73 --file=$out/tarballs/$releaseName.tar.xz \ 74 --absolute-names \ 75 --transform="s|^$src|$releaseName|g" \ 76 --transform="s|^$(pwd)|$releaseName|g" \ 77 --owner=0 \ 78 --group=0 \ 79 --numeric-owner \ 80 --format=gnu \ 81 --sort=name \ 82 --mtime="@$SOURCE_DATE_EPOCH" \ 83 --mode=ug+w \ 84 --hard-dereference \ 85 $src $(pwd)/{.version-suffix,.git-revision} 86 ''; 87}